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:
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.
La función de transformación de rango recíproco o
rr()
se usa para transformar todas las puntuaciones a la misma escala.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 camporankingExpression
.
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 naturalexp(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)
ylog(keywordSimilarityScore * 0.2 + 1.0)
.Función de transformación de rango recíproco (
rr
): Esta función se expresa comorr(expression, k)
. Primero, ordena los documentos por el valor deexpression
en orden descendente y les asigna un rango. A continuación, calcula el valor final mediante las expresiones1 / (rank_i + k)
, donderank_i
es la posición del documento en la lista ordenada, empezando por 0, yk
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 devuelve1
. De lo contrario, se devuelve0
.fill_nan(arg_expression, fill_with_expression)
: Siarg_expression
da como resultado un NaN, devuelvefill_with_expression
. De lo contrario, devuelvearg_expression
. Esto es fundamental para gestionar documentos a los que les falten determinadas señales.
Ejemplos de fórmulas de clasificación
Una combinación lineal elemental:
semantic_similarity_score * 0.7 + keyword_similarity_score * 0.3
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
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
Personalizar la clasificación mediante la fórmula de clasificación en la búsqueda
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
.
Formula una expresión de clasificación.
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:
PROJECT_ID
: el ID de tu proyecto de Google Cloud .APP_ID
: el ID de la aplicación de Vertex AI Search que quieres consultar.QUERY
: el texto de la consulta que se va a buscar.RANKING_EXPRESSION
: la fórmula de clasificación personalizada que puedes escribir usando las señales disponibles con una sintaxis de fórmula de clasificación válida.- Para ver ejemplos válidos, consulta Ejemplos de fórmulas de ranking.
- Para ajustar la fórmula de clasificación, que puede darte los mejores resultados, consulta Ajustar la fórmula de clasificación con la biblioteca de Python.
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:
- 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. - 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 campoSearchResult.rankSignals
. Almacena estos datos junto con tus etiquetas de referencia. 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.
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.