Clasifica los resultados de la búsqueda

Selecciona una versión de la documentación:

Aprende a clasificar y volver a clasificar los resultados de la búsqueda para las aplicaciones con los modelos de clasificación de Vertex AI, como semantic-ranker-default-003. Puedes usar la función ai.rank() para calificar documentos según su relevancia para una búsqueda y mejorar los resultados de la búsqueda de vectores volviendo a clasificarlos para obtener un mejor orden de búsqueda.

La API de clasificación de Vertex AI toma una lista de documentos y los clasifica según su relevancia para una consulta determinada (una cadena de búsqueda). Cuando usas la función ai.rank(), esta devuelve puntuaciones que indican qué tan bien un documento responde una consulta determinada.

Para usar las instrucciones de esta página, debes comprender AlloyDB Omni y conocer los conceptos de la IA generativa.

AlloyDB Omni reserva y crea el esquema ai.

Antes de comenzar

Antes de clasificar los resultados de la búsqueda, haz lo siguiente:

  1. Configura el acceso de los usuarios a los modelos de Vertex AI.
  2. Verifica que esté instalada la versión más reciente de google_ml_integration.
    1. Para verificar la versión instalada, ejecuta el siguiente comando:

      SELECT extversion FROM pg_extension WHERE extname = 'google_ml_integration';
      extversion
      ------------
      1.5.2
      (1 row)
    2. Si la extensión no está instalada o si la versión instalada es anterior a la 1.5.2, actualízala.

      CREATE EXTENSION IF NOT EXISTS google_ml_integration;
      ALTER EXTENSION google_ml_integration UPDATE;

      Si tienes problemas cuando ejecutas los comandos anteriores o si la extensión no se actualiza a la versión 1.5.2 después de ejecutar los comandos anteriores, comunícate con el equipo de asistencia de Google Cloud.

  3. Para usar la funcionalidad del motor de consultas de AlloyDB AI, establece la marca google_ml_integration.enable_ai_query_engine en on.

    1. Usa un editor de texto para establecer la siguiente marca en el archivo de configuración postgresql.conf para tu instalación de AlloyDB Omni:
      google_ml_integration.enable_ai_query_engine = on
    2. Después de guardar el archivo postgresql.conf, reinicia el servicio de AlloyDB Omni para que se apliquen los cambios.
      sudo systemctl restart alloydbomni18
  4. Habilita la API de Discover Engine.

  5. Obtén los roles necesarios para usar los modelos de clasificación.

Habilita la API de Discovery Engine

<p>To use ranking models, you must enable the Discovery Engine API.<br>
    Replace <code><var>PROJECT_ID</var></code> with your
    Google Cloud project ID and <code><var>PROJECT_NUMBER</var></code>
    with your corresponding project number.</p>

<pre class="prettyprint lang-terminal">
    # Enable Discovery Engine API
    gcloud services enable discoveryengine.googleapis.com --project=<var>PROJECT_ID</var>
    gcloud projects add-iam-policy-binding <var>PROJECT_ID</var> \
    --member="serviceAccount:service-<var>PROJECT_NUMBER</var>@iam.gserviceaccount.com" \
    --role="roles/discoveryengine.viewer"
</pre>

<p>Model registration for ranking isn't required for Vertex AI models.
    You can use the Vertex AI model name as the
    <code>model_id</code>, which is shown in the following example.
</p>

<pre class="prettyprint lang-sh">
    SELECT index, score
    FROM
      ai.rank(
        model_id => 'semantic-ranker-default-003',
        search_string => 'Affordable family-friendly vacation spots in Southeast Asia?',
        documents =>
    ARRAY[
      'Luxury resorts in South Korea',
      'Family vacation packages for Vietnam: Ha Long Bay and Hoi An',
      'Budget-friendly beaches in Thailand perfect for families',
      'A backpacker guide to solo travel in India'])
</pre>

<p>A common use case for the semantic ranker is to rerank the results returned
    by vector search for better query ordering. The following example shows how to
    use the semantic ranking model for this use case. The example retrieves an
    initial result set for the query <code>personal fitness
    equipment</code> using vector search. These results are then re-ranked to
    return the top five results.
</p>

