Usar a pesquisa vetorial 2.0 com RAG

Nesta página, mostramos como o mecanismo RAG na Gemini Enterprise Agent Platform usa a busca vetorial 2.0 da Gemini Enterprise Agent Platform, que é um produto do Cloud de Confiance by S3NS que serve como um sistema abrangente de armazenamento e recuperação para armazenar e gerenciar representações vetoriais dos seus documentos. A Pesquisa Vetorial 2.0 da Gemini Enterprise Agent Platform é usada para recuperar documentos relevantes com base na similaridade semântica do documento com uma determinada consulta.

A RAG vai gerenciar as coleções da Pesquisa Vetorial 2.0 para você, e você terá acesso total a elas no seu projeto.

Como escolher um back-end de RAG

Ao usar o mecanismo RAG na Gemini Enterprise Agent Platform, é possível escolher entre diferentes opções de armazenamento de back-end para seus corpora RAG. A tabela a seguir resume as principais diferenças:

Opção de back-end Tecnologia subjacente Gerenciamento pelo mecanismo RAG Visibilidade de dados no projeto Suporte à CMEK
RagManagedVertexVectorSearch Busca vetorial da Gemini Enterprise Agent Platform 2.0 Totalmente gerenciado pelo Google. Visível no seu projeto do Cloud de Confiance by S3NS Não
VertexVectorSearch Busca vetorial 1.0 da plataforma de agentes do Gemini Enterprise O usuário precisa configurar, gerenciar e limpar a instância da Pesquisa Vetorial 1.0. Visível no seu projeto do Cloud de Confiance by S3NS Não
RagManagedDb Spanner Totalmente gerenciado pelo Google. Não é diretamente visível no seu projeto Sim

Escolha RagManagedVertexVectorSearch para ter os recursos mais recentes, gerenciamento automatizado e transparência nos dados da Pesquisa Vetorial 2.0. Se o suporte a CMEK for um requisito estrito, considere o RagManagedDb, tendo em mente a falta de visibilidade direta do banco de dados de back-end.

Ativar a API de busca vetorial

Para usar a pesquisa vetorial da Gemini Enterprise Agent Platform gerenciada por RAG, primeiro é necessário ativar a API Vector Search.

Criar um corpus de RAG com RagManagedVertexVectorSearch

Este exemplo de código demonstra como criar um corpus RAG usando RagManagedVertexVectorSearch.

Python

from vertexai.preview import rag
import vertexai

PROJECT_ID = YOUR_PROJECT_ID
LOCATION = YOUR_RAG_ENGINE_LOCATION
DISPLAY_NAME = YOUR_RAG_CORPUS_DISPLAY_NAME

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

vector_db = rag.RagManagedVertexVectorSearch()
rag_corpus = rag.create_corpus(
    display_name=DISPLAY_NAME, backend_config=rag.RagVectorDbConfig(vector_db=vector_db))

REST

Substitua as seguintes variáveis:

  • PROJECT_ID: o ID do projeto.
  • LOCATION: a região para processar a solicitação.
  • CORPUS_DISPLAY_NAME: o nome de exibição do corpus de RAG.
PROJECT_ID=PROJECT_ID
LOCATION=LOCATION
CORPUS_DISPLAY_NAME=CORPUS_DISPLAY_NAME

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}/ragCorpora \
-d '{
      "display_name" : '\""${CORPUS_DISPLAY_NAME}"\"',
      "vector_db_config": {
        "rag_managed_vertex_vector_search": {}
      }
    }'

Importar seus dados para o RagManagedVertexVectorSearch

É possível usar a API ImportRagFiles ou UploadRagFile para importar seus dados para o RagManagedVertexVectorSearch.

Para fazer upload do arquivo local para o corpus de RAG, consulte Fazer upload de um arquivo RAG. Para importar dados para seu corpus de RAG, consulte o exemplo de código a seguir, que demonstra como importar do Cloud Storage. Para saber mais sobre as fontes de dados compatíveis, consulte Fontes de dados compatíveis com RAG.

Python

from vertexai.preview import rag
import vertexai

