RAG Avançado: LongRAG, Self-RAG e GraphRAG Explicados
LongRAG, Self-RAG, GraphRAG – Técnicas de próxima geração
Geração Aumentada por Recuperação (RAG) evoluiu muito além da simples busca de similaridade vetorial. LongRAG, Self-RAG e GraphRAG representam o estado da arte dessas capacidades.
Sistemas RAG modernos precisam lidar com documentos massivos, entender relacionamentos complexos de entidades e muito mais.
Esta bela imagem foi gerada pelo modelo de IA Flux 1 dev.
A Evolução Além do RAG Básico
Os sistemas RAG tradicionais seguem um padrão simples: dividir documentos em blocos (chunks), incorporá-los em vetores, recuperar blocos similares via similaridade de cosseno e alimentá-los em um LLM. Embora eficaz para muitos casos de uso, essa abordagem enfrenta dificuldades em três cenários críticos:
Compreender a distinção entre busca, deepsearch e pesquisa profunda ajuda a esclarecer por que variantes avançadas de RAG são necessárias para tarefas complexas de recuperação de informações. Para uma análise mais aprofundada desses conceitos, consulte Busca vs Deepsearch vs Pesquisa Profunda.
- Dependências de longo alcance: O contexto importante pode abranger milhares de tokens em múltiplos blocos
- Confiança na recuperação: O sistema não tem como avaliar se o conteúdo recuperado é realmente relevante
- Complexidade de relacionamentos: A similaridade vetorial não consegue capturar conexões intricadas entre entidades
Variantes avançadas de RAG abordam essas limitações com arquiteturas especializadas adaptadas a desafios específicos.
LongRAG: Conquistando o Contexto Estendido
Visão Geral da Arquitetura
O LongRAG reimagina fundamentalmente a estratégia de fragmentação (chunking) aproveitando LLMs com janelas de contexto estendidas (32K, 100K ou até 1M tokens). Em vez de dividir documentos em blocos pequenos de 512 tokens, o LongRAG utiliza uma abordagem hierárquica:
Incorporação ao Nível de Documento: O documento inteiro (ou seções muito grandes) é processado como uma única unidade. Uma incorporação de nível de documento captura o significado semântico geral, mantendo o texto completo para processamento subsequente.
Fragmentação Mínima: Quando a fragmentação é necessária, o LongRAG usa blocos muito maiores (4K-8K tokens) com sobreposição significativa (20-30%). Isso preserva o fluxo narrativo e reduz a fragmentação do contexto.
Montagem de Contexto: No momento da recuperação, o LongRAG retorna documentos completos ou seções grandes e coerentes, em vez de fragmentos dispersos. O LLM recebe um contexto contínuo que preserva os relacionamentos estruturais e semânticos.
Estratégia de Implementação
Aqui está uma implementação conceitual usando Python e modelos de incorporação modernos:
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]:
"""Cria blocos grandes sobrepostos"""
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):
"""Indexa documento com incorporação hierárquica"""
# Incorpora documento inteiro
doc_embedding = self.model.embed(doc)
# Cria blocos grandes 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]:
"""Recupera conteúdo relevante de formato longo"""
query_embedding = self.model.embed(query)
# Pontua primeiro no nível de documento
doc_scores = [
np.dot(query_embedding, doc['doc_embedding'])
for doc in self.doc_embeddings
]
# Obtém 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, encontra os melhores blocos
chunk_scores = [
np.dot(query_embedding, emb)
for emb in doc_data['chunk_embeddings']
]
best_chunk_idx = np.argmax(chunk_scores)
# Retorna contexto estendido ao redor do melhor bloco
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]:
"""Obtém contexto estendido ao redor do bloco relevante"""
start = max(0, center_idx - 1)
end = min(len(chunks), center_idx + 2)
return chunks[start:end]
Casos de Uso e Desempenho
O LongRAG destaca-se em cenários onde o contexto importa:
- Análise de documentos legais: Contratos e memorandos legais frequentemente têm dependências que se estendem por dezenas de páginas
- Recuperação de artigos de pesquisa: Compreender a metodologia requer seções coerentes, não parágrafos isolados
- Repositórios de código: Funções e classes devem ser compreendidas dentro do contexto de seu módulo
Características de desempenho:
- Latência: Maior devido ao processamento de blocos grandes (2-5x mais lento que o RAG padrão)
- Precisão: Melhoria de 15-25% em benchmarks de QA de formato longo
- Memória: Requer 3-4x mais memória para janelas de contexto
Self-RAG: Recuperação Reflexiva
Princípios Centrais
O Self-RAG introduz uma camada metacognitiva aos sistemas RAG. Em vez de recuperar e gerar cegamente, o sistema reflete ativamente sobre seus próprios processos através de tokens de reflexão especiais:
Token Retrieve: Decide se a recuperação é necessária para uma consulta dada Token Relevance: Avalia se os documentos recuperados são realmente relevantes Token Support: Verifica se a resposta gerada é sustentada pelo conteúdo recuperado Token Critique: Avalia a qualidade geral da resposta gerada
Componentes da Arquitetura
A arquitetura 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):
"""Gera resposta com autorreflexão"""
# Fase 1: Decide 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: Recupera e avalia 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: Gera e verifica suporte
best_answer = None
best_score = -1
for _ in range(max_iterations):
# Gera resposta candidata
answer = self.generator.generate(
query, context=relevant_docs
)
# Avalia 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 alta qualidade for atingida
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
O Self-RAG requer o treinamento do componente crítico para realizar avaliações confiáveis. Isso tipicamente envolve:
- Ajuste supervisionado (fine-tuning) em conjuntos de dados anotados com julgamentos de relevância
- Aprendizado por reforço com recompensas por 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 de classificador separadas no modelo
- Modelos críticos externos (abordagem de ensemble)
Considerações de Produção
Ao implantar Self-RAG em sistemas de produção:
Compensações de Latência: Cada passo de reflexão adiciona 20-40% de sobrecarga de inferência. Equilibre a profundidade com os requisitos de tempo de resposta.
Limiares de Confiança: Ajuste os limiares de reflexão com base no seu caso de uso. Aplicações legais ou médicas precisam de maior confiança do que chatbots gerais.
Monitoramento: Acompanhe as decisões de reflexão para identificar padrões. Se a recuperação raramente for necessária, você pode se beneficiar de uma arquitetura mais simples.
GraphRAG: Recuperação Aprimorada por Grafo de Conhecimento
Fundamentação Conceitual
O GraphRAG transforma o problema de recuperação de similaridade vetorial para travessia de grafo. Em vez de encontrar blocos de texto semanticamente similares, o GraphRAG identifica subgrafos relevantes de entidades e relacionamentos conectados.
Extração de Entidades: Identifica entidades nomeadas, conceitos e seus tipos Mapeamento de Relacionamentos: Extrai relacionamentos entre entidades (temporal, causal, hierárquico) Construção de Grafo: Constrói um grafo de conhecimento com entidades como nós e relacionamentos como arestas Recuperação de Subgrafo: Dada uma consulta, encontra subgrafos conectados relevantes
Pipeline de Construção de Grafo
Construir um grafo de conhecimento a partir de texto não estruturado envolve vários estágios:
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]):
"""Constrói grafo de conhecimento a partir de documentos"""
for doc in documents:
# Extrai entidades
entities = self.entity_extractor.extract(doc)
# Adiciona entidades como nós
for entity in entities:
self.graph.add_node(
entity['text'],
entity_type=entity['type'],
context=entity['surrounding_text']
)
# Extrai relacionamentos
relations = self.relation_extractor.extract(
doc, entities
)
# Adiciona relacionamentos 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):
"""Adiciona relacionamentos derivados e metadados"""
# Computa importância dos nós (PageRank, etc.)
self.graph.compute_centrality()
# Identifica comunidades/cluster
self.graph.detect_communities()
# Adiciona ordenamento temporal se carimbos de data/hora estiverem disponíveis
self.graph.add_temporal_edges()
Processamento de Consulta com Grafos
As consultas GraphRAG envolvem raciocínio multi-hop através do grafo 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):
"""Recupera subgrafo relevante para a consulta"""
# Identifica entidades semente na consulta
query_entities = self.entity_extractor.extract(query)
# Encontra nós correspondentes no grafo
seed_nodes = []
for entity in query_entities:
matches = self.graph.find_similar_nodes(
entity['text'],
similarity_threshold=0.85
)
seed_nodes.extend(matches)
# Expande subgrafo via travessia
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
)
# Classifica nós por relevância
ranked_nodes = self._rank_subgraph_nodes(
subgraph, query
)
# Extrai e formata 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):
"""Expande subgrafo recursivamente"""
if current_hop >= max_hops or node in visited:
return
visited.add(node)
subgraph.add_node(node)
# Obtém vizinhos
neighbors = self.graph.get_neighbors(node)
for neighbor, edge_data in neighbors:
# Adiciona aresta ao subgrafo
subgraph.add_edge(node, neighbor, edge_data)
# Expande recursivamente
self._expand_from_node(
neighbor,
subgraph,
visited,
current_hop + 1,
max_hops
)
def _format_graph_context(self, nodes, subgraph):
"""Converte subgrafo em contexto textual"""
context_parts = []
for node in nodes:
# Adiciona contexto do nó
context_parts.append(f"Entidade: {node.text}")
context_parts.append(f"Tipo: {node.entity_type}")
# Adiciona informações de relacionamento
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
O GraphRAG da Microsoft adota uma abordagem única ao gerar resumos de comunidades:
- Constrói grafo inicial a partir de documentos usando extração de entidades/relacionamentos baseada em LLM
- Detecta comunidades usando o algoritmo Leiden ou similar
- Gera resumos para cada comunidade usando LLMs
- Estrutura hierárquica: Constrói múltiplos níveis de abstrações de comunidade
- Tempo de consulta: Recupera comunidades relevantes e atravessa para entidades específicas
Essa abordagem é particularmente eficaz para:
- Consultas exploratórias (“Quais são os principais temas neste corpus?”)
- Raciocínio multi-hop (“Como A está conectado a C através de B?”)
- Análise temporal (“Como os relacionamentos desta entidade evoluíram?”)
Análise Comparativa
Quando Usar Cada Variante
Use LongRAG quando:
- Documentos têm coerência interna forte
- Janelas de contexto do seu LLM suportam entradas grandes (32K+)
- Respostas a consultas requerem compreensão de dependências de longo alcance
- Você está trabalhando com documentos estruturados (relatórios, artigos, livros)
Use Self-RAG quando:
- Precisão e confiabilidade são críticas
- Você precisa de decisões de recuperação explicáveis
- Falsos positivos de recuperação irrelevante são custosos
- A complexidade da consulta varia amplamente (algumas precisam de recuperação, outras não)
Use GraphRAG quando:
- Seu domínio tem relacionamentos ricos de entidades
- Consultas envolvem raciocínio multi-hop
- Relacionamentos temporais ou hierárquicos 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 de Consulta | 1x | 2-3x | 1.4x | 1.5-2x |
| Uso de Memória | 1x | 3-4x | 1.2x | 2-3x |
| Precisão (QA) | baseline | +15-25% | +20-30% | +25-40%* |
| Interpretabilidade | Baixa | Média | Alta | Alta |
*Melhorias do GraphRAG altamente dependentes do domínio
Abordagens Híbridas
Os sistemas de produção mais poderosos frequentemente combinam múltiplas técnicas:
LongRAG + GraphRAG: Use estrutura de grafo para identificar clusters de documentos relevantes, depois recupere documentos completos em vez de fragmentos
Self-RAG + GraphRAG: Aplique mecanismos de reflexão a decisões de travessia de grafo (quais caminhos seguir, quando parar a expansão)
Pipeline de três estágios: Use GraphRAG para recuperação inicial baseada em entidades → Self-RAG para filtragem de relevância → LongRAG para montagem de contexto
Considerações de Implementação
Modelos de Incorporação
Diferentes variantes de RAG têm requisitos de incorporação distintos:
LongRAG: Precisa de incorporações que funcionem bem tanto no nível de documento quanto no nível de bloco. Considere modelos treinados com aprendizado contrastivo em sequências longas.
Self-RAG: Beneficia-se de incorporações que capturam nuances semânticas para avaliação de relevância de grão fino.
GraphRAG: Requer incorporações conscientes de entidades. Modelos ajustados em tarefas de vinculação de entidades performam melhor.
A escolha do modelo de incorporação impacta significativamente o desempenho. Ao trabalhar com modelos locais, ferramentas como Ollama fornecem uma maneira direta de experimentar com diferentes modelos de incorporação antes de comprometer-se com uma implantação de produção.
Estratégias de Fragmentação Revisitadas
A fragmentação de tamanho fixo tradicional é insuficiente para RAG avançado:
Fragmentação semântica: Quebre em limites naturais (parágrafos, seções, mudanças de tópico) Fragmentação recursiva: Crie blocos hierárquicos com relacionamentos pai-filho Janela deslizante: Use blocos sobrepostos para preservar contexto nos limites Consciente de estrutura: Respeite a estrutura do documento (cabeçalhos markdown, tags XML, blocos de código)
Para implementações baseadas em Python, bibliotecas como LangChain e LlamaIndex fornecem suporte nativo para essas estratégias de fragmentação.
Integração de Reranking
O reranking melhora drasticamente a qualidade de recuperação em todas as variantes de RAG. Após a recuperação inicial, um modelo de reranking especializado reclassifica os resultados com base em características de interação consulta-documento. Isso proporciona um aumento significativo de precisão (10-20%) com impacto mínimo de latência quando integrado de forma inteligente.
Escalonamento para Produção
Pipeline de indexação:
- Use processamento distribuído (Ray, Dask) para grandes corpora de documentos
- Implemente indexação incremental para atualizações em tempo real
- Armazene incorporações em bancos de dados vetoriais otimizados (Pinecone, Weaviate, Qdrant)
Otimização de consulta:
- Cacheie consultas frequentes e seus resultados
- Implemente roteamento de consulta (diferentes variantes de RAG para diferentes tipos de consulta)
- Use busca de vizinho mais próximo aproximado para escalonamento sublinear
Monitoramento:
- Acompanhe pontuações de relevância de recuperação
- Monitore decisões de reflexão no Self-RAG
- Meça caminhos e profundidades de travessia de grafo
- Registre pontuações de confiança e feedback do usuário
Aplicações do Mundo Real
Pesquisa em Documentação Técnica
Um grande provedor de nuvem implementou GraphRAG para sua documentação:
- Entidades: Endpoints de API, parâmetros, códigos de erro, nomes de serviço
- Relacionamentos: Dependências, compatibilidades de versão, caminhos de migração
- Resultado: Redução de 35% em tickets de suporte, tempo de resolução 45% mais rápido
Descoberta Legal
Uma empresa de tecnologia jurídica combinou Self-RAG com LongRAG:
- Self-RAG filtra documentos irrelevantes precocemente
- LongRAG preserva contexto nos documentos retidos
- Advogados revisam 60% menos falsos positivos
- Preservação de contexto crítico melhorou de 71% para 94%
Revisão de Literatura Acadêmica
Mecanismo de busca acadêmico usando abordagem híbrida:
- GraphRAG identifica redes de citação e comunidades de pesquisa
- LongRAG recupera seções completas mantendo o 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
Estendendo essas variantes para lidar com imagens, tabelas e código:
- Ancoragem visual: Vincular entidades de texto a imagens em documentos
- Compreensão de tabelas: Analisar dados estruturados em formato de grafo
- Análise de código: Construir grafos de dependência a partir de bases de código
RAG Adaptativo
Seleção dinâmica de estratégia de RAG baseada em características da consulta:
- Classificador de complexidade de consulta
- Detetor de tipo de documento
- Otimizador de custo-benefício para seleção de estratégia
RAG com Preservação de Privacidade
Implementando essas variantes com restrições de privacidade:
- Recuperação federada através de silos de dados
- Privacidade diferencial em incorporações
- 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. O rico ecossistema de Python para aprendizado de máquina o torna a escolha natural para 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 experimentação com blocos longos
model = SentenceTransformer('all-MiniLM-L6-v2')
documents = [
# Seus documentos de formato longo aqui
]
# Cria incorporações
embeddings = model.encode(documents)
# Constrói í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: Melhor para prototipagem rápida, integrações extensas LlamaIndex: Otimizado para indexação e recuperação de documentos Haystack: Pronto para produção, abstrações de pipeline robustas Personalizado: Quando você precisa de controle total e otimização
Framework de Avaliação
Implemente avaliação rigorosa antes da implantação em produção:
Métricas de recuperação:
- Precisão@K, Recall@K, MRR (Rank Recíproco Médio)
- NDCG (Ganho Acumulado Descontado Normalizado)
Métricas de geração:
- ROUGE, BLEU para similaridade de texto
- BERTScore para similaridade semântica
- Avaliação humana para qualidade
Métricas de ponta a ponta:
- Taxa de sucesso da tarefa
- Pontuações de satisfação do usuário
- Percentis de latência (p50, p95, p99)
Conclusão
O cenário de sistemas RAG amadureceu significativamente além da busca básica de similaridade vetorial. LongRAG, Self-RAG e GraphRAG abordam limitações específicas de abordagens tradicionais:
LongRAG resolve o problema de fragmentação de contexto ao abraçar janelas de contexto estendidas e fragmentação mínima. É a escolha ideal quando a coerência do documento importa e você tem recursos computacionais para lidar com contextos grandes.
Self-RAG adiciona autoconsciência crítica aos sistemas de recuperação. Ao refletir sobre suas próprias decisões, 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 de conhecimento estruturado. Quando seu domínio envolve relacionamentos complexos entre entidades, a recuperação baseada em grafo pode revelar conexões que a similaridade vetorial perde completamente.
O futuro do RAG provavelmente envolve 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 ainda mais variantes sofisticadas de RAG emergirem. A chave é entender seus requisitos específicos de caso de uso—estrutura de documento, padrões de consulta, demandas de precisão e restrições computacionais—e selecionar a técnica apropriada ou combinação delas.
O ecossistema de ferramentas está amadurecendo rapidamente, com frameworks como LangChain, LlamaIndex e Haystack fornecendo suporte cada vez mais sofisticado para esses padrões avançados. Combinados com runtimes poderosos de LLM locais e modelos de incorporação, nunca foi tão fácil experimentar e implantar sistemas de RAG de nível de produção.
Comece com o básico, meça o desempenho rigorosamente e evolua sua arquitetura conforme os requisitos ditarem. As variantes avançadas de RAG cobertas aqui fornecem um roteiro para essa evolução.
Links Úteis
- Reranking com modelos de incorporação
- LLMs e Saída Estruturada: Ollama, Qwen3 & Python ou Go
- Provedores de LLM na Nuvem
- Comparação de LLMs: Qwen3:30b vs GPT-OSS:20b
- Tutorial RAG passo a passo
- Comparação de fragmentação em RAG
- Comparação de bancos de dados vetoriais para RAG
Referências Externas
- Microsoft GraphRAG: A Modular Graph-Based Retrieval-Augmented Generation System
- Self-RAG: Learning to Retrieve, Generate, and Critique through Self-Reflection
- LongRAG: Enhancing Retrieval-Augmented Generation with Long-context LLMs
- Retrieval-Augmented Generation for Large Language Models: A Survey
- FAISS: A Library for Efficient Similarity Search
- LangChain Documentation: Advanced RAG Techniques
- HuggingFace: Sentence Transformers for Embedding Models
- RAG Survey: A Comprehensive Analysis of Retrieval Augmented Generation