Building Production RAG Systems
RAG combines LLMs with external knowledge retrieval for accurate, up-to-date responses.
Document Chunking
from langchain.text_splitter import RecursiveCharacterTextSplitter
def create_chunks(documents, chunk_size=1000, overlap=200):
splitter = RecursiveCharacterTextSplitter(
chunk_size=chunk_size,
chunk_overlap=overlap,
separators=["
", "
", ". ", " ", ""],
)
return splitter.split_documents(documents)
Vector Storage
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import PGVector
def build_vector_store(chunks, collection_name="knowledge_base"):
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
return PGVector.from_documents(
documents=chunks,
embedding=embeddings,
collection_name=collection_name,
connection_string=os.getenv("DATABASE_URL"),
)
Reranking
from sentence_transformers import CrossEncoder
class ReRanker:
def __init__(self):
self.model = CrossEncoder("cross-encoder/ms-marco-MiniLM-L-6-v2")
def rerank(self, query, documents, top_k=3):
pairs = [(query, doc.page_content) for doc in documents]
scores = self.model.predict(pairs)
ranked = sorted(zip(documents, scores), key=lambda x: x[1], reverse=True)
return [doc for doc, _ in ranked[:top_k]]
HyDE
def hyde_retrieve(vectorstore, query, k=5):
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)
hypothetical = llm.invoke(f"Write a document answering: {query}").content
return vectorstore.similarity_search(hypothetical, k=k)
Evaluation
from ragas import evaluate
from ragas.metrics import answer_relevancy, faithfulness, context_recall
def evaluate_rag(qa_pairs, pipeline):
results = [{"question": q["question"], "answer": a, "contexts": c,
"ground_truth": q["ground_truth"]}
for q in qa_pairs for a, c in [pipeline(q["question"])]]
return evaluate(results, metrics=[answer_relevancy, faithfulness, context_recall])
Best Practices
| Strategy | Benefit |
|---|---|
| Semantic chunking | Better context |
| HyDE | Better recall |
| Reranking | Better precision |
| Hybrid search | Best coverage |