如何高效追踪LLM的Token使用:从概念到实现

110 阅读2分钟

引言

在将您的应用部署到生产环境时,追踪大语言模型(LLM)的Token使用量和计算费用是一个重要的环节。这份指南将引导您如何从LangChain模型调用中获取此信息。了解这些使用数据有助于更好地管理资源并优化成本。

主要内容

1. 先决条件

本指南假设您已经熟悉以下概念:

  • 大语言模型(LLMs)
  • 使用LangSmith进行监控

您可以通过LangSmith追踪LLM应用中的Token使用情况,更多信息请参考LangSmith快速入门指南。

2. 使用回调

在某些API中,有特定的回调上下文管理器允许您在多次调用中追踪Token使用情况。您需要确认是否有适合您模型的集成可用。

如果没有现成的集成,您可以通过适配OpenAI回调管理器的实现来创建自定义回调管理器。

3. OpenAI的例子

单次调用追踪

我们先来看一个追踪单次聊天模型调用的简单例子。

from langchain_community.callbacks import get_openai_callback
from langchain_openai import OpenAI

llm = OpenAI(model_name="gpt-3.5-turbo-instruct")

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

print(f"Total Tokens: {cb.total_tokens}")
print(f"Prompt Tokens: {cb.prompt_tokens}")
print(f"Completion Tokens: {cb.completion_tokens}")
print(f"Total Cost (USD): ${cb.total_cost}")

请注意,这个回调处理器当前不支持流式Token计数。

多次调用追踪

任何在上下文管理器内的代码都会被追踪。这是一个用于顺序调用链的例子。这种方法同样适用于可能使用多步的Agent。

from langchain_community.callbacks import get_openai_callback
from langchain_core.prompts import PromptTemplate
from langchain_openai import OpenAI

llm = OpenAI(model_name="gpt-3.5-turbo-instruct")
# 使用API代理服务提高访问稳定性

template = PromptTemplate.from_template("Tell me a joke about {topic}")
chain = template | llm

with get_openai_callback() as cb:
    response = chain.invoke({"topic": "birds"})
    print(response)
    response = chain.invoke({"topic": "fish"})
    print("--")
    print(response)

print()
print("---")
print(f"Total Tokens: {cb.total_tokens}")
print(f"Prompt Tokens: {cb.prompt_tokens}")
print(f"Completion Tokens: {cb.completion_tokens}")
print(f"Total Cost (USD): ${cb.total_cost}")

流式调用

由于回调处理器不支持流式Token计数,您可能需要使用自定义回调或监控平台。

from langchain_community.callbacks import get_openai_callback
from langchain_openai import OpenAI

llm = OpenAI(model_name="gpt-3.5-turbo-instruct")
# 使用API代理服务提高访问稳定性

with get_openai_callback() as cb:
    for chunk in llm.stream("Tell me a joke"):
        print(chunk, end="", flush=True)
    print("---")
print()

print(f"Total Tokens: {cb.total_tokens}")
print(f"Prompt Tokens: {cb.prompt_tokens}")
print(f"Completion Tokens: {cb.completion_tokens}")
print(f"Total Cost (USD): ${cb.total_cost}")

常见问题和解决方案

  1. 模型不支持流式Token计数怎么办?

    • 您可以实现自定义回调处理程序,或使用如LangSmith这样的监控平台。
  2. 如何处理API调用的网络限制?

    • 考虑使用API代理服务来提高访问稳定性,特别是在某些地区的网络限制下。

总结和进一步学习资源

本指南介绍了如何追踪LLM的Token使用情况。为了深入学习,您可以参考以下资源:

参考资料

  • LangChain Documentation
  • OpenAI Documentation

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