正在加载,请稍候…

Building Production RAG Systems: Retrieval-Augmented Generation Complete Guide

Master RAG architecture for LLM applications. Learn chunking strategies, embedding models, vector search, reranking, and evaluation metrics for production-grade AI systems.

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