引言
在使用大型语言模型(LLM)时,追踪token的使用量以计算成本是将应用投入生产的重要部分。本文将探讨如何从LangChain模型调用中获得这些信息,并提供清晰的代码示例。为了实现这一目标,你需要确保使用langchain-openai >= 0.1.9
的版本。我们还会讨论可能遇到的挑战及其解决方案。
主要内容
使用LangSmith
LangSmith是一个可以帮助你在LLM应用中追踪token使用情况的工具。你可以参考LangSmith的快速入门指南以开始使用。
使用AIMessage.usage_metadata
许多模型提供商会在聊天生成响应中返回token使用信息。这些信息会包含在由相应模型生成的AIMessage对象中。当可用时,AIMessage对象的usage_metadata
属性将是一个UsageMetadata
字典,包含标准键(例如,“input_tokens"和"output_tokens”)。
示例:
-
OpenAI:
from langchain_openai import ChatOpenAI 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}
-
Anthropic:
from langchain_anthropic import ChatAnthropic llm = ChatAnthropic(model="claude-3-haiku-20240307") anthropic_response = llm.invoke("hello") print(anthropic_response.usage_metadata)
输出:
{'input_tokens': 8, 'output_tokens': 12, 'total_tokens': 20}
使用AIMessage.response_metadata
模型响应中的元数据也会包含在AIMessage的response_metadata
属性中。不同的提供商对于token计数的表示采用了不同的标准。
流式传输
某些提供商在流式上下文中支持token计数元数据。
OpenAI流式传输示例:
通过在langchain-openai >= 0.1.9
中设置stream_usage=True
,可以启用流式token使用。此属性也可以在创建ChatOpenAI实例时设置。
llm = ChatOpenAI(model="gpt-3.5-turbo-0125")
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)
代码示例
以下是追踪OpenAI API中token使用的完整代码示例:
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,
)
with get_openai_callback() as cb:
result = llm.invoke("Tell me a joke")
print(cb)
常见问题和解决方案
问题1:网络访问限制
在某些地区,由于网络限制,开发者可能需要考虑使用API代理服务来提高访问稳定性。
问题2:不一致的元数据格式
不同的模型提供商对token使用数据的格式不一致,需根据不同格式进行解析。
总结与进一步学习资源
通过本文,你已经学会了如何在生产应用中追踪ChatModels的token使用情况。接下来,你可以参考其他关于如何实现结构化输出、如何为聊天模型添加缓存的文章来进一步提升你的应用。
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
—END—