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

Dado que las necesidades de búsqueda pueden diferir según las industrias y variar con el tiempo, es posible que el comportamiento de clasificación predeterminado no sea óptimo para todas las necesidades comerciales. Para abordar este problema, puedes modificar el comportamiento de la clasificación con la clasificación personalizada.

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

Descripción general

El ranking personalizado te permite proporcionar una expresión matemática que se basa en un conjunto de indicadores calculados por el modelo, como la puntuación de relevancia semántica y la puntuación de similitud de palabras clave, y en indicadores basados en documentos, como un campo personalizado, como la distancia o la antigüedad del documento.

Con el ranking personalizado, puedes lograr lo siguiente:

  • Obtén visibilidad: Comprende qué indicadores contribuyen a la clasificación final de tus resultados de búsqueda.
  • Ajusta los indicadores existentes: Ajusta las ponderaciones de varios indicadores, como la similitud semántica, la coincidencia de palabras clave o la actualización de documentos.
  • Incorpora la lógica empresarial: Agrega tus propios indicadores personalizados de los datos de tus documentos directamente en la fórmula de clasificación.
  • Optimiza de forma sistemática: 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

Considera una situación en la que se busca 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 principal hotel de lujo de Vancouver con vista al aeropuerto". Cuenta con una impresionante piscina en la azotea. No se permiten mascotas".
  • Hotel B: "Hotel moderno y elegante en el centro de Vancouver. Apto para mascotas y con habitaciones 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 de la ciudad). Cuenta con un hermoso patio con jardín. No hay piscina".
  • Hotel D: "Un complejo turístico rústico icónico. Conocido por su exquisita gastronomía y su servicio impecable. Cuenta con una piscina cubierta y un spa. Opciones que admiten mascotas disponibles a pedido".

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

Clasificación basada en embeddings

El sistema de búsqueda convierte la búsqueda en un solo embedding. Luego, compara esta incorporación de la búsqueda con las incorporaciones de todos los hoteles de su catálogo. Los hoteles con embeddings que son numéricamente más cercanos al embedding de la búsqueda se clasifican en un lugar más alto.

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

Clasificación Hotel Posible motivo de esta clasificación
1 Hotel A Hay una coincidencia semántica muy sólida para lujo, aeropuerto y piscina en la azotea. El "no se permiten mascotas" no es deseable, pero las otras coincidencias sólidas dominan.
2 Hotel B Buena concordancia semántica para "admite mascotas" y "piscina". Sin embargo, "interior" en lugar de "azotea", "moderno" y "elegante" en lugar de "lujoso", y "centro de la ciudad" en lugar de "aeropuerto" hacen que sea menos relevante que A.
3 Hotel D Tiene una fuerte coincidencia semántica para "admite mascotas" y "piscina grande", pero "interior" en lugar de "en la azotea" y "rústico" en lugar de "de lujo" hacen que sea ligeramente menos pertinente semánticamente que A y D.
4 Hotel C Es muy apto para mascotas, pero "sin piscina" y "boutique" reducen significativamente su relevancia para esta búsqueda específica.

Esta clasificación no ofrece los resultados más relevantes. El hotel A se clasifica en primer lugar, aunque, con la etiqueta "no se admiten mascotas", es posible que muchos usuarios no lo prefieran. El hotel D, que cumple con muchos criterios, se clasifica más abajo porque su estado de "rústico" no se correlaciona necesariamente con "lujoso", y la piscina "cubierta" se clasifica más abajo que las coincidencias exactas de "grande" y "al aire libre".

Clasificación personalizada

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

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

Aquí, distance_from_airport es un campo recuperable en el catálogo y c.distance_from_airport actúa como un indicador.

En el ranking personalizado, se consideran diferentes indicadores que influyen en la relevancia de un documento. Luego, creas una expresión matemática que contiene estos indicadores con una sintaxis válida. En esta expresión, normalizas los indicadores y agregas pesos a sus 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. A cada hotel se le otorga una puntuación de similitud semántica y una puntuación de similitud de palabras clave. Además, la distancia desde el aeropuerto es un indicador importante que se deriva del documento.

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

  3. A la puntuación derivada de cada indicador se le asigna un peso y, luego, la suma de todas las puntuaciones individuales se convierte en la puntuación de clasificación personalizada para cada hotel.

