You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用OpenAI API结合结构化数据的Token总量计算及费用咨询

问题分析与Token计算说明

一、本次场景的Token计算逻辑

LangChain的SQLDatabaseChain运行时,Token消耗分为以下核心部分:

  • 内置系统提示词:SQLDatabaseChain会自带引导LLM生成SQL、处理查询结果的系统指令,这部分属于隐性输入Token,不会在verbose输出中显示,但会被计入总消耗。
  • 用户查询输入:你的查询语句Describe the playlisttrack table会被统计为输入Token。
  • 数据库元数据:初始化SQLDatabase时,LangChain会提取数据库的表结构(表名、列名、数据类型等)作为上下文传给LLM。默认情况下会传入全库表结构元数据,如果数据库表/列数量多,这部分会占用大量Token。
  • SQL执行结果:SQL返回的结果[(1, 3402), (1, 3389), (1, 3390), (1, 3391), (1, 3392)]会作为上下文传给LLM生成自然语言回答,这部分也属于输入Token。
  • LLM输出内容:最终生成的回答文本会被统计为输出Token。

二、费用偏高的核心原因

你提到的0.13美元费用对应约32k Token,主要源于两个点:

  1. 模型选择错误:你代码中使用的OpenAI类默认调用的是text-davinci-003模型,该模型定价为0.02美元/千输入Token、0.02美元/千输出Token,远高于gpt-3.5-turbo的定价。
  2. 全库元数据传入:即使你的数据库仅1.87MB,若包含较多表/列,全库表结构元数据的Token量会远超查询本身的消耗。

三、精确计算Token的方法

  1. 拼接内容统计:将以下内容拼接后,用OpenAI的tiktoken库统计Token数:
    • SQLDatabaseChain的系统提示词(可通过db_chain.prompt查看)
    • 数据库表结构元数据(可通过db.get_table_info()获取)
    • 你的查询语句
    • SQL执行结果文本
    • LLM生成的回答文本
  2. 代码实时统计:用tiktoken在关键节点统计:
    import tiktoken
    # 对应你使用的模型
    encoding = tiktoken.encoding_for_model("text-davinci-003")
    
    # 统计输入Token:系统提示词+元数据+查询+SQL结果
    input_content = db_chain.prompt.format(input="Describe the playlisttrack table", top_k=5, table_info=db.get_table_info()) + str([(1, 3402), (1, 3389), (1, 3390), (1, 3391), (1, 3392)])
    input_tokens = len(encoding.encode(input_content))
    
    # 统计输出Token:回答文本
    output_content = "The PlaylistTrack table contains two columns, PlaylistId and TrackId, which are both integers. It is used to store the relationship between playlists and tracks."
    output_tokens = len(encoding.encode(output_content))
    
    total_tokens = input_tokens + output_tokens
    

四、降低费用的建议

  • 切换到gpt-3.5-turbo模型:修改LLM初始化代码,使用ChatOpenAI类指定模型:
    from langchain.chat_models import ChatOpenAI
    llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0, verbose=True)
    
  • 限制传入的表元数据:初始化SQLDatabase时指定仅传入需要的表,减少Token消耗:
    db = SQLDatabase.from_uri("sqlite:///../../../../content/sqlite2.db", include_tables=["PlaylistTrack"])
    

内容的提问来源于stack exchange,提问作者Ajay

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 13:26:19