Поделиться через


Руководство по созданию семантического поиска с помощью Базы данных Azure для PostgreSQL и Azure OpenAI

ОБЛАСТЬ ПРИМЕНЕНИЯ: База данных Azure для PostgreSQL — гибкий сервер

В этом практическом руководстве показано, как создать семантические приложения поиска с помощью Базы данных Azure для PostgreSQL и Azure OpenAI.

Семантический поиск выполняет поиск на основе семантики. Стандартный лексический поиск выполняет поиск на основе ключевых слов, предоставленных в запросе. Например, набор данных рецептов может не содержать такие метки, как безглютеновые, веганские, без молочных продуктов, без фруктов или десерты, но эти характеристики могут быть выведены из ингредиентов. Идея заключается в том, чтобы выдавать такие семантические запросы и получать соответствующие результаты поиска.

Изучив это руководство, вы:

  • Определите сценарии поиска и поля данных, которые будут участвовать в поиске.
  • Для каждого поля данных, связанного с поиском, создайте соответствующее поле вектора для хранения внедренных значений, хранящихся в поле данных.
  • Создайте внедренные данные в выбранные поля данных и сохраните внедренные в соответствующие векторные поля.
  • Создайте векторное представление для любого поискового запроса.
  • Найдите поле векторных данных и укажите ближайшие соседи.
  • Для получения окончательного рейтинга обработайте результаты через соответствующие модели релевантности, ранжирования и персонализации. В отсутствие таких моделей ранжировать результаты в снижении порядка dot-product.
  • Отслеживайте модель, качество результатов и бизнес-метрики, такие как скорость щелчка и время ожидания. Включите механизмы обратной связи для отладки и улучшения стека поиска, от качества данных, свежести данных и персонализации до пользовательского интерфейса.

Необходимые компоненты

  1. Создайте учетную запись OpenAI и запросите доступ к Azure OpenAI.
  2. Предоставьте доступ к Azure OpenAI в нужной подписке.
  3. Предоставьте разрешения на создание ресурсов Azure OpenAI и развертывание моделей.
  4. Создайте и разверните ресурс Azure OpenAI и модель. Разверните модель эмбеддингов ada-002. Скопируйте имя развертывания, потому что оно потребуется, чтобы создать эмбеддинги.

Включение расширений azure_ai и pgvector

Прежде чем включить azure_ai и pgvector на гибком сервере Базы данных Azure для PostgreSQL, необходимо добавить их в список разрешений. Убедитесь, что они правильно добавлены, выполнив команду SHOW azure.extensions;.

Затем можно установить расширение, подключився к целевой базе данных и выполнив команду CREATE EXTENSION . Необходимо повторить команду отдельно для каждой базы данных, в которой необходимо, чтобы расширение было доступно.

CREATE EXTENSION azure_ai;
CREATE EXTENSION vector;

Настройка конечной точки и ключа OpenAI

В службах ИИ Azure в разделе "Ключи управления> ресурсами" и "Конечные точки" можно найти конечную точку и ключи для ресурса ИИ Azure. Используйте конечную точку и один из ключей, чтобы включить azure_ai расширение для вызова развертывания модели:

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

Скачивание данных

Скачайте данные из Kaggle.

Создание таблицы

Подключитесь к серверу и создайте test базу данных. В этой базе данных используйте следующую команду, чтобы создать таблицу, в которой будут импортированы данные:

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)
);

Импорт данных

Задайте следующую переменную среды в окне клиента, чтобы задать кодировку UTF-8. Этот шаг необходим, так как этот конкретный набор данных использует кодировку Windows-1252.

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

Импортируйте данные в созданную таблицу. Обратите внимание, что этот набор данных содержит строку заголовка.

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

Добавление столбца для хранения внедренных данных

Добавьте в таблицу столбец встраивания.

ALTER TABLE recipes ADD COLUMN embedding vector(1536);

Создание внедрения

Создайте эмбеддинги для ваших данных с помощью расширения azure_ai. В следующем примере несколько полей векторизируются и конкатенируются.

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;

Повторите команду, пока не будет больше строк для обработки.

Совет

Экспериментируйте со значением LIMIT. С высоким значением запрос может завершиться на полпути из-за ограничения, налагаемого Azure OpenAI. Если инструкция завершается ошибкой, подождите хотя бы одну минуту и повторите команду.

Создайте функцию поиска в базе данных для удобства:

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;

Теперь просто вызовите функцию для поиска:

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

И изучите результаты:

 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)