RAG 检索增强

RAG(Retrieval-Augmented Generation) 在生成前从外部知识库检索相关片段,降低幻觉、支持私有数据。LangChain 提供 Loader、Splitter、Embedding、VectorStore、Retriever 全链路组件。


RAG 流水线

flowchart LR
  D[文档] --> L[Loader]
  L --> S[Splitter]
  S --> E[Embedding]
  E --> V[VectorStore]
  Q[用户问题] --> R[Retriever]
  V --> R
  R --> P[Prompt + Context]
  P --> M[LLM / Agent]

索引阶段(离线)

from langchain_community.document_loaders import TextLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import Chroma

loader = TextLoader("docs/guide.txt", encoding="utf-8")
docs = loader.load()

splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
chunks = splitter.split_documents(docs)

embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
vectorstore = Chroma.from_documents(chunks, embeddings, persist_directory="./chroma_db")
retriever = vectorstore.as_retriever(search_kwargs={"k": 4})

要点:

  • chunk_size / overlap 影响召回粒度
  • 生产常用 Chroma / Pinecone / pgvector / Qdrant
  • 索引与查询可使用不同 Embedding 模型(需一致)

检索阶段(在线)

简单 LCEL / Runnable 链

from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI

prompt = ChatPromptTemplate.from_template(
    "Answer using context:\n{context}\n\nQuestion: {question}"
)

def format_docs(docs):
    return "\n\n".join(d.page_content for d in docs)

chain = (
    {"context": retriever | format_docs, "question": lambda x: x["question"]}
    | prompt
    | ChatOpenAI(model="gpt-4.1-mini")
)

chain.invoke({"question": "What is LangChain 1.0?"})

RAG Agent(推荐)

让 Agent 自己决定何时检索

from langchain.tools import tool
from langchain.agents import create_agent

@tool
def search_docs(query: str) -> str:
    """Search internal documentation."""
    docs = retriever.invoke(query)
    return "\n---\n".join(d.page_content for d in docs)

agent = create_agent(
    "openai:gpt-4.1-mini",
    tools=[search_docs],
    system_prompt="Use search_docs for factual questions. Say if context is insufficient.",
)

Agentic RAG 适合多步检索、比较、过滤;纯链式 RAG 适合固定问答。


提升 RAG 质量

手段说明
Hybrid search向量 + BM25
Reranker交叉编码器重排 top-k
Metadata filter按部门、日期过滤
Parent document小块检索、大块返回
EvalLangSmith 数据集回归

与 Middleware 结合

  • before_model 自动检索并注入 context(隐式 RAG)
  • 或通过工具显式检索(可解释、可审计)

企业场景常偏好 显式工具 + 日志,便于合规。


常见问题

检索为空? 检查 embedding 模型、语言、chunk 是否过碎。

答非所问? 提高 k、加 rerank、优化 prompt 要求「仅依据 context」。

延迟高? 缓存 embedding、异步索引、缩小 k。


下一步