基于 LangChain 开发大模型 RAG 知识问答应用
本文介绍如何使用 LangChain 框架结合 DeepSeek 大模型构建检索增强生成(RAG)系统。内容涵盖模型调用、提示词模板设计、文档加载与分割、文本嵌入与向量存储、重排序(ReRank)优化、链式编排(LCEL)及输出解析。通过阿里云百炼嵌入模型和 FAISS 向量库实现本地知识库索引,利用 BAAI/bge-reranker-large 提升检索精度,最终实现准确的知识问答应用。

本文介绍如何使用 LangChain 框架结合 DeepSeek 大模型构建检索增强生成(RAG)系统。内容涵盖模型调用、提示词模板设计、文档加载与分割、文本嵌入与向量存储、重排序(ReRank)优化、链式编排(LCEL)及输出解析。通过阿里云百炼嵌入模型和 FAISS 向量库实现本地知识库索引,利用 BAAI/bge-reranker-large 提升检索精度,最终实现准确的知识问答应用。

RAG(Retrieval-Augmented Generation,检索增强生成)是一种通过引入外部资料来约束大模型回答的技术。在用户提问时,系统先检索相关资料,将'问题 + 上下文'一同输入大模型,使其在参考资料的提示下生成答案,从而减少幻觉、解决训练数据过时及知识范围有限的问题。
相比于大模型微调,RAG 在时间成本、经济成本和技术难度上更具优势,特别适用于专业领域或企业内部知识库场景。
本文代码基于 LangChain v0.3 版本。
确保安装以下 Python 库:
pip install langchain langchain-community langchain-core faiss-cpu deeplake flag-embedding
需配置环境变量以保存 API Key:
import os
os.environ["DEEPSEEK_API_KEY"] = "YOUR_DEEPSEEK_API_KEY"
os.environ["DASHSCOPE_API_KEY"] = "YOUR_ALIBABA_CLOUD_API_KEY"
LangChain 支持接入多种云服务模型。DeepSeek 采用了与 OpenAI 兼容的接口规范,可通过 ChatOpenAI 类配置自定义 Base URL 或直接使用专用 Provider。
from langchain.chat_models import ChatDeepSeek
llm = ChatDeepSeek(
model_name="deepseek-chat",
temperature=0,
max_tokens=None,
timeout=None,
max_retries=2,
)
推荐使用 ChatPromptTemplate 管理消息结构。包含 System Message(系统指令)和 Human Message(用户问题)。
from langchain.prompts import ChatPromptTemplate, MessagesPlaceholder
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个信息整理归纳助手。在回答用户问题时,请严格参考提供的上下文信息。如果上下文中没有相关信息,请直接回复'在资料中没有相关信息',不要自行编造。上下文如下:{context}"),
("human", "{question}")
])
使用 DirectoryLoader 加载本地文档,并通过 RecursiveCharacterTextSplitter 进行分割。合理的 Chunk Size 和重叠率有助于保持语义完整性。
from langchain_community.document_loaders import DirectoryLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
loader = DirectoryLoader("./data", glob="**/*.txt")
docs = loader.load()
splitter = RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=200,
separators=["\n\n", "\n", ".", " ", ""]
)
chunks = splitter.split_documents(docs)
使用阿里云百炼 DashScope Embedding 模型生成向量,并存储至 FAISS 向量数据库。
from langchain.embeddings import DashScopeEmbeddings
from langchain.vectorstores import FAISS
embeddings = DashScopeEmbeddings(model="text-embedding-v2")
vectorstore = FAISS.from_documents(chunks, embeddings)
retriever = vectorstore.as_retriever(search_kwargs={"k": 5})
为了提升检索精度,引入 BAAI/bge-reranker-large 模型对初步检索结果进行重排序。需自定义 BaseDocumentCompressor。
from langchain.retrievers.document_compressors import BaseDocumentCompressor
from typing import List
from FlagEmbedding import FlagReranker
class BGERerankCompressor(BaseDocumentCompressor):
def __init__(self, reranker_model: str):
self.reranker = FlagReranker(reranker_model, use_fp16=True)
def compress_documents(self, documents, query, top_n=2):
scores = self.reranker.compute_score([[query, doc.page_content] for doc in documents])
sorted_docs = sorted(zip(documents, scores), key=lambda x: x[1], reverse=True)
return [doc for doc, _ in sorted_docs[:top_n]]
reranker_compressor = BGERerankCompressor("BAAI/bge-reranker-large")
整合检索与重排逻辑:
from langchain.retrievers import ContextualCompressionRetriever
compression_retriever = ContextualCompressionRetriever(
base_compressor=reranker_compressor,
base_retriever=retriever
)
利用 LangChain Expression Language (LCEL) 编排流程。使用 RunnableParallel 并行处理问题和检索内容,再通过 RunnablePassthrough 传递原始输入。
from langchain_core.runnables import RunnableParallel, RunnablePassthrough
chain = (
{"context": compression_retriever, "question": RunnablePassthrough()}
| prompt
| llm
)
继承 BaseCallbackHandler 可监控链的运行状态。输出端使用 StrOutputParser 提取模型生成的纯文本。
from langchain_core.output_parsers import StrOutputParser
output_chain = chain | StrOutputParser()
假设知识库中包含人物介绍信息,测试问答效果。
response = output_chain.invoke("林悦喜欢吃什么?")
print(response)
预期输出示例:
根据您的问题,我找到的相关答案是:林悦喜欢吃火锅,尤其是涮毛肚和鸭肠...
若知识库无相关内容:
在资料中没有相关信息。
本教程展示了如何从零搭建一个基于 LangChain 的 RAG 系统。通过集成 DeepSeek 推理能力、阿里云 Embedding 服务以及 BGE 重排模型,实现了高质量的知识问答应用。关键点在于合理的文档分块策略、向量检索优化以及严格的提示词约束,有效降低了大模型的幻觉风险。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online