Menggunakan Mesin RAG Vertex AI di Gemini Live API

Retrieval-augmented generation (RAG) adalah teknik yang digunakan untuk mengambil dan memberikan informasi yang relevan ke LLM untuk menghasilkan respons yang dapat diverifikasi. Informasi ini dapat mencakup informasi terbaru, topik dan konteks, atau kebenaran dasar.

Halaman ini menunjukkan cara menggunakan Mesin RAG Vertex AI dengan Gemini Live API, yang memungkinkan Anda menentukan dan mengambil informasi dari korpus RAG.

Prasyarat

Prasyarat berikut harus diselesaikan sebelum Anda dapat menggunakan Vertex AI RAG Engine dengan Live API multimodal:

  1. Aktifkan RAG API di Vertex AI.

  2. Buat contoh RAG Corpus.

  3. Untuk mengupload file ke RAG Corpus, lihat Contoh API impor file RAG.

Siapkan

Anda dapat menggunakan Vertex AI RAG Engine dengan Live API dengan menentukan Vertex AI RAG Engine sebagai alat. Contoh kode berikut menunjukkan cara menentukan Vertex AI RAG Engine sebagai alat:

Ganti variabel berikut:

  • YOUR_PROJECT_ID: ID project Google Cloud Anda.
  • YOUR_CORPUS_ID: ID korpus Anda.
  • YOUR_LOCATION: Region untuk memproses permintaan.
PROJECT_ID = "YOUR_PROJECT_ID"
RAG_CORPUS_ID = "YOUR_CORPUS_ID"
LOCATION = "YOUR_LOCATION"