<pre class="prettyprint lang-sh">
    WITH initial_ranking AS (
      SELECT id, description, ROW_NUMBER() OVER () AS ref_number
      FROM product
      ORDER BY
        embedding <=> google_ml.embedding(
          'gemini-embedding-001', 'personal fitness equipment')::vector
      LIMIT 10
    ), reranked_results AS (
      SELECT index, score
      FROM ai.rank(
          model_id => 'semantic-ranker-default-003',
          search_string => 'personal fitness equipment',
          documents => (SELECT ARRAY_AGG(description ORDER BY ref_number) FROM initial_ranking),
          top_n => 5)
    )
    SELECT id, description
    FROM initial_ranking, reranked_results
    WHERE initial_ranking.ref_number = reranked_results.index
    ORDER BY reranked_results.score DESC;
  </pre>

  <p>For a list of available models and use cases, see <a href="/generative-ai-app-builder/docs/ranking#models">Supported models</a>.</p>

Integración en Vertex AI e instalación de la extensión

Para obtener más información, consulta Configura tu instalación de AlloyDB Omni para consultar modelos basados en la nube.

Roles obligatorios

Para obtener los permisos que necesitas para usar los modelos de clasificación de Discovery Engine, pídele a tu administrador que otorgue a la cuenta de servicio de AlloyDB Omni el rol de visualizador de Discovery Engine (roles/discoveryengine.viewer) de Identity and Access Management (IAM) en your project. Para obtener más información sobre cómo otorgar roles, consulta Administra el acceso a proyectos, carpetas y organizaciones.

También puedes obtener los permisos necesarios a través de roles personalizados o cualquier otro rol predefinido.

Clasifica tus resultados de la búsqueda

La siguiente consulta en SQL muestra cómo clasificar tus resultados de la búsqueda :

SELECT
  ai.rank(
    model_id => 'MODEL_ID',
    search_string => 'SEARCH_STRING',
    documents => ARRAY['DOCUMENT_1', 'DOCUMENT_2', 'DOCUMENT_3']);

Reemplaza lo siguiente:

Parámetro Descripción
MODEL_ID Es un ID único para el extremo del modelo que defines.
SEARCH_STRING Es una cadena de búsqueda con la que se clasifican los registros.
DOCUMENTS Es un array de cadenas de texto únicas que deseas clasificar.

Para obtener una lista de los modelos de clasificación de Vertex AI admitidos, consulta Modelos admitidos.

Ejemplos

Para clasificar los resultados de la búsqueda con un modelo de clasificación de Vertex AI, ejecuta la siguiente consulta:

SELECT index, score
FROM
  ai.rank(
    model_id => 'semantic-ranker-default-003',
    search_string => 'AlloyDB is a PostgreSQL compatible AI database that is ready for production.',
    documents =>
      ARRAY[
        'Alloys are made from combination of metals',
        'The best enterprise-ready PostgreSQL database.',
        'You can feel the heat in Alloy apartments.']);

La respuesta es una tabla que muestra cada documento y la puntuación según la relevancia para la búsqueda. A continuación, se muestra la respuesta de ejemplo:

 index | score
-------+------------
     2 |  0.33
     1 |  0.28
     3 |  0.16
(3 rows)

Considera una base de datos de ejemplo de AlloyDB Omni con una lista de descripciones de opiniones que se convierten en embeddings. El siguiente código de muestra muestra cómo usar el modelo de clasificación para recuperar el nombre de los productos mejor clasificados según la similitud semántica de las descripciones de sus opiniones con una búsqueda.

WITH initial_ranking AS (
    SELECT product_id, name, review, review_id, ROW_NUMBER() OVER () AS ref_number
    FROM user_reviews
    ORDER BY
      review_desc_embedding <=> google_ml.embedding(
        'gemini-embedding-001', 'good desserts')::vector
    LIMIT 10
  ), reranked_results AS (
    SELECT index, score
    FROM
      ai.rank(
        model_id => 'semantic-ranker-512',
        search_string => 'good desserts',
        documents => (SELECT ARRAY_AGG(review ORDER BY ref_number) FROM initial_ranking),
        top_n => 5)
  )
SELECT product_id, name
FROM initial_ranking, reranked_results
WHERE initial_ranking.ref_number = reranked_results.index
ORDER BY reranked_results.score DESC;

¿Qué sigue?