PROJECT_ID = YOUR_PROJECT_ID
LOCATION = YOUR_RAG_ENGINE_LOCATION
CORPUS_ID = YOUR_CORPUS_ID
PATHS = ["gs://my_bucket/my_files_dir"]

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

corpus_name = f"projects/{PROJECT_ID}/locations/{LOCATION}/ragCorpora/{CORPUS_ID}"
# This is a non blocking call.
response = await rag.import_files_async(
    corpus_name=corpus_name,
    paths=PATHS,
)

# Wait for the import to complete.
await response.result()

REST

GCS_URI=GCS_URI

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}/ragCorpora/${CORPUS_ID}/ragFiles:import \
-d '{
  "import_rag_files_config": {
    "gcs_source": {
      "uris": '\""${GCS_URI}"\"',
      },
  }
}'

Criar um índice para seu corpus

O mecanismo RAG cria uma coleção da Pesquisa Vetorial 2.0 para cada corpus, mas não cria um índice nessa coleção. Até que você crie um, cada recuperação será uma verificação de KNN de força bruta.

Uma verificação de força bruta é mais lenta do que uma pesquisa indexada, e o KNN é executado apenas em coleções de até 100.000 objetos de dados. O mecanismo RAG armazena um bloco por objeto de dados. Portanto, quando um corpus ultrapassa esse limite, a recuperação falha até que um índice seja criado.

Não indexe todos os corpora. Um índice é executado na própria infraestrutura de exibição e é faturado enquanto existir, independentemente de ser consultado ou não. Para decidir quais corpora precisam de um, consulte Decidir quais corpora indexar.

Depois que um índice é criado, a recuperação o usa automaticamente. O corpus não muda, e seus dados não precisam ser importados novamente.

Se você estiver indexando vários corpora, use um script para o loop: não há um caminho de criação em massa. As operações de índice simultâneas são limitadas por cota. Portanto, crie os índices em série ou em pequenos lotes. Para mais informações, consulte Cotas.

Antes de começar

A criação de um índice requer a permissão vectorsearch.indexes.create na coleção, e a contagem dos objetos de dados requer vectorsearch.dataObjects.query. As duas permissões estão incluídas no papel de Administrador da Pesquisa Vetorial (roles/vectorsearch.admin). O Gravador de Índice da Pesquisa Vetorial (roles/vectorsearch.indexWriter) concede a primeira. A API Vector Search também precisa estar ativada no projeto.

Encontrar os IDs do corpus

No seu projeto, cada corpus tem exatamente uma coleção, chamada vertex-rag-RAG_CORPUS_ID. Liste seus corpora para ver os IDs deles.

Substitua PROJECT_ID pelo ID do projeto:

PROJECT_ID=PROJECT_ID
LOCATION=us-central1

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

A parte numérica no final de cada corpus name é o RAG_CORPUS_ID. Cada corpus também informa o nome completo do recurso Collection em vectorDbConfig.ragManagedVertexVectorSearch.collectionName.

A resposta lista no máximo 100 corpora e no máximo 25 se você omitir pageSize. Se a resposta incluir um nextPageToken, transmita esse valor como pageToken para buscar a próxima página.

Se você já souber o RAG_CORPUS_ID que quer indexar, busque apenas esse corpus. A resposta carrega o mesmo collectionName:

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

Decidir quais corpora indexar

Para cada corpus, conte os objetos de dados na coleção. Transmita um filter vazio para contar toda a coleção:

COLLECTION_ID=vertex-rag-RAG_CORPUS_ID

curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
"https://vectorsearch.googleapis.com/v1/projects/${PROJECT_ID}/locations/${LOCATION}/collections/${COLLECTION_ID}/dataObjects:aggregate" \
-d '{"aggregate": "COUNT", "filter": {}}'

A contagem é retornada em aggregateResults:

{
  "aggregateResults": [
    {
      "count": 95217
    }
  ]
}

Crie um índice para esse corpus quando uma das seguintes condições for verdadeira:

  • A contagem está próxima ou acima de 100.000. O limite conta objetos de dados, não arquivos. Portanto, um corpus com um pequeno número de arquivos grandes ainda pode estar bem acima dele.
  • A recuperação é muito lenta na sua taxa de consulta. Uma pesquisa indexada é mais rápida do que uma verificação de força bruta, e a diferença aumenta à medida que a coleção cresce.

