Importante: defina o description do corpus ao criar um corpus RAG. O description não pode ser editado depois da criação. Descrições de alta qualidade são cruciais para uma recuperação eficaz entre corpora, já que o sistema depende delas para selecionar os corpora adequados para sua consulta.
Nesta página, descrevemos duas APIs, AsyncRetrieveContexts e AskContexts, que oferecem suporte à recuperação de RAG em vários corpus, com tecnologia de recuperação agentic no back-end.
API AsyncRetrieveContexts: é uma API assíncrona que permite aos usuários recuperar contextos relevantes de vários corpus gerenciados por RAG. Essa é uma API de longa duração. Os usuários podem usar o ID da operação para saber o status da consulta e do resultado.
API AskContexts: é uma API síncrona que gera diretamente a resposta à consulta pesquisando em vários corpus gerenciados por RAG.
Importante: para usar esse recurso, conceda o papel de Usuário da Vertex AI no seu projeto à conta de serviço do Mecanismo RAG: service-[Your project's automatically generated project number]@gcp-sa-vertex-rag.iam.gserviceaccount.com.
Importante: esse recurso está disponível apenas em us-central1.
Arquitetura do sistema e seleção de corpus
Esta seção descreve a arquitetura do sistema de recuperação entre corpus da RAG e como ele seleciona os corpus adequados para recuperação.
Arquitetura do sistema
O sistema de recuperação entre corpus usa uma abordagem de agente para orquestrar a recuperação em vários corpus. Uma visão geral de alto nível da arquitetura inclui os seguintes componentes:
- Orquestrador/roteador: recebe a consulta do usuário e coordena o processo de recuperação.
- Agente de planejamento: analisa a consulta e determina quais corpora são mais relevantes com base na
descriptions. - Mecanismo de recuperação: realiza pesquisa semântica nos corpora de RAG selecionados.
- Agente de raciocínio: avalia se os contextos recuperados são suficientes para responder à consulta. Se for insuficiente, ele vai gerar um feedback para acionar outro loop de recuperação com base na percepção de contexto suficiente (SCA, na sigla em inglês). Para mais detalhes, consulte a postagem do blog sobre a SCA e o artigo de pesquisa.
- Gerador de LLM (para
AskContexts): sintetiza os contextos recuperados para gerar uma resposta final.
Como os corpus são selecionados
Quando uma consulta é executada em vários corpus gerenciados pela RAG, o sistema precisa determinar qual deles contém as informações necessárias para responder à consulta. Isso é feito com a recuperação agêntica:
- Mapeamento de corpus: o sistema mantém um mapa de corpora RAG disponíveis com as descrições técnicas (especificadas no campo
descriptiondo corpus RAG). - Correspondência semântica: um agente de planejamento estratégico (com tecnologia de um modelo do Gemini) avalia a consulta do usuário em relação ao
descriptionsdos corpora disponíveis. - Roteamento segmentado: o planejador gera um plano de recuperação que mapeia partes específicas da consulta aos corpus mais relevantes, garantindo que a recuperação seja focada e eficiente, em vez de pesquisar todos os corpus de forma ingênua.
Exemplos de código
Os exemplos de código a seguir demonstram como usar as APIs de recuperação entre corpus da RAG.
AsyncRetrieveContexts API
Este exemplo de código demonstra como recuperar contextos de vários corpora RAG de forma assíncrona.
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}"'"
}
}
}
}
}'
Acessar resultado da operação
Como AsyncRetrieveContexts é uma operação de longa duração, você pode usar a API GetOperations para pesquisar o resultado usando o ID da operação.
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}"
API AskContexts
Este exemplo de código demonstra como gerar uma resposta diretamente pesquisando em vários corpora RAG de forma síncrona.
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}"'"
}
}
}
}
}'
A seguir
- Para saber mais sobre a API RAG, consulte API do mecanismo RAG.
- Para saber mais sobre as respostas da RAG, consulte Saída de recuperação e geração do mecanismo RAG.
- Para saber mais sobre o mecanismo RAG, consulte a visão geral do mecanismo RAG.