1. 为什么 Agent 上线前必须做评估与回归测试Agent 评估、测试与生产最佳实践说白了就是回答一个问题你写的这个会自己调工具、自己规划步骤的智能体到底靠不靠谱。它和普通 LLM 应用最大的区别在于Agent 多了「行动」这一层——它会选工具、填参数、根据返回结果决定下一步。这意味着一次失败可能不是「回答得不好」而是「调错了接口」「传错了参数」「陷入死循环」甚至在生产环境里执行了危险操作。适合谁适合所有准备把 Agent 从 demo 推到线上的工程团队尤其是需要在上线前做回归验证、又不想每次手动点一遍的团队。我见过太多项目卡在同一个坎上开发阶段用几个 case 试了试感觉「能跑」就直接上线。结果用户一用工具调用失败率飙升或者模型在某个边界输入下开始反复调用同一个工具。问题不在于模型不行而在于没有一套可复现的评估闭环。Agent 评估和 LLM 评估的本质区别就在这里LLM 评估看的是输出文本质量困惑度、BLEU、ROUGE 这些指标还能用Agent 评估看的是整个系统的端到端表现任务完成率、工具选择准确率、参数提取准确率、执行效率、鲁棒性、安全性一个都不能少。更麻烦的是Agent 的输出是自然语言加结构化动作的混合体传统指标根本没法准确衡量语义层面的质量。所以业界现在主流做法是 LLM-as-Judge用一个能力足够的模型当裁判对 Agent 的执行轨迹打分。这套方法不是完美的但它是目前最能规模化的方案。你要做的是把它工程化——固定测试用例、固定评分标准、固定调用通道让每次改动后的评估结果可对比、可复现。这里就引出一个很实际的问题评估本身也要调模型。如果你的 Agent 用一家模型裁判用另一家测试脚本里散落着各种 Key 和 Base URL那评估结果的可复现性就无从谈起。统一 Key 和 API 通道不是为了省事而是为了让「同一套用例、同一套参数、同一套模型」这个前提成立。这也是后面要讲的 TaoToken 前置配置的核心价值。2. TaoToken 统一 Key 与 API 通道前置配置在讲评估框架之前先把调用凭证这件事理清楚。Agent 评估会频繁调用模型被测 Agent 要调LLM-as-Judge 裁判也要调有时候还要跑多轮回归。如果每个脚本、每个环境都配一套 Key很快就会乱。TaoToken 在这里的作用是提供一个统一的 API 通道把调用凭证集中管理官网入口是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 地址是 https://taotoken.net/api 。你需要准备三件套Base URL、API Key、Model ID。这三样在评估脚本里会反复出现建议统一放在环境变量或配置文件里不要硬编码。Base URL 填 https://taotoken.net/api API Key 在控制台的 API Keys 页面生成Model ID 根据你实际要评估的模型填。如果你用的是 Claude Code 这类工具做 Agent 开发配置方式类似把 Base URL 指向同一个通道即可。注意评估脚本里不要出现任何网络代理相关的配置。TaoToken 提供的是标准 API 通道直接填 Base URL 就能用。配置好之后先做一次最小连通性验证确认 Key 和通道没问题再进入评估框架的搭建。这一步很多人跳过结果评估跑了一半报 401浪费大量时间排查。验证命令很简单用 curl 发一个最小的 chat completions 请求curl https://taotoken.net/api/v1/chat/completions \ -H Content-Type: application/json \ -H Authorization: Bearer $TAOTOKEN_API_KEY \ -d { model: your-model-id, messages: [{role: user, content: ping}], max_tokens: 16 }如果返回正常的 JSON 结构说明通道通了。如果返回 401检查 Key 是否复制完整、是否有多余空格如果返回 model not found检查 Model ID 是否拼写正确。这一步过了后面的评估才有意义。3. 可复制的 Agent 评估用例配置与测试脚本评估框架的核心是「用例 执行 打分 报告」。下面这套配置可以直接复制到你的项目里围绕五个维度设计任务完成率、工具选择准确率、参数提取准确率、Token 效率、延迟。用例用 JSON 管理方便版本控制和回归对比。先建一个eval_cases.json每个用例包含输入、期望关键词、期望工具、权重{ cases: [ { id: weather_001, input: 北京今天天气怎么样, expected_keywords: [天气, 温度, °C], expected_tool: get_weather, weight: 1.0 }, { id: calc_001, input: 帮我算一下 123 456 等于多少, expected_keywords: [579, 计算结果], expected_tool: calculator, weight: 1.0 }, { id: search_001, input: 搜索 Python 教程, expected_keywords: [搜索, 结果], expected_tool: web_search, weight: 0.5 }, { id: edge_001, input: 写一首关于春天的诗, expected_keywords: [春], expected_tool: null, weight: 1.5 } ] }然后是评估器脚本agent_evaluator.py它读取用例、执行 Agent、按维度打分、输出报告。关键点在于评分逻辑要显式不能靠感觉。关键词匹配算一个基础分工具选择正确再加分执行报错直接归零。import json import time from typing import Callable class AgentEvaluator: def __init__(self, llm: Callable None): self.llm llm self.results [] def evaluate(self, agent_func: Callable, test_cases: list) - list: self.results [] for i, case in enumerate(test_cases): print(f\n评估用例 {i1}/{len(test_cases)}: {case[input][:50]}...) start_time time.time() try: output agent_func(case[input]) error None except Exception as e: output error str(e) elapsed time.time() - start_time score 1.0 details [] if case.get(expected_keywords): keyword_score self._check_keywords(output, case[expected_keywords]) score * keyword_score details.append(f关键词匹配: {keyword_score:.2f}) if not output or len(output) 10: score * 0.5 details.append(输出过短) if error: score * 0 details.append(f执行错误: {error}) weight case.get(weight, 1.0) self.results.append({ case_id: case.get(id, i 1), input: case[input], output: output[:200], score: score, weight: weight, error: error, elapsed_sec: round(elapsed, 2), details: details, }) print(f 评分: {score:.2f} | 耗时: {elapsed:.2f}s) return self.results def _check_keywords(self, output: str, keywords: list) - float: if not keywords: return 1.0 matched sum(1 for kw in keywords if kw.lower() in output.lower()) return matched / len(keywords) def summary(self) - str: if not self.results: return 无评估结果。 total_weight sum(r[weight] for r in self.results) weighted_score sum(r[score] * r[weight] for r in self.results) / total_weight passed sum(1 for r in self.results if r[score] 0.7) lines [ * 55, Agent 评估报告, * 55, f总用例数: {len(self.results)}, f通过 (0.7): {passed}, f失败 (0.7): {len(self.results) - passed}, f加权平均分: {weighted_score:.2f}, - * 55, ] for r in self.results: status PASS if r[score] 0.7 else FAIL lines.append(f[{status}] {r[case_id]}: score{r[score]:.2f} | time{r[elapsed_sec]}s) return \n.join(lines)这套脚本的好处是用例和逻辑分离改用例不用动代码改评分逻辑也不用重写用例。跑起来之后你会得到一份带加权平均分的报告直接贴到 CI 里就能做回归门禁。4. 验证请求与成功结果跑通一次完整评估配置和脚本都有了现在跑一次完整评估确认结果可复现。先写一个模拟 Agent 用于演示实际项目里替换成你自己的 Agent 调用函数即可。注意这里所有模型调用都走同一个 Base URL 和 Key保证评估环境一致。from agent_evaluator import AgentEvaluator def mock_agent(user_input: str) - str: if 天气 in user_input: return 当前天气晴好气温25°C湿度适中适合户外活动。 if 计算 in user_input: try: expr user_input.split(计算)[-1].strip() return f计算结果为: {eval(expr)} except Exception: return 计算失败请检查表达式。 if 搜索 in user_input: return 搜索结果: 找到了相关信息详情请查看链接。 return 我不太理解您的问题请提供更多信息。 if __name__ __main__: with open(eval_cases.json, r, encodingutf-8) as f: cases json.load(f)[cases] evaluator AgentEvaluator() evaluator.evaluate(mock_agent, cases) print(\n evaluator.summary())运行python agent_evaluator.py你会看到每个用例的评分和耗时最后输出一份汇总报告。成功的结果应该类似总用例数 4通过 3 或 4加权平均分在 0.8 以上。如果某个用例失败报告里会标出是关键词没匹配上还是执行报错。这里的关键是「可复现」同样的用例、同样的 Agent、同样的模型通道跑两次结果应该一致。如果两次结果差异很大说明评估环境不稳定可能是模型温度参数没固定或者调用通道有波动。建议在评估脚本里显式设置temperature0减少随机性。另外把每次评估的报告存成带时间戳的文件方便对比不同版本之间的变化。提示评估跑通后把命令接到 CI 里每次提交代码自动跑一遍。加权平均分低于阈值就阻断合并这就是最基础的回归门禁。5. 本篇常见错误排查401、local proxy failed、reading choices、OAuth评估过程中最容易卡住的不是评分逻辑而是调用通道的报错。下面这几个是我实际踩过的坑对照着排查能省不少时间。401 Unauthorized最常见。原因通常是 Key 没填对、Key 过期、或者请求头格式不对。检查Authorization: Bearer key里的 Bearer 后面有没有空格Key 有没有复制完整。如果你用的是环境变量确认变量在当前 shell 里真的生效了echo $TAOTOKEN_API_KEY看一眼。local proxy failed这个报错通常出现在你本地配了某些网络转发规则但目标地址不可达。评估脚本里不要引入任何本地转发配置直接把 Base URL 设为 https://taotoken.net/api 让请求走标准通道。如果你之前配过全局转发先清掉再跑。reading choices 相关报错一般是响应结构解析失败。可能是模型返回了非预期的 JSON 结构或者你的解析代码假设了choices[0].message.content但实际返回的是流式分片。检查请求里有没有误开stream: true评估场景建议先关掉流式拿到完整响应再解析。OAuth 相关报错如果你用的是 Claude Code 或类似工具可能会遇到 OAuth 认证失败。这类工具通常支持 API Key 模式把认证方式切到 KeyBase URL 填 https://taotoken.net/api Model ID 填你实际使用的模型。三件套齐全之后OAuth 报错一般会消失。排查顺序建议先 curl 验证通道再跑最小 Python 请求最后跑完整评估。这样能把问题定位在通道层、脚本层还是用例层。另外评估脚本里加一个--dry-run参数只打印将要发送的请求而不实际调用能快速发现配置拼写错误。6. 生产环境检查清单与统一 Key 的长期价值评估通过只是上线前的第一步生产环境还有一整套检查清单要过。下面这份清单可以直接拿去用每一条都对应一个真实的故障场景。错误处理方面每个工具调用都要有 try-catch并且给 LLM 返回「能帮助它修正」的错误信息而不是一句「失败了」。全局超时和最大重试次数必须设置防止某个工具卡死拖垮整个 Agent。可观测性方面记录每次 LLM 调用的输入、输出、token 数、耗时记录每个 tool_call 的参数和结果用 LangSmith 或 LangFuse 这类工具做 tracing。成本控制方面简单任务用更小更便宜的模型相同或相似的 LLM 调用做缓存设置 max_tokens 上限用语义缓存减少重复查询。安全防护方面输入过滤防 Prompt Injection工具权限最小化关键操作加人工确认。性能优化方面独立的工具调用并行执行流式输出提升用户体验预加载和预计算减少等待。这些检查项里很多都依赖稳定的模型调用通道。统一 Key 的长期价值就在这里评估阶段、CI 阶段、生产阶段用的是同一套凭证和同一个 Base URL环境差异带来的问题被降到最低。你不需要在三个地方维护三套配置也不需要担心某个环境的 Key 过期导致评估结果失真。最后给一个实用技巧把评估用例当成代码资产来管理。每次线上发现 bad case就把它补进eval_cases.json下次回归自动覆盖。时间长了这套用例集就是你 Agent 的质量护城河。评估报告存成带版本号的文件和代码提交记录关联出问题时能快速定位是哪次改动引入的退化。做到这一步Agent 从开发到生产的闭环才算真正跑通。
阅读完成 · 觉得有帮助?