Caso contrário, deixe o corpus sem indexação e evite o custo de veiculação. Você pode adicionar um índice mais tarde, se ele crescer.

Analisar o esquema da coleção

O RAG Engine cria cada coleção com o esquema a seguir. Use esses nomes ao especificar o campo de índice e os campos de filtro.

Campo Tipo Descrição
text_embedding Vetor denso O embedding do fragmento. Este é o campo que você indexa. O número de dimensões corresponde ao modelo de embedding do corpus.
corpus_id String O ID do corpus de RAG.
file_id String O ID do arquivo RAG de origem do fragmento.
chunk_id String O ID do fragmento.
chunk_data String O texto do fragmento.
chunk_data_type String O tipo de dados do bloco.
file_original_uri String O URI original do arquivo de origem.
rag_metadata String Metadados fornecidos pelo usuário para o fragmento.

Escolha as configurações do índice

UpdateIndex altera apenas o nome de exibição, a descrição, os rótulos e as contagens de réplicas. Portanto, para alterar qualquer uma das configurações nesta seção, é necessário excluir o índice e criar um novo.

Campo de índice:defina como text_embedding, o único campo de vetor no esquema da coleção.

Métrica de distância:defina como cosseno. O mecanismo de RAG sempre envia COSINE_DISTANCE nas solicitações de recuperação, e a Pesquisa Vetorial 2.0 rejeita uma solicitação de recuperação cuja métrica não corresponde ao índice. A métrica assume como padrão DOT_PRODUCT quando você a omite. Portanto, um índice criado sem ela interrompe a recuperação desse corpus. O RAG Engine informa a falha como FAILED_PRECONDITION com a mensagem Failed to process Rag Managed Vertex Vector Search response., que não identifica a métrica como a causa. A grafia varia de acordo com a plataforma: o corpo REST usa COSINE_DISTANCE, e a flag da CLI gcloud usa cosine-distance.

Infraestrutura:deixe o índice na infraestrutura padrão otimizada para desempenho, porque a distância de cosseno não é compatível com a infraestrutura otimizada para armazenamento. Um índice é executado em uma infraestrutura de exibição dedicada e é cobrado enquanto existir. No v1, min_replica_count e max_replica_count têm como padrão 2. Portanto, por padrão, o índice é disponibilizado por duas réplicas e não é escalonado automaticamente. Para mais informações, consulte Índices de coleção.

Campos de filtro:defina filter_fields como file_id. É o único campo em que o RAG Engine filtra no momento da recuperação, e isso só acontece quando uma solicitação de recuperação restringe a pesquisa a arquivos específicos. Em particular, corpus_id tem o mesmo valor para cada objeto de dados em uma determinada coleção. Portanto, filtrá-lo não oferece nenhum benefício.

A filtragem de metadados também não precisa de outros campos de filtro. Quando uma solicitação de recuperação define ragRetrievalConfig.filter.metadataFilter, o RAG Engine resolve o filtro em relação aos metadados do arquivo primeiro, converte o resultado no conjunto de IDs de arquivo RAG correspondentes e envia esse conjunto para a Pesquisa Vetorial como o mesmo filtro file_id. Adicionar rag_metadata a filter_fields aumenta o tamanho do índice sem mudar a recuperação.

Campos de armazenamento:deixe store_fields sem definição. O mecanismo RAG solicita todos os campos de dados em cada recuperação, o que nunca se qualifica para a exibição inline. Portanto, os dados do bloco são lidos do banco de dados de backup de qualquer maneira. Os campos listados em store_fields são enviados para o índice e contam para o tamanho dele. Portanto, defini-los adiciona custo sem mudar a recuperação.

Criar o índice

Python

Substitua as seguintes variáveis:

  • PROJECT_ID: o ID do projeto.
  • RAG_CORPUS_ID: o ID do corpus de RAG a ser indexado.
from google.cloud import vectorsearch_v1

