十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

建 Baseten Grounded Inference 搜索基线,TaoToken Key 先固定

建 Baseten Grounded Inference 搜索基线,TaoToken Key 先固定 1. 为什么 Baseten Grounded Inference 基线要先固定 TaoToken Key在给 Baseten Grounded Inference 做搜索性能基线时第一步不是跑模型而是把 Key 固定去 TaoToken 获取 API Keyhttps://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_contentbaseten_grounded_introBase URL 保持https://taotoken.net/api。Baseten 近期把 Hosted Tools 放到了台前第一个能力是 Grounded Inference托管在 Baseten 上的开源模型可以通过配置接入网络搜索。当前可选搜索提供方包括 Exa、Keenable、Parallel、You.com。对性能测试来说这四家提供方的差异不只是“能不能搜到”还会影响首 Token 延迟、端到端延迟、搜索结果注入长度、工具调用次数最终影响 Token 消耗和单次请求成本。如果没有固定 Key基线会很容易失真。比如今天用 A Key 测 Exa明天用 B Key 测 You.com表面看只是换了搜索提供方实际上模型调用入口、鉴权链路、并发限制、计费口径都可能变了。最后得到的延迟差异无法判断是搜索提供方造成的还是 Key 或 Base URL 切换造成的。因此构建 Baseten Grounded Inference 搜索基线的核心原则是搜索提供方可以变模型调用入口和 Key 变量不能变。本文的复现产出有三类一份可直接落表的基线指标表覆盖 TTFT、P50/P95、端到端延迟、成功率、Token 消耗、搜索调用次数、单请求成本。一套 Key 固定变量说明把 TaoToken Key、Base URL、模型名、搜索提供方、并发数、运行 ID 全部环境变量化。一组复现测试命令包含 Claude Code、Codex、CC Switch 三件套配置以及 Python 压测脚本和 CSV 汇总命令。这里要特别强调Baseten Grounded Inference 的 Token 消耗方是 Baseten 托管模型与搜索链路。模型侧消耗输入/输出 Token搜索链路可能带来额外上下文注入也可能产生搜索服务调用费用。做基线时不能只看模型账单也不能只看搜索账单必须把两边按run_id provider关联起来。如果你还没有固定 Key建议先到 TaoToken 官网完成准备https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_contentbaseten_grounded_prepare 。后面所有配置都使用YOUR_API_KEY占位符Base URL 统一写https://taotoken.net/api不要在这个地址后面拼接 UTM 参数。UTM 只用于官网入口和 deep link工具配置里的 Base URL 必须保持干净。2. TaoToken Key 固定变量说明从官网到 Base URL 的最小闭环做性能测试最怕变量漂移。建议在开始前建立一个独立的 shell 环境文件把本次 Baseten Grounded Inference 搜索基线涉及的所有变量固定下来。变量分为三组鉴权组TAOTOKEN_API_KEY、TAOTOKEN_BASE_URL模型组BASETEN_GROUNDED_MODEL实验组SEARCH_PROVIDER、BENCH_CONCURRENCY、BENCH_RUN_ID先到 TaoToken 获取 Keyhttps://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_contentbaseten_grounded_key_setup 。创建后把 Key 写入本地环境文件不要硬编码到脚本里。# ~/.config/taotoken/baseten-grounding.env export TAOTOKEN_API_KEYYOUR_API_KEY export TAOTOKEN_BASE_URLhttps://taotoken.net/api export BASETEN_GROUNDED_MODELyour-baseten-hosted-model export SEARCH_PROVIDERexa # exa | keenable | parallel | you_com export BENCH_CONCURRENCY1 export BENCH_RUN_IDgrounded-baseline-$(date %Y%m%d%H%M) export BENCH_TIMEOUT_S60 export BENCH_MAX_OUTPUT_TOKENS512加载并检查source ~/.config/taotoken/baseten-grounding.env env | grep -E TAOTOKEN|BASETEN_GROUNDED|SEARCH_PROVIDER|BENCH_ | sort预期能看到TAOTOKEN_BASE_URLhttps://taotoken.net/api。如果这里写成了带 UTM 的官网地址模型 SDK 会把 UTM 当成路径参数轻则 404重则鉴权失败。Base URL 就是 Base URLUTM 只放在浏览器入口。Key 固定变量说明可以用一张表记录后续每次跑基线都复制一份变量名用途是否允许变化示例TAOTOKEN_API_KEYTaoToken 鉴权一轮基线内不变YOUR_API_KEYTAOTOKEN_BASE_URL模型调用入口不变https://taotoken.net/apiBASETEN_GROUNDED_MODEL被测模型名按实验矩阵变化your-baseten-hosted-modelSEARCH_PROVIDER搜索提供方核心变量exa/keenable/parallel/you_comBENCH_CONCURRENCY并发数核心变量1/4/8BENCH_RUN_ID运行标识每次运行唯一grounded-baseline-20250101BENCH_TIMEOUT_S请求超时一轮内不变60BENCH_MAX_OUTPUT_TOKENS输出上限一轮内不变512再强调一次在 Claude Code 里使用ANTHROPIC_*在 Codex 里使用config.toml不要把ANTHROPIC_*套到 Codex。这是两套工具配置字段不同混用会出现“Key 明明是对的但请求一直 401”的假故障。3. Claude Code / Codex / CC Switch 三件套配置别把 ANTHROPIC_* 套到 Codex为了让 Baseten Grounded Inference 基线可复现建议把本地 AI 工具链也统一到 TaoToken。这里给出三件套配置Claude Code 的settings.json、Codex 的config.toml、以及 CC Switch 使用的环境变量文件。三者的共同点是 Base URL 都使用https://taotoken.net/apiKey 都引用YOUR_API_KEY但字段名不能混。3.1 Claude Code使用 settings.json 和 ANTHROPIC_*Claude Code 读取~/.claude/settings.json。配置如下{ env: { ANTHROPIC_BASE_URL: https://taotoken.net/api, ANTHROPIC_AUTH_TOKEN: YOUR_API_KEY, ANTHROPIC_MODEL: your-baseten-hosted-model } }如果你的 Claude Code 版本还支持ANTHROPIC_API_KEY也可以放在同一个env对象里但优先使用ANTHROPIC_AUTH_TOKEN与当前文档保持一致。配置完成后新开终端验证claude --version echo $ANTHROPIC_BASE_URL echo $ANTHROPIC_AUTH_TOKEN | sed s/./*/g不要把ANTHROPIC_BASE_URL写成官网首页。工具需要的是 API Base URL即https://taotoken.net/api。官网入口只用于获取 Key、查看模型、创建 API Key 和阅读 Claude Code 文档。3.2 Codex使用 config.toml不要用 ANTHROPIC_*Codex 走的是~/.codex/config.toml。配置如下model your-baseten-hosted-model model_provider taotoken [model_providers.taotoken] name TaoToken base_url https://taotoken.net/api env_key TAOTOKEN_API_KEY wire_api chat然后在 shell 中导出export TAOTOKEN_API_KEYYOUR_API_KEY验证codex --version printenv TAOTOKEN_API_KEY | sed s/./*/g grep -n base_url\|env_key\|model_provider ~/.codex/config.toml注意Codex 的env_key指向TAOTOKEN_API_KEY不要写ANTHROPIC_AUTH_TOKEN。把 Claude Code 的环境变量复制到 Codex 配置里是常见错误。症状是 Codex 能启动但模型请求鉴权失败。3.3 CC Switch 三件套统一切换不改 KeyCC Switch 的价值在于快速切换工具与供应商配置。建议准备三件套# 1. Claude Code 配置 ~/.claude/settings.json # 2. Codex 配置 ~/.codex/config.toml # 3. 环境变量文件 ~/.config/taotoken/cc-switch.envcc-switch.env内容export TAOTOKEN_API_KEYYOUR_API_KEY export TAOTOKEN_BASE_URLhttps://taotoken.net/api export BASETEN_GROUNDED_MODELyour-baseten-hosted-modelCC Switch 切换时只切换工具入口和模型名不改TAOTOKEN_API_KEY。这样 Baseten Grounded Inference 搜索基线的 Key 变量保持稳定。若切换后 Claude Code 正常、Codex 异常优先检查 Codex 是否误用了ANTHROPIC_*。4. Baseten Grounded Inference 搜索链路性能测试基线指标表与采集口径性能测试的目标不是证明某个搜索提供方“最快”而是建立可比较的基线。Baseten Grounded Inference 支持 Exa、Keenable、Parallel、You.com 四家提供方但每家返回的搜索结果数量、摘要长度、排序方式、超时行为可能不同。你的测试矩阵至少应包含搜索提供方exa、keenable、parallel、you_com并发数1、4、8查询类型事实型、时效型、代码型、多跳型模型同一个 Baseten 托管模型通过 TaoToken 统一调用输出上限统一512Token避免输出长度干扰超时统一60s重试建议先固定为1不要自动多次重试否则成本归因会混入重试请求指标定义如下指标含义采集点success请求是否成功返回脚本异常捕获ttft_ms首 Token 延迟流式响应首块e2e_ms端到端延迟请求开始到结束search_calls搜索工具调用次数Baseten 侧或日志input_tokens输入 Token响应 usageoutput_tokens输出 Token响应 usagesearch_latency_ms搜索阶段延迟搜索提供方日志或链路追踪cost_per_req单请求成本模型 Token 搜索调用cost_per_1k千次请求成本cost_per_req * 1000基线指标表建议使用下面结构方便直接写进 CSVrun_id,provider,concurrency,model,query_type,success,ttft_p50_ms,ttft_p95_ms,e2e_p50_ms,e2e_p95_ms,search_calls_avg,input_tokens_avg,output_tokens_avg,cost_per_req,cost_per_1k grounded-baseline-001,exa,1,your-baseten-hosted-model,fact,20/20,0,0,0,0,0,0,0,0,0成本归因建议拆成两部分模型成本 input_tokens / 1_000_000 * 输入单价 output_tokens / 1_000_000 * 输出单价 搜索成本 search_calls * 搜索单价 单请求成本 模型成本 搜索成本这里的单价以你实际使用的 TaoToken 模型价格和搜索提供方账单为准。本文不写具体金额避免不同时间、不同套餐造成误导。你只需要保证同一轮基线里单价口径不变。TaoToken 的模型调用入口和 Key 管理可以在这里查看https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_contentbaseten_grounded_cost 。进入控制台后先创建 API Key再回到本地更新YOUR_API_KEY。不要在一轮测试中途换 Key否则cost_per_req和限流表现都会变。5. 复现测试命令从 20 条固定 Query 到 CSV下面给出一个最小复现脚本。它通过 TaoToken 的 Base URL 调用 Baseten 托管模型并记录延迟、Token 和成功状态。搜索提供方的切换建议在 Baseten Hosted Tools 侧完成脚本只读取SEARCH_PROVIDER作为标记不要伪造不存在的 API 字段。# benchmark_grounded.py import os import time import json import argparse import statistics from openai import OpenAI client OpenAI( api_keyos.environ[TAOTOKEN_API_KEY], base_urlos.environ[TAOTOKEN_BASE_URL], ) QUERIES [ {id: fact-001, type: fact, q: 请给出一个可验证的事实并说明来源类型。}, {id: fresh-001, type: fresh, q: 总结最近一周内某个技术话题的变化并标注时间。}, {id: code-001, type: code, q: 解释一个常见 Python 报错的排查步骤。}, {id: multi-001, type: multi_hop, q: 先找概念 A再找与 A 相关的概念 B最后给出二者关系。}, ] def pct(values, p): if not values: return 0 values sorted(values) k int(round((len(values) - 1) * p / 100)) return values[k] def run_one(query, model, max_output_tokens, timeout_s): start time.perf_counter() first_token_at None text try: stream client.chat.completions.create( modelmodel, messages[{role: user, content: query[q]}], temperature0, max_tokensmax_output_tokens, streamTrue, timeouttimeout_s, ) for chunk in stream: if first_token_at is None: first_token_at time.perf_counter() delta chunk.choices[0].delta.content or text delta end time.perf_counter() return { success: 1, ttft_ms: round((first_token_at - start) * 1000, 2) if first_token_at else 0, e2e_ms: round((end - start) * 1000, 2), output_chars: len(text), error: , } except Exception as e: end time.perf_counter() return { success: 0, ttft_ms: 0, e2e_ms: round((end - start) * 1000, 2), output_chars: 0, error: str(e)[:200], } def main(): parser argparse.ArgumentParser() parser.add_argument(--provider, requiredTrue) parser.add_argument(--concurrency, typeint, default1) parser.add_argument(--n, typeint, default20) parser.add_argument(--out, requiredTrue) args parser.parse_args() model os.environ[BASETEN_GROUNDED_MODEL] max_output_tokens int(os.environ.get(BENCH_MAX_OUTPUT_TOKENS, 512)) timeout_s int(os.environ.get(BENCH_TIMEOUT_S, 60)) rows [] for i in range(args.n): q QUERIES[i % len(QUERIES)] r run_one(q, model, max_output_tokens, timeout_s) r.update({ run_id: os.environ.get(BENCH_RUN_ID, local), provider: args.provider, concurrency: args.concurrency, model: model, query_type: q[type], }) rows.append(r) success [r for r in rows if r[success] 1] ttft [r[ttft_ms] for r in success] e2e [r[e2e_ms] for r in success] summary { run_id: os.environ.get(BENCH_RUN_ID, local), provider: args.provider, concurrency: args.concurrency, model: model, n: args.n, success: f{len(success)}/{args.n}, ttft_p50_ms: pct(ttft, 50), ttft_p95_ms: pct(ttft, 95), e2e_p50_ms: pct(e2e, 50), e2e_p95_ms: pct(e2e, 95), } with open(args.out, w, encodingutf-8) as f: for r in rows: f.write(json.dumps(r, ensure_asciiFalse) \n) f.write(json.dumps({summary: summary}, ensure_asciiFalse) \n) print(json.dumps(summary, ensure_asciiFalse, indent2)) if __name__ __main__: main()安装依赖并运行python -m venv .venv source .venv/bin/activate pip install openai source ~/.config/taotoken/baseten-grounding.env python benchmark_grounded.py --provider exa --concurrency 1 --n 20 --out baseline_exa_c1.jsonl python benchmark_grounded.py --provider keenable --concurrency 1 --n 20 --out baseline_keenable_c1.jsonl python benchmark_grounded.py --provider parallel --concurrency 1 --n 20 --out baseline_parallel_c1.jsonl python benchmark_grounded.py --provider you_com --concurrency 1 --n 20 --out baseline_you_com_c1.jsonl如果你的 Baseten Hosted Tools 配置支持在控制台切换搜索提供方请每跑一个 provider 前先切到对应值再执行同名命令。脚本里的--provider只用于结果标记不负责修改 Baseten 侧配置。这样能避免把“实验标记”和“真实搜索提供方”搞混。汇总 CSVpython - PY import json, glob, csv rows [] for path in glob.glob(baseline_*.jsonl): with open(path, encodingutf-8) as f: for line in f: obj json.loads(line) if summary in obj: rows.append(obj[summary]) with open(baseline_summary.csv, w, newline, encodingutf-8) as f: writer csv.DictWriter(f, fieldnamesrows[0].keys()) writer.writeheader() writer.writerows(rows) print(wrote baseline_summary.csv) PY如果你在跑并发把--concurrency改成 4 或 8但脚本当前是串行示例。实际压测时可以把run_one放进线程池同时确保TAOTOKEN_API_KEY不变、BENCH_RUN_ID唯一、每个 provider 独立输出文件。并发测试不要和其他实验共用 Key 限额否则 P95 会被限流污染。6. 四家搜索提供商 Exa / Keenable / Parallel / You.com 的排障与成本归因Baseten Grounded Inference 支持四家搜索提供方基线建设时建议把它们当成四个独立链路而不是“一个搜索开关”。排障时按下面顺序检查先确认模型调用是否成功。如果 TaoToken 侧请求就失败先查TAOTOKEN_API_KEY和TAOTOKEN_BASE_URL。常见错误是把 Base URL 写成官网首页或者 Key 里混入空格。再确认 Baseten Hosted Tools 是否实际调用了搜索。看search_calls是否为 0。如果为 0说明模型没有触发搜索可能是提示词太短、问题不需要外部信息或者搜索工具配置未启用。对比搜索结果注入长度。同样一个问题Exa、Keenable、Parallel、You.com 返回的片段长度可能不同。注入越长input_tokens越高TTFT 和成本都会上升。区分搜索延迟和生成延迟。端到端延迟包括搜索阶段和模型生成阶段。只看总延迟无法判断是搜索慢还是模型慢。建议至少在日志里记录搜索开始、搜索结束、首 Token 三个时间点。固定重试策略。搜索超时后自动重试会拉高 P95也会增加搜索调用费用。基线阶段建议先关闭自动重试或者固定为一次并单独记录重试次数。固定上下文截断策略。把搜索结果转成上下文时必须固定最大字符数或最大 Token 数。否则提供方 A 返回 3 条、提供方 B 返回 10 条成本没有可比性。成本归因表可以这样设计providersearch_callsavg_search_resultsinput_tokens_avgoutput_tokens_avgmodel_costsearch_costtotal_costexa0000000keenable0000000parallel0000000you_com0000000注意model_cost和search_cost必须来自同一run_id。如果你在 TaoToken 控制台看到模型 Token 消耗在搜索提供方后台看到搜索调用量需要用run_id和时间窗口对齐。否则会出现“模型账单不高但总成本很高”的错觉实际是搜索调用没有被计入。如果你需要重新创建 Key 或查看模型列表可以从这里进入https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_contentbaseten_grounded_console 。创建 Key 后回到~/.config/taotoken/baseten-grounding.env更新YOUR_API_KEY再重新加载环境变量。整轮基线中只允许在开始前换 Key不要中途换。7. 从基线到上线阈值、回归门禁与文末 CTA一次基线不是终点。你需要把基线结果转成回归门禁。建议为 Baseten Grounded Inference 搜索链路设置三类阈值性能阈值ttft_p95_ms不超过基线均值的 1.3 倍e2e_p95_ms不超过基线均值的 1.5 倍。成本阈值cost_per_1k不超过上轮基线的 1.2 倍input_tokens_avg不出现无解释上涨。稳定性阈值success低于 99%或search_calls_avg波动超过 20%触发人工排查。每次上线前用同样的 20 条 Query、同样的模型、同样的TAOTOKEN_BASE_URL、同样的TAOTOKEN_API_KEY跑一轮。只允许SEARCH_PROVIDER和BENCH_CONCURRENCY作为实验变量。若必须换模型重新建立基线不要直接把新模型结果和旧模型对比。排障清单再压缩成一句话先查 Key 和 Base URL再查搜索是否触发再查搜索结果注入长度最后查重试和并发。大部分“Baseten Grounded Inference 搜索慢”的问题最终都能落在这四层里。如果你准备直接复现建议按下面的路径走先到模型对话页确认可用模型https://taotoken.net/models/detail/chat?utm_sourcetaotoken_aicg_blog_endutm_contentbaseten_grounded_chat如果要做长期压测和工具链接入看 Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentbaseten_grounded_coding然后创建 API Key替换YOUR_API_KEYhttps://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentbaseten_grounded_keys最后对照 Claude Code 文档完成settings.json配置https://taotoken.net/doc/ClaudeCodeAnthropic?utm_sourcetaotoken_aicg_blog_endutm_contentbaseten_grounded_claude把 Key 固定、Base URL 固定、模型固定、Query 集固定Baseten Grounded Inference 的搜索性能与成本基线才有复现意义。接下来你要做的就是跑完第一轮 CSV然后把baseline_summary.csv作为所有后续优化的对照表。
返回列表