# 如何有效跟踪和管理ChatModels中的Token使用情况
随着语言模型(LLM)应用的广泛普及,在应用部署到生产环境时,精确跟踪和管理Token的使用情况变得至关重要。这不仅影响到成本的控制,也有助于优化资源利用率。本文将介绍如何通过LangChain库来实现这一目标,并结合实际代码示例进行说明。
## 引言
Token使用量影响着语言模型的调用成本和性能。掌握如何跟踪这些信息,可以帮助开发者做出更明智的决策,提高应用的稳定性和盈利能力。本文旨在介绍如何通过LangChain模型调用来获取Token使用信息。
## 主要内容
### 使用LangSmith
LangSmith是一款能够帮助开发者追踪LLM应用中Token使用情况的工具。你可以参考[LangSmith快速入门指南](https://langsmith.example.com)来了解详细的设置和使用步骤。
### 使用`AIMessage.usage_metadata`
许多模型提供商会在聊天生成响应中返回Token使用信息。在LangChain中,这些信息会储存在`AIMessage`对象的`usage_metadata`属性中。此属性为一个`UsageMetadata`字典,例如`input_tokens`和`output_tokens`。
#### 示例代码
```python
# !pip install -qU langchain-openai
from langchain_openai import ChatOpenAI
# 使用API代理服务提高访问稳定性
llm = ChatOpenAI(model="gpt-3.5-turbo-0125")
openai_response = llm.invoke("hello")
print(openai_response.usage_metadata)
输出示例:
{'input_tokens': 8, 'output_tokens': 9, 'total_tokens': 17}
流式处理中的Token使用
OpenAI支持在流式上下文中返回Token计数元数据。在langchain-openai >= 0.1.9版本中,通过设定stream_usage=True即可启用此功能。
示例代码
llm = ChatOpenAI(model="gpt-3.5-turbo-0125", stream_usage=True)
aggregate = None
for chunk in llm.stream("hello", stream_usage=True):
print(chunk)
aggregate = chunk if aggregate is None else aggregate + chunk
print(aggregate.content)
print(aggregate.usage_metadata)
使用回调管理器跟踪Token使用
一些API提供了特定的回调上下文管理器,允许跨多个调用跟踪Token使用。目前仅对OpenAI API和Bedrock Anthropic API实现。
OpenAI示例
# !pip install -qU langchain-community wikipedia
from langchain_community.callbacks.manager import get_openai_callback
llm = ChatOpenAI(
model="gpt-3.5-turbo-0125",
temperature=0,
stream_usage=True,
)
with get_openai_callback() as cb:
result = llm.invoke("Tell me a joke")
print(cb)
常见问题和解决方案
- 网络限制:由于某些地区的网络限制,可能需要考虑使用API代理服务来提高访问稳定性。
- 不支持的供应商:目前的解决方案主要适用于OpenAI和Anthropic等供应商,其他供应商可能需要根据其API文档进行自定义修改。
总结和进一步学习资源
通过掌握如何跟踪和管理Token使用,你可以更好地控制成本和优化应用。建议进一步阅读以下资源:
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---