LangChain Day4 课程:回调、持久化、日志追踪
回调就是钩子函数打印日志、记录耗时监控模型调用次数、token 消耗给前端实时推送生成进度做错误捕获、重试逻辑如果想把日志存到文件、数据库,或者做更复杂的监控,可以继承写自定义回调:python运行print(f"[日志] 模型开始调用,prompt:{prompts[0][:100]}...")print(f"[日志] 模型调用结束,耗时:{duration:.2f}秒")
·
课程目标
✅ 理解回调(Callbacks)的作用与核心场景 ✅ 掌握 LangChainCallbackHandler 的基础用法 ✅ 学会对话持久化(存到文件 / 数据库) ✅ 能给你的链加上日志追踪,调试问题更轻松
一、核心概念:回调(Callbacks)
1. 什么是回调?
回调就是钩子函数,在 LangChain 的组件执行前后自动触发,用来:
- 打印日志、记录耗时
- 监控模型调用次数、token 消耗
- 给前端实时推送生成进度
- 做错误捕获、重试逻辑
2. 内置回调:StdOutCallbackHandler
最常用的控制台日志回调,能帮你打印链里每一步的执行细节,是调试必备!
python
运行
from langchain.callbacks import StdOutCallbackHandler
from langchain_openai import OpenAI
from langchain.chains import LLMChain
from langchain.prompts import PromptTemplate
# 1. 初始化模型+回调
llm = OpenAI(temperature=0, callbacks=[StdOutCallbackHandler()])
# 2. 组装链
prompt = PromptTemplate(input_variables=["topic"], template="解释一下{topic}")
chain = LLMChain(llm=llm, prompt=prompt)
# 3. 执行,控制台会自动打印完整执行过程
chain.run("LangChain回调")
你运行后会看到:模型调用、prompt 拼接、token 消耗等日志,调试超方便!
二、自定义回调:实现日志追踪
如果想把日志存到文件、数据库,或者做更复杂的监控,可以继承 BaseCallbackHandler 写自定义回调:
python
运行
from langchain.callbacks.base import BaseCallbackHandler
import time
class MyCustomCallback(BaseCallbackHandler):
def on_llm_start(self, serialized, prompts, **kwargs):
print(f"[日志] 模型开始调用,prompt:{prompts[0][:100]}...")
self.start_time = time.time()
def on_llm_end(self, response, **kwargs):
duration = time.time() - self.start_time
print(f"[日志] 模型调用结束,耗时:{duration:.2f}秒")
print(f"[日志] 模型回复:{response.generations[0][0].text[:100]}...")
# 使用自定义回调
llm = OpenAI(temperature=0, callbacks=[MyCustomCallback()])
chain = LLMChain(llm=llm, prompt=prompt)
chain.run("LangChain自定义回调")
你可以在这些钩子方法里,把数据写入文件、发送到日志服务器,实现持久化监控。
三、对话持久化:把聊天记录存起来
之前用的 ConversationBufferMemory 是存在内存里的,程序重启就丢了。LangChain 支持把对话历史持久化到文件 / 数据库,这里给你 2 种常用方案:
方案 1:文件持久化(简单易上手)
python
运行
from langchain.memory import ConversationBufferMemory
from langchain.chains import ConversationChain
import json
# 1. 初始化记忆
memory = ConversationBufferMemory()
conv_chain = ConversationChain(llm=OpenAI(temperature=0), memory=memory)
# 2. 对话
conv_chain.predict(input="你好,我在学LangChain")
conv_chain.predict(input="回调是什么?")
# 3. 保存对话到文件
history = memory.load_memory_variables({})["history"]
with open("chat_history.json", "w", encoding="utf-8") as f:
json.dump(history, f, ensure_ascii=False, indent=2)
# 4. 下次启动时加载对话
from langchain.memory.chat_message_histories import FileChatMessageHistory
from langchain.memory import ConversationBufferMemory
chat_history = FileChatMessageHistory("chat_history.json")
memory = ConversationBufferMemory(chat_memory=chat_history, return_messages=True)
conv_chain = ConversationChain(llm=OpenAI(temperature=0), memory=memory)
方案 2:SQLite 数据库持久化(适合长期使用)
python
运行
from langchain.memory.chat_message_histories import SQLChatMessageHistory
from langchain.memory import ConversationBufferMemory
# 连接SQLite数据库,存储对话历史
chat_history = SQLChatMessageHistory(
session_id="user_123", # 每个用户/会话一个ID
connection_string="sqlite:///chat_history.db"
)
memory = ConversationBufferMemory(chat_memory=chat_history, return_messages=True)
conv_chain = ConversationChain(llm=OpenAI(temperature=0), memory=memory)
# 对话会自动保存到数据库,重启不丢失
conv_chain.predict(input="我又来了,接着聊回调")
四、课后作业(30 分钟搞定)
- 用
StdOutCallbackHandler给一个LLMChain加上控制台日志,运行并观察输出。 - 写一个自定义回调,实现:模型调用开始 / 结束时,打印耗时和 prompt 前 100 字符。
- 用
FileChatMessageHistory实现对话持久化:- 第一次运行:和模型聊 2 轮
- 第二次运行:加载历史对话,接着聊,验证历史不丢失
作业 1:用
StdOutCallbackHandler给LLMChain加控制台日志python
运行
from langchain_openai import OpenAI from langchain.chains import LLMChain from langchain.prompts import PromptTemplate from langchain.callbacks import StdOutCallbackHandler # 1. 初始化模型 + 控制台日志回调 llm = OpenAI( temperature=0, callbacks=[StdOutCallbackHandler()] # 开启内置日志回调 ) # 2. 定义提示词模板 prompt = PromptTemplate( input_variables=["topic"], template="请用大白话解释一下:{topic}" ) # 3. 组装链 chain = LLMChain(llm=llm, prompt=prompt) # 4. 执行,控制台会自动打印完整执行过程 result = chain.run("LangChain的回调机制") print("\n最终回答:", result)运行后,你会在控制台看到模型调用、提示词拼接、Token 消耗等完整日志,方便调试。
作业 2:自定义回调,记录模型调用耗时和 Prompt
python
运行
from langchain.callbacks.base import BaseCallbackHandler from langchain_openai import OpenAI from langchain.chains import LLMChain from langchain.prompts import PromptTemplate import time # 1. 自定义回调类 class MyCustomCallback(BaseCallbackHandler): def on_llm_start(self, serialized, prompts, **kwargs): # 模型调用开始时触发 self.start_time = time.time() print("\n=== [日志] 模型调用开始 ===") print(f"收到的Prompt前100字符:\n{prompts[0][:100]}...") def on_llm_end(self, response, **kwargs): # 模型调用结束时触发 duration = time.time() - self.start_time print("\n=== [日志] 模型调用结束 ===") print(f"耗时:{duration:.2f} 秒") print(f"模型回复前100字符:\n{response.generations[0][0].text[:100]}...") # 2. 初始化模型 + 自定义回调 llm = OpenAI( temperature=0, callbacks=[MyCustomCallback()] ) # 3. 组装链并执行 prompt = PromptTemplate(input_variables=["topic"], template="解释一下:{topic}") chain = LLMChain(llm=llm, prompt=prompt) chain.run("LangChain的持久化")
作业 3:用
FileChatMessageHistory实现对话持久化第 1 步:第一次运行(保存对话)
python
运行
from langchain_openai import OpenAI from langchain.chains import ConversationChain from langchain.memory import ConversationBufferMemory from langchain.memory.chat_message_histories import FileChatMessageHistory # 1. 初始化文件持久化历史 chat_history = FileChatMessageHistory("chat_history.json") memory = ConversationBufferMemory( chat_memory=chat_history, return_messages=True ) # 2. 初始化对话链 llm = OpenAI(temperature=0) conv_chain = ConversationChain(llm=llm, memory=memory) # 3. 对话(会自动保存到文件) print(conv_chain.predict(input="你好,我在学LangChain的持久化")) print(conv_chain.predict(input="程序重启后对话会丢吗?")) # 查看保存的消息 print("\n当前对话历史:", chat_history.messages)第 2 步:第二次运行(加载历史,接着聊)
python
运行
from langchain_openai import OpenAI from langchain.chains import ConversationChain from langchain.memory import ConversationBufferMemory from langchain.memory.chat_message_histories import FileChatMessageHistory # 1. 从文件加载历史对话 chat_history = FileChatMessageHistory("chat_history.json") memory = ConversationBufferMemory( chat_memory=chat_history, return_messages=True ) # 2. 初始化对话链 llm = OpenAI(temperature=0) conv_chain = ConversationChain(llm=llm, memory=memory) # 3. 接着之前的对话聊 print(conv_chain.predict(input="你还记得我们刚才聊了什么吗?")) # 验证:能看到之前的对话历史 print("\n加载后的对话历史:", chat_history.messages)
更多推荐


所有评论(0)