RAG Avançado: LongRAG, Self-RAG e GraphRAG Explicados
LongRAG, Self-RAG, GraphRAG - Técnicas de próxima geração
Retrieval-Augmented Generation (RAG) evoluiu muito além da simples busca por similaridade de vetores. LongRAG, Self-RAG e GraphRAG representam a ponta da tecnologia dessas capacidades.
Sistemas modernos de RAG precisam lidar com documentos massivos, compreender relações complexas entre entidades e muito mais.
Esta imagem agradável foi gerada pelo modelo AI Flux 1 dev.
A Evolução Além do RAG Básico
Sistemas de RAG tradicionais seguem um padrão simples: dividir documentos, embutir em vetores, recuperar fragmentos similares por meio da similaridade do cosseno e alimentar um LLM. Embora eficazes para muitos casos de uso, essa abordagem tem dificuldades com três cenários críticos:
- Dependências de longo alcance: Contexto importante pode se estender por milhares de tokens em múltiplos fragmentos
- Confiança na recuperação: O sistema não tem forma de avaliar se o conteúdo recuperado é realmente relevante
- Complexidade das relações: A similaridade vetorial não consegue capturar conexões intricadas entre entidades
Variações avançadas de RAG abordam essas limitações com arquiteturas especializadas adaptadas a desafios específicos.
LongRAG: Conquistando Contextos Estendidos
Visão Geral da Arquitetura
LongRAG reinterpreta fundamentalmente a estratégia de fragmentação ao aproveitar LLMs com janelas de contexto estendidas (32K, 100K ou até 1M tokens). Em vez de quebrar documentos em pequenos fragmentos de 512 tokens, LongRAG usa uma abordagem hierárquica:
Embedding no Nível do Documento: O documento inteiro (ou grandes seções) é processado como uma única unidade. Um embedding no nível do documento captura o significado semântico geral, mantendo o texto completo para processamento posterior.
Fragmentação Mínima: Quando a fragmentação é necessária, LongRAG usa fragmentos muito maiores (4K-8K tokens) com sobreposição significativa (20-30%). Isso preserva o fluxo narrativo e reduz a fragmentação do contexto.
Montagem do Contexto: Durante a recuperação, LongRAG devolve documentos completos ou seções coerentes grandes, em vez de fragmentos dispersos. O LLM recebe um contexto contínuo que preserva relações estruturais e semânticas.
Estratégia de Implementação
Aqui está uma implementação conceitual usando Python e modelos modernos de embedding:
from typing import List, Dict
import numpy as np
class LongRAGRetriever:
def __init__(self, model, chunk_size=8000, overlap=1600):
self.model = model
self.chunk_size = chunk_size
self.overlap = overlap
self.doc_embeddings = []
self.documents = []
def create_long_chunks(self, text: str) -> List[str]:
"""Criar grandes fragmentos com sobreposição"""
chunks = []
start = 0
while start < len(text):
end = start + self.chunk_size
chunk = text[start:end]
chunks.append(chunk)
start += (self.chunk_size - self.overlap)
return chunks
def index_document(self, doc: str, metadata: Dict):
"""Indexar documento com embedding hierárquico"""
# Embutir o documento inteiro
doc_embedding = self.model.embed(doc)
# Criar grandes fragmentos com sobreposição
chunks = self.create_long_chunks(doc)
chunk_embeddings = [self.model.embed(c) for c in chunks]
self.doc_embeddings.append({
'doc_id': len(self.documents),
'doc_embedding': doc_embedding,
'chunk_embeddings': chunk_embeddings,
'chunks': chunks,
'full_text': doc,
'metadata': metadata
})
self.documents.append(doc)
def retrieve(self, query: str, top_k: int = 3) -> List[Dict]:
"""Recuperar conteúdo de longa forma relevante"""
query_embedding = self.model.embed(query)
# Pontuar primeiro no nível do documento
doc_scores = [
np.dot(query_embedding, doc['doc_embedding'])
for doc in self.doc_embeddings
]
# Obter os melhores documentos
top_doc_indices = np.argsort(doc_scores)[-top_k:][::-1]
results = []
for idx in top_doc_indices:
doc_data = self.doc_embeddings[idx]
# Para cada documento, encontrar os melhores fragmentos
chunk_scores = [
np.dot(query_embedding, emb)
for emb in doc_data['chunk_embeddings']
]
best_chunk_idx = np.argmax(chunk_scores)
# Devolver contexto estendido ao redor do melhor fragmento
context_chunks = self._get_extended_context(
doc_data['chunks'],
best_chunk_idx
)
results.append({
'text': ''.join(context_chunks),
'score': doc_scores[idx],
'metadata': doc_data['metadata']
})
return results
def _get_extended_context(self, chunks: List[str],
center_idx: int) -> List[str]:
"""Obter contexto estendido ao redor do fragmento relevante"""
start = max(0, center_idx - 1)
end = min(len(chunks), center_idx + 2)
return chunks[start:end]
Casos de Uso e Desempenho
LongRAG se destaca em cenários onde o contexto importa:
- Análise de documentos jurídicos: Contratos e resumos jurídicos frequentemente têm dependências que se estendem por dezenas de páginas
- Recuperação de artigos de pesquisa: Compreender metodologias requer seções coerentes, não parágrafos isolados
- Repositórios de código: Funções e classes devem ser compreendidas dentro do contexto do seu módulo
Características de desempenho:
- Latência: Mais alta devido ao processamento de grandes fragmentos (2-5x mais lento que o RAG padrão)
- Precisão: Melhoria de 15-25% em benchmarks de perguntas e respostas de longa forma
- Memória: Requer 3-4x mais memória para janelas de contexto
Self-RAG: Recuperação Reflexiva
Princípios Fundamentais
Self-RAG introduz uma camada metacognitiva aos sistemas de RAG. Em vez de recuperar e gerar de forma cega, o sistema reflete ativamente sobre seus próprios processos por meio de tokens de reflexão especiais:
Token de Recuperação: Decide se a recuperação é necessária para uma determinada consulta Token de Relevância: Avalia se os documentos recuperados são realmente relevantes Token de Suporte: Verifica se a resposta gerada é suportada pelo conteúdo recuperado Token de Crítica: Avalia a qualidade geral da resposta gerada
Componentes da Arquitetura
A arquitetura de Self-RAG consiste em três fases intercaladas:
class SelfRAGSystem:
def __init__(self, retriever, generator, critic):
self.retriever = retriever
self.generator = generator
self.critic = critic
def generate_with_reflection(self, query: str,
max_iterations: int = 3):
"""Gerar resposta com auto-reflexão"""
# Fase 1: Decidir se a recuperação é necessária
retrieve_decision = self.critic.should_retrieve(query)
if not retrieve_decision:
# Geração direta sem recuperação
return self.generator.generate(query)
# Fase 2: Recuperar e avaliar relevância
retrieved_docs = self.retriever.retrieve(query)
relevant_docs = []
for doc in retrieved_docs:
relevance_score = self.critic.assess_relevance(
query, doc
)
if relevance_score > 0.7: # Limiar
relevant_docs.append(doc)
if not relevant_docs:
# Fallback para geração sem recuperação
return self.generator.generate(query)
# Fase 3: Gerar e verificar suporte
best_answer = None
best_score = -1
for _ in range(max_iterations):
# Gerar resposta candidata
answer = self.generator.generate(
query, context=relevant_docs
)
# Avaliar suporte e qualidade
support_score = self.critic.check_support(
answer, relevant_docs
)
quality_score = self.critic.assess_quality(answer)
total_score = 0.6 * support_score + 0.4 * quality_score
if total_score > best_score:
best_score = total_score
best_answer = answer
# Parada antecipada se qualidade alta alcançada
if total_score > 0.9:
break
return {
'answer': best_answer,
'confidence': best_score,
'sources': relevant_docs,
'reflections': {
'retrieved': retrieve_decision,
'relevance': len(relevant_docs),
'support': support_score
}
}
Treinamento dos Mecanismos de Reflexão
Self-RAG exige o treinamento do componente crítico para fazer avaliações confiáveis. Isso geralmente envolve:
- Finação supervisionada em conjuntos de dados anotados com julgamentos de relevância
- Aprendizado por reforço com recompensas para previsões precisas
- Aprendizado contrastivo para distinguir afirmações suportadas de não suportadas
Os tokens de reflexão podem ser implementados como:
- Tokens especiais no vocabulário (como
[RETRIEVE],[RELEVANT]) - Cabeças classificadoras separadas no modelo
- Modelos críticos externos (abordagem de ensemble)
Considerações de Produção
Ao implantar Self-RAG em sistemas de produção:
Compromissos de Latência: Cada etapa de reflexão adiciona 20-40% de sobrecarga de inferência. Equilibre a profundidade com os requisitos de tempo de resposta.
Limites de Confiança: Ajuste os limites de reflexão com base no seu caso de uso. Aplicações jurídicas ou médicas exigem maior confiança do que chatbots gerais.
Monitoramento: Rastreie decisões de reflexão para identificar padrões. Se a recuperação raramente for necessária, você pode beneficiar-se de uma arquitetura mais simples.
GraphRAG: Recuperação com Gráfico de Conhecimento
Fundamento Conceitual
GraphRAG transforma o problema de recuperação de similaridade vetorial em percurso de gráfico. Em vez de encontrar fragmentos de texto semanticamente similares, GraphRAG identifica subgrafos relevantes de entidades e relações conectadas.
Extração de Entidades: Identificar entidades nomeadas, conceitos e seus tipos Mapeamento de Relações: Extrair relações entre entidades (temporais, causais, hierárquicas) Construção de Gráfico: Construir um gráfico de conhecimento com entidades como nós e relações como arestas Recuperação de Subgrafos: Dada uma consulta, encontrar subgrafos conectados relevantes
Pipeline de Construção do Gráfico
Construir um gráfico de conhecimento a partir de texto não estruturado envolve várias etapas:
class GraphRAGBuilder:
def __init__(self, entity_extractor, relation_extractor):
self.entity_extractor = entity_extractor
self.relation_extractor = relation_extractor
self.graph = NetworkGraph()
def build_graph(self, documents: List[str]):
"""Construir gráfico de conhecimento a partir de documentos"""
for doc in documents:
# Extrair entidades
entities = self.entity_extractor.extract(doc)
# Adicionar entidades como nós
for entity in entities:
self.graph.add_node(
entity['text'],
entity_type=entity['type'],
context=entity['surrounding_text']
)
# Extrair relações
relations = self.relation_extractor.extract(
doc, entities
)
# Adicionar relações como arestas
for rel in relations:
self.graph.add_edge(
rel['source'],
rel['target'],
relation_type=rel['type'],
confidence=rel['score'],
evidence=rel['text_span']
)
def enrich_graph(self):
"""Adicionar relações derivadas e metadados"""
# Calcular importância dos nós (PageRank, etc.)
self.graph.compute_centrality()
# Identificar comunidades/agrupamentos
self.graph.detect_communities()
# Adicionar ordenação temporal se timestamps estiverem disponíveis
self.graph.add_temporal_edges()
Processamento de Consultas com Gráficos
Consultas GraphRAG envolvem raciocínio de múltiplos saltos no gráfico de conhecimento:
class GraphRAGRetriever:
def __init__(self, graph, embedder):
self.graph = graph
self.embedder = embedder
def retrieve_subgraph(self, query: str,
max_hops: int = 2,
max_nodes: int = 50):
"""Recuperar subgrafo relevante para consulta"""
# Identificar entidades semente na consulta
query_entities = self.entity_extractor.extract(query)
# Encontrar nós correspondentes no gráfico
seed_nodes = []
for entity in query_entities:
matches = self.graph.find_similar_nodes(
entity['text'],
similarity_threshold=0.85
)
seed_nodes.extend(matches)
# Expandir subgrafo por meio de percurso
subgraph = self.graph.create_subgraph()
visited = set()
for seed in seed_nodes:
self._expand_from_node(
seed,
subgraph,
visited,
current_hop=0,
max_hops=max_hops
)
# Classificar nós por relevância
ranked_nodes = self._rank_subgraph_nodes(
subgraph, query
)
# Extrair e formatar contexto
context = self._format_graph_context(
ranked_nodes[:max_nodes],
subgraph
)
return context
def _expand_from_node(self, node, subgraph, visited,
current_hop, max_hops):
"""Expandir recursivamente o subgrafo"""
if current_hop >= max_hops or node in visited:
return
visited.add(node)
subgraph.add_node(node)
# Obter vizinhos
neighbors = self.graph.get_neighbors(node)
for neighbor, edge_data in neighbors:
# Adicionar aresta ao subgrafo
subgraph.add_edge(node, neighbor, edge_data)
# Expandir recursivamente
self._expand_from_node(
neighbor,
subgraph,
visited,
current_hop + 1,
max_hops
)
def _format_graph_context(self, nodes, subgraph):
"""Converter subgrafo em contexto textual"""
context_parts = []
for node in nodes:
# Adicionar contexto do nó
context_parts.append(f"Entidade: {node.text}")
context_parts.append(f"Tipo: {node.entity_type}")
# Adicionar informações de relação
edges = subgraph.get_edges(node)
for edge in edges:
context_parts.append(
f"- {edge.relation_type} -> {edge.target.text}"
)
return "\n".join(context_parts)
Implementação do GraphRAG da Microsoft
A implementação do GraphRAG da Microsoft adota uma abordagem única ao gerar resumos de comunidades:
- Construir o gráfico inicial a partir de documentos usando extração de entidades e relações baseada em LLM
- Detectar comunidades usando o algoritmo Leiden ou similar
- Gerar resumos para cada comunidade usando LLMs
- Estrutura hierárquica: Construir múltiplos níveis de abstrações de comunidade
- Tempo de consulta: Recuperar comunidades relevantes e percorrer até entidades específicas
Essa abordagem é particularmente eficaz para:
- Consultas exploratórias (“Quais são os principais temas nesse corpus?”)
- Raciocínio de múltiplos saltos (“Como A está conectado a C por meio de B?”)
- Análise temporal (“Como as relações dessa entidade evoluíram?”)
Análise Comparativa
Quando Usar Cada Variante
Use LongRAG quando:
- Os documentos têm forte coerência interna
- As janelas de contexto do seu LLM suportam grandes entradas (32K+)
- As respostas às consultas exigem compreensão de dependências de longo alcance
- Você está trabalhando com documentos estruturados (relatórios, artigos, livros)
Use Self-RAG quando:
- A precisão e a confiabilidade são críticas
- Você precisa de decisões de recuperação explicáveis
- Falsos positivos da recuperação irrelevante são custosos
- A complexidade das consultas varia amplamente (algumas precisam de recuperação, outras não)
Use GraphRAG quando:
- Seu domínio tem relações ricas entre entidades
- As consultas envolvem raciocínio de múltiplos saltos
- Relações temporais ou hierárquicas importam
- Você precisa entender conexões entre entidades
Comparação de Métricas de Desempenho
| Métrica | RAG Padrão | LongRAG | Self-RAG | GraphRAG |
|---|---|---|---|---|
| Tempo de Indexação | 1x | 0.8x | 1.1x | 3-5x |
| Latência da Consulta | 1x | 2-3x | 1.4x | 1.5-2x |
| Uso de Memória | 1x | 3-4x | 1.2x | 2-3x |
| Precisão (QA) | base | +15-25% | +20-30% | +25-40%* |
| Interpretabilidade | Baixa | Média | Alta | Alta |
*As melhorias do GraphRAG dependem muito do domínio
Abordagens Híbridas
Os sistemas de produção mais poderosos frequentemente combinam múltiplas técnicas:
LongRAG + GraphRAG: Use a estrutura do gráfico para identificar clusters de documentos relevantes, depois recupere documentos completos em vez de fragmentos
Self-RAG + GraphRAG: Aplique mecanismos de reflexão às decisões de percurso do gráfico (quais caminhos seguir, quando parar a expansão)
Pipeline de três etapas: Use GraphRAG para a recuperação inicial baseada em entidades → Self-RAG para filtragem de relevância → LongRAG para montagem do contexto
Considerações de Implementação
Modelos de Embedding
Diferentes variantes de RAG têm diferentes requisitos de embedding:
LongRAG: Precisa de embeddings que funcionam bem tanto no nível do documento quanto no nível do fragmento. Considere modelos treinados com aprendizado contrastivo em sequências longas.
Self-RAG: Beneficia-se de embeddings que capturam nuances semânticas para avaliação de relevância fina-granular.
GraphRAG: Requer embeddings conscientes de entidades. Modelos finos-tunados em tarefas de vinculação de entidades performam melhor.
A escolha do modelo de embedding impacta significativamente o desempenho. Ao trabalhar com modelos locais, ferramentas como Ollama oferecem uma maneira direta de experimentar com diferentes modelos de embedding antes de comprometer-se a uma implantação de produção.
Estratégias de Fragmentação Revisitadas
A fragmentação tradicional com tamanho fixo é insuficiente para RAG avançado:
Fragmentação semântica: Dividir em limites naturais (parágrafos, seções, mudanças de tópico) Fragmentação recursiva: Criar fragmentos hierárquicos com relações pai-filho Janela deslizante: Usar fragmentos com sobreposição para preservar contexto nos limites Consciente de estrutura: Respeitar a estrutura do documento (cabeçalhos markdown, tags XML, blocos de código)
Para implementações baseadas em Python, bibliotecas como LangChain e LlamaIndex oferecem suporte embutido a essas estratégias de fragmentação.
Integração de Reordenação
A reordenação melhora significativamente a qualidade da recuperação em todas as variantes de RAG. Após a recuperação inicial, um modelo especializado de reordenação reclassifica os resultados com base em características de interação consulta-documento. Isso fornece um aumento significativo na precisão (10-20%) com impacto mínimo na latência quando integrado de forma pensada.
Escalando para Produção
Pipeline de indexação:
- Use processamento distribuído (Ray, Dask) para grandes corporas de documentos
- Implemente indexação incremental para atualizações em tempo real
- Armazene embeddings em bancos de dados vetoriais otimizados (Pinecone, Weaviate, Qdrant)
Otimização de consultas:
- Cancele consultas frequentes e seus resultados
- Implemente roteamento de consultas (diferentes variantes de RAG para diferentes tipos de consultas)
- Use busca de vizinhos próximos aproximada para escalabilidade sublinear
Monitoramento:
- Rastreie pontuações de relevância da recuperação
- Monitore decisões de reflexão no Self-RAG
- Meça caminhos e profundidades de percurso no gráfico
- Registre pontuações de confiança e feedback do usuário
Aplicações em Mundo Real
Pesquisa em Documentação Técnica
Um grande provedor de nuvem implementou GraphRAG para sua documentação:
- Entidades: Pontos finais de API, parâmetros, códigos de erro, nomes de serviços
- Relações: Dependências, compatibilidade de versão, caminhos de migração
- Resultado: Redução de 35% nas solicitações de suporte, tempo de resolução 45% mais rápido
Descoberta Jurídica
Uma empresa de tecnologia jurídica combinou Self-RAG com LongRAG:
- Self-RAG filtra documentos irrelevantes cedo
- LongRAG preserva contexto em documentos retidos
- Advogados revisam 60% menos falsos positivos
- A preservação de contexto crítico melhorou de 71% para 94%
Revisão de Literatura Acadêmica
Motor de busca acadêmico usando abordagem híbrida:
- GraphRAG identifica redes de citação e comunidades de pesquisa
- LongRAG recupera seções completas mantendo contexto metodológico
- Melhoria de 40% na descoberta de artigos relevantes
- Redução do tempo de revisão de literatura de semanas para dias
Tópicos Avançados
RAG Multimodal
Extensão dessas variantes para lidar com imagens, tabelas e código:
- Aterramento visual: Vincular entidades de texto a imagens em documentos
- Entendimento de tabelas: Parsear dados estruturados em formato de gráfico
- Análise de código: Construir gráficos de dependência a partir de bases de código
RAG Adaptativo
Seleção dinâmica da estratégia de RAG com base nas características da consulta:
- Classificador de complexidade da consulta
- Detectador de tipo de documento
- Otimizador de custo-benefício para seleção de estratégia
RAG com Preservação de Privacidade
Implementação dessas variantes com restrições de privacidade:
- Recuperação federada em silos de dados
- Privacidade diferencial em embeddings
- Busca de similaridade criptografada
Começando
Início Rápido com Python
Para aqueles que desejam implementar essas técnicas, começar com uma base sólida em Python é essencial. A rica ecossistema de Python para aprendizado de máquina o torna a escolha natural para o desenvolvimento de RAG.
Aqui está um ponto de partida simples para experimentação:
# Instale dependências
# pip install sentence-transformers faiss-cpu langchain
from sentence_transformers import SentenceTransformer
import faiss
import numpy as np
# Configuração básica para experimentar com longos trechos
model = SentenceTransformer('all-MiniLM-L6-v2')
documents = [
# Seus documentos longos aqui
]
# Crie embeddings
embeddings = model.encode(documents)
# Construa o índice FAISS
dimension = embeddings.shape[1]
index = faiss.IndexFlatL2(dimension)
index.add(embeddings.astype('float32'))
# Consulta
query = "Sua pergunta aqui"
query_embedding = model.encode([query])
distances, indices = index.search(
query_embedding.astype('float32'), k=3
)
Seleção de Framework
LangChain: Ideal para prototipagem rápida, com integrações extensas
LlamaIndex: Otimizado para indexação e recuperação de documentos
Haystack: Pronto para produção, com fortes abstrações de pipeline
Personalizado: Quando você precisa de controle total e otimização
Framework de Avaliação
Implemente uma avaliação rigorosa antes do implantação em produção:
Métricas de recuperação:
- Precisão@K, Recall@K, MRR (Mean Reciprocal Rank)
- NDCG (Normalized Discounted Cumulative Gain)
Métricas de geração:
- ROUGE, BLEU para similaridade de texto
- BERTScore para similaridade semântica
- Avaliação humana para avaliação de qualidade
Métricas de ponta a ponta:
- Taxa de sucesso na tarefa
- Pontuação de satisfação do usuário
- Percentis de latência (p50, p95, p99)
Conclusão
O cenário dos sistemas RAG evoluiu significativamente além da simples busca por similaridade de vetores. LongRAG, Self-RAG e GraphRAG cada um aborda limitações específicas das abordagens tradicionais:
LongRAG resolve o problema de fragmentação de contexto ao adotar janelas de contexto estendidas e minimizar a quebra de trechos. É a escolha ideal quando a coerência dos documentos importa e você tem os recursos computacionais para lidar com contextos grandes.
Self-RAG adiciona uma consciência crítica aos sistemas de recuperação. Ao refletir sobre suas próprias decisões, ele reduz falsos positivos e melhora a confiabilidade — essencial para aplicações de alto risco onde a precisão importa mais que a velocidade.
GraphRAG desbloqueia o poder da representação estruturada do conhecimento. Quando seu domínio envolve relações complexas entre entidades, a recuperação baseada em grafos pode revelar conexões que a similaridade de vetores completamente ignora.
O futuro do RAG provavelmente envolverá abordagens híbridas que combinam as forças dessas variantes. Um sistema de produção pode usar GraphRAG para identificar clusters de entidades relevantes, Self-RAG para filtrar e validar recuperações, e LongRAG para montar contexto coerente para o LLM.
À medida que os LLMs continuam a melhorar e as janelas de contexto se expandem, veremos variantes ainda mais sofisticadas de RAG surgirem. A chave é compreender os requisitos específicos do seu caso de uso — estrutura de documento, padrões de consulta, exigências de precisão e restrições computacionais — e selecionar a técnica apropriada ou a combinação dela.
O ecossistema de ferramentas está amadurecendo rapidamente, com frameworks como LangChain, LlamaIndex e Haystack oferecendo suporte cada vez mais sofisticado para esses padrões avançados. Combinados com poderosos runtimes locais de LLM e modelos de embedding, nunca foi mais fácil experimentar e implantar sistemas RAG de produção.
Comece com os fundamentos, meça o desempenho rigorosamente e evolua sua arquitetura conforme as necessidades indicarem. As variantes avançadas de RAG abordadas aqui fornecem um mapa para essa evolução.
Links Úteis
- Folha de Dicas do Python
- Reclassificação com modelos de embedding
- LLMs e Saída Estruturada: Ollama, Qwen3 e Python ou Go
- Fornecedores de LLM na Nuvem
- Comparação de LLMs: Qwen3:30b vs GPT-OSS:20b
Referências Externas
- Microsoft GraphRAG: Um Sistema Modular de Recuperação Aumentada com Geração Baseado em Grafos
- Self-RAG: Aprendizado para Recuperar, Gerar e Criticar por meio de Auto-Reflexão
- LongRAG: Melhorando a Geração Aumentada com LLMs de Contexto Longo
- Geração Aumentada para Modelos de Linguagem Grandes: Uma Revisão
- FAISS: Uma Biblioteca para Busca de Similaridade Eficiente
- Documentação do LangChain: Técnicas Avançadas de RAG
- HuggingFace: Transformers de Frases para Modelos de Embedding
- Revisão de RAG: Análise abrangente da Geração Aumentada com Recuperação