client = vectorsearch_v1.VectorSearchServiceClient()

index = vectorsearch_v1.Index(
    index_field="text_embedding",
    distance_metric=vectorsearch_v1.DistanceMetric.COSINE_DISTANCE,
    filter_fields=["file_id"],
)
request = vectorsearch_v1.CreateIndexRequest(
    parent="projects/PROJECT_ID/locations/us-central1/collections/vertex-rag-RAG_CORPUS_ID",
    index_id="vertex-rag-RAG_CORPUS_ID-index",
    index=index,
)

operation = client.create_index(request=request)

# Wait for the result (note this may take up to several minutes).
operation.result()

REST

Substitua as seguintes variáveis:

  • PROJECT_ID: o ID do projeto.
  • RAG_CORPUS_ID: o ID do corpus de RAG a ser indexado.
PROJECT_ID=PROJECT_ID
RAG_CORPUS_ID=RAG_CORPUS_ID
LOCATION=us-central1
COLLECTION_ID=vertex-rag-${RAG_CORPUS_ID}
INDEX_ID=${COLLECTION_ID}-index

curl -X POST \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
"https://vectorsearch.googleapis.com/v1/projects/${PROJECT_ID}/locations/${LOCATION}/collections/${COLLECTION_ID}/indexes?indexId=${INDEX_ID}" \
-d '{
      "index_field": "text_embedding",
      "distance_metric": "COSINE_DISTANCE",
      "filter_fields": ["file_id"]
    }'

gcloud

Substitua as seguintes variáveis:

  • PROJECT_ID: o ID do projeto.
  • RAG_CORPUS_ID: o ID do corpus de RAG a ser indexado.
gcloud vector-search collections indexes create vertex-rag-RAG_CORPUS_ID-index \
  --collection=vertex-rag-RAG_CORPUS_ID \
  --index-field=text_embedding \
  --distance-metric=cosine-distance \
  --filter-fields=file_id \
  --location=us-central1 \
  --project=PROJECT_ID

O comando bloqueia até que a operação seja concluída, a menos que você transmita --async.

Verificar a conclusão

A criação de um índice retorna uma operação de longa duração:

{
  "name": "projects/PROJECT_ID/locations/us-central1/operations/operation-1770302393524-64a14a54fa197-0dea326c-5a90efda",
  "metadata": {
    "@type": "type.googleapis.com/google.cloud.vectorsearch.v1.OperationMetadata",
    "createTime": "2026-02-05T14:39:53.558308609Z",
    "target": "projects/PROJECT_ID/locations/us-central1/collections/vertex-rag-RAG_CORPUS_ID/indexes/vertex-rag-RAG_CORPUS_ID-index",
    "verb": "create",
    "apiVersion": "v1"
  },
  "done": false
}

Pesquise a operação usando o nome dessa resposta:

OPERATION_NAME=OPERATION_NAME

curl -X GET \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
"https://vectorsearch.googleapis.com/v1/${OPERATION_NAME}"

Quando done é true, um campo response significa que o índice foi criado com sucesso, e um campo error informa o motivo da falha. A criação de um índice leva vários minutos e mais tempo para um corpus grande.

Para listar as operações no projeto e no local, execute o seguinte:

curl -X GET \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
"https://vectorsearch.googleapis.com/v1/projects/PROJECT_ID/locations/us-central1/operations"

Para inspecionar um índice, execute o seguinte:

gcloud vector-search collections indexes describe vertex-rag-RAG_CORPUS_ID-index \
  --collection=vertex-rag-RAG_CORPUS_ID \
  --location=us-central1 \
  --project=PROJECT_ID

Para excluir um índice, o que é necessário para mudar qualquer uma das configurações permanentes, execute o seguinte. A recuperação volta para uma verificação de KNN de força bruta até que o índice de substituição seja criado e falha totalmente se o corpus exceder 100.000 blocos.

gcloud vector-search collections indexes delete vertex-rag-RAG_CORPUS_ID-index \
  --collection=vertex-rag-RAG_CORPUS_ID \
  --location=us-central1 \
  --project=PROJECT_ID

A seguir