1. 项目概述:当LangChain遇上RAG与Agent
最近在开发一个需要整合大语言模型能力的智能系统时,我选择了LangChain作为技术框架。这个开源工具链完美解决了三个关键需求:如何让大模型访问最新知识(RAG)、如何让AI自主完成任务(Agent)、以及如何优雅地调用不同厂商的聊天大模型API。经过两个月的实战,我总结出一套可复用的开发模式,特别适合需要构建企业级智能应用的团队。
RAG(检索增强生成)技术通过将外部知识库与LLM结合,有效解决了大模型的"知识截止"问题。而Agent模式则让AI具备了自主决策能力,可以根据用户意图自动选择工具、分解任务。LangChain的价值在于,它用统一的Python/JS接口封装了这些复杂能力,开发者只需关注业务逻辑本身。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心架构设计
2.1 技术选型对比
在项目启动时,我们对比了三个主流方案:
- 纯API调用:直接使用OpenAI等厂商的API
- 自研框架:完全从零开发
- LangChain生态:包括LangChain Core、LangChain.js等
最终选择LangChain主要基于:
- 模块化设计:Chain、Agent、Memory等组件可插拔
- 多模型支持:同一套代码可切换GPT-4、Claude等不同后端
- 工具生态:内置100+工具集成(搜索引擎、计算器等)
2.2 系统分层架构
我们的生产环境架构分为四层:
code复制[用户接口层]
↓
[Agent决策层] → [工具执行层]
↑
[知识增强层]
├─ 向量数据库(Chroma)
└─ 文档处理器(Unstructured)
3. RAG实现详解
3.1 知识库构建流程
- 文档预处理:
- 使用Unstructured库处理PDF/Word等格式
- 文本分块策略:按语义分割(而非固定长度)
- 关键参数:chunk_size=1000, chunk_overlap=200
python复制from langchain_text_splitters import RecursiveCharacterTextSplitter
splitter = RecursiveCharacterTextSplitter.from_tiktoken_encoder(
chunk_size=1000,
chunk_overlap=200
)
- 向量化存储:
- 嵌入模型选择:text-embedding-3-large
- 数据库选型:Chroma(轻量级本地方案)
- 索引优化:HNSW算法加速检索
实测发现:嵌入维度从1536降到512仍保持90%的检索准确率,但查询速度提升3倍
3.2 检索增强策略
我们实现了混合检索模式:
- 关键词检索(BM25算法)
- 向量相似度检索(余弦相似度)
- 元数据过滤(文档来源、时间范围)
python复制retriever = EnsembleRetriever(
retrievers=[
BM25Retriever.from_texts(texts),
vector_store.as_retriever()
],
weights=[0.3, 0.7]
)
4. Agent开发实战
4.1 Agent类型选择
根据任务复杂度选择不同Agent类型:
- 零样本Agent:简单任务(单步操作)
- ReAct Agent:需要推理的复杂任务
- Plan-and-Execute:多步骤规划任务
python复制from langchain.agents import initialize_agent
agent = initialize_agent(
tools=[web_search, calculator],
llm=chat_model,
agent=AgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION,
verbose=True
)
4.2 工具开发规范
自定义工具需要遵循:
- 继承BaseTool类
- 明确定义args_schema
- 实现同步/异步执行方法
示例:股票查询工具
python复制class StockPriceTool(BaseTool):
name = "get_stock_price"
description = "查询指定股票的实时价格"
args_schema = create_model("StockPriceInput", symbol=(str, ...))
def _run(self, symbol: str):
yfinance.Ticker(symbol).history(period="1d")["Close"].iloc[-1]
5. 大模型集成方案
5.1 多模型路由策略
通过Fallbacks实现故障转移:
python复制from langchain.llms import RouterLLM
llm = RouterLLM(
routers=[
("gpt-4", openai_gpt4, lambda x: len(x) < 8000),
("claude-3", anthropic_claude, lambda x: True)
]
)
5.2 对话记忆管理
针对长对话场景:
- 短期记忆:ConversationBufferWindowMemory(保留最近5轮)
- 长期记忆:VectorStoreRetrieverMemory(关键信息向量化)
- 摘要记忆:ConversationSummaryMemory(生成对话摘要)
python复制memory = CombinedMemory(
memories=[
ConversationBufferWindowMemory(k=5),
VectorStoreRetrieverMemory(retriever=vector_retriever)
]
)
6. 性能优化技巧
6.1 延迟优化方案
- 流式响应:使用callback机制实现逐字输出
- 预检索:在用户输入完成前启动向量查询
- 缓存策略:
- 对话缓存(Redis)
- 嵌入缓存(DiskCache)
6.2 成本控制方法
- 小模型路由:
- 简单任务使用GPT-3.5
- 复杂任务才调用GPT-4
- 令牌计数:
python复制from langchain.callbacks import get_openai_callback
with get_openai_callback() as cb:
agent.run("查询AAPL股价")
print(f"消耗token: {cb.total_tokens}")
7. 生产环境部署
7.1 监控指标设计
必备监控项:
- 请求延迟(P99 < 3s)
- 令牌消耗(按业务线统计)
- 知识检索准确率(人工抽样评估)
7.2 异常处理机制
关键防御策略:
- 输入清洗:检测注入攻击
- 输出过滤:移除敏感信息
- 熔断机制:连续错误自动降级
python复制from tenacity import retry, stop_after_attempt
@retry(stop=stop_after_attempt(3))
def safe_agent_run(query):
return agent.run(query)
8. 踩坑经验实录
-
分块大小陷阱:
- 最初使用固定512字符分块导致语义断裂
- 解决方案:改用句子分割+动态合并算法
-
Agent死循环:
- 某次工具返回"稍后再试"导致Agent持续重试
- 修复方案:设置max_iterations=10
-
中文嵌入偏差:
- text-embedding-ada-002对中文效果较差
- 改用m3e-base中文专用模型后准确率提升35%
9. 扩展应用场景
9.1 客服知识库
- 将产品文档导入RAG
- 配置话术校验工具
- 添加工单创建能力
9.2 数据分析助手
- 集成SQL执行工具
- 添加可视化生成
- 配置数据解释器
实际部署某电商客服系统后,问题解决率从68%提升至89%,平均处理时间缩短40%。关键是在知识检索阶段加入了商品图谱关系查询,让AI能理解"手机壳"和"iPhone15配件"的关联性。
