使用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,主要源于两个点:
- 模型选择错误:你代码中使用的
OpenAI类默认调用的是text-davinci-003模型,该模型定价为0.02美元/千输入Token、0.02美元/千输出Token,远高于gpt-3.5-turbo的定价。 - 全库元数据传入:即使你的数据库仅1.87MB,若包含较多表/列,全库表结构元数据的Token量会远超查询本身的消耗。
三、精确计算Token的方法
- 拼接内容统计:将以下内容拼接后,用OpenAI的
tiktoken库统计Token数:- SQLDatabaseChain的系统提示词(可通过
db_chain.prompt查看) - 数据库表结构元数据(可通过
db.get_table_info()获取) - 你的查询语句
- SQL执行结果文本
- LLM生成的回答文本
- SQLDatabaseChain的系统提示词(可通过
- 代码实时统计:用
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
相关产品推荐
相关产品推荐

