Pular para o conteúdo principal

Guia de qualidade de recuperação de pesquisa vetorial

Este guia fornece uma abordagem sistemática para melhorar a qualidade da recuperação de dados em aplicações de RAG (Radio Agregation Group), busca e correspondência em tempo real, utilizando o Mosaic AI Vector Search. As recomendações estão ordenadas da de maior impacto/menor esforço para a de menor impacto/maior esforço.

Pré-requisitos: Estabelecer a estrutura de avaliação

Antes de otimizar a qualidade da recuperação de dados, é necessário ter um sistema de avaliação reproduzível.

importante

Se você ainda não tem um sistema de avaliação implementado, pare aqui e configure-o primeiro. Otimizar sem medir é mera adivinhação.

Defina os requisitos de latência.

Estabeleça metas de latência claras com base no seu caso de uso:

  • Agentes RAG : Meta de Tempo até o Primeiro Token (TTFT) (por exemplo, <2 segundos)
  • Barras de pesquisa : Latência de ponta a ponta para exibir resultados (por exemplo, <100 ms)

Qualquer otimização que você tentar deve atender a esses requisitos.

Configurar avaliação automatizada

Utilize uma ou mais das seguintes abordagens:

O key é ter alguma forma automatizada de medir as mudanças – dados perfeitos não são necessários. Ao testar diferentes estratégias, concentre-se nas melhorias relativas , e não nos resultados absolutos. Mesmo um pequeno dataset sintéticos pode indicar se a reclassificação melhora a qualidade em 15% ou se a busca híbrida é adequada para o seu caso de uso específico.

Escolha métricas de qualidade

Escolha suas métricas de qualidade com base no seu caso de uso:

Se a recordação for mais importante (precisa de todas as informações relevantes):

  • Agentes RAG : A falta de contexto key leva a respostas incorretas ou alucinações.
  • Correspondência de ensaios clínicos da indústria farmacêutica : Não é possível deixar de fora pacientes elegíveis ou estudos relevantes.
  • Pesquisa compliance financeira : Necessário incluir todas as regulamentações, fatores de risco ou precedentes relevantes.
  • Análise da causa raiz na fabricação : Deve revelar todos os incidentes e padrões de falha relacionados.
  • Métricas a serem monitoradas : Recall@k (por exemplo, recall@10, recall@50).

Se a precisão for primordial (precisar apenas dos resultados mais relevantes):

  • Resolução de entidades/correspondência aproximada : Correspondência de registros de clientes, nomes de fornecedores ou SKUs de produtos em diferentes sistemas.
  • Desduplicação em serviços financeiros : Identificação de transações ou contas duplicadas com alto grau de confiança.
  • Correspondência de peças na cadeia de suprimentos : Encontrando componentes exatos ou compatíveis em diferentes catálogos.
  • Base de conhecimento de suporte técnico : Engenheiros precisam das soluções exatas nos principais resultados.
  • Métricas a serem monitoradas : Precisão@k (por exemplo, precisão@3, precisão@10).

Casos de uso equilibrados (que exigem boa recuperação e precisão):

  • Due diligence em fusões e aquisições : Não se pode ignorar os riscos (recordação), mas primeiro é preciso ter a documentação relevante (precisão).
  • Busca de anterioridades de patentes : Cobertura abrangente com prioridade para as patentes mais relevantes.
  • Visão 360º do cliente : Unificação dos dados do cliente em vários sistemas.

o passo 1: Ativar pesquisa híbrida

Combine a precisão das palavras-chave com a compreensão semântica.

Quando usar :

  • Os usuários pesquisam com termos específicos (códigos de produtos, termos técnicos).
  • É necessário que haja correspondência exata para determinadas consultas.
  • Deseja-se fallback quando a pesquisa semântica não encontrar correspondências óbvias por palavra-chave.

Impacto nas métricas :

  • Melhora a recuperação de informações ao capturar correspondências semânticas e por palavra-chave.
  • Aumenta a precisão das consultas com termos específicos.

Implementação : Alteração de uma linha na Mosaic AI Vector Search.

Python
# Enable hybrid search
results = index.similarity_search(
query_text="error code E404",
query_type="HYBRID" # Combines vector and keyword search
)

