Bagikan melalui


Tutorial: Membuat pencarian semantik dengan Azure Database for PostgreSQL dan Azure OpenAI

BERLAKU UNTUK: Azure Database for PostgreSQL - Server Fleksibel

Tutorial langsung ini menunjukkan kepada Anda cara membuat aplikasi pencarian semantik dengan menggunakan Azure Database for PostgreSQL dan Azure OpenAI.

Pencarian semantik melakukan pencarian berdasarkan semantik. Pencarian leksikal standar melakukan pencarian berdasarkan kata kunci yang disediakan dalam kueri. Misalnya, himpunan data resep Anda mungkin tidak berisi label seperti bebas gluten, vegan, bebas susu, bebas buah, atau makanan penutup, tetapi karakteristik ini dapat disimpulkan dari bahan-bahannya. Idenya adalah mengeluarkan kueri semantik tersebut dan mendapatkan hasil pencarian yang relevan.

Di tutorial ini, Anda akan:

  • Identifikasi skenario pencarian dan bidang data yang akan terlibat dalam pencarian.
  • Untuk setiap bidang data yang terlibat dalam pencarian, buat bidang vektor terkait untuk menyimpan penyematan nilai yang disimpan di bidang data.
  • Buat penyematan untuk data di bidang data yang dipilih dan simpan penyematan di bidang vektor yang sesuai.
  • Buat representasi vektor untuk setiap kueri pencarian input.
  • Cari bidang data vektor dan cantumkan tetangga terdekat.
  • Jalankan hasilnya melalui model relevansi, peringkat, dan personalisasi yang sesuai untuk menghasilkan peringkat akhir. Dengan tidak adanya model tersebut, beri peringkat hasil dalam mengurangi urutan produk titik.
  • Pantau model, kualitas hasil, dan metrik bisnis, seperti rasio klik-tayang dan waktu tinggal di situs. Masukkan mekanisme umpan balik untuk men-debug dan meningkatkan tumpukan pencarian, dari kualitas data, kesegaran data, dan personalisasi hingga pengalaman pengguna.

Prasyarat

  1. Buat akun OpenAI dan minta akses ke Azure OpenAI.
  2. Berikan akses ke Azure OpenAI dalam langganan yang diinginkan.
  3. Berikan izin untuk membuat sumber daya Azure OpenAI dan untuk menyebarkan model.
  4. Membuat dan menyebarkan sumber daya Azure OpenAI dan model. Implementasikan model embedding text-embedding-ada-002. Salin nama penyebaran, karena Anda memerlukannya untuk membuat embedding.

Mengaktifkan ekstensi azure_ai dan pgvector

Sebelum dapat mengaktifkan azure_ai dan pgvector di server fleksibel Azure Database for PostgreSQL, Anda perlu menambahkannya ke daftar yang diizinkan. Pastikan bahwa mereka ditambahkan dengan benar dengan menjalankan SHOW azure.extensions;.

Kemudian Anda dapat menginstal ekstensi dengan menyambungkan ke database target Anda dan menjalankan perintah CREATE EXTENSION . Anda perlu mengulangi perintah secara terpisah untuk setiap database tempat Anda ingin ekstensi tersedia.

CREATE EXTENSION azure_ai;
CREATE EXTENSION vector;

Konfigurasikan titik akhir dan kunci OpenAI

Di layanan Azure AI, di bawah Kunci Manajemen >Sumber Dayadan Titik Akhir, Anda dapat menemukan titik akhir dan kunci untuk sumber daya Azure AI Anda. Gunakan endpoint dan salah satu kunci untuk mengaktifkan ekstensi azure_ai guna memanggil penyebaran model.

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

Mengunduh data

Unduh data dari Kaggle.

Membuat tabel

Sambungkan ke server Anda dan buat test database. Dalam database tersebut, gunakan perintah berikut untuk membuat tabel tempat Anda akan mengimpor data:

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

Impor data

Atur variabel lingkungan berikut pada jendela klien untuk mengatur pengodean ke UTF-8. Langkah ini diperlukan karena himpunan data khusus ini menggunakan pengodean Windows-1252.

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

Impor data ke dalam tabel yang Anda buat. Perhatikan bahwa himpunan data ini berisi baris header.

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

Menambahkan kolom untuk menyimpan penyematan

Tambahkan kolom penyematan ke tabel:

ALTER TABLE recipes ADD COLUMN embedding vector(1536);

Hasilkan penyematan

Hasilkan embedding untuk data Anda dengan menggunakan ekstensi azure_ai. Contoh berikut mem-vektorisasi beberapa bidang dan digabungkan.

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;

Ulangi perintah hingga tidak ada lagi baris yang akan diproses.

Petunjuk / Saran

Bereksperimen dengan LIMIT. Karena nilai yang tinggi, pernyataan mungkin gagal di tengah jalan karena pembatasan yang diberlakukan oleh Azure OpenAI. Jika pernyataan gagal, tunggu setidaknya satu menit dan jalankan perintah lagi.

Buat fungsi pencarian di database Anda untuk kenyamanan:

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;

Sekarang hanya memanggil fungsi untuk mencari:

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

Dan jelajahi hasilnya:

 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)