Bootstrap

如何高效追踪ChatModels中的Token使用

引言

在使用大型语言模型(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使用情况。接下来,你可以参考其他关于如何实现结构化输出、如何为聊天模型添加缓存的文章来进一步提升你的应用。

参考资料

  1. LangChain Documentation
  2. LangSmith Quick Start Guide

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

—END—

;