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


Система рекомендаций с База данных Azure для PostgreSQL — гибкий сервер и Azure OpenAI

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

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

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

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

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

Создайте и разверните ресурс Службы Azure OpenAI и модель, разверните модель внедрения текста-внедрения-ada-002. Скопируйте имя развертывания, так как требуется для создания внедрения.

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

Прежде чем включить и pgvector на azure_ai База данных Azure для PostgreSQL гибкий экземпляр сервера, необходимо добавить их в список разрешений, как описано в том, как использовать расширения 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>');

Скачивание и импорт данных

  1. Скачайте данные из Kaggle.
  2. Подключитесь к серверу и создайте test базу данных, а в ней создайте таблицу, в которой будут импортированы данные.
  3. Импорт данных.
  4. Добавьте в таблицу столбец внедрения.
  5. Создайте внедрения.
  6. Поиск.

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

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. Этот шаг необходим, так как этот конкретный набор данных использует кодировку WIN1252.

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
    recommend_recipe(sampleRecipeId int, numResults int)
returns table(
            out_recipeName text,
            out_nutrition text,
            out_similarityScore real)
as $$
declare
    queryEmbedding vector(1536);
    sampleRecipeText text;
begin
    sampleRecipeText := (select
                            recipe_name||' '||cuisine_path||' '||ingredients||' '||nutrition||' '||directions
                        from
                            recipes where rid = sampleRecipeId);

    queryEmbedding := (azure_openai.create_embeddings('text-embedding-ada-002',sampleRecipeText));

    return query
    select
        distinct r.recipe_name,
        r.nutrition,
        (r.embedding <=> queryEmbedding)::real as score
    from
        recipes r
    order by score asc limit numResults; -- cosine distance
end $$
language plpgsql;

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

select out_recipename, out_similarityscore from recommend_recipe(1, 20); -- search for 20 recipe recommendations that closest to recipeId 1

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

            out_recipename             | out_similarityscore
---------------------------------------+---------------------
 Apple Pie by Grandma Ople             |                   0
 Easy Apple Pie                        |          0.05137232
 Grandma's Iron Skillet Apple Pie      |         0.054287136
 Old Fashioned Apple Pie               |         0.058492836
 Apple Hand Pies                       |          0.06449003
 Apple Crumb Pie                       |          0.07290977
 Old-Fashioned Apple Dumplings         |         0.078374185
 Fried Apple Pies                      |          0.07918481
 Apple Pie Filling                     |         0.084320426
 Apple Turnovers                       |          0.08576391
 Dutch Apple Pie with Oatmeal Streusel |          0.08779895
 Apple Crisp - Perfect and Easy        |          0.09170883
 Delicious Cinnamon Baked Apples       |          0.09384012
 Easy Apple Crisp with Pie Filling     |          0.09477234
 Jump Rope Pie                         |          0.09503954
 Easy Apple Strudel                    |         0.095167875
 Apricot Pie                           |          0.09634114
 Easy Apple Crisp with Oat Topping     |          0.09708358
 Baked Apples                          |          0.09826993
 Pear Pie                              |         0.099974394
(20 rows)