当前位置: 首页 > news >正文

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"])

在这里插入图片描述
在这里插入图片描述

调试建议:

  1. 添加中间结果打印:
print("意图识别结果:", result["intent"])
print("实体提取结果:", result["entities"])
print("动作决策结果:", result["action"])
  1. 使用 stream() 方法查看推理过程
  2. 通过 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 参数值

七、总结

通过本案例的学习,您已经掌握了:

  1. LangChain 的核心组件使用方法
  2. 如何构建可扩展的对话流程
  3. Prompt 工程的基本实践
  4. 与第三方大模型 API 的集成技巧

建议下一步尝试:

  • 添加用户身份验证模块
  • 实现多意图并行处理
  • 开发 Web 交互界面

完整代码已通过验证,可直接在您的项目中使用。记得替换 API 密钥并根据业务需求调整 Prompt 模板。

源码已上传云盘:https://pan.quark.cn/s/3a3378f9e61b

http://www.xdnf.cn/news/885241.html

相关文章:

  • 今日科技热点速览
  • 【联网玩具】EN 18031欧盟网络安全认证
  • 数论~~~
  • 曼昆《经济学原理》(第9版)微观经济学第二章第一节作为科学家的经济学家
  • 西门子SCL之IF-ELSIF语句详解及应用(安全控制代码)
  • RDMA简介5之RoCE v2队列
  • 如何做好一份技术文档?(下篇)
  • Windows系统下Cursor与QWQ-32B大模型的本地部署及插件调用实现方法
  • OpenAI 即将推出 GPT-5:开启多模态、持续记忆对话新时代
  • MATLAB读取文件内容:Excel、CSV和TXT文件解析
  • 【C#】异步和多线程
  • 优化09-表连接
  • 各种排序算法的再整理
  • 【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制
  • 命令行运行python程序报错 ImportError: /lib/x86_64-linux-gnu/libstdc++.so.6
  • Cursor AI编程助手模型选择对了吗?
  • mysql跨库关联查询及视图创建
  • 机器学习——什么时候使用决策树
  • PostgreSQL 入门教程
  • 边缘计算应用实践心得
  • 防反接电路设计浅谈
  • 在使用一些不用驱动大电流的设备就可以用stm32的自己的上下拉但是本身上下拉不就是给iicspi这些他通信给信号的吗中怎么还跟驱动能力扯上了有什么场景嘛
  • Wireshark使用教程(含安装包和安装教程)
  • Kafka存储机制核心优势剖析
  • 数据库-MySQL
  • Ubuntu中常用的网络命令指南
  • 8.axios Http网络请求库(1)
  • 洛谷题目:P2761 软件补丁问题 (本题简单)
  • Unity基础-Mathf相关
  • NoSQL 之 Redis 配置与优化