Para mais informações, consulte Consultar um índice de pesquisa vetorial.

o passo 2: Implementar filtragem de metadados

Essa é a sua maior alavanca para a qualidade da recuperação.

A filtragem reduz drasticamente o espaço de busca e melhora tanto a precisão quanto a abrangência.

Impacto nas métricas :

  • Aumenta drasticamente a precisão ao eliminar resultados irrelevantes.
  • Melhora a recuperação dentro do subconjunto filtrado.
  • Pode reduzir o espaço de busca em mais de 90%.

Exemplos

  • Documentação técnica : Filtre por versão do produto, componente ou módulo.
  • Manuais de automóveis : Filtre por marca, modelo e ano.
  • Suporte ao cliente : Filtre por linha de produto, região e categoria de problema.

Implementação

Python
# Vector Search with metadata filtering
results = index.similarity_search(
query_text="brake system maintenance",
filters='make = "Toyota" AND model = "Camry" AND year = 2023',
num_results=10
)

Seleção de filtro dinâmico

Abordagem programática :

Python
# Parse query for filter criteria
def extract_filters(user_query):
filter_parts = []
if "Toyota" in user_query:
filter_parts.append('make = "Toyota"')
if "2023" in user_query:
filter_parts.append('year = 2023')
return " AND ".join(filter_parts) if filter_parts else None

Filtragem baseada em agentes com Databricks :

Python
from databricks_ai_bridge.agents.tools.vector_search import VectorSearchTool

# Create the vector search tool
vector_search_tool = VectorSearchTool(
index_name="catalog.schema.car_manuals_index",
# Optional: specify columns to return
columns=["content", "make", "model", "year", "chunk_id"],
# Optional: set number of results
num_results=10,
# Optional: add additional parameters as needed
additional_parameters={
"query_type": "HYBRID" # Enable hybrid search
}
)

# The tool automatically handles filter generation based on the agent's understanding
# Agent analyzes "brake issues in my 2023 Toyota Camry" and generates appropriate filters

# For LangChain agents:
from langchain.agents import create_react_agent

agent = create_react_agent(
tools=[vector_search_tool],
llm=your_llm,
prompt=your_prompt
)

O agente automaticamente:

  1. Extrai as entidades relevantes da consulta.
  2. Gera strings de filtro apropriadas, semelhantes a SQL.
  3. Executa a busca com compreensão semântica e filtragem precisa.

Impacto : Pode reduzir o espaço de busca em mais de 90%, ao mesmo tempo que melhora a relevância.

o passo 3: Adicionar reclassificação

Uma única alteração resulta em uma melhoria de qualidade de aproximadamente 15%.

Databricks oferece um reclassificador integrado que é perfeito para agentes RAG.

Impacto nas métricas :

  • Aumenta a precisão ao alcançar alta taxa de recall com menos candidatos.
  • Funciona melhor quando combinado com técnicas como busca híbrida e filtragem.

Implementação

Python
# Python SDK
results = index.similarity_search(
query_text="How to create a Vector Search index",
num_results=10,
columns=["id", "text", "parent_doc_summary"],
reranker={
"model": "databricks_reranker",
"parameters": {
"columns_to_rerank": ["text", "parent_doc_summary"]
}
}
)

Para obter mais informações, consulte Reclassificar resultados da consulta.

Quando usar

Ideal para :

  • Agentes RAG (a latência é dominada pela geração de LLM).
  • Aplicações com foco na qualidade.
  • QPS baixo a moderado (aproximadamente 5 QPS por padrão).

O reclassificador integrado não é adequado para :

  • Aplicações com alto QPS (>5 QPS sem escalonamento adicional).
  • Barras de pesquisa em tempo real que requerem latência inferior a 100 ms.
  • Aplicações em que um tempo de reclassificação de 1,5 segundos é inaceitável.

Desempenho : Reclassifica 50 resultados em aproximadamente 1,5 segundos em cargas de trabalho típicas. Para blocos menores, a velocidade pode ser de até ~250 ms.

Para casos de uso de baixa latência/não RAG

A reclassificação ainda pode proporcionar melhorias significativas na qualidade das barras de pesquisa e aplicações com alta demanda de consultas por segundo (QPS) - você só precisa de um reclassificador mais rápido. Considere implantar um modelo de reclassificação leve (por exemplo, cross-encoder/ms-marco-TinyBERT-L-2-v2) como um modelo personalizado no Databricks servindo modelo para reclassificação em menos de 100 ms.

o passo 4: Melhorar a preparação de dados

Esta seção descreve algumas técnicas que você pode usar para melhorar a preparação de dados: fragmentação, análise sintática, adição de contexto semântico e limpeza de dados.

Estratégia de fragmentação

A otimização do tamanho dos blocos continua sendo uma área ativa de pesquisa. Um estudo recente da DeepMind (LIMIT) mostra que os embeddings podem falhar na captura de informações básicas em contextos longos, tornando essa uma decisão complexa.

Pontos de partida para experimentação :

Python
# Common configurations to test
small_chunks = 256 # Better for precise fact retrieval
medium_chunks = 512 # Balanced approach
large_chunks = 1024 # More context per chunk

Principais compensações a serem consideradas :

  • Fragmentos menores : Melhor localização de informações específicas, mas pode haver perda de contexto.
  • Pedaços maiores : Mais contexto preservado, mas mais difícil de identificar informações relevantes.
  • Limites de contexto : Deve caber dentro da janela de contexto do LLM ao recuperar vários fragmentos.

Otimizações mais impactantes : Em vez de otimizar excessivamente o tamanho do bloco, concentre-se em:

  1. Extração de informações para metadados : Extraia entidades, tópicos e categorias para permitir uma filtragem precisa.
  2. Análise sintática de alta qualidade : Use ai_parse_document para obter texto limpo e estruturado.
  3. Metadados semânticos : Adicione resumos de documentos e cabeçalhos de seção aos blocos de texto.

Considere também as seguintes abordagens avançadas. Essas técnicas exigem mais esforço, mas podem ter um impacto maior:

Agrupamento semântico : Agrupar frases por similaridade em vez de tamanho fixo.

Agrupamento pai-filho (recuperação do menor para o maior):

Python
# Record child and parent chunks in your source table
for parent_chunk in create_chunks(doc, size=2048): # Large for context
for child_chunk in create_chunks(parent_chunk, size=512): # Small for precision
source_table.append({"text": child_chunk, "parent_text": parent_chunk})

# Search children, return parents
results = index.similarity_search(
query_text="Is attention all you need?",
num_results=10,
columns=["text", "parent_text"]
)

Consulte a documentação do recuperador de documentos pai LangChain.

Análise de documentos

Para PDFs e documentos complexos, a Databricks recomenda o uso do ai_parse_document para uma análise sintática de alta qualidade. Uma análise sintática inadequada (tabelas ausentes, formatação incorreta) afeta diretamente a qualidade da recuperação de dados.

Enriquecer com metadados semânticos

Adicione contexto semântico para melhorar a recuperação da informação.

Por que isso funciona :

  • Fornece sinais semânticos adicionais para modelos de incorporação.
  • Fornece aos responsáveis pela reclassificação mais contexto para a pontuação.
  • Auxilia em consultas que fazem referência a conceitos em nível de documento.

Opção 1: Incluir metadados em blocos

Python
# Prepend document summary to each chunk
chunk_with_context = f"""
Document: {doc_title}
Summary: {doc_summary}
Section: {section_name}
{chunk_content}
"""

Opção 2: Armazenar como colunas de metadados separadas

Python
# Store semantic metadata for reranker to use
metadata = {
"doc_summary": "Technical manual for brake system maintenance",
"section": "Emergency brake adjustment procedures",
"keywords": ["brake", "safety", "adjustment"]
}
importante

Essa abordagem requer processamento posterior para aproveitar os metadados:

  • Para metadados semânticos: Use a reclassificação com o parâmetro columns_to_rerank para considerar essas colunas.
  • Para metadados que contenham apenas palavras-chave: Use a pesquisa híbrida (modo de texto completo) para encontrar correspondências nesses campos.

Limpeza de dados

  • Remover elementos padrão (cabeçalhos, rodapés, números de página).
  • Preservar a estrutura do documento (títulos, listas, tabelas).
  • Ao dividir o conteúdo em blocos, mantenha os limites semânticos.

o passo 5: Otimização de consultas

Expansão de consulta

Gere múltiplas variações de consulta para melhorar a recuperação. Consulte o guia do LangChain.

Impacto : Melhora a capacidade de recordar informações ao encontrar documentos com terminologia diferente.

Python
# Use LLM to expand query with synonyms and related terms
def expand_query(user_query):
prompt = f"""Generate 3 variations of this search query including synonyms:
Query: {user_query}
Return only the variations, one per line."""

variations = llm.generate(prompt).split('\n')

# Search with original + variations
all_results = []
for query in [user_query] + variations:
results = index.similarity_search(query_text=query, num_results=10)
all_results.extend(results)

# Deduplicate and return
return deduplicate_results(all_results)

Exemplo : "manutenção de carro" também pesquisa "reparo de automóveis", "serviços automotivos", "manutenção de veículos"

Para mais técnicas, consulte:

Reformulação da consulta

Para consultas complexas, divida-as em partes ou reformule-as. Consulte as estratégias RAG da OpenAI.

  • Perguntas com múltiplos saltos → Pesquisas sequenciais
  • Consultas ambíguas → Múltiplas pesquisas específicas
  • Veja Técnicas de decomposição

o passo 6: Técnicas avançadas de prompts

Otimização imediata

Utilize técnicas automáticas de otimização de prompts, como MIPROv2 ou GEPA (disponíveis no DSPy), para aprimorar os prompts usados na preparação de dados, reescrita de consultas ou em qualquer etapa do seu sistema de recuperação de dados. A Agent Bricks incorpora a tecnologia GEPA para proporcionar grandes melhorias de desempenho a baixo custo. Veja "Construindo agentes empresariais de última geração 90 vezes mais baratos com otimização automatizada de prompts".

Para obter mais informações, consulte Evolução do prompt reflexivo com GEPA.

o passo 7: Estratégias adaptativas de recuperação

Padrão de agente React

Crie agentes capazes de orquestrar a recuperação de informações de forma inteligente:

  • O agente pondera sobre se a recuperação é necessária.
  • É possível reformular consultas com base nos resultados iniciais.
  • Combina a recuperação de dados com outras ferramentas (calculadoras, APIs, etc.).
  • Tentar novamente as recuperações com falha, utilizando consultas modificadas.
  • Implemente usando o Databricks Mosaic AI Agent Framework.

Exemplos de recuperação agentiva

Python
# Agent decides when to search and what filters to apply
# Based on conversation context and user intent
agent = create_agent(
tools=[vector_search_tool, calculator, web_search],
instructions="Retrieve relevant docs only when needed, apply appropriate filters"
)

o passo 8: Ajustar modelos de incorporação

Primeiro: diagnostique se você tem um problema de incorporação.

Teste rápido : Compare os embeddings do GTE com os do OpenAI no Databricks.

Python
# Test with both embedding models
# Databricks native: gte-large-en-v1.5
gte_results = gte_index.similarity_search(query)

# OpenAI: text-embedding-3-large (3072 dims)
openai_results = openai_index.similarity_search(query)

# If OpenAI text-embedding-3-large significantly outperforms GTE:
# - Fine-tuning a smaller model could match or exceed OpenAI quality
# - You have an embedding model problem, not a data problem

Interpretação :

  • Se text-embedding-3-large tiver um desempenho muito melhor do que gte-large-en, considere o ajuste fino. É possível obter qualidade semelhante com um modelo menor.
  • Se text-embedding-3-large tiver um desempenho aproximadamente igual ao de gte-large-en, o seu problema não está no modelo de incorporação. Concentre-se em outras otimizações.

Quando fazer os ajustes finais

importante

O ajuste fino deve ser considerado como último recurso e só deve ser levado em conta quando os seguintes critérios forem atendidos:

  1. Você já tentou os passos 1 a 7.
  2. Nos seus testes, a OpenAI apresentou um desempenho significativamente superior ao da GTE.
  3. Você possui vocabulário ou caso de uso específico do domínio.
nota

Você não precisa de dados de treinamento de rótulos - você pode usar a geração de dados sintéticos, como mostrado nos blogs de ajuste fino de incorporaçãoDatabricks.