[掌握LangChain模型调用:高效追踪Token使用和成本]

76 阅读2分钟

掌握LangChain模型调用:高效追踪Token使用和成本

在将应用程序投入生产时,追踪用于大型语言模型(LLM)调用的token使用情况,以便计算花费,是一项非常重要的任务。本指南将介绍如何从LangChain模型调用中获取此信息。

引言

本文旨在帮助开发者了解如何使用LangChain和相关工具来追踪LLM调用中的token使用情况。这对于在生产环境中优化成本和性能至关重要。

主要内容

前提条件

在开始之前,建议您对以下概念有所了解:

  • LLMs(大型语言模型)
  • LangSmith的使用

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

代码示例

多次调用追踪

上下文管理器中任何内容的调用都会被追踪。这是一个使用它来顺序追踪多个Chain调用的例子:

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(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当前不支持流式传输上下文中的token计数。为准确计数,考虑以下选项:

  • 使用专门的聊天模型。
  • 实现自定义回调处理器,使用适当的分词器来计数。
  • 使用像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(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使用,开发者能够更好地控制LLM调用的成本和性能。建议阅读以下资源以获得更深入的了解:

参考资料

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

---END---