Los diferentes indicadores de cada hotel se tabulan de la siguiente manera:

Hotel semantic_similarity_score keyword_similarity_score c.distance_from_airport Puntuación de clasificación personalizada Clasificación personalizada Clasificación basada en embeddings
Hotel A 9.0 6.2 ("aeropuerto", "lujo", "piscina en la azotea") 5.0 0.04879 2 1
Hotel B 7.5 5.6 ("admite mascotas", "centro de la ciudad", "piscina cubierta", "elegante") 12.5 0.04691 3 2
Hotel C 5.0 3.4 ("admite mascotas", "centro de la ciudad") 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 considerada que probablemente satisfaga mejor las necesidades de un usuario que una clasificación basada únicamente en la incorporación.

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

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

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

    • RANK_BY_EMBEDDING: Este es el valor predeterminado cuando no se especifica este campo. Si eliges esta opción, los resultados se clasifican según una expresión de clasificación predefinida que se basa en la incorporación o en la relevancia.
    • RANK_BY_FORMULA: 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 recuperados.

    • Para RANK_BY_EMBEDDING, puede ser basado en la puntuación de relevancia (double * relevanceScore) o en la incorporación (double * dotProduct(embedding_field_path)).

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

Indicadores estándares

La Búsqueda con agentes ofrece una variedad de indicadores que puedes usar para formular una clasificación personalizada. Estos son los indicadores estándares disponibles:

Nombre del indicador Descripción
default_rank Es la clasificación predeterminada del documento, según lo determina el algoritmo de clasificación estándar de Agent Search.
semantic_similarity_score Es una puntuación calculada en función de las incorporaciones de la búsqueda y el contenido para determinar qué tan similar es una búsqueda al contenido de un documento. Se calcula con un algoritmo propietario de Google.
relevance_score Es una puntuación que produce un modelo de relevancia profunda, que controla interacciones complejas entre la búsqueda y el documento. El modelo determina el significado y la intención de una búsqueda en el contexto del contenido. Se calcula con un algoritmo propietario de Google.
keyword_similarity_score Es una puntuación que hace mucho hincapié en la concordancia de palabras clave. Este indicador usa la función de clasificación Best Match 25 (BM25).
document_age Es la antigüedad del documento en horas. Admite valores de punto flotante. Por ejemplo, un valor de 0.5 significa 30 minutos, mientras que 50 significa 2 días y 2 horas.
pctr_rank Es un ranking que indica los porcentajes de conversiones previstos, calculado en función de los datos de eventos del usuario. Este indicador utiliza la tasa de clics prevista (pCTR) para medir la relevancia de un resultado de la búsqueda desde la perspectiva del usuario.
topicality_rank Es una clasificación que denota el ajuste de similitud de palabras clave calculado con un algoritmo patentado de Google.
boosting_factor Es una combinación de todos los aumentos personalizados que aplicaste al documento.

Indicadores personalizados

Además de los indicadores estándar, puedes usar indicadores de cualquier campo personalizado numérico en un documento marcado como recuperable. Para ello, agrega el prefijo c. a los nombres de sus campos. Por ejemplo, si tienes un campo personalizado llamado date_approved, puedes usar c.date_approved como un indicador personalizado.

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

Distancia geográfica: Un indicador derivado

