Personalizar la clasificación de los resultados de búsqueda

Dado que las necesidades de búsqueda pueden variar en función del sector y cambiar con el tiempo, el comportamiento de clasificación predeterminado puede no ser óptimo para todas las empresas. Para solucionar este problema, puede modificar el comportamiento de la clasificación mediante la clasificación personalizada.

En esta página se describe cómo usar una fórmula de ordenación personalizada en su solicitud de búsqueda y cómo ajustarla. Esta función está disponible para datos estructurados, no estructurados y de sitios web.

Información general

La clasificación personalizada te permite proporcionar una expresión matemática que se basa en un conjunto de señales calculadas por el modelo, como la puntuación de relevancia semántica y la puntuación de similitud de palabras clave, así como en señales basadas en documentos, como un campo personalizado (por ejemplo, la distancia o la antigüedad del documento).

Con la clasificación personalizada, puedes hacer lo siguiente:

  • Aumentar la visibilidad: descubre qué señales contribuyen a la clasificación final de tus resultados de búsqueda.
  • Ajustar las señales actuales: ajusta la importancia de varias señales, como la similitud semántica, la coincidencia de palabras clave o la actualidad del documento.
  • Incorporar lógica empresarial: añade tus propias señales personalizadas de los datos de tus documentos directamente a la fórmula de clasificación.
  • Optimizar sistemáticamente: usa la biblioteca de Python de código abierto para descubrir de forma programática la fórmula de clasificación óptima.

Necesidad de una clasificación personalizada: un ejemplo

Supongamos que se consulta la siguiente cadena en un sitio web de reservas de hoteles:

luxury hotel with a large rooftop pool in Vancouver, pet-friendly and close to airport.

Supongamos que se recuperan las siguientes entradas:

  • Hotel A: "El mejor hotel de lujo de Vancouver con vistas al aeropuerto. Cuenta con una impresionante piscina en la azotea. No se admiten mascotas".
  • Hotel B: "Hotel moderno y elegante en el centro de Vancouver. Se admiten mascotas y las habitaciones son amplias. Cuenta con una gran piscina cubierta y un gimnasio."
  • Hotel C: "Un encantador hotel boutique que admite mascotas cerca del acuario (a 10 minutos a pie del centro). Cuenta con un precioso patio ajardinado. No hay piscina".
  • Hotel D: "Un complejo rústico emblemático. Conocido por su exquisita cocina y su impecable servicio. Cuenta con una piscina cubierta y un spa. Hay opciones donde se admiten mascotas disponibles bajo petición".

Todos los hoteles del catálogo incluyen un campo distance_from_airport en kilómetros (km).

Clasificación basada en inserciones

El sistema de búsqueda convierte la consulta en una sola incrustación. Después, compara esta inserción de consulta con las inserciones de todos los hoteles de su catálogo. Los hoteles con las inserciones numéricamente más cercanas a la inserción de la consulta se clasifican en puestos más altos.

Esta es la clasificación probable de una búsqueda de relevancia basada únicamente en las inserciones:

Clasificación Hotel Posible motivo de esta clasificación
1 Hotel A Coincidencia semántica muy alta para lujo, aeropuerto y piscina en la azotea. La opción "no pets" no es deseable, pero las otras coincidencias sólidas dominan.
2 Hotel B Buena concordancia semántica para "pet-friendly" y "pool". Sin embargo, "interior" en lugar de "azotea", "moderno" y "elegante" en lugar de "lujoso" y "centro" en lugar de "aeropuerto" hacen que sea menos relevante que A.
3 Hotel D Coincidencia semántica sólida para "admite mascotas" y "piscina grande", pero "cubierta" en lugar de "azotea" y "rústico" en lugar de "lujo" hacen que sea ligeramente menos relevante semánticamente que A y D.
4 Hotel C Aunque admite mascotas, las palabras "sin piscina" y "boutique" reducen significativamente su relevancia para esta consulta específica.

Esta clasificación no ofrece los resultados más relevantes. El hotel A ocupa el primer puesto, aunque muchos usuarios no lo prefieran porque no admite mascotas. El hotel D cumple muchos criterios, pero tiene una clasificación inferior porque su estado "rústico" no se corresponde necesariamente con "lujoso" y la piscina "cubierta" tiene una clasificación inferior a las coincidencias exactas de "grande" y "exterior".

Clasificación personalizada

Supongamos que ha configurado la siguiente expresión de clasificación para este ejemplo. Para obtener información sobre los componentes de esta expresión, consulta Acerca de la implementación de la clasificación personalizada.

rankingExpression = rr(semantic_similarity_score, 32) * 0.4 + rr(keyword_similarity_score, 32) * 0.3 + rr(c.distance_from_airport * -1, 32) * 0.8

