Compartir vía


Tutorial: Creación de una búsqueda semántica con Azure Database for PostgreSQL y Azure OpenAI

En este tutorial práctico se muestra cómo crear una aplicación de búsqueda semántica mediante Azure Database for PostgreSQL y Azure OpenAI.

La búsqueda semántica realiza búsquedas basadas en la semántica. La búsqueda léxica estándar realiza búsquedas basadas en palabras clave proporcionadas en una consulta. Por ejemplo, el conjunto de datos de recetas podría no contener etiquetas como sin gluten, vegano, sin lácteos, sin fruta o postre, pero estas características se pueden deducir de los ingredientes. La idea es emitir estas consultas semánticas y obtener resultados de búsqueda relevantes.

En este tutorial, usted hará lo siguiente:

  • Identifique los escenarios de búsqueda y los campos de datos implicados en una búsqueda.
  • Para cada campo de datos implicado en una búsqueda, cree un campo vectorial correspondiente para almacenar las incrustaciones del valor almacenado en el campo de datos.
  • Genere inserciones para los datos de los campos de datos seleccionados y almacene las inserciones en los campos vectoriales correspondientes.
  • Genere la inserción para cualquier consulta de búsqueda de entrada.
  • Busque el campo de datos vectoriales y enumere los vecinos más próximos.
  • Ejecute los resultados a través de los modelos de relevancia, clasificación y personalización adecuados para generar la clasificación final. En ausencia de estos modelos, clasifique los resultados en orden decreciente de producto escalar.
  • Supervise el modelo, la calidad de los resultados y las métricas empresariales, como la tasa de clics y el tiempo de permanencia. Incorpore mecanismos de comentarios para depurar y mejorar la pila de búsqueda desde la calidad de los datos, la actualización y la personalización, hasta la experiencia del usuario.

Requisitos previos

  1. Cree una cuenta de OpenAI y solicite acceso a Azure OpenAI.
  2. Conceda acceso a Azure OpenAI en la suscripción deseada.
  3. Conceda permisos para crear recursos de Azure OpenAI e implementar modelos.
  4. Cree e implemente un recurso de Azure OpenAI y un modelo. Implemente las incrustaciones del modelo text-embeding-ada-002. Copie el nombre de implementación, ya que lo necesita para crear incrustaciones.

Habilitar las extensiones azure_ai y pgvector

Para poder habilitar azure_ai y pgvector en la instancia de servidor flexible de Azure Database for PostgreSQL, debe agregarlos a la lista de permitidos. Asegúrese de que se han agregado correctamente ejecutando SHOW azure.extensions;.

A continuación, puede instalar la extensión conectándose a la base de datos de destino y ejecutando el comando CREATE EXTENSION . Debe repetir el comando por separado para cada base de datos donde desee que la extensión esté disponible.

CREATE EXTENSION azure_ai;
CREATE EXTENSION vector;

Configuración de un punto de conexión y una clave de OpenAI

En los servicios de Azure AI, en Administración de recursos>Claves y puntos de conexión, puede encontrar el punto de conexión y las claves de su recurso de Azure AI. Use el punto de conexión y una de las claves para permitir que la azure_ai extensión invoque la implementación del modelo:

select azure_ai.set_setting('azure_openai.endpoint','https://<endpoint>.openai.azure.com');
select azure_ai.set_setting('azure_openai.subscription_key', '<API Key>');

Descarga de los datos

Descargue los datos de Kaggle.

Creación de la tabla

Conéctese al servidor y cree una test base de datos. En esa base de datos, use el siguiente comando para crear una tabla en la que importará los datos:

CREATE TABLE public.recipes(
    rid integer NOT NULL,
    recipe_name text,
    prep_time text,
    cook_time text,
    total_time text,
    servings integer,
    yield text,
    ingredients text,
    directions text,
    rating real,
    url text,
    cuisine_path text,
    nutrition text,
    timing text,
    img_src text,
    PRIMARY KEY (rid)
);

Importación de los datos

Establezca la siguiente variable de entorno en la ventana de cliente para establecer la codificación en UTF-8. Este paso es necesario porque este conjunto de datos determinado usa la codificación Windows-1252.

Rem on Windows
Set PGCLIENTENCODING=utf-8;
# on Unix based operating systems
export PGCLIENTENCODING=utf-8

Importe los datos en la tabla que creó. Tenga en cuenta que este conjunto de datos contiene una fila de encabezado.

psql -d <database> -h <host> -U <user> -c "\copy recipes FROM <local recipe data file> DELIMITER ',' CSV HEADER"

Adición de una columna para almacenar las inserciones

Agregue una columna de inserción a la tabla:

ALTER TABLE recipes ADD COLUMN embedding vector(1536);

Generación de inserciones

Genere representaciones para sus datos mediante la extensión azure_ai. En el ejemplo siguiente se vectorizan algunos campos y se concatenan.

WITH ro AS (
    SELECT ro.rid
    FROM
        recipes ro
    WHERE
        ro.embedding is null
        LIMIT 500
)
UPDATE
    recipes r
SET
    embedding = azure_openai.create_embeddings('text-embedding-ada-002', r.recipe_name||' '||r.cuisine_path||' '||r.ingredients||' '||r.nutrition||' '||r.directions)
FROM
    ro
WHERE
    r.rid = ro.rid;

Repita el comando hasta que no haya más filas que procesar.

Sugerencia

Juega con el valor LIMIT. Con un valor alto, es posible que la instrucción produzca un error a mitad de camino debido a la limitación que impone Azure OpenAI. Si se produce un error en la instrucción, espere al menos un minuto y vuelva a ejecutar el comando.

Cree una función de búsqueda en la base de datos para mayor comodidad:

create function
    recipe_search(searchQuery text, numResults int)
returns table(
            recipeId int,
            recipe_name text,
            nutrition text,
            score real)
as $$
declare
    query_embedding vector(1536);
begin
    query_embedding := (azure_openai.create_embeddings('text-embedding-ada-002', searchQuery));
    return query
    select
        r.rid,
        r.recipe_name,
        r.nutrition,
        (r.embedding <=> query_embedding)::real as score
    from
        recipes r
    order by score asc limit numResults; -- cosine distance
end $$
language plpgsql;

Ahora simplemente invoque la función para buscar:

select recipeid, recipe_name, score from recipe_search('vegan recipes', 10);

Y explore los resultados:

 recipeid |                         recipe_name                          |   score
----------+--------------------------------------------------------------+------------
      829 | Avocado Toast (Vegan)                                        | 0.15672222
      836 | Vegetarian Tortilla Soup                                     | 0.17583494
      922 | Vegan Overnight Oats with Chia Seeds and Fruit               | 0.17668104
      600 | Spinach and Banana Power Smoothie                            |  0.1773768
      519 | Smokey Butternut Squash Soup                                 | 0.18031077
      604 | Vegan Banana Muffins                                         | 0.18287598
      832 | Kale, Quinoa, and Avocado Salad with Lemon Dijon Vinaigrette | 0.18368931
      617 | Hearty Breakfast Muffins                                     | 0.18737361
      946 | Chia Coconut Pudding with Coconut Milk                       |  0.1884186
      468 | Spicy Oven-Roasted Plums                                     | 0.18994217
(10 rows)