使用LangChain构建RAG管道:从文档处理到向量搜索

6月 15, 2026·
杨劲松
杨劲松
· 2 分钟阅读时长
blog

检索增强生成(RAG)已成为构建需要访问特定知识库的AI应用的标准方法。本指南将介绍如何使用LangChain从零开始构建完整的RAG管道。

上图:Production RAG Pipeline — 文档摄入 → 向量嵌入 → 检索 → 增强生成 → 输出

目录

  1. 什么是RAG?
  2. 文档处理
  3. 向量存储
  4. 检索策略
  5. 幻觉预防
  6. 流式接口
  7. 生产环境考虑

什么是RAG?

RAG结合了大语言模型和外部知识检索的能力:

用户查询 → 检索 → 上下文 + 查询 → LLM → 回答

这种方法解决了LLM的核心问题:它们只能基于训练数据回答问题。RAG允许它们访问最新的、特定领域的或私有的信息。

文档处理

第一步是为检索准备文档:

from langchain.document_loaders import PyPDFLoader
from langchain.text_splitter import TokenTextSplitter

# 加载文档
loader = PyPDFLoader("knowledge_base.pdf")
documents = loader.load()

# 分割为块
text_splitter = TokenTextSplitter(
    chunk_size=500,
    chunk_overlap=50,
    encoding_name="cl100k_base"  # OpenAI分词器
)

chunks = text_splitter.split_documents(documents)

关键考虑

  1. 块大小 - 平衡上下文和检索准确性
  2. 重叠 - 防止重要信息被分割到不同块中
  3. 元数据 - 保留源信息用于归属

向量存储

存储嵌入以进行高效相似性搜索:

from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Redis

# 初始化嵌入
embeddings = OpenAIEmbeddings()

# 创建向量存储
vector_store = Redis.from_documents(
    documents=chunks,
    embedding=embeddings,
    redis_url="redis://localhost:6379",
    index_name="knowledge_base"
)

选择向量存储

存储性能功能最佳用途
Redis高实时更新生产环境
Pinecone高托管服务企业级
FAISS中本地、免费开发环境
Chroma中简单设置原型开发

检索策略

使用LangChain实现智能检索:

from langchain.retrievers import ContextualCompressionRetriever
from langchain.retrievers.document_compressors import LLMChainExtractor

# 基本相似性搜索
retriever = vector_store.as_retriever(
    search_type="similarity",
    search_kwargs={"k": 5}
)

# 高级:上下文压缩
compressor = LLMChainExtractor.from_llm(llm)
compression_retriever = ContextualCompressionRetriever(
    base_compressor=compressor,
    base_retriever=retriever
)

幻觉预防

对生产级RAG系统至关重要:

from langchain.prompts import ChatPromptTemplate

system_prompt = """你是一位农业专家。仅基于提供的上下文回答问题。如果上下文没有包含足够的信息,请说"我没有足够的信息来回答这个问题。"

上下文:{context}
"""

prompt = ChatPromptTemplate.from_messages([
    ("system", system_prompt),
    ("human", "{input}")
])

三层预防

  1. 检索过滤 - 仅传递高相关性文档
  2. 提示词工程 - 强制模型引用来源
  3. 输出验证 - 验证响应与源数据

流式接口

使用FastAPI实现实时响应:

from fastapi import FastAPI
from fastapi.responses import StreamingResponse
import asyncio

app = FastAPI()

@app.post("/chat")
async def chat(query: str):
    async def generate():
        async for chunk in chain.astream({"input": query}):
            yield f"data: {chunk.content}\n\n"
            await asyncio.sleep(0.01)  # 模拟打字效果
        yield "data: [DONE]\n\n"
    
    return StreamingResponse(
        generate(),
        media_type="text/event-stream"
    )

生产环境考虑

1. 错误处理

try:
    response = await chain.ainvoke({"input": query})
except Exception as e:
    logger.error(f"RAG错误: {e}")
    return {"error": "生成响应失败"}

2. 缓存

from langchain.cache import RedisCache

cache = RedisCache(redis_url="redis://localhost:6379")
llm = OpenAI(cache=cache)

3. 监控

跟踪关键指标:

  • 检索准确性
  • 响应延迟
  • 用户满意度
  • 幻觉率

总结

构建生产级RAG系统需要关注:

  • 文档质量 - 良好的预处理至关重要
  • 检索策略 - 平衡精确率和召回率
  • 幻觉预防 - 多层次方法
  • 用户体验 - 流式传输和错误处理

完整代码可在 GitHub 上获取。


有问题?通过 GitHub 或邮件 yjs_0831@qq.com 联系我!

杨劲松
Authors
Java后端工程师 / AI应用开发

Java后端起步,正在转型AI应用/Agent开发者,让大模型落地到真实业务。

  • 🖥️ 技术方向 — Spring Boot微服务 + AI Agent应用
  • 🤖 当前专注 — 多智能体协同调度、RAG知识库
  • 🎯 目标 — 让企业软件从「点击操作」走向「自然对话」