Melakukan penelusuran semantik dan retrieval-augmented generation

Tutorial ini memandu Anda melalui proses end-to-end untuk membuat dan menggunakan embedding teks untuk penelusuran semantik dan retrieval-augmented generation (RAG).

Tutorial ini membahas tugas-tugas berikut:

  • Membuat model jarak jauh BigQuery ML melalui model embedding Vertex AI.
  • Menggunakan model jarak jauh dengan fungsi ML.GENERATE_EMBEDDING untuk membuat embedding dari teks dalam tabel BigQuery.
  • Membuat indeks vektor untuk mengindeks embedding guna meningkatkan performa penelusuran.
  • Menggunakan fungsi VECTOR_SEARCH dengan embedding untuk menelusuri teks serupa.
  • Lakukan RAG dengan membuat teks menggunakan fungsi ML.GENERATE_TEXT, dan menggunakan hasil penelusuran vektor untuk meningkatkan input perintah dan meningkatkan hasil.

Tutorial ini menggunakan tabel publik BigQuery patents-public-data.google_patents_research.publications.

Peran yang diperlukan

Untuk menjalankan tutorial ini, Anda memerlukan peran Identity and Access Management (IAM) berikut:

  • Membuat dan menggunakan set data, koneksi, dan model BigQuery: Admin BigQuery (roles/bigquery.admin).
  • Memberikan izin ke akun layanan koneksi: Project IAM Admin (roles/resourcemanager.projectIamAdmin).

Peran yang telah ditetapkan ini berisi izin yang diperlukan untuk melakukan tugas dalam dokumen ini. Untuk melihat izin yang benar-benar diperlukan, luaskan bagian Izin yang diperlukan:

Izin yang diperlukan

  • Buat set data: bigquery.datasets.create
  • Membuat, mendelegasikan, dan menggunakan koneksi: bigquery.connections.*
  • Menetapkan koneksi default: bigquery.config.*
  • Tetapkan izin akun layanan: resourcemanager.projects.getIamPolicy dan resourcemanager.projects.setIamPolicy
  • Buat model dan jalankan inferensi:
    • bigquery.jobs.create
    • bigquery.models.create
    • bigquery.models.getData
    • bigquery.models.updateData
    • bigquery.models.updateMetadata

Anda mungkin juga bisa mendapatkan izin ini dengan peran khusus atau peran bawaan lainnya.

Biaya

Dalam dokumen ini, Anda akan menggunakan komponen Google Cloudyang dapat ditagih berikut:

  • BigQuery ML: You incur costs for the data that you process in BigQuery.
  • Vertex AI: You incur costs for calls to the Vertex AI service that's represented by the remote model.

Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan Anda, gunakan kalkulator harga.

Pengguna Google Cloud baru mungkin memenuhi syarat untuk mendapatkan uji coba gratis.

Untuk mengetahui informasi selengkapnya tentang harga BigQuery, lihat harga BigQuery dalam dokumentasi BigQuery.

Untuk mengetahui informasi selengkapnya tentang harga Vertex AI, lihat halaman harga Vertex AI.

Sebelum memulai

  1. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  2. Make sure that billing is enabled for your Google Cloud project.

  3. Enable the BigQuery, BigQuery Connection, and Vertex AI APIs.

    Enable the APIs

Membuat set data

Buat set data BigQuery untuk menyimpan model ML Anda.

Konsol

  1. Di Google Cloud konsol, buka halaman BigQuery.

    Buka halaman BigQuery

  2. Di panel Explorer, klik nama project Anda.

  3. Klik View actions > Create dataset.

    Opsi menu Create dataset.

  4. Di halaman Create dataset, lakukan hal berikut:

    • Untuk Dataset ID, masukkan bqml_tutorial.

    • Untuk Location type, pilih Multi-region, lalu pilih US (multiple regions in United States).

    • Jangan ubah setelan default yang tersisa, lalu klik Create dataset.

bq

Untuk membuat set data baru, gunakan perintah bq mk dengan flag --location. Untuk daftar lengkap kemungkinan parameter, lihat referensi perintah bq mk --dataset.

  1. Buat set data bernama bqml_tutorial dengan lokasi data yang ditetapkan ke US dan deskripsi BigQuery ML tutorial dataset:

    bq --location=US mk -d \
     --description "BigQuery ML tutorial dataset." \
     bqml_tutorial

    Perintah ini menggunakan pintasan -d, bukan flag --dataset. Jika Anda menghapus -d dan --dataset, perintah defaultnya adalah membuat set data.

  2. Pastikan set data telah dibuat:

    bq ls

API

Panggil metode datasets.insert dengan resource set data yang ditentukan.

{
  "datasetReference": {
     "datasetId": "bqml_tutorial"
  }
}

DataFrame BigQuery

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan BigQuery DataFrames di Panduan memulai BigQuery menggunakan BigQuery DataFrames. Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi BigQuery DataFrames.

Untuk melakukan autentikasi ke BigQuery, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan ADC untuk lingkungan pengembangan lokal.

import google.cloud.bigquery

