Pengambilan Lintas Korpus Mesin RAG

Penting: Tetapkan description korpus saat membuat korpus RAG. description tidak dapat diedit setelah dibuat. Deskripsi berkualitas tinggi sangat penting untuk pengambilan lintas korpus yang efektif, karena sistem mengandalkannya untuk memilih korpus yang sesuai untuk kueri Anda.

Halaman ini menjelaskan dua API, AsyncRetrieveContexts dan AskContexts, yang mendukung Pengambilan Lintas Korpus RAG, yang didukung oleh Agentic Retrieval di backend.

AsyncRetrieveContexts API: Ini adalah API asinkron yang memungkinkan pengguna mengambil konteks yang relevan dari beberapa korpus yang dikelola RAG. Ini adalah API yang berjalan lama. Pengguna dapat menggunakan ID operasi untuk mendapatkan status kueri dan hasil.

AskContexts API: Ini adalah API sinkron yang langsung menghasilkan jawaban atas kueri dengan menelusuri beberapa korpus yang dikelola RAG.

Penting: Untuk menggunakan fitur ini, Anda harus memberikan peran Vertex AI User di project Anda ke akun layanan RAG Engine di Gemini Enterprise Agent Platform: service-[Your project's automatically generated project number]@gcp-sa-vertex-rag.iam.gserviceaccount.com.

Penting: Fitur ini hanya tersedia di us-central1.

Arsitektur Sistem dan Pemilihan Korpus

Bagian ini menjelaskan arsitektur sistem RAG Cross Corpus Retrieval dan cara sistem ini memilih korpus yang sesuai untuk pengambilan.

Arsitektur Sistem

Sistem Cross Corpus Retrieval menggunakan pendekatan agentic untuk mengatur pengambilan di beberapa korpus. Ringkasan tingkat tinggi arsitektur mencakup komponen berikut:

  • Orchestrator/Router: Menerima kueri pengguna dan mengoordinasikan proses pengambilan.
  • Agen Perencanaan: Menganalisis kueri dan menentukan korpus mana yang paling relevan berdasarkan descriptions-nya.
  • Retrieval Engine: Melakukan penelusuran semantik pada korpus RAG yang dipilih.
  • Reasoning Agent: Mengevaluasi apakah konteks yang diambil sudah cukup untuk menjawab kueri. Jika tidak memadai, model akan menghasilkan masukan untuk memicu loop pengambilan lain berdasarkan Sufficient Context Awareness (SCA). Untuk mengetahui detail selengkapnya, lihat postingan blog SCA dan makalah riset.
  • Generator LLM (untuk AskContexts): Melakukan sintesis konteks yang diambil untuk menghasilkan jawaban akhir.
Arsitektur Pengambilan Lintas Korpus

Cara Korpus Dipilih

Saat kueri dijalankan di beberapa korpus yang dikelola RAG, sistem harus menentukan korpus mana yang berisi informasi yang diperlukan untuk menjawab kueri. Hal ini dicapai melalui Pengambilan Data Agentic:

  1. Pemetaan Korpus: Sistem mengelola peta korpus RAG yang tersedia beserta deskripsi teknisnya (ditentukan di kolom description korpus RAG).
  2. Pencocokan Semantik: Agen perencanaan strategis (didukung oleh model Gemini) mengevaluasi kueri pengguna terhadap descriptions korpus yang tersedia.
  3. Pemilihan Rute yang Ditargetkan: Planner menghasilkan rencana pengambilan yang memetakan bagian tertentu dari kueri ke korpus yang paling relevan, sehingga memastikan pengambilan yang terfokus dan efisien, bukan menelusuri semua korpus secara naif.

Contoh Kode

Contoh kode berikut menunjukkan cara menggunakan API RAG Cross Corpus Retrieval.

AsyncRetrieveContexts API

Contoh kode ini menunjukkan cara mengambil konteks dari beberapa korpus RAG secara asinkron.

Python

from vertexai.preview import rag
import vertexai

PROJECT_ID = "PROJECT_ID"
LOCATION = "LOCATION"
RAG_CORPUS_1_ID = "RAG_CORPUS_1_ID"
RAG_CORPUS_2_ID = "RAG_CORPUS_2_ID"

# Initialize API once per session
vertexai.init(project=PROJECT_ID, location=LOCATION)

# Async retrieve contexts from multiple corpora
# This can be run in an environment like a Colab notebook.
response = await rag.async_retrieve_contexts(
    text="Why is the sky blue?",
    rag_resources=[
        rag.RagResource(
            rag_corpus=f"projects/{PROJECT_ID}/locations/{LOCATION}/ragCorpora/{RAG_CORPUS_1_ID}",
        ),
        rag.RagResource(
            rag_corpus=f"projects/{PROJECT_ID}/locations/{LOCATION}/ragCorpora/{RAG_CORPUS_2_ID}",
        ),
    ],
)
print(response)

REST

PROJECT_ID="PROJECT_ID"
LOCATION="LOCATION"
RAG_CORPUS_1_ID="RAG_CORPUS_1_ID"
RAG_CORPUS_2_ID="RAG_CORPUS_2_ID"
QUERY="Why is the sky blue?"

curl -X POST \
  -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  -H "Content-Type: application/json" \
  "https://${LOCATION}-aiplatform.googleapis.com/v1beta1/projects/${PROJECT_ID}/locations/${LOCATION}:asyncRetrieveContexts" \
  -d '{
    "query": {
      "text": "'"$QUERY"'"
    },
    "tools": {
      "retrieval": {
        "disable_attribution": false,
        "vertex_rag_store": {
          "rag_resources": {
            "rag_corpus": "projects/'"${PROJECT_ID}"'/locations/'"${LOCATION}"'/ragCorpora/'"${RAG_CORPUS_1_ID}"'"
          },
          "rag_resources": {
            "rag_corpus": "projects/'"${PROJECT_ID}"'/locations/'"${LOCATION}"'/ragCorpora/'"${RAG_CORPUS_2_ID}"'"
          }
        }
      }
    }
  }'

