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

大模型学习·第42天:LangChain进阶——自定义函数入链与对话记忆

一、RunnableLambda:自定义函数加入Chain

普通函数不能直接用|加入链,需要用RunnableLambda包装(也可直接传入lambda,会自动转换)。

fromlangchain_core.runnablesimportRunnableLambda# 函数接收AIMessage,返回dictmy_func=RunnableLambda(lambdaai_msg:{"name":ai_msg.content})# 直接传lambda也可以,自动转换chain=first_prompt|model|(lambdaai_msg:{"name":ai_msg.content})|second_prompt|model|str_parser

两种入链方式:封装为RunnableLambda对象再入链,或直接将函数入链自动转换。函数在链中接收上一个组件的输出,返回值传给下一个组件。可以在链中用自定义函数做数据格式转换、打印调试信息等。

二、Memory临时会话记忆

RunnableWithMessageHistory在原链基础上创建带历史记录的新链,InMemoryChatMessageHistory在内存中存储历史。

fromlangchain_core.runnables.historyimportRunnableWithMessageHistoryfromlangchain_core.chat_historyimportInMemoryChatMessageHistory store={}defget_history(session_id):ifsession_idnotinstore:store[session_id]=InMemoryChatMessageHistory()returnstore[session_id]conversation_chain=RunnableWithMessageHistory(base_chain,# 被增强的原链get_history,# 通过session_id获取历史记录对象input_messages_key="input",# 用户输入在模板中的占位符名history_messages_key="chat_history"# 历史记录在模板中的占位符名)# 调用时需传入session_idsession_config={"configurable":{"session_id":"user_001"}}res=conversation_chain.invoke({"input":"小明有2个猫"},session_config)

工作流程:每次调用时根据session_id获取该用户的历史记录,把历史填入模板的chat_history位置,模型结合历史回答问题,新的问答自动追加到历史中。不同session_id的历史互不影响。InMemoryChatMessageHistory存在内存中,重启程序后消失,适合临时测试。

三、Memory长期会话记忆:FileChatMessageHistory

继承BaseChatMessageHistory,重写三个方法,以session_id为文件名存到本地。

fromlangchain_core.chat_historyimportBaseChatMessageHistoryclassFileChatMessageHistory(BaseChatMessageHistory):def__init__(self,session_id,storage_path):self.session_id=session_id self.file_path=os.path.join(storage_path,session_id)os.makedirs(os.path.dirname(self.file_path),exist_ok=True)defadd_messages(self,messages):all_messages=list(self.messages)all_messages.extend(messages)new_messages=[message_to_dict(m)forminall_messages]withopen(self.file_path,"w",encoding="utf-8")asf:json.dump(new_messages,f)@propertydefmessages(self):try:withopen(self.file_path,encoding="utf-8")asf:returnmessages_from_dict(json.load(f))exceptFileNotFoundError:return[]defclear(self):withopen(self.file_path,"w",encoding="utf-8")asf:json.dump([],f)

只需把get_history函数换成return FileChatMessageHistory(session_id, "./chat_history"),历史记录就能持久化到磁盘文件。@property装饰器让messages方法像属性一样访问。

四、两种记忆方案对比

方案存储位置重启后适用场景
InMemoryChatMessageHistory内存丢失临时测试
FileChatMessageHistory(自实现)本地文件保留持久化存储

核心流程base_chain(原有链)→RunnableWithMessageHistory(增强为带记忆的链)→ 调用时传session_config指定会话ID。

今日核心总结

  1. RunnableLambda:将自定义函数转为Runnable实例入链,lambda可直接传入
  2. 临时记忆RunnableWithMessageHistory+InMemoryChatMessageHistory,按session_id隔离
  3. 长期记忆:继承BaseChatMessageHistory,实现文件读写,持久化保存
  4. 调用格式:invoke时传{"configurable": {"session_id": "xxx"}},自动关联历史
  5. 调试技巧:链中加入自定义函数print信息,原样返回不破坏业务
http://www.jsqmd.com/news/1324457/

相关文章:

  • SpringBoot+Vue3构建企业级在线问卷系统实战
  • AI时代的奥德赛:算法星空,寻找精神归航
  • Xshell终端模拟器:从安装配置到高效运维实战
  • 2026年精选:昆明轻法式装修公司推荐——欢乐佳园 - 装修教育财税推荐2026
  • Spring Boot核心技术与生产级应用实践
  • 省级数字化运营中心建设方案解析与实施指南
  • SRC漏洞挖掘实战指南:从零入门到高效变现的完整路径
  • 2026 年 7 月新发布:楚州可靠的消防管道保温施工队哪个好,零下二十度的冬夜,谁能料到那不起眼的铁管藏着关乎安全的秘密? - 行业推荐官-2
  • 从一到无穷大 #74:智能全域巡检的产品形态与能力边界
  • 2026年电工工具箱厂家推荐:高性价比与精密制造并重的实力之选 - 优质品牌商家
  • 前端零基础3个月上岸AI:这套90天路线,无天赋也能吃透!
  • 2026 年至今,建德有实力的卧室整木 + 慕思软装定制厂家有哪些,花大价钱装卧室,没想到选它才是真的省心又上档次? - 鉴选官
  • 2026 年中山热门的海狮表演租赁厂家哪家专业,商场搞活动想省几十万?这玩意儿竟能帮你搞定顶级人气流量 - 行业推荐官[官方】--
  • Unity TextMeshPro图文混排与表情包功能全解析:从原理到实战应用
  • 如何在5分钟内掌握ComfyUI-Manager:AI工作流的终极节点管理器完全指南
  • 3分钟免费解锁PotPlayer字幕翻译:告别语言障碍的终极指南
  • Java程序员必看:掌握AI技术,收藏这份从入门到精通的实战指南!
  • 波导模式分析与损耗控制工程实践
  • Linux虚拟机操作命令大合集:从入门到精通的实用指南
  • 语义缓存管理
  • 2026 年更新:思明正规的酚醛环氧玻璃鳞片涂制造厂格局重塑与选型新思路,做防腐工程还在花大价钱?这款材料帮你省30%成本还不踩坑 - 行业推荐官-2
  • left join 和inner join on 后边的条件 还有 and 条件 和where 后的比较
  • 2026年智能工具柜品牌怎么选?从技术实力到售后服务全维度解析 - 优质品牌商家
  • MAX6675热电偶测温芯片:从原理到实战的完整指南
  • YOLOv3代码深度解析:从Darknet-53到多尺度预测与损失函数
  • PHP文件包含漏洞与CTF解题技巧
  • AI生图重在表达能力,这套方法让小白也能稳定出好图
  • C++函数封装进阶:从接口设计到RAII与异常安全的工程实践
  • 27考研天天师兄跟课笔记-导图版 丨内科学 · 循环系统疾病
  • 孤能子视角:EIS分析框架的演化(下)——从各类“论”到翻译层通约:让关系与实体可通约