Advanced RAG Techniques Overview
Recent developments in retrieval-augmented generation have led to three distinct paradigms:
- Naive RAG
- Advenced RAG
- Modular RAG
This article explores these approaches and demonstrates how to implement an advanced RAG pipeline using LlamaIndex with Python. We'll cover three key optimization techniques:
- Pre-retrieval optimization: Sentence window retrieval
- Retrieval optimization: Hybrid search
- Post-retrieval optimization: Re-ranking
Advanced RAG Implementation
Advanced RAG addresses limitations of naive approaches through targeted enhancements in data processing, retrieval, and post-processing stages.
Prerequisites
Required packages:
pip install llama-index
pip install weaviate-client llama-index-vector-stores-weaviate
API configuration:
import os
from dotenv import load_dotenv, find_dotenv
load_dotenv(find_dotenv())
Basic RAG Implementation
Configure models and load data:
from llama_index.embeddings.openai import OpenAIEmbedding
from llama_index.llms.openai import OpenAI
from llama_index.core.settings import Settings
Settings.llm = OpenAI(model="gpt-3.5-turbo", temperature=0.1)
Settings.embed_model = OpenAIEmbedding()
from llama_index.core import SimpleDirectoryReader
documents = SimpleDirectoryReader(
input_files=["./data/sample_document.txt"]
).load_data()
Parse documents and build index:
from llama_index.core.node_parser import SimpleNodeParser
node_parser = SimpleNodeParser.from_defaults(chunk_size=1024)
nodes = node_parser.get_nodes_from_documents(documents)
import weaviate
client = weaviate.Client(embedded_options=weaviate.embedded.EmbeddedOptions())
from llama_index.core import VectorStoreIndex, StorageContext
from llama_index.vector_stores.weaviate import WeaviateVectorStore
vector_store = WeaviateVectorStore(weaviate_client=client, index_name="DocumentIndex")
storage_context = StorageContext.from_defaults(vector_store=vector_store)
index = VectorStoreIndex(nodes, storage_context=storage_context)
Query execution:
query_engine = index.as_query_engine()
response = query_engine.query("Query about document content")
Advanced RAG Enhancements
Sentence window retrieval:
from llama_index.core.node_parser import SentenceWindowNodeParser
node_parser = SentenceWindowNodeParser.from_defaults(
window_size=3,
window_metadata_key="context_window",
original_text_metadata_key="source_text"
)
from llama_index.core.postprocessor import MetadataReplacementPostProcessor
post_processor = MetadataReplacementPostProcessor(target_metadata_key="context_window")
Hybrid search configuration:
query_engine = index.as_query_engine(
vector_store_query_mode="hybrid",
alpha=0.5
)
Re-ranking implementation:
from llama_index.core.postprocessor import SentenceTransformerRerank
reranker = SentenceTransformerRerank(
top_n=2,
model="BAAI/bge-reranker-base"
)
query_engine = index.as_query_engine(
similarity_top_k=6,
node_postprocessors=[reranker]
)