bqclient = google.cloud.bigquery.Client()
bqclient.create_dataset("bqml_tutorial", exists_ok=True)

Membuat model jarak jauh untuk pembuatan penyematan teks

Buat model jarak jauh yang merepresentasikan model pembuatan penyematan teks Vertex AI yang dihosting:

  1. Di Google Cloud konsol, buka halaman BigQuery.

    Buka BigQuery

  2. Di editor kueri, jalankan pernyataan berikut:

    CREATE OR REPLACE MODEL `bqml_tutorial.embedding_model`
      REMOTE WITH CONNECTION DEFAULT
      OPTIONS (ENDPOINT = 'text-embedding-005');

    Kueri memerlukan waktu beberapa detik untuk diselesaikan, setelah itu model embedding_model akan muncul di set data bqml_tutorial di panel Explorer. Karena kueri menggunakan pernyataan CREATE MODEL untuk membuat model, tidak akan ada hasil kueri.

Membuat embedding teks

Buat penyematan teks dari abstrak paten menggunakan fungsi ML.GENERATE_EMBEDDING, lalu tulis ke tabel BigQuery agar dapat dicari.

  1. Di Google Cloud konsol, buka halaman BigQuery.

    Buka BigQuery

  2. Di editor kueri, jalankan pernyataan berikut:

    CREATE OR REPLACE TABLE `bqml_tutorial.embeddings` AS
    SELECT * FROM ML.GENERATE_EMBEDDING(
      MODEL `bqml_tutorial.embedding_model`,
      (
        SELECT *, abstract AS content
        FROM `patents-public-data.google_patents_research.publications`
        WHERE LENGTH(abstract) > 0 AND LENGTH(title) > 0 AND country = 'Singapore'
      )
    )
    WHERE LENGTH(ml_generate_embedding_status) = 0;

Kueri ini membutuhkan waktu sekitar 5 menit untuk diselesaikan.

Pembuatan embedding menggunakan fungsi ML.GENERATE_EMBEDDING mungkin gagal karena kuota LLM Vertex AI atau layanan tidak tersedia. Detail error ditampilkan di kolom ml_generate_embedding_status. Kolom ml_generate_embedding_status yang kosong menunjukkan pembuatan sematan berhasil.

Untuk metode pembuatan embedding teks alternatif di BigQuery, lihat Tutorial Menyematkan teks dengan model TensorFlow yang telah dilatih sebelumnya.

Membuat indeks vektor

Jika Anda membuat indeks vektor pada kolom embedding, penelusuran vektor yang dilakukan pada kolom tersebut akan menggunakan teknik penelusuran Tetangga Terdekat Perkiraan. Teknik ini meningkatkan performa penelusuran vektor, dengan mengurangi recall dan menampilkan hasil yang lebih mendekati.

Untuk membuat indeks vektor, gunakan pernyataan bahasa definisi data (DDL) CREATE VECTOR INDEX:

  1. Buka halaman BigQuery.

    Buka BigQuery

  2. Di editor kueri, jalankan pernyataan SQL berikut:

    CREATE OR REPLACE VECTOR INDEX my_index
    ON `bqml_tutorial.embeddings`(ml_generate_embedding_result)
    OPTIONS(index_type = 'IVF',
      distance_type = 'COSINE',
      ivf_options = '{"num_lists":500}')

Membuat indeks vektor biasanya hanya memerlukan waktu beberapa detik. Diperlukan waktu 2 atau 3 menit lagi agar indeks vektor terisi dan siap digunakan.

Memverifikasi kesiapan indeks vektor

Indeks vektor diisi secara asinkron. Anda dapat memeriksa apakah indeks siap digunakan dengan membuat kueri tampilan INFORMATION_SCHEMA.VECTOR_INDEXES dan memverifikasi bahwa nilai kolom coverage_percentage lebih besar dari 0 dan nilai kolom last_refresh_time bukan NULL.

  1. Buka halaman BigQuery.

    Buka BigQuery

  2. Di editor kueri, jalankan pernyataan SQL berikut:

    SELECT table_name, index_name, index_status,
    coverage_percentage, last_refresh_time, disable_reason
    FROM `PROJECT_ID.bqml_tutorial.INFORMATION_SCHEMA.VECTOR_INDEXES`

    Ganti PROJECT_ID dengan project ID Anda.

Melakukan penelusuran kemiripan teks menggunakan indeks vektor

Gunakan fungsi VECTOR_SEARCH untuk menelusuri paten yang relevan dan cocok dengan embedding yang dihasilkan dari kueri teks.

Argumen top_k menentukan jumlah kecocokan yang akan ditampilkan, dalam hal ini lima. Opsi fraction_lists_to_search menentukan persentase daftar indeks vektor yang akan ditelusuri. Indeks vektor yang Anda buat memiliki 500 daftar, sehingga nilai fraction_lists_to_search dari .01 menunjukkan bahwa penelusuran vektor ini memindai lima daftar tersebut. Nilai fraction_lists_to_search yang lebih rendah seperti yang ditunjukkan di sini memberikan recall yang lebih rendah dan performa yang lebih cepat. Untuk mengetahui informasi selengkapnya tentang daftar indeks vektor, lihat opsi indeks vektor num_lists.

