【2024最全最细Lanchain教程-10】Langchain记忆模块-CSDN博客
回调(callback)是一个python中常用的技术,在langchain中回调作为一个主要模块主要应用在运行过程管理、查看日志、计算token等场景。下面我们来看具体的代码:
1. 一个最简单的同步回调
我们从 langchain.callbacks库中引入 StdOutCallbackHandler类,并进行实例化:
import os
from langchain.callbacks import StdOutCallbackHandler
from langchain.chains import LLMChain
from langchain_openai import OpenAI
from langchain.prompts import PromptTemplate
handler = StdOutCallbackHandler()
llm = OpenAI(
temperature=0,
openai_api_key = os.getenv("OPENAI_API_KEY"),
base_url = os.getenv("OPENAI_BASE_URL"),
)
prompt = PromptTemplate.from_template("{year}年是中国生肖年的哪年?")
chain_callback = LLMChain(
llm=llm,
prompt=prompt,
callbacks = [handler]
)
chain_callback.invoke({"year":1987})
在构造链的时候我们加入回调 callbacks = [handler],然后在运行链的过程中会看到回调的效果,就是在启动、结束链的时候可以看到相关的输出,这咋复杂链的构造中可以有效地帮助你定位问题:
2. 使用FileCallbackHandler进行日志输出
我们在实际项目运行中,不太可能去console去盯着看StdOutCallbackHandler的输出,我们往往使用loggin来记录、保存和回顾代码运行情况。
注意我们要先pip安装 loguru 这个库,然后我们先声明一个logfile并添加进logger里,我们实例化一个 FileCallbackHandler并将logfile作为参数输入进去:
from loguru import logger
from langchain.callbacks import FileCallbackHandler
logfile = 'output.log'
logger.add(logfile,colorize=True,enqueue = True)
handler = FileCallbackHandler(logfile)
chain = LLMChain(
llm=llm,
prompt=prompt,
callbacks = [handler],
verbose = True
)
response = chain.invoke({"year":1988})
logger.info(response)
在运行chain之后,我们可以通过logger.info()来查看log信息,我们同样可以在代码当前目录下面找到 output.log文件,查看里面的信息:
with open('output.log','r',encoding='utf-8') as file:
content = file.read()
print(content)
3. 使用 get_openai_callback 回调实现token计数
我们使用如下代码可以实现token的计数,这个在生产场景很有用,因为在线调用各种模型都是要付费的:
from langchain.callbacks import get_openai_callback
llm = OpenAI(
temperature=0,
openai_api_key = os.getenv("OPENAI_API_KEY"),
base_url = os.getenv("OPENAI_BASE_URL"),
)
with get_openai_callback() as cb:
llm.invoke("牛顿什么时候发现的万有引力定律?")
total_tokens = cb.total_tokens
assert total_tokens >0
print(total_tokens)
我们也可以把整个链的调用放到 with as: 语句下面:
with get_openai_callback() as cb:
logfile = 'output.log'
logger.add(logfile,colorize=True,enqueue = True)
handler = FileCallbackHandler(logfile)
chain = LLMChain(
llm=llm,
prompt=prompt,
callbacks = [handler],
verbose = True
)
response = chain.invoke({"year":1988})
logger.info(response)
total_tokens = cb.total_tokens
assert total_tokens >0
print(total_tokens)