关于 Agent 评测,我搭了一个能跑的最小版!
文末有源码链接,欢迎试跑~
Agent评测不能光看它说了啥,得看它干了啥——调了哪些工具、传了什么参数、拿到了啥结果。最近看到一篇文章,把这个问题拆解得很清楚:
Task → Environment → Tools → Trace → Grader
5个模块,概念非常清晰——就是有个小遗憾,代码跑不起来。但有个小问题——它不能直接跑😅。
🤔 于是我们想:能不能把这个骨架落地成一个真正可执行的东西?
✅ 能跑 — 装了依赖就能跑
✅ 能接真实模型 — 我们接入了 DeepSeek
✅ 没 API 也能玩 — 自动降级 demo 模式
✅ 只有 150 行 — 绝不多写一行废话
今天把整个过程分享出来。文末有源码,欢迎试跑~
— — —
🤷 一、Harness 到底是个啥?
想象一下你要面试一个 Agent,你问它:
"请判断这个项目是否支持插件系统"
Agent 答:"不能确认"。
听着挺合理对吧?但你仔细一想——
-
它到底有没有读 README?🤨
-
还是瞎蒙的?
-
它读了哪些文件?读对了吗?
-
有没有把文件里没有的信息脑补进去?
光看一句话答案,你什么都不知道。
Harness 就是来解决这个问题的。它把你和 Agent 之间的"面试"变成了一次实验——有固定的题目、固定的工具、全程录像,最后还有裁判打分。
💡 一句话总结:Harness 把 Agent 跑的过程从"黑盒"变成了"白盒"。
— — —
🧩 二、5 个模块,一个不能少
Harness 的核心就 5 个东西,咱们一个一个来,都配了真实代码,别怕。
📋 ① Task — 给 Agent 下任务
就是告诉 Agent:你要干什么、别干什么。我们用 SYSTEM_PROMPT 搞定:
Python
SYSTEM_PROMPT = """
你是一个文件分析助手。
你的任务是:判断项目是否支持插件系统。
你需要根据提供的文件内容来回答,不能根据你的知识补充。
如果文件内容不足以确认,请明确回答"不能确认"。
"""
注意最后一句——"不能确认",这是给 Grader(评分器)埋的钩子,后面会说到。
📁 ② Environment — 造一个"楚门的世界"
Agent 只能看到我们给它看的东西。我们造了两个文件:
Python
INITIAL_FILES = {
"/README.md": "本项目支持本地启动、基础登录和配置管理。",
"/config.md": "配置项包括 port、theme、log_level。",
}
没有插件相关的任何信息。Agent 如果回答"支持插件系统",那就是在瞎编。
🔧 ③ Tools — 只给两把螺丝刀
为了评测精确,我们只给 Agent 两个工具,不多不少:
Python
@tool
def list_files(path: str = ".") -> str:
"""列出所有文件。"""
return json.dumps(["README.md", "config.md"])
@tool
def read_file(path: str) -> str:
"""读取文件内容。"""
return INITIAL_FILES[path]
if path in INITIAL_FILES else f"错误:文件不存在。"
没有 write_file,没有 execute,没有 task。Agent 唯一能做的事就是看文件。这样测出来的结果才有说服力。
📝 ④ Trace — 全程录像
Agent 调了什么、传了什么参数、返回了什么,全部记录下来:
Python
pending = {}
for msg in result["messages"]:
if hasattr(msg, "tool_calls"):
for tc in msg.tool_calls:
pending[tc["id"]] = {
"tool": tc["name"],
"arguments": tc["args"],
}
# ... 匹配 ToolMessage 拿回结果
我们拿到的 Trace 长这样:
JSON
{
"tool": "read_file",
"arguments": {"path": "/README.md"},
"result": "本项目支持本地启动、基础登录和配置管理。"
}
⚖️ ⑤ Grader — 裁判上线
同时检查"过程"和"结果":
Python
def grader(trace, answer):
# 检查过程:有没有读 README.md?
readme_read = any(
step["arguments"].get("path", "").endswith("README.md")
for step in trace if step["tool"] == "read_file"
)
# 检查结果:有没有说"不能确认"?
answer_ok = "不能确认" in answer
success = readme_read and answer_ok
return {"success": success, "reason": ...}
📦 最终输出
所有东西打包成一个 JSON:
JSON
{
"case_id": "case_001",
"trace": [
{"tool": "read_file", "arguments": {"path": "/README.md"}, "result": "..."},
{"tool": "read_file", "arguments": {"path": "/config.md"}, "result": "..."}
],
"answer": "根据文件内容,未能确认插件系统支持。",
"grade": {"success": true, "reason": "读取了README.md,且回答了'不能确认'。"}
}
— — —
🔌 三、把 DeepSeek 接进来
概念再好,跑不起来也是白搭。我们来真的。
我们用的是 DeepSeek 的 deepseek-v4-flash。但默认开启了 thinking 模式,用 ChatOpenAI 来调,把 thinking 关掉:
Python
llm = ChatOpenAI(
model="deepseek-v4-flash",
api_key=os.getenv("DEEPSEEK_API_KEY"),
base_url="https://api.deepseek.com/v1",
temperature=0,
extra_body={"thinking": {"type": "disabled"}},
)
agent = create_deep_agent(model=llm, ...)
密钥和模型名放在 .env 里,不写死在代码中:
INI
DEEPAGENTS_MODEL=deepseek-v4-flash
DEEPSEEK_API_KEY=sk-你的密钥
DEEPSEEK_API_BASE=https://api.deepseek.com/v1
🧠 想用别的模型?改 .env 就行。OpenAI、Anthropic 同理。
— — —
🏃 四、一次真实的"跑分"记录
设置好 API 密钥,一行命令搞定:
Bash
$ uv run python main.py
[Harness] Mode: live
Agent 开始干活,总共调了 6 次工具:
|
# |
工具 |
参数 |
|---|---|---|
|
1 |
list_files | "." |
|
2 |
read_file | "./README.md" |
|
3 |
read_file | "./config.md" |
|
4 |
ls | "/" |
|
5 |
read_file | "/README.md" |
|
6 |
read_file | "/config.md" |
最终答案:
📢 不能确认。 README.md 只描述了本地启动、基础登录和配置管理,未提及任何插件相关功能。
评分器判定:
JSON
"grade": {
"success": true,
"reason": "读取了README.md,且回答包含'不能确认'。"
}
🎉 一次完整的 Agent 评测,跑通了。
— — —
🎭 五、没 API 密钥?照样玩
没有 DeepSeek 的 API 密钥怎么办?代码会自动降级为 Demo 模式:
Bash
$ uv run python main.py
[Harness] Mode: demo
会用模拟数据展示完整的 5 模块流程,输出一模一样的 Eval Report。拿到密钥后改一下 .env 就能切换到 live 模式,代码一行都不用动。
— — —
📂 六、项目结构一览
deepagents-mini-harness/
├── main.py # 150行,整个Harness
├── .env # 模型配置
├── pyproject.toml # 依赖
└── .gitignore # 防密钥泄露
就 4 个文件。没有复杂的目录结构,没有 Docker 编排,没有 YAML 配置地狱。
— — —
📝 七、写在最后
这个 Mini Harness 的定位很清楚:不做成一个平台,只做好一件事——把 Agent 的执行变成可复现、可记录、可评分的实验。
150 行 Python,5 个模块,接入了真实模型,输出了标准化的 Eval Report。就这么简单。
有了这套结构,Agent 评测不再是"试一下好不好用",而是能精确定位问题出在哪个环节:
-
🤔 任务理解错了? → 改 System Prompt
-
🔧 工具用错了? → 看 Trace 里的 tool name
-
📝 参数传错了? → 看 Trace 里的 arguments
-
📖 结果读错了? → 看 Trace 里的 result
-
⚖️ 评分规则不合理? → 改 Grader
🚀 项目已开源:https://github.com/winsurelab/deepagents-mini-harness
⭐ 欢迎 Star,欢迎提 Issue,欢迎来一起讨论
参考:陈思州,《关于Agent Harness,我整理了一个最小版!》,Datawhale
如果觉得有用,点个 👍 赞 和

推荐
👇 欢迎关注,第一时间收到更新
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)