尧图精选

把 TaoToken 放进 Qwen 4B 查询优化智能体的调用链,Token 谁消耗?

🕒 发布时间:2026/9/18 10:03:53 📁 来源:尧图网络
1. 从 EXPLAIN 报错到调用链Qwen 4B 查询优化智能体的 Token 入口在哪当你在本地把 Postgres 的EXPLAIN (FORMAT JSON)塞给 Qwen 4B 查询优化智能体第一次请求 TaoToken 时若报openai.BadRequestError: Error code: 400多半不是模型不会看执行计划而是 Base URL 写成了带/v1的地址或者 Key 还没从正确入口获取。搭建调用链前先去 TaoToken 官网 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_contentqwen4b_postgres_chain 拿 Key调用时 Base URL 用 https://taotoken.net/api 。这一步定下来后面讨论“Token 谁消耗”才有意义。很多后端同学做查询优化智能体时会把注意力全放在模型训练上用 SFT 冷启动再用智能体 RL 微调让 4B 模型学会输出 join order、扫描方式、索引建议。但真正落到线上或本地可复现环境时训练只是上半场。下半场是推理调用链谁把 SQL 和 EXPLAIN 结果拼成 prompt谁发起 HTTP 请求谁解析返回谁把建议拿到本地数据库验证。每一次“让模型生成一版查询计划”的推理请求都会消耗 Token。如果调用链里混入了多个模型、多个重试、多个调试打印Token 消耗会散落在日志里最后对不上账。本文以一个可复现的 Qwen 4B 查询优化智能体为例把 TaoToken 放进调用链拆解三个产出调用链示意、请求日志、Token 消耗记录。视角是 AI 应用后端不碰生产库所有 SQL 和验证命令都由读者在本地执行。你不需要先训练一个 4B 模型也可以先用一个已部署的 Qwen 4B 或同类模型跑通调用链再替换成自己的模型端点。2. 调用链拆解Qwen 4B 智能体、Postgres 计划与 Token 消耗点先画一条文字版调用链不依赖任何图形工具本地测试库执行EXPLAIN (ANALYZE, FORMAT JSON) SELECT ...得到 JSON 执行计划。后端服务读取 SQL 文本、表结构、索引定义、EXPLAIN JSON。Prompt 构造器把上述信息裁剪成模型能接受的上下文并附加输出格式约束。OpenAI 兼容客户端向https://taotoken.net/api发起chat.completions请求。Qwen 4B 查询优化智能体返回候选计划、join 顺序、改写建议或代价估计。后端解析返回抽取可执行 SQL 或 hint。本地 Postgres 执行验证记录实际耗时、rows、loops。日志系统落盘请求日志与 Token 消耗记录。在这条链里Token 消耗点非常集中第 4 步的推理请求。具体来说prompt_tokens来自你发送的 SQL、EXPLAIN JSON、表结构、few-shot 示例completion_tokens来自模型生成的计划文本。如果启用了多轮对话历史消息也会累积进下一轮prompt_tokens。如果失败重试每次重试都会重新计费。如果并发跑 113 条 join 密集查询Token 消耗就是单次请求的线性累加再加上重试和调试请求。需要区分两个阶段训练阶段SFT 和智能体 RL 消耗的是 GPU 算力、训练数据管道、rollout 采样。若你用 API 生成蒸馏轨迹那么轨迹生成阶段也会消耗 Token但这部分属于数据制造不属于线上推理。推理阶段Qwen 4B 智能体在调用链中生成查询计划消耗的是 API Token。本文讨论的“谁消耗 Token”主要指这一阶段。一个常见误区是把训练收益直接等同于推理成本下降。4B 模型比更大模型便宜但如果你在调用链里做了 5 次重试、每轮都塞完整 EXPLAIN JSON总 Token 依然可能失控。因此调用链设计要同时考虑模型效果和 Token 账本。可复现产出第一项调用链示意。你可以用注释形式写在代码文件顶部例如# 调用链示意 # local_sql - explain_json - prompt_builder - TaoToken /api - qwen4b_agent # - plan_parser - local_postgres_validate - request_log token_usage.csv这样任何人拿到代码都能先看清数据流和计费点。3. 接入 TaoToken拿 Key、配 Base URL、写可复现请求在搭建调用链前去 TaoToken 官网 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_contentqwen4b_create_key 拿 Key。控制台里创建 Key 后不要把它硬编码进仓库。用环境变量注入export OPENAI_API_KEYYOUR_API_KEY export OPENAI_BASE_URLhttps://taotoken.net/api注意 Base URL 不加 UTM 参数保持为https://taotoken.net/api。OpenAI 兼容客户端会自动拼接/v1/chat/completions之类的路径所以不要手动在末尾再加/v1否则容易出现 404 或 400。下面是可运行的最小调用示例包含请求日志与 Token 消耗记录import csv import json import logging import time from openai import OpenAI client OpenAI( api_keyYOUR_API_KEY, base_urlhttps://taotoken.net/api, ) logging.basicConfig( filenameqwen4b_query_agent.log, levellogging.INFO, format%(asctime)s %(levelname)s %(message)s, ) def build_prompt(sql: str, explain_json: dict, schema_ddl: str) - list: system ( 你是一个 Postgres 查询优化智能体。 只输出 JSON字段包括 join_order、scan_methods、rewrite_sql、reason。 不要输出 Markdown不要解释无关内容。 ) user ( f原始 SQL\n{sql}\n\n f表结构\n{schema_ddl}\n\n fEXPLAIN JSON\n{json.dumps(explain_json, ensure_asciiFalse)[:6000]} ) return [ {role: system, content: system}, {role: user, content: user}, ] def call_qwen4b_agent(sql_id: str, sql: str, explain_json: dict, schema_ddl: str) - dict: messages build_prompt(sql, explain_json, schema_ddl) start time.time() try: resp client.chat.completions.create( modelqwen-4b-agent, messagesmessages, temperature0.2, max_tokens1200, ) latency_ms int((time.time() - start) * 1000) content resp.choices[0].message.content usage resp.usage log_record { sql_id: sql_id, model: resp.model, prompt_tokens: usage.prompt_tokens, completion_tokens: usage.completion_tokens, total_tokens: usage.total_tokens, latency_ms: latency_ms, status: ok, } logging.info(json.dumps(log_record, ensure_asciiFalse)) with open(token_usage.csv, a, newline, encodingutf-8) as f: writer csv.writer(f) writer.writerow([ sql_id, resp.model, usage.prompt_tokens, usage.completion_tokens, usage.total_tokens, latency_ms, ]) return json.loads(content) except Exception as exc: latency_ms int((time.time() - start) * 1000) logging.error(json.dumps({ sql_id: sql_id, status: error, error: str(exc), latency_ms: latency_ms, }, ensure_asciiFalse)) raise if __name__ __main__: sql SELECT ... FROM a JOIN b ON ... JOIN c ON ... WHERE ... explain_json {Plan: {Node Type: Seq Scan, Relation Name: a}} schema_ddl CREATE TABLE a (...); CREATE TABLE b (...); plan call_qwen4b_agent(job_001, sql, explain_json, schema_ddl) print(json.dumps(plan, ensure_asciiFalse, indent2))这段代码做了四件事从环境变量或占位符读取 Key固定 Base URL 为https://taotoken.net/api调用模型落盘请求日志和 CSV。token_usage.csv就是 Token 消耗记录。日志里包含sql_id、model、prompt_tokens、completion_tokens、total_tokens、latency_ms方便后续按查询维度聚合。如果你还没有模型名可以先在模型对话页面确认可用模型再填入model参数。模型名写错通常返回 404 或 400日志里的error字段会直接暴露。建议在批量跑 JOB 负载前先用一条简单 SQL 验证 Key、Base URL、模型名三要素。4. 在 Claude Code / Codex / CC Switch 中复用同一套 Key查询优化智能体的主调用链通常是 Python 服务但开发调试阶段会用到命令行工具。你可以把同一个 TaoToken Key 配置到 Claude Code 和 Codex用来写调用链脚本、检查日志、补配置。注意两者的配置格式完全不同不要把ANTHROPIC_*套到 Codex。Claude Code 使用settings.json关键字段是ANTHROPIC_BASE_URL和ANTHROPIC_AUTH_TOKEN{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_AUTH_TOKEN: YOUR_API_KEY, ANTHROPIC_MODEL: claude-3-5-sonnet-20241022 } }保存到 Claude Code 的配置目录后重启终端或重新加载配置。如果报 401先检查ANTHROPIC_AUTH_TOKEN是否带了多余空格。如果报 404检查ANTHROPIC_BASE_URL是否误写成了https://taotoken.net/api/v1。Codex 使用config.tomlBase URL 仍然用https://taotoken.net/api但环境变量名走 OpenAI 风格model gpt-4o model_provider taotoken [model_providers.taotoken] name TaoToken base_url https://taotoken.net/api env_key OPENAI_API_KEY然后在 shell 中设置export OPENAI_API_KEYYOUR_API_KEYCC Switch 三件套可以理解为Claude Code 的settings.json、Codex 的config.toml、以及 shell 环境变量。三者各自独立切换工具时只改对应文件。如果你在同一个终端里同时用 Claude Code 和 Codex建议用不同的环境变量名或不同的 shell 会话避免 Key 混淆。Token 消耗记录仍然以主调用链的 CSV 为准命令行工具的调用量单独看账单。5. Token 消耗记录与成本归因从单次请求到批量 JOB 负载有了请求日志和 CSV下一步是做成本归因。建议按以下维度聚合按sql_id单条查询消耗多少 prompt/completion Token。按modelQwen 4B 与其他模型分别消耗多少。按status成功请求与失败重试的 Token 占比。按latency_msToken 消耗与延迟是否正相关。一个可复现的统计脚本如下import csv from collections import defaultdict stats defaultdict(lambda: {prompt: 0, completion: 0, total: 0, count: 0}) with open(token_usage.csv, newline, encodingutf-8) as f: reader csv.DictReader(f, fieldnames[ sql_id, model, prompt_tokens, completion_tokens, total_tokens, latency_ms ]) for row in reader: key row[model] stats[key][prompt] int(row[prompt_tokens]) stats[key][completion] int(row[completion_tokens]) stats[key][total] int(row[total_tokens]) stats[key][count] 1 for model, s in stats.items(): print(f{model}: requests{s[count]} prompt{s[prompt]} completion{s[completion]} total{s[total]})批量跑 join 密集查询时Token 消耗大致等于“查询条数 × 单次平均 prompt 单次平均 completion”再乘以重试系数。不要忽略 prompt 构造器的裁剪逻辑如果你把完整 EXPLAIN JSON 和所有表结构都塞进去prompt_tokens会迅速膨胀。可以只保留 Plan 节点类型、Relation Name、Join Type、Filter、Actual Rows、Actual Total Time 等关键字段。对于 few-shot 示例按需选取不要固定塞十几条。如果要做 off-policy 蒸馏或智能体 RL轨迹生成阶段也可能调用 TaoToken 生成候选计划。这部分 Token 消耗应单独记录不要和线上推理混在一起。可以给日志加stage字段例如stagetrajectory_gen、stageonline_inference、stagedebug。这样月底看账单时能区分“数据制造成本”和“服务推理成本”。可复现产出第二项请求日志。确保每条日志都有唯一sql_id、时间戳、模型名、Token 数、延迟、错误信息。日志脱敏时不要打印完整 Key只保留前几位和后几位。6. 常见报错与排障Base URL、模型名、Key 权限排障时按顺序核对401 UnauthorizedKey 是否从正确入口创建是否带空格是否已过期。去 API Keys 页面重新生成。404 Not FoundBase URL 是否写成https://taotoken.net/api是否误加了/v1或尾部斜杠。模型名是否在可用列表中。400 Bad Request请求体格式是否合法messages是否为数组max_tokens是否超出模型限制。EXPLAIN JSON 是否包含非法字符导致 JSON 序列化失败。429 Too Many Requests并发过高或触发限流。降低并发增加指数退避。Timeout单次 prompt 过长或模型响应慢。裁剪 EXPLAIN JSON设置合理超时和重试次数。Context length exceeded历史消息累积过多。查询优化智能体通常不需要多轮对话每轮重新构造 prompt 即可。一个容易忽略的点是网络代理。不要配置任何非产品文档提供的中间层Base URL 只用https://taotoken.net/api。如果本地环境有全局代理先确认它不会改写请求路径。所有 SQL 验证都在本地 Postgres 测试库执行不要让智能体直接连接生产库也不要通过 MCP 或 Agent 直连 Oracle/生产库。可复现产出第三项Token 消耗记录。把 CSV 和日志一起归档每次调整 prompt 或模型后重新跑一批查询对比 Token 数和计划质量。如果计划质量提升但 Token 数翻倍需要判断是否值得。7. 文末 CTA调用链跑通后把 Token 账本变成工程习惯当你已经跑通 Qwen 4B 查询优化智能体的调用链并且能稳定输出请求日志和 Token 消耗记录下一步是把 Key 管理、模型选择和成本控制固化下来。可以按以下路径继续先到模型对话页面验证模型和 Keyhttps://taotoken.net/models/detail/chat?utm_sourcetaotoken_aicg_blog_endutm_contentqwen4b_chat如果需要长期在命令行里写调用链和调试脚本查看 Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentqwen4b_coding_plan为批量 JOB 负载创建独立 Key便于按项目归因 Tokenhttps://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentqwen4b_api_keys如果你同时使用 Claude Code 开发后端服务参考 Claude Code 文档配置https://taotoken.net/doc/ClaudeCodeAnthropic?utm_sourcetaotoken_aicg_blog_endutm_contentqwen4b_claude_code_doc回到最初的问题把 TaoToken 放进 Qwen 4B 查询优化智能体的调用链Token 谁消耗答案是推理请求消耗 Token具体落在每一次chat.completions调用的prompt_tokens和completion_tokens上。训练阶段的 SFT 和智能体 RL 消耗的是训练资源如果轨迹生成走了 API也要单独记账。只要调用链固定 Base URL 为https://taotoken.net/api请求日志和 Token 消耗记录完整你就能清楚知道每一条 Postgres 查询计划背后花了多少 Token以及下一步该优化 prompt、模型还是重试策略。更多接入入口和配置说明可以从 TaoToken 官网 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_contentqwen4b_token_audit 开始。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →