Pular para o conteúdo principal

Capítulo 3: Self-Query e Filtragem por Metadados

O que é Self-Query?​

O LLM extrai tanto a consulta semântica quanto os filtros estruturados a partir da entrada do usuário:

Usuário: "Encontre políticas de RH de 2023"

Extraído:
- Consulta semântica: "políticas de RH"
- Filtros: {department: "RH", year: 2023}

Implementação com LangChain​

from langchain.retrievers.self_query.base import SelfQueryRetriever
from langchain.chains.query_constructor.base import AttributeInfo

# Definir atributos de metadados
metadata_field_info = [
AttributeInfo(
name="department",
description="O departamento (RH, Engenharia, Vendas)",
type="string"
),
AttributeInfo(
name="year",
description="Ano de publicação",
type="integer"
),
AttributeInfo(
name="document_type",
description="Tipo de documento (política, guia, memorando)",
type="string"
)
]

# Criar o self-query retriever
retriever = SelfQueryRetriever.from_llm(
llm=llm,
vectorstore=vectorstore,
document_contents="Documentos internos da empresa",
metadata_field_info=metadata_field_info
)

# Consultar com filtros em linguagem natural
results = retriever.get_relevant_documents(
"Mostre diretrizes de engenharia de 2024"
)
# Filtra automaticamente: department=Engenharia, year=2024

Comparações Suportadas​

OperadorExemplo
$eqyear == 2023
$nestatus != "draft"
$gtyear > 2020
$gteyear >= 2020
$ltyear < 2024
$indepartment in ["RH", "Jurídico"]

Boas Práticas​

  1. Esquema de metadados claro - Atributos bem definidos
  2. Boas descrições - Ajudam o LLM a entender os campos
  3. Lógica de fallback - Trate falhas de extração
  4. Teste exaustivo - Diversos padrões de consulta

Combinando Abordagens​

# Multi-query + Self-query
def advanced_retrieve(query, retriever):
# Gerar variações
queries = generate_variations(query)

# Self-query em cada variação
all_results = []
for q in queries:
results = self_query_retriever.get_relevant_documents(q)
all_results.extend(results)

# Remover duplicatas e ranquear
return rank_and_dedupe(all_results)