Model yang Anda gunakan untuk membuat embedding dalam kueri ini harus sama dengan model yang Anda gunakan untuk membuat embedding dalam tabel yang Anda bandingkan, jika tidak, hasil penelusuran tidak akan akurat.

  1. Buka halaman BigQuery.

    Buka BigQuery

  2. Di editor kueri, jalankan pernyataan SQL berikut:

    SELECT query.query, base.publication_number, base.title, base.abstract
    FROM VECTOR_SEARCH(
      TABLE `bqml_tutorial.embeddings`, 'ml_generate_embedding_result',
      (
      SELECT ml_generate_embedding_result, content AS query
      FROM ML.GENERATE_EMBEDDING(
      MODEL `bqml_tutorial.embedding_model`,
      (SELECT 'improving password security' AS content))
      ),
      top_k => 5, options => '{"fraction_lists_to_search": 0.01}')

    Outputnya mirip dengan hal berikut ini:

    +-----------------------------+--------------------+-------------------------------------------------+-------------------------------------------------+
    |            query            | publication_number |                       title                     |                      abstract                   |
    +-----------------------------+--------------------+-------------------------------------------------+-------------------------------------------------+
    | improving password security | SG-120868-A1       | Data storage device security method and a...    | Methods for improving security in data stora... |
    | improving password security | SG-10201610585W-A  | Passsword management system and process...      | PASSSWORD MANAGEMENT SYSTEM AND PROCESS ...     |
    | improving password security | SG-148888-A1       | Improved system and method for...               | IMPROVED SYSTEM AND METHOD FOR RANDOM...        |
    | improving password security | SG-194267-A1       | Method and system for protecting a password...  | A system for providing security for a...        |
    | improving password security | SG-120868-A1       | Data storage device security...                 | Methods for improving security in data...       |
    +-----------------------------+--------------------+-------------------------------------------------+-------------------------------------------------+
    

Membuat model jarak jauh untuk pembuatan teks

Buat model jarak jauh yang merepresentasikan model pembuatan teks Vertex AI yang dihosting:

  1. Di Google Cloud konsol, buka halaman BigQuery.

    Buka BigQuery

  2. Di editor kueri, jalankan pernyataan berikut:

    CREATE OR REPLACE MODEL `bqml_tutorial.text_model`
      REMOTE WITH CONNECTION DEFAULT
      OPTIONS (ENDPOINT = 'gemini-1.5-flash-002');

    Kueri memerlukan waktu beberapa detik untuk diselesaikan, setelah itu model text_model akan muncul di set data bqml_tutorial di panel Explorer. Karena kueri menggunakan pernyataan CREATE MODEL untuk membuat model, tidak akan ada hasil kueri.

Menghasilkan teks yang ditingkatkan dengan hasil penelusuran vektor

Berikan hasil penelusuran sebagai perintah untuk membuat teks dengan fungsi ML.GENERATE_TEXT

  1. Di Google Cloud konsol, buka halaman BigQuery.

    Buka BigQuery

  2. Di editor kueri, jalankan pernyataan berikut:

    SELECT ml_generate_text_llm_result AS generated, prompt
    FROM ML.GENERATE_TEXT(
      MODEL `bqml_tutorial.text_model`,
      (
        SELECT CONCAT(
          'Propose some project ideas to improve user password security using the context below: ',
          STRING_AGG(
            FORMAT("patent title: %s, patent abstract: %s", base.title, base.abstract),
            ',\n')
          ) AS prompt,
        FROM VECTOR_SEARCH(
          TABLE `bqml_tutorial.embeddings`, 'ml_generate_embedding_result',
          (
            SELECT ml_generate_embedding_result, content AS query
            FROM ML.GENERATE_EMBEDDING(
              MODEL `bqml_tutorial.embedding_model`,
             (SELECT 'improving password security' AS content)
            )
          ),
        top_k => 5, options => '{"fraction_lists_to_search": 0.01}')
      ),
      STRUCT(600 AS max_output_tokens, TRUE AS flatten_json_output));

    Outputnya mirip dengan hal berikut ini:

    +------------------------------------------------+------------------------------------------------------------+
    |            generated                           | prompt                                                     |
    +------------------------------------------------+------------------------------------------------------------+
    | These patents suggest several project ideas to | Propose some project ideas to improve user password        |
    | improve user password security.  Here are      | security using the context below: patent title: Active     |
    | some, categorized by the patent they build     | new password entry dialog with compact visual indication   |
    | upon:                                          | of adherence to password policy, patent abstract:          |
    |                                                | An active new password entry dialog provides a compact     |
    | **I. Projects based on "Active new password    | visual indication of adherence to password policies. A     |
    | entry dialog with compact visual indication of | visual indication of progress towards meeting all          |
    | adherence to password policy":**               | applicable password policies is included in the display    |
    |                                                | and updated as new password characters are being...        |
    +------------------------------------------------+------------------------------------------------------------+
     

Pembersihan

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

Langkah berikutnya