Los indicadores derivados, como la distancia geográfica, se calculan en función de los indicadores estándar y personalizados. La función geodistance calcula la distancia entre una ubicación de origen y una de destino. La función geo_distance() se expresa como geo_distance(source_location, destination_location). Se compone de los siguientes argumentos:

  • La ubicación de origen o source_location: Es el origen para calcular la distancia, que puede ser uno de los siguientes tipos:

    • Ubicación de la búsqueda: Es la ubicación que se analiza a partir de la búsqueda con modelos de comprensión del lenguaje natural. Por ejemplo, en la búsqueda Hotels along the M6, el modelo de comprensión del lenguaje natural extrae Hotels como la parte de qué y M6 como la parte de dónde de los parámetros de búsqueda. La parte dónde es la ubicación de la búsqueda y se puede representar como un punto, una polilínea, un círculo o un polígono.

      {
       "query": "Hotels along M6",
       "ranking_expression": "geo_distance(query_loc, c.hotel_location)",
       "ranking_expression_backend": "RANK_BY_FORMULA"
      }
      
    • Solicitar coordenadas de ubicación: Es una ubicación que se proporciona de forma explícita en la solicitud de búsqueda, como la latitud y la longitud de un usuario. Por ejemplo, puedes proporcionar la búsqueda como Hotels y proporcionar una ubicación con la latitud y la longitud.

      {
        "query": "Hotels",
        "user_info": {
          "precise_location": {
            "point": {
              "lat": 52.23034637633789,
              "lon": 20.98339855121653,
            }
          }
        },
        "ranking_expression": "geo_distance(request_loc, c.hotel_location)",
        "ranking_expression_backend": "RANK_BY_FORMULA"
      }
      
    • Dirección de la ubicación de la solicitud: Es una dirección que se proporciona de forma explícita en la solicitud de búsqueda. Por ejemplo, puedes proporcionar la búsqueda como Hotels y una dirección para referencia.

      {
        "query": "Hotels",
        "user_info": {
          "precise_location": {
            "address": "1800 Amphibious Blvd. Mountain View, CA 94045"
          }
        },
        "ranking_expression": "geo_distance(request_loc, c.hotel_location)",
        "ranking_expression_backend": "RANK_BY_FORMULA"
      }
      
  • Ubicación de destino o destination_location: Es el destino para calcular la distancia, que es un campo recuperable personalizado, como c.office_location o c.home_location.

El orden de estos argumentos dentro de la función debe seguir siendo el mismo. Es decir, la ubicación de origen siempre debe ser el primer argumento dentro de la función geo_distance(), seguido de la ubicación de destino. La función calcula la distancia en metros con la latitud y la longitud de las ubicaciones de origen y destino.

Sintaxis de la fórmula de clasificación

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

  • Números (double): Son valores de punto flotante positivos o negativos que agregan un peso a un indicador o una expresión.

  • Indicadores (signal): Son los nombres de los indicadores que se enumeran en la sección Indicadores estándar.

  • 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 un indicador.

    Ejemplos de una función válida: exp(c.document_age) y log(keywordSimilarityScore * 0.2 + 1.0).

  • Función de transformación del rango recíproco denso (drr):

    Esta función se expresa como drr(expression, k, eps). Primero, ordena los documentos según el valor de expression en orden descendente y les asigna una clasificación. Cuando los valores de la expresión se encuentran dentro de eps, se consideran iguales. Luego, la función calcula el valor final con las expresiones 1 / (rank_i + k), en las que rank_i es la posición del documento en la lista ordenada a partir de 0 y k es un número de punto flotante positivo que proporcionas.

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

    Google recomienda que uses esta función en lugar de la función de transformación del rango recíproco anterior (rr) porque brinda mejores resultados en los casos en los que los indicadores están vinculados para los primeros resultados. Por ejemplo, si la búsqueda es de hoteles en San Francisco, hay muchos hoteles dentro de los límites de la ciudad, por lo que muchos hoteles comparten el mismo indicador de distancia geográfica.

    Más información sobre el parámetro eps:

    • El parámetro eps agrega flexibilidad cuando se determina si dos indicadores son iguales. Los indicadores equivalentes se encuentran con mayor frecuencia en los indicadores de los siguientes tipos: boosting_factor, geo_distance, personalizados categóricos y personalizados de números enteros.

    • La función determina si el valor de la expresión de un documento es igual al valor de la expresión de otro documento. Si es eps=0, los valores deben ser exactamente iguales para considerarse iguales; si es eps>0, los valores dentro del rango especificado por eps se consideran iguales.

    • Más específicamente, si x1 y x2 son valores de señal, se consideran el mismo valor si la diferencia absoluta entre los dos es menor o igual que eps, es decir, si abs(x1-x2) <= eps. De forma predeterminada, eps=0, lo que significa que los valores se consideran iguales si x1 == x2. El valor predeterminado de eps=0 funciona bien para los números enteros, pero puede fallar en algunos casos para los números de punto flotante debido a la naturaleza imprecisa de la aritmética de punto flotante, por ejemplo, cuando 1/5 podría evaluarse como 0.20000000000001 o 0.19999999999.

  • Función de transformación del rango recíproco (rr): Esta función se expresa como rr(expression, k). Primero, ordena los documentos según el valor de expression en orden descendente y les asigna una clasificación. Luego, calcula el valor final con las expresiones 1 / (rank_i + k), donde rank_i es la posición del documento en la lista ordenada a partir de 0 y k es un número de punto flotante positivo que proporcionas.

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

    Si bien esta función es compatible, Google recomienda la función de transformación de rango recíproco denso más reciente (drr).

  • Funciones de control de valores que no son números (NaN):

    • is_nan(expression): Cuando la expresión se evalúa como NaN, por ejemplo, cuando falta un indicador para un documento, se devuelve 1. De lo contrario, se devuelve 0.
    • fill_nan(arg_expression, fill_with_expression): Si arg_expression se evalúa como NaN, devuelve fill_with_expression. De lo contrario, muestra arg_expression. Esto es fundamental para controlar los documentos a los que les podrían faltar ciertos indicadores.

