1. LangChain智能体开发实战指南
去年在开发一个企业知识库系统时,我第一次接触到LangChain框架。当时为了实现对技术文档的智能问答,我们团队尝试了多种方案,最终发现基于RAG(检索增强生成)架构的LangChain智能体最能满足需求。今天我就来分享如何从零开始构建一个完整的智能体系统。
智能体(Agent)在LangChain生态中是指能够自主决策、调用工具并完成复杂任务的AI程序。与普通链式调用不同,智能体具备以下核心能力:
- 动态选择工具链(Tool Calling)
- 记忆和上下文管理(Memory)
- 多步骤任务规划(Planning)
- 子任务委派(Subagent)
2. 环境准备与基础配置
2.1 开发环境搭建
建议使用Python 3.9+环境,以下是必备依赖:
bash复制pip install langchain-core langchain-community langchain-openai
对于向量数据库,我推荐初学者使用Chroma:
bash复制pip install chromadb langchain-chroma
2.2 API密钥配置
主流LLM服务提供商配置示例(以OpenAI为例):
python复制from langchain_openai import ChatOpenAI, OpenAIEmbeddings
llm = ChatOpenAI(model="gpt-4-turbo", temperature=0)
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
实际项目中建议通过环境变量管理API密钥:
export OPENAI_API_KEY='sk-...'
3. RAG核心模块实现
3.1 文档加载与处理
文档预处理是RAG系统的关键环节,常见问题包括:
- PDF解析格式混乱
- 网页抓取内容冗余
- 代码片段处理不当
优化后的文档加载器:
python复制from langchain_community.document_loaders import WebBaseLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
loader = WebBaseLoader(["https://langchain.com/docs"])
docs = loader.load()
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=200,
separators=["\n\n", "\n", "。", "!", "?", "."] # 中日英分句支持
)
splits = text_splitter.split_documents(docs)
3.2 向量存储方案选型
不同向量数据库对比:
| 数据库 | 安装复杂度 | 查询速度 | 分布式支持 | 适用场景 |
|---|---|---|---|---|
| Chroma | ★★☆ | ★★★ | ★☆☆ | 开发测试 |
| Pinecone | ★☆☆ | ★★★ | ★★★ | 生产环境 |
| Weaviate | ★★☆ | ★★☆ | ★★☆ | 多模态搜索 |
| Milvus | ★★★ | ★★★ | ★★★ | 超大规模数据 |
实测建议:中小项目用Chroma足够,日均查询超1万次建议迁移到Pinecone。
4. 智能体系统构建
4.1 基础工具定义
搜索工具示例(带错误处理):
python复制from langchain.tools import tool
from typing import Optional
@tool
def search_docs(query: str, top_k: Optional[int] = 3) -> str:
"""Semantic search in document database"""
try:
docs = vectorstore.similarity_search(query, k=top_k)
return "\n\n".join([f"Source: {d.metadata['source']}\n{d.page_content}"
for d in docs])
except Exception as e:
return f"Search failed: {str(e)}"
4.2 智能体工作流设计
典型RAG智能体工作流:
-
问题解析阶段
- 意图识别
- 查询改写
- 敏感词过滤
-
检索阶段
- 向量相似度搜索
- 元数据过滤
- 结果排序
-
生成阶段
- 上下文压缩
- 引用标注
- 安全审查
python复制from langchain.agents import AgentExecutor, create_tool_calling_agent
from langchain_core.prompts import ChatPromptTemplate
prompt = ChatPromptTemplate.from_messages([
("system", "你是一个专业的文档助手,请根据以下工具和文档进行回答。"),
("placeholder", "{chat_history}"),
("human", "{input}"),
("placeholder", "{agent_scratchpad}")
])
tools = [search_docs]
agent = create_tool_calling_agent(llm, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
5. 高级功能实现
5.1 子智能体系统
对于复杂任务,可以采用主从智能体架构:
python复制from langchain.agents import AgentExecutor, create_react_agent
analyst_prompt = ChatPromptTemplate.from_messages([
("system", "你是一个分析专家,负责处理特定文档片段"),
("human", "请分析以下内容:\n{chunk}\n\n问题:{question}")
])
analyst_llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0.2)
analyst_agent = create_react_agent(analyst_llm, [], analyst_prompt)
analyst_executor = AgentExecutor(agent=analyst_agent, tools=[])
5.2 流式输出实现
通过回调实现实时输出:
python复制from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler
streaming_llm = ChatOpenAI(
streaming=True,
callbacks=[StreamingStdOutCallbackHandler()],
temperature=0
)
6. 生产环境优化
6.1 性能调优技巧
-
缓存策略
- LLM响应缓存(ttl=1h)
- 向量查询缓存(ttl=24h)
-
异步处理
python复制from langchain.agents import AgentExecutor async def arun(query): agent = AgentExecutor.from_agent_and_tools(...) return await agent.ainvoke({"input": query}) -
负载测试指标
- 平均响应时间 < 3s
- 错误率 < 0.5%
- 并发支持 ≥ 50 QPS
6.2 安全防护方案
-
输入过滤清单:
- SQL注入特征
- 敏感关键词
- 超长文本(>10k chars)
-
输出审查机制:
python复制from langchain.output_parsers import CommaSeparatedListOutputParser from langchain_core.output_parsers import StrOutputParser safety_chain = prompt | llm | StrOutputParser() | safety_filter
7. 常见问题排查
7.1 典型错误案例
-
检索结果不相关
- 检查embedding模型是否匹配
- 调整chunk_size(建议500-1500)
- 添加metadata过滤
-
智能体循环调用
- 设置max_iterations(默认15)
- 添加超时中断
- 记录执行轨迹
-
API限流问题
- 实现指数退避重试
python复制from tenacity import retry, stop_after_attempt, wait_exponential @retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=4, max=10)) def safe_call(): return agent.invoke(...)
7.2 监控方案设计
推荐监控指标:
- 令牌使用量(input/output)
- 工具调用次数
- 执行耗时分布
- 缓存命中率
Prometheus配置示例:
yaml复制scrape_configs:
- job_name: 'langchain'
metrics_path: '/metrics'
static_configs:
- targets: ['localhost:8000']
8. 项目实战:技术文档助手
完整实现示例:
python复制from fastapi import FastAPI
from langserve import add_routes
app = FastAPI(title="TechDoc Assistant")
# 初始化核心组件
vectorstore = Chroma.from_documents(splits, embeddings)
tools = [search_docs]
agent = create_tool_calling_agent(llm, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools)
# 暴露API端点
add_routes(app, agent_executor, path="/chat")
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8000)
部署建议:
- 使用gunicorn多进程
- 配置Nginx反向代理
- 启用HTTPS加密
9. 性能对比测试
不同配置下的表现(测试环境:100并发请求):
| 配置组合 | 平均响应时间 | 准确率 | 成本/千次 |
|---|---|---|---|
| GPT-4 + Chroma | 2.3s | 92% | $1.20 |
| GPT-3.5 + Pinecone | 1.8s | 85% | $0.45 |
| Claude-3 + Weaviate | 3.1s | 89% | $0.80 |
| Mixtral + Milvus | 4.2s | 78% | $0.30 |
优化建议:
- 高精度场景:GPT-4 + 混合检索(向量+关键词)
- 成本敏感场景:Mixtral + 预过滤
- 高并发场景:Claude-3 + 缓存层
10. 进阶开发方向
-
多模态扩展
- 图像理解(GPT-4V)
- 表格数据处理(Pandas Agent)
-
分布式架构
mermaid复制graph TD A[Client] --> B[API Gateway] B --> C[Agent Cluster] C --> D[Vector DB] C --> E[LLM Service] C --> F[Cache] -
持续学习机制
- 用户反馈收集
- 自动数据增强
- 模型微调流水线
在真实项目中,我们通过添加简单的用户反馈循环,将回答准确率提升了27%。关键实现:
python复制feedback_prompt = """请评价以下回答质量:
问题:{question}
回答:{answer}
请给出1-5星评分,并指出需要改进的地方:"""
def collect_feedback(question, answer):
feedback = llm.invoke(feedback_prompt.format(question=question, answer=answer))
store_feedback(question, answer, feedback)
return feedback