TOOLS = {
  "retrieval": {
    "vertex_rag_store": {
    "rag_resources": {
          "rag_corpus": "projects/${PROJECT_ID}/locations/${LOCATION}/ragCorpora/${RAG_CORPUS_ID}"
        }
     }
}

Menggunakan Websocket untuk komunikasi real-time

Untuk mengaktifkan komunikasi real-time antara klien dan server, Anda harus menggunakan Websocket. Contoh kode ini menunjukkan cara menggunakan Websocket menggunakan Python API dan Python SDK.

Python API

CONFIG = {"response_modalities": ["TEXT"], "speech_config": { "language_code": "en-US" }}
headers = {
  "Content-Type": "application/json",
  "Authorization": f"Bearer {bearer_token[0]}",
}
HOST= "${LOCATION}-aiplatform.googleapis.com"
SERVICE_URL = f"wss://{HOST}/ws/google.cloud.aiplatform.v1beta1.LlmBidiService/BidiGenerateContent"
MODEL="gemini-2.0-flash-exp"

# Connect to the server
async with connect(SERVICE_URL, additional_headers=headers) as ws:
  # Setup the session
  await ws.send(
json.dumps(
          {
              "setup": {
                  "model": MODEL,
                  "generation_config": CONFIG,
                  # Setup RAG as a retrieval tool
                  "tools": TOOLS,
              }
          }
      )
  )

  # Receive setup response
  raw_response = await ws.recv(decode=False)
  setup_response = json.loads(raw_response.decode("ascii"))

  # Send text message
  text_input = "What are popular LLMs?"
  display(Markdown(f"**Input:** {text_input}"))

  msg = {
      "client_content": {
          "turns": [{"role": "user", "parts": [{"text": text_input}]}],
          "turn_complete": True,
      }
  }

  await ws.send(json.dumps(msg))

  responses = []

  # Receive chunks of server response
  async for raw_response in ws:
      response = json.loads(raw_response.decode())
      server_content = response.pop("serverContent", None)
      if server_content is None:
          break

      model_turn = server_content.pop("modelTurn", None)
      if model_turn is not None:
          parts = model_turn.pop("parts", None)
          if parts is not None:
              display(Markdown(f"**parts >** {parts}"))
              responses.append(parts[0]["text"])

      # End of turn
      turn_complete = server_content.pop("turnComplete", None)
      if turn_complete:
          grounding_metadata = server_content.pop("groundingMetadata", None)
          if grounding_metadata is not None:
            grounding_chunks = grounding_metadata.pop("groundingChunks", None)
            if grounding_chunks is not None:
              for chunk in grounding_chunks:
                display(Markdown(f"**grounding_chunk >** {chunk}"))
          break

  # Print the server response
  display(Markdown(f"**Response >** {''.join(responses)}"))

Python SDK

Untuk mempelajari cara menginstal AI SDK generatif, lihat Menginstal library:

from google import genai
from google.genai import types
from google.genai.types import (Content, LiveConnectConfig, HttpOptions, Modality, Part,)
from IPython import display

MODEL="gemini-2.0-flash-exp"

client = genai.Client(
  vertexai=True,
  project=PROJECT_ID,
  location=LOCATION
)

async with client.aio.live.connect(
  model=MODEL,
  config=LiveConnectConfig(response_modalities=[Modality.TEXT],
                            tools=TOOLS),
) as session:
  text_input = "\'What are core LLM techniques?\'"
  print("> ", text_input, "\n")
  await session.send_client_content(
      turns=Content(role="user", parts=[Part(text=text_input)])
  )

  async for message in session.receive()
      if message.text:
          display.display(display.Markdown(message.text))
          continue

Menggunakan Mesin RAG Vertex AI sebagai penyimpanan konteks

Anda dapat menggunakan Mesin RAG Vertex AI sebagai penyimpanan konteks untuk Gemini Live API guna menyimpan konteks sesi untuk membentuk dan mengambil konteks terdahulu yang terkait dengan percakapan Anda dan memperkaya konteks saat ini untuk pembuatan model. Anda juga dapat memanfaatkan fitur ini untuk membagikan konteks di berbagai sesi Live API.

Vertex AI RAG Engine mendukung penyimpanan dan pengindeksan bentuk data berikut dari konteks sesi:

  • Teks
  • Ucapan audio

Membuat korpus jenis MemoryCorpus

Untuk menyimpan dan mengindeks teks percakapan dari konteks sesi, Anda harus membuat korpus RAG dari jenis MemoryCorpus. Anda juga harus menentukan parser LLM dalam konfigurasi korpus memori yang digunakan untuk menguraikan konteks sesi yang disimpan dari Live API untuk membuat memori untuk pengindeksan.

Contoh kode ini menunjukkan cara membuat korpus. Namun, ganti variabel dengan nilai terlebih dahulu.

# Currently supports Google first-party embedding models
EMBEDDING_MODEL = YOUR_EMBEDDING_MODEL  # Such as "publishers/google/models/text-embedding-005"
MEMORY_CORPUS_DISPLAY_NAME = YOUR_MEMORY_CORPUS_DISPLAY_NAME
LLM_PARSER_MODEL_NAME = YOUR_LLM_PARSER_MODEL_NAME  # Such as "projects/{project_id}/locations/{location}/publishers/google/models/gemini-2.5-pro-preview-05-06"

memory_corpus = rag.create_corpus(
   display_name=MEMORY_CORPUS_DISPLAY_NAME,
   corpus_type_config=rag.RagCorpusTypeConfig(
       corpus_type_config=rag.MemoryCorpus(
           llm_parser=rag.LlmParserConfig(
               model_name=LLM_PARSER_MODEL_NAME,
           )
       )
   ),
   backend_config=rag.RagVectorDbConfig(
       rag_embedding_model_config=rag.RagEmbeddingModelConfig(
           vertex_prediction_endpoint=rag.VertexPredictionEndpoint(
               publisher_model=EMBEDDING_MODEL
           )
       )
   ),
)

Menentukan korpus memori untuk menyimpan konteks

Saat menggunakan korpus memori dengan Live API, Anda harus menentukan korpus memori sebagai alat pengambilan, lalu menetapkan store_context ke true untuk mengizinkan Live API menyimpan konteks sesi.

Contoh kode ini menunjukkan cara menentukan korpus memori untuk menyimpan konteks. Namun, ganti variabel dengan nilai terlebih dahulu.

from google import genai
from google.genai import types
from google.genai.types import (Content, LiveConnectConfig, HttpOptions, Modality, Part)
from IPython import display

PROJECT_ID=YOUR_PROJECT_ID
LOCATION=YOUR_LOCATION
TEXT_INPUT=YOUR_TEXT_INPUT
MODEL_NAME=YOUR_MODEL_NAME  # Such as "gemini-2.0-flash-exp"

client = genai.Client(
   vertexai=True,
   project=PROJECT_ID,
   location=LOCATION,
)

memory_store=types.VertexRagStore(
   rag_resources=[
       types.VertexRagStoreRagResource(
           rag_corpus=memory_corpus.name
       )
   ],
   store_context=True
)

async with client.aio.live.connect(
   model=MODEL_NAME,
   config=LiveConnectConfig(response_modalities=[Modality.TEXT],
                            tools=[types.Tool(
                                retrieval=types.Retrieval(
                                    vertex_rag_store=memory_store))]),
) as session:
   text_input=TEXT_INPUT
   await session.send_client_content(
       turns=Content(role="user", parts=[Part(text=text_input)])
   )

   async for message in session.receive():
       if message.text:
           display.display(display.Markdown(message.text))
           continue

Langkah berikutnya