Ejemplos de fórmulas de clasificación

Estos son algunos ejemplos de fórmulas de clasificación que puedes usar en el campo rankingExpression de tu solicitud de búsqueda:

  • Una combinación lineal elemental:

    semantic_similarity_score * 0.7 + keyword_similarity_score * 0.3
    
  • Una fórmula compleja que usa el rango recíproco denso y el control de NaN:

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

    drr(fill_nan(semantic_similarity_score, 0), 40) * 0.2 + exp(keyword_similarity_score) * 0.3 + is_nan(keyword_similarity_score) * 0.1
    
  • Una fórmula compleja que usa el rango recíproco denso con la función geo_distance(), que ilustra el uso del parámetro eps con la función geo_distance():

    drr(keyword_similarity_score, 16) * 0.8 + drr(geo_distance(query_loc, c.office_location) * -1, 16, 0.00001) * 0.2
    

    En esta fórmula, el factor de multiplicación es un valor negativo, de modo que una distancia mayor corresponde a un valor de expresión más pequeño (más negativo) y, por lo tanto, la clasificación recíproca asigna una puntuación de clasificación más baja a distancias mayores.

Indicadores en la respuesta

Cuando se devuelve un documento en la respuesta de búsqueda, el resultado de la búsqueda enumera los indicadores estándar y los indicadores personalizados que contribuyen a recuperar el documento del almacén de datos. El campo rankSignals enumera estos indicadores.

Campos de texto para la similitud de palabras clave

En los almacenes de datos estructurados, para obtener el indicador keywordSimilarityScore en tu respuesta de búsqueda, debes actualizar tu esquema para hacer lo siguiente:

  • Asocia los campos de texto esenciales para la concordancia de palabras clave con las propiedades clave title y description.
  • Actualiza la anotación de los campos de texto como Searchable

Para personalizar la clasificación de tus documentos en los resultados de la búsqueda, redacta manualmente una fórmula y agrégala a tu llamada a la API de search.

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

  2. Obtener resultados de la 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"
    }'
    

    Reemplaza lo siguiente:

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

Para casos de uso más avanzados, encontrar los pesos óptimos para tu fórmula puede ser un desafío. Para superar este problema, puedes usar la biblioteca de Python de ajuste de clasificación de Agent Search, que es una herramienta de código abierto, y llegar a una fórmula adecuada para tu caso de uso.

El flujo de trabajo general es el siguiente:

  1. Prepara un conjunto de datos de búsquedas con 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 búsquedas representativas, llama a la API de search para obtener los indicadores de clasificación disponibles para 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 de Clearbox.

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