Mendapatkan Hasil Operasi

Karena AsyncRetrieveContexts adalah operasi yang berjalan lama, Anda dapat menggunakan GetOperations API untuk melakukan polling hasil menggunakan ID operasi.

Python

from google.cloud import aiplatform_v1beta1

PROJECT_ID = "PROJECT_ID"
LOCATION = "LOCATION"
OPERATION_ID = "OPERATION_ID"

client = aiplatform_v1beta1.VertexRagServiceClient(
    client_options={"api_endpoint": f"{LOCATION}-aiplatform.googleapis.com"}
)

operation = client.get_operation(
    request={"name": f"projects/{PROJECT_ID}/locations/{LOCATION}/operations/{OPERATION_ID}"}
)

if operation.done:
    print(operation.response)
else:
    print("Operation is still running")

REST

PROJECT_ID="PROJECT_ID"
LOCATION="LOCATION"
OPERATION_ID="OPERATION_ID"

curl -X GET \
  -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  "https://${LOCATION}-aiplatform.googleapis.com/v1beta1/projects/${PROJECT_ID}/locations/${LOCATION}/operations/${OPERATION_ID}"

AskContexts API

Contoh kode ini menunjukkan cara langsung menghasilkan jawaban dengan menelusuri beberapa korpus RAG secara sinkron.

Python

from vertexai.preview import rag
import vertexai

PROJECT_ID = "PROJECT_ID"
LOCATION = "LOCATION"
RAG_CORPUS_1_ID = "RAG_CORPUS_1_ID"
RAG_CORPUS_2_ID = "RAG_CORPUS_2_ID"

# Initialize API once per session
vertexai.init(project=PROJECT_ID, location=LOCATION)

# Ask contexts from multiple corpora
response = rag.ask_contexts(
    text="Why is the sky blue?",
    rag_resources=[
        rag.RagResource(
            rag_corpus=f"projects/{PROJECT_ID}/locations/{LOCATION}/ragCorpora/{RAG_CORPUS_1_ID}",
        ),
        rag.RagResource(
            rag_corpus=f"projects/{PROJECT_ID}/locations/{LOCATION}/ragCorpora/{RAG_CORPUS_2_ID}",
        ),
    ],
)
print(response)

REST

PROJECT_ID="PROJECT_ID"
LOCATION="LOCATION"
RAG_CORPUS_1_ID="RAG_CORPUS_1_ID"
RAG_CORPUS_2_ID="RAG_CORPUS_2_ID"
QUERY="Why is the sky blue?"

curl -X POST \
  -H "Authorization: Bearer $(gcloud auth print-access-token)" \
  -H "Content-Type: application/json" \
  "https://${LOCATION}-aiplatform.googleapis.com/v1beta1/projects/${PROJECT_ID}/locations/${LOCATION}:askContexts" \
  -d '{
    "query": {
      "text": "'"$QUERY"'"
    },
    "tools": {
      "retrieval": {
        "disable_attribution": false,
        "vertex_rag_store": {
          "rag_resources": {
            "rag_corpus": "projects/'"${PROJECT_ID}"'/locations/'"${LOCATION}"'/ragCorpora/'"${RAG_CORPUS_1_ID}"'"
          },
          "rag_resources": {
            "rag_corpus": "projects/'"${PROJECT_ID}"'/locations/'"${LOCATION}"'/ragCorpora/'"${RAG_CORPUS_2_ID}"'"
          }
        }
      }
    }
  }'

Langkah berikutnya