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

📅 2026/8/4 4:59:15
大模型学习·第42天:LangChain进阶——自定义函数入链与对话记忆
一、RunnableLambda自定义函数加入Chain普通函数不能直接用|加入链需要用RunnableLambda包装也可直接传入lambda会自动转换。fromlangchain_core.runnablesimportRunnableLambda# 函数接收AIMessage返回dictmy_funcRunnableLambda(lambdaai_msg:{name:ai_msg.content})# 直接传lambda也可以自动转换chainfirst_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_chainRunnableWithMessageHistory(base_chain,# 被增强的原链get_history,# 通过session_id获取历史记录对象input_messages_keyinput,# 用户输入在模板中的占位符名history_messages_keychat_history# 历史记录在模板中的占位符名)# 调用时需传入session_idsession_config{configurable:{session_id:user_001}}resconversation_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_idsession_id self.file_pathos.path.join(storage_path,session_id)os.makedirs(os.path.dirname(self.file_path),exist_okTrue)defadd_messages(self,messages):all_messageslist(self.messages)all_messages.extend(messages)new_messages[message_to_dict(m)forminall_messages]withopen(self.file_path,w,encodingutf-8)asf:json.dump(new_messages,f)propertydefmessages(self):try:withopen(self.file_path,encodingutf-8)asf:returnmessages_from_dict(json.load(f))exceptFileNotFoundError:return[]defclear(self):withopen(self.file_path,w,encodingutf-8)asf:json.dump([],f)只需把get_history函数换成return FileChatMessageHistory(session_id, ./chat_history)历史记录就能持久化到磁盘文件。property装饰器让messages方法像属性一样访问。四、两种记忆方案对比方案存储位置重启后适用场景InMemoryChatMessageHistory内存丢失临时测试FileChatMessageHistory自实现本地文件保留持久化存储核心流程base_chain原有链→RunnableWithMessageHistory增强为带记忆的链→ 调用时传session_config指定会话ID。今日核心总结RunnableLambda将自定义函数转为Runnable实例入链lambda可直接传入临时记忆RunnableWithMessageHistoryInMemoryChatMessageHistory按session_id隔离长期记忆继承BaseChatMessageHistory实现文件读写持久化保存调用格式invoke时传{configurable: {session_id: xxx}}自动关联历史调试技巧链中加入自定义函数print信息原样返回不破坏业务