Donde distance_from_airport es un campo recuperable del catálogo y c.distance_from_airport actúa como señal.

En la clasificación personalizada, se tienen en cuenta diferentes señales que influyen en la relevancia de un documento. A continuación, crea una expresión matemática que contenga estas señales con una sintaxis válida. En esta expresión, normalizas las señales y añades pesos a las puntuaciones derivadas. Se calcula la puntuación personalizada final y se clasifican los documentos.

En este ejemplo, el proceso se puede explicar de la siguiente manera:

  1. Cada hotel recibe una puntuación de similitud semántica y una puntuación de similitud de palabras clave. Además, la distancia al aeropuerto es una señal importante derivada del documento.

  2. La función de transformación de rango recíproco o rr() se usa para transformar todas las puntuaciones a la misma escala.

  3. La puntuación derivada de cada señal recibe una ponderación y, a continuación, la suma de todas las puntuaciones individuales se convierte en la puntuación de ordenación personalizada de cada hotel.

Las diferentes señales de cada hotel se tabulan de la siguiente manera:

Hotel semantic_similarity_score keyword_similarity_score c.distance_from_airport Puntuación de posicionamiento personalizado Clasificación personalizada Clasificación basada en inserciones
Hotel A 9,0 6.2 ("airport", "luxury", "rooftop pool") 5,0 0,04879 2 1
Hotel B 7,5 5.6 ("pet-friendly", "downtown", "indoor pool", "stylish") 12,5 0,04691 3 2
Hotel C 5,0 3.4 ("pet-friendly", "downtown") 18 0,04525 4 4
Hotel D 8,0 4.5 ("piscina cubierta", "admite mascotas", "rústico") 1 0,04890 1 3

Si comparamos los dos métodos de clasificación, la clasificación personalizada ofrece una clasificación más meditada que probablemente se ajuste mejor a las necesidades de un usuario que una clasificación basada únicamente en embeddings.

Acerca de la implementación de la clasificación personalizada

Para obtener una clasificación personalizada en los resultados de búsqueda, debe llamar al método search proporcionando los siguientes campos:

  • Backend de la expresión de ranking (rankingExpressionBackend): este campo indica cuál de los siguientes mecanismos de ranking se debe usar.

    • RANK_BY_EMBEDDING: este es el valor predeterminado cuando no se especifica este campo. Si elige esta opción, los resultados se ordenarán según una expresión de clasificación predefinida que se basa en la inserción o en la relevancia.
    • RANK_BY_FORMULA: esta opción anula la clasificación predeterminada y te permite proporcionar tu fórmula personalizada en el campo rankingExpression.
  • Expresión de clasificación (rankingExpression): este campo contiene una fórmula matemática que determina la clasificación de los documentos obtenidos.

    • En el caso de RANK_BY_EMBEDDING, puede ser por puntuación de relevancia (double * relevanceScore) o por inserción (double * dotProduct(embedding_field_path)).

    • En el caso de RANK_BY_FORMULA, se trata de una expresión seleccionada que combina varias señales para calcular una nueva puntuación de cada resultado de búsqueda.

Señales estándar

Vertex AI Search ofrece una variedad de señales que puedes usar para formular una clasificación personalizada. Estas son las señales estándar disponibles:

Nombre de la señal Descripción
default_rank El rango predeterminado del documento, determinado por el algoritmo de clasificación estándar de VAIS.
semantic_similarity_score Una puntuación calculada a partir de las inserciones de consultas y contenido para determinar el grado de similitud entre una consulta de búsqueda y el contenido de un documento. Se calcula mediante un algoritmo propietario de Google.
relevance_score Puntuación generada por un modelo de relevancia profunda que gestiona interacciones complejas entre consultas y documentos. El modelo determina el significado y la intención de una consulta en el contexto del contenido. Se calcula mediante un algoritmo propietario de Google.
keyword_similarity_score Una puntuación que hace especial hincapié en la concordancia con palabras clave. Esta señal usa la función de clasificación Best Match 25 (BM25).
document_age La antigüedad del documento en horas. Admite valores de punto flotante. Por ejemplo, el valor 0,5 significa 30 minutos, mientras que el valor 50 significa 2 días y 2 horas.
pctr_rank Una clasificación que indica las tasas de conversión previstas, calculadas a partir de los datos de eventos de usuario. Esta señal usa el porcentaje de clics previsto (pCTR) para medir la relevancia de un resultado de búsqueda desde la perspectiva del usuario.
topicality_rank Una clasificación que indica el ajuste de similitud de las palabras clave calculado mediante un algoritmo propietario de Google.
boosting_factor Una combinación de todos los aumentos personalizados que hayas aplicado al documento.

