LangChain 入门指南:基于 DeepSeek 模型构建对话流程(保姆级)
本教程将以实际代码案例为基础,带您掌握 LangChain 的核心概念与开发流程。我们将使用 LangChain 0.2.17 和 langchain-openai 0.1.25 版本,结合 DeepSeek 的 deepseek-chat 模型,构建一个完整的意图识别-响应生成系统。结合Jupyter进行实践效果更佳。需申请deepseek的API-KEY,充值10元可以玩好久。
一、环境准备
# 安装必要依赖
!pip install langchain==0.2.17 langchain-community==0.2.19 langchain-openai==0.1.25
二、代码结构解析
1. 核心组件初始化
from langchain_openai import ChatOpenAIllm = ChatOpenAI(model="deepseek-chat",api_key="sk-b247cb47eff84e9694f383c09682xxxx", # todo 替换deepseek API Key https://platform.deepseek.com/api_keystemperature=0.7,max_tokens=512,timeout=30,max_retries=3,base_url="https://api.deepseek.com"
)
按shift+enter进行执行操作。
关键参数说明:
model
: 指定使用 DeepSeek 的 deepseek-chat 模型temperature
: 控制输出随机性(0-1 范围)base_url
: DeepSeek API 的基础地址max_retries
: 网络重试次数
2. 流程链式构建
(1)意图识别链
intent_prompt = PromptTemplate(input_variables=["input_text"],template="请根据以下输入识别用户意图:{input_text}"
)
intent_chain = intent_prompt | llm
工作原理:
- 接收用户原始输入
- 使用 PromptTemplate 构造标准化提示
- 通过
|
操作符连接 LLM 生成意图判断
(2)实体提取链
entity_prompt = PromptTemplate(input_variables=["intent", "input_text"],template="根据用户的意图 '{intent}',从以下输入中提取相关实体:{input_text}"
)
entity_chain = entity_prompt | llm
设计亮点:
- 动态上下文感知:将前序识别的意图作为输入参数
- 实体提取的针对性:根据意图调整提取策略(如"北京"在天气查询中是地点实体)
(3)动作确定链
action_prompt = PromptTemplate(input_variables=["intent", "entities"],template="根据意图 '{intent}' 和提取的实体 '{entities}',确定要执行的操作。"
)
action_chain = action_prompt | llm
实现价值:
- 将抽象意图转化为可执行操作
- 支持后续对接实际业务系统(如天气API)
(4)响应生成链
response_prompt = PromptTemplate(input_variables=["action"],template="根据确定的动作 '{action}' 生成用户的响应。"
)
response_chain = response_prompt | llm
设计目标:
- 根据具体操作生成自然语言回复
- 保持对话系统的连贯性
3. 流程整合与执行
sequential_chain = (RunnableLambda(lambda x: {"intent": intent_chain.invoke(x),"input_text": x["input_text"]})| RunnableLambda(lambda x: {**x,"entities": entity_chain.invoke({"intent": x["intent"],"input_text": x["input_text"]})})| RunnableLambda(lambda x: {**x,"action": action_chain.invoke({"intent": x["intent"],"entities": x["entities"]})})| RunnableLambda(lambda x: {**x,"response": response_chain.invoke({"action": x["action"]})})
)
架构优势:
- 模块化设计:各环节职责单一,便于维护和扩展
- 状态传递:通过字典形式传递上下文信息
- 链式调用:使用
|
符号构建清晰的工作流 - 渐进式处理:从粗粒度意图识别到细粒度实体提取
三、运行示例与调试
if __name__ == "__main__":input_text = "我想查询北京的天气。"result = sequential_chain.invoke({"input_text": input_text})print("\n最终生成的响应:", result["response"])
调试建议:
- 添加中间结果打印:
print("意图识别结果:", result["intent"])
print("实体提取结果:", result["entities"])
print("动作决策结果:", result["action"])
- 使用
stream()
方法查看推理过程 - 通过
with_config()
设置跟踪标识
四、核心概念深入
1. PromptTemplate 的使用技巧
template = """角色:天气助手
任务:分析用户意图
输入:{input_text}
要求:
1. 识别查询/预订/建议等基本类型
2. 用简洁的关键词描述意图
"""
最佳实践:
- 显式定义角色和任务
- 使用数字编号列出要求
- 添加示例提升准确性
2. RunnableLambda 的作用
# 数据转换示例
RunnableLambda(lambda x: {"cleaned_text": preprocess(x["input_text"]),**x
})
应用场景:
- 数据预处理
- 上下文增强
- 结果后处理
- 状态管理
3. 错误处理机制
建议添加异常处理:
try:result = sequential_chain.invoke({"input_text": input_text})
except Exception as e:print(f"处理出错:{e}")# 添加默认响应
五、扩展与优化建议
1. 性能优化
- 使用缓存机制:
langchain.cache.set_cache(...)
- 并行处理:对独立环节使用
map()
操作 - 批量处理:合并相似请求减少API调用次数
2. 功能扩展
- 添加记忆模块:
ConversationBufferMemory
- 集成数据库查询:通过SQLDatabase组件
- 增加多轮对话支持
3. 监控与评估
- 使用
CallbackManager
跟踪调用过程 - 添加日志记录:记录每个环节的耗时
- 建立评估指标:准确率、响应时间等
六、常见问题排查
问题类型 | 解决方案 |
---|---|
API 调用失败 | 检查 API 密钥和 base_url 是否正确 |
响应不准确 | 优化 Prompt 模板,添加更多示例 |
执行超时 | 调整 timeout 参数,简化模型输出 |
内存不足 | 减少 max_tokens 参数值 |
七、总结
通过本案例的学习,您已经掌握了:
- LangChain 的核心组件使用方法
- 如何构建可扩展的对话流程
- Prompt 工程的基本实践
- 与第三方大模型 API 的集成技巧
建议下一步尝试:
- 添加用户身份验证模块
- 实现多意图并行处理
- 开发 Web 交互界面
完整代码已通过验证,可直接在您的项目中使用。记得替换 API 密钥并根据业务需求调整 Prompt 模板。
源码已上传云盘:https://pan.quark.cn/s/3a3378f9e61b