基于LangChain构建知识库检索Agent的入门教程

云信安装大师
90
AI 质量分
22 4 月, 2025
2 分钟阅读
0 阅读

基于LangChain构建知识库检索Agent的入门教程

引言

在信息爆炸的时代背景下,”知道在哪里找答案”比”记住所有答案”更重要。本文将手把手教你使用LangChain框架构建一个能够理解自然语言问题并精准检索知识库的智能Agent(智能体)。通过本教程你将掌握:
– 文档加载与预处理
– 向量化语义搜索
– 对话式交互实现
– Agent智能决策

准备工作

环境要求

代码片段
# Python 3.8+ 环境
pip install langchain openai chromadb unstructured python-dotenv tiktoken

API配置

创建.env文件:

代码片段
OPENAI_API_KEY="your-api-key"  # 替换为实际API密钥

完整实现流程

Step1. 知识库预处理

代码片段
from langchain.document_loaders import UnstructuredFileLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter

# 加载知识库文档(支持pdf/docx/txt)
loader = UnstructuredFileLoader("knowledge_base.md")
documents = loader.load()

# 文档分割(处理大文件的关键)
text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=500,   # 每个文本块500字符
    chunk_overlap=50, # 块间重叠50字符保持上下文
    separators=["\n\n", "\n", "。"]) # 中文友好分隔符

split_docs = text_splitter.split_documents(documents)

原理说明
chunk_size需根据模型的最大输入长度调整(如GPT-3.5为4096 tokens)
chunk_overlap防止关键信息被切断丢失上下文

Step2. 构建向量数据库

代码片段
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma

# 初始化嵌入模型(推荐text-embedding-3-small)
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")

# 创建本地向量数据库(持久化存储)
vector_db = Chroma.from_documents(
    documents=split_docs,
    embedding=embeddings,
    persist_directory="./chroma_db"
)
vector_db.persist()  # 保存到本地目录

替代方案:本地运行可使用HuggingFace嵌入模型(需安装sentence-transformers):

代码片段
from langchain.embeddings import HuggingFaceEmbeddings

embeddings = HuggingFaceEmbeddings(model_name="shibing624/text2vec-base-chinese")

Step3. 创建检索链

代码片段
from langchain.chains import RetrievalQA
from langchain.chat_models import ChatOpenAI

llm = ChatOpenAI(temperature=0) # temperature=0保证结果确定性

qa_chain = RetrievalQA.from_chain_type(
    llm=llm,
    retriever=vector_db.as_retriever(
        search_kwargs={"k":3} # 返回最相关的3个结果片段
    ),
    chain_type="stuff" # "map_reduce"适合更大规模文档集,
)

参数解析
search_kwargs.k:影响最终答案的信息覆盖范围与响应速度的平衡值
chain_type:选择不同的信息整合策略(stuff/map_reduce/refine)

Step4. Agent封装与测试

代码片段
from langchain.agents import initialize_agent, Tool

tools = [
    Tool(
        name="Knowledge Base",
        func=qa_chain.run,
        description="""
        用于回答技术问题的重要工具。
        输入应为完整的自然语言问题。
        例如:如何实现OAuth2认证?
        """
    )
]

agent = initialize_agent(
    tools=tools,
    llm=llm,
    agent="zero-shot-react-description",
    verbose=True # 显示思考过程便于调试,
)

# Demo测试案例 
question = "LangChain支持哪些文件格式的知识库导入?"
result = agent.run(question)
print(f"Answer: {result}")

典型输出示例

代码片段
> Entering new AgentExecutor chain...
我需要确定用户询问的是LangChain支持的文档格式。
应该使用Knowledge Base工具进行查询。
Action: Knowledge Base  
Action Input: LangChain支持哪些文件格式的知识库导入?
Observation: LangChain支持包括PDF、Markdown、Word文档(docx)、纯文本(txt)等多种常见格式...
Thought:现在可以将这些信息整理成清晰的回答。
Answer: LangChain支持的主流文件格式包括PDF、Markdown(.md)、Word(.docx)、纯文本(.txt)...

实践经验与注意事项

⚠️常见问题排查表

现象 可能原因 解决方案
返回无关内容 chunk_size设置过大 调整为300-500字符
回答不完整 chunk_overlap不足 增加至50-100字符
响应速度慢 search_kwargs.k值过大 降低k值至3~5
中文处理异常 未指定中文分词器 添加separators=["\n\n", "\n", "。"]

🛠️性能优化技巧

  1. 混合搜索策略:结合语义搜索与关键词搜索提升召回率
代码片段
retriever = vector_db.as_retriever(
   search_type="mmr",      # Maximal Marginal Relevance算法 
   search_kwargs={"k":5, "fetch_k":10}
)
  1. 缓存机制:对高频查询添加缓存层减少重复计算
代码片段
from langchain.cache import SQLiteCache  
import langchain  
langchain.llm_cache = SQLiteCache(database_path=".langchain.db")
  1. 分级存储:对核心文档设置更高权重

FAQ扩展问答

Q1:如何处理超长技术文档?
A:采用分层处理方法:
1)第一级用大chunksize提取主题结构
2)第二级用小chunk
size解析细节

Q2:如何保证私有数据安全?
A:推荐方案:
1)使用本地嵌入模型如text2vec-large-chinese
2)部署私有LLM服务如Llama2-chinese

Q3:如何评估检索质量?
A:推荐指标:
1)MRR(Mean Reciprocal Rank)平均倒数排名
2)Recall@K前K个结果的召回率

总结与扩展

通过本教程我们实现了:
✅非结构化数据的自动化处理流程
✅基于语义理解的精准问答系统
✅可扩展的智能体架构设计

进阶方向建议:
•接入实时网络搜索增强时效性
•添加多模态处理能力(图片/表格解析)
•集成业务系统API实现自动化操作

完整项目代码已开源在GitHub:[项目地址] (此处替换实际地址)

“知识的价值不在于占有而在于运用。” ——希望本教程能帮助你开启智能应用开发的新篇章!

原创 高质量