Además de estos campos, puede usar cualquier campo personalizado de un documento que esté marcado como recuperable. Para ello, añade el prefijo c. a los nombres de los campos. Por ejemplo, si tiene un campo personalizado llamado date_approved, puede usar c.date_approved como señal personalizada.

Los nombres de las señales son una combinación de caracteres alfabéticos y guiones bajos (_). A continuación, se muestra una lista de nombres reservados que no se pueden usar como nombres de señales: log, exp, rr, is_nan y fill_nan.

Sintaxis de la fórmula de clasificación

La fórmula de ranking personalizada es una expresión matemática con los siguientes componentes:

  • Números (double): valores de coma flotante positivos o negativos que añaden un peso a una señal o una expresión.

  • Señales (signal): los nombres de las señales que aparecen en la sección Señales disponibles.

  • Operadores aritméticos: + (suma) y * (multiplicación).

  • Funciones matemáticas:

    • log(expression): el logaritmo natural
    • exp(expression): el exponente natural

    Cada una de estas expresiones acepta exactamente un argumento, que es una expresión escrita en términos de una señal.

    Ejemplos de funciones válidas: exp(c.document_age) y log(keywordSimilarityScore * 0.2 + 1.0).

  • Función de transformación de rango recíproco (rr): Esta función se expresa como rr(expression, k). Primero, ordena los documentos por el valor de expression en orden descendente y les asigna un rango. A continuación, calcula el valor final mediante las expresiones 1 / (rank_i + k), donde rank_i es la posición del documento en la lista ordenada, empezando por 0, y k es un número de coma flotante positivo que usted proporciona.

    La función rr() transforma todas las puntuaciones a la misma escala y elimina la necesidad de aplicar una normalización adicional.

  • Funciones de gestión de valores no numéricos (NaN):

    • is_nan(expression): cuando la expresión se evalúa como NaN, como cuando falta una señal en un documento, se devuelve 1. De lo contrario, se devuelve 0.
    • fill_nan(arg_expression, fill_with_expression): Si arg_expression da como resultado un NaN, devuelve fill_with_expression. De lo contrario, devuelve arg_expression. Esto es fundamental para gestionar documentos a los que les falten determinadas señales.

Ejemplos de fórmulas de clasificación

  1. Una combinación lineal elemental:

    semantic_similarity_score * 0.7 + keyword_similarity_score * 0.3
    
  2. Fórmula compleja que usa el rango recíproco y la gestión de NaN:

    rr(fill_nan(semantic_similarity_score, 0), 40) * 0.5 + topicality_rank * 0.5
    
  3. Una fórmula compleja que usa el rango recíproco, la función exponencial y el control de NaN:

    rr(fill_nan(semantic_similarity_score, 0), 40) * 0.2 + exp(keyword_similarity_score) * 0.3 + is_nan(keyword_similarity_score) * 0.1
    

Para personalizar la clasificación de tus documentos en los resultados de búsqueda, crea manualmente una fórmula y añádela a tu llamada a la API search.

  1. Formula una expresión de clasificación.

  2. Obtener resultados de búsqueda.

    curl -X POST -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    -H "Content-Type: application/json" \
    "https://discoveryengine.googleapis.com/v1/projects/PROJECT_ID/locations/global/collections/default_collection/engines/APP_ID/servingConfigs/default_search:search" \
    -d '{
    "servingConfig": "projects/PROJECT_ID/locations/global/collections/default_collection/engines/APP_ID/servingConfigs/default_search",
    "query": "QUERY",
    "rankingExpression": "RANKING_EXPRESSION",
    "rankingExpressionBackend": "RANK_BY_FORMULA"
    }'
    

    Haz los cambios siguientes:

Ajustar la fórmula de clasificación con la biblioteca de Python

En casos prácticos más avanzados, puede ser difícil encontrar los pesos óptimos para tu fórmula. Para solucionar este problema, puedes usar la biblioteca de Python de ajuste de ranking de Vertex AI Search, que es una herramienta de código abierto, y encontrar una fórmula adecuada para tu caso práctico.

El flujo de trabajo general es el siguiente:

  1. Prepara un conjunto de datos de consultas con las etiquetas de referencia correspondientes. Estas etiquetas doradas pueden ser campos de identificación únicos, como el ID del documento, que pueden ayudarte a asociar el objeto SearchResult en la respuesta de búsqueda.
  2. Para un conjunto de consultas representativas, llama a la API search para obtener las señales de clasificación disponibles de todos los documentos devueltos. Puedes encontrarlo en el campo SearchResult.rankSignals. Almacena estos datos junto con tus etiquetas de referencia.
  3. Usa la biblioteca de Python para entrenar un modelo de clasificación en este conjunto de datos. Para obtener más información, consulta la biblioteca de Python Clearbox.

  4. Convierte la fórmula de los resultados del entrenamiento en una expresión de clasificación que puedas usar en tus llamadas a la API.