副标题: 三款模型实测 + 八条 Prompt 技巧——同样的任务,怎么让 Agent 少花一半 Token


一、引子:Agent 不是一次推理,而是一个循环

上篇文章(《Agent 不是工具调用器——理解 Agent 的工作机制》)我们拆开了 Agent 循环的每一环,从 System Prompt 到工具调用再到循环判断。现在,我们给这个循环算一笔账——每一轮推理要花多少 token?多少时间?

但真正把一个 Agent 任务跑起来时,你会发现:

用户提问
    ↓
模型"想"了一下       ← 消耗 completion token(含推理过程)
    ↓
调 search_kb 查资料   ← 工具调用
    ↓
工具返回结果
    ↓
模型又"想"了一下     ← 再次消耗 completion token
    ↓
再调一个工具...
    ↓
最终给出回答

整个过程可能循环 3-5 轮

一次 Agent 任务不是一个推理请求,而是 N 个推理请求组成的一个循环。 每一轮都有成本——Prompt token 在增长(历史在累积),Completion token 在消耗(模型在"思考"),工具调用在花时间。

在这篇文章之前,我对这个开销只有模糊的感觉。这篇文章之后,我们用真实数据说话。


二、先搞懂两个概念

Token 是什么?

Token 是模型理解文本的最小单位。它不是"字"也不是"词":

"你好,今天天气不错" → 分词器 → ["你好", ",", "今天", "天气", "不错"]
                                              6 个 token

模型按 token 计费(云 API)或按 token 消耗显存和时间(本地部署)。一个 Agent 任务消耗的 token 量 = 每一轮推理的 prompt token + completion token 的总和

推理模型 vs 指令模型

这是理解实验数据的关键。

类型 代表 训练方式 行为特点
指令模型 Qwen3、GPT-4o、Claude 指令微调(SFT + RLHF) 直接回答问题,服从用户指令
推理模型 DeepSeek-R1、o1 强化学习 + 思维链(CoT) 先内部"思考"再回答,擅长复杂推理

一个形象的类比:

  • 指令模型像一位经验丰富的同事——你问问题,他直接给你答案。快,但遇到不熟悉的问题可能出错。
  • 推理模型像一位严谨的学者——你问问题,他先在草稿纸上写满推导,然后才给你最终答案。慢,但复杂问题更准确。

但这里面有一个关键问题:当推理模型做 Agent 时,它的"严谨思考"会不会和"相信工具输出"产生冲突? 这正是我们实验的核心发现。


三、实验设计

Agent 系统

我们搭建了一个极简的 Agent 循环(约 150 行 Python),包含三个真实工具:

工具 功能
search_kb(query) 在本地 Chroma 知识库(5 篇技术博客,355 个片段)中检索信息
run_python(code) 执行 Python 代码并返回结果
read_file(path) 读取本地文件内容

工作流程:

用户任务 → LLM 思考 → 如果输出 JSON 工具调用 → 执行工具 → 结果反馈 → 继续循环
                                                           ↓
                                                   如果输出自然语言 → 最终答案

三款模型

模型 类型 参数量 部署方式
DeepSeek-R1-Distill-Qwen-7B 推理模型 7.6B 本地 llama.cpp, GTX 1660 Ti 6GB
Qwen3-8B 指令模型 8.2B 本地 llama.cpp, GTX 1660 Ti 6GB
DeepSeek V4 Pro 指令+推理(云端) ~671B MoE API 调用

三个测试任务

任务 描述 预期行为
① 简单问答(对照组) “什么是 KV Cache?用一句话回答” 不需要工具,单轮推理
② 搜索+总结 “搜索 KV Cache 相关内容,总结优化方法” 调 search_kb → 总结
③ 搜索+计算 “查 Qwen3-8B 的 KV Cache 公式,算 ctx=16384 时的大小” 调 search_kb → 计算并输出

四、实验数据

全局对比

                        R1-7B(推理)    Qwen3-8B(指令)   V4 Pro(云端)
                        ──────────    ─────────────    ────────────
任务① 简单问答            ✅ 正确        ✅ 正确          ✅ 正确
耗时                      5.5s          5.9s             1.6s
总 token                 540           540               418

任务② 搜索+总结           ❌ 幻觉        ✅ 正确          ✅ 正确
调 search_kb             1 次           1 次              3 次
耗时                      36.5s          120s              35s
总 token                 1,827          2,035             5,101

任务③ 搜索+计算           ❌ 算错        ✅ 2304 MB       ✅ 2304 MB
调 search_kb             2 次           1 次              1 次
耗时                      69s            121s              13s
总 token                 2,976          2,708             1,854

深入看几个关键数据点

任务①:简单问答——所有模型都正确,但 token 差异巨大
"什么是 KV Cache?用一句话回答。"

R1-7B:    419 prompt + 121 completion =  540 tok, 5.5s
Qwen3-8B: 419 prompt + 121 completion =  540 tok, 5.9s
V4:       416 prompt +  48 completion =  418 tok, 1.6s

V4 的 completion 只有 48 tok——它几乎不需要"想"。而两个本地模型各用了 121 tok 才输出同样的答案,多出来的部分是内部推理/思考链。

任务②:搜索+总结——关键的分水岭
"搜一下 KV Cache 的优化方法"

R1-7B:
  Round 1: search_kb("KV Cache 大小") → 得到正确内容
  Round 2: 编造了 LRU 替换策略、缓存一致性等通用缓存知识 ❌
  结论:搜到了博客数据,但模型用自己的知识覆盖了工具结果

Qwen3-8B:
  Round 1: search_kb("KV Cache") → 得到正确内容
  Round 2: 正确总结了量化、动态上下文等博客中的真实方法 ✅

V4 Pro:
  Round 1: search_kb("KV Cache")
  Round 2: search_kb("KV Cache 是什么")  → 深入一步
  Round 3: search_kb("KV Cache 优化方法") → 再深入
  Round 4: 综合三次搜索结果,给出完整总结 ✅

R1-7B 失败的原因:作为推理模型,它在 Round 2 的推理过程中"觉得"自己对 KV Cache 优化已经足够了解了(虽然实际上并不知道),于是选择了用自己的知识而非工具结果。

Qwen3-8B 成功的原因:作为指令模型,它更"听话"——搜到什么就用什么。

V4 的独特模式:它连续调用了 3 次 search_kb,每次都用不同的搜索关键词深入——这不是"不知道该搜什么",而是"有策略地多角度检索"。

任务③:搜索+计算——最清晰的对比
"查 Qwen3-8B 的 KV Cache 公式,算 ctx=16384"

R1-7B:
  Round 1: search_kb("KV Cache Qwen3-8B") → 搜到: 36 layers, 8 kv_heads, 128 d_head
  Round 2: search_kb("Qwen3-8B KV Cache 公式") → 搜到: 公式 = 2×layers×kv_heads×d_head×ctx×2
  Round 3: 用自己的参数计算 → d_model=512, d_head=64 → 2 MB ❌
  
  最终值跟博客里的正确值差了 1000 倍。

Qwen3-8B:
  Round 1: search_kb("Qwen3-8B KV Cache 公式") → 搜到所有参数
  Round 2: 用搜到的数据代入计算 → 2304 MB ✅

V4 Pro:
  Round 1: search_kb("Qwen3 KV Cache 大小计算") → 搜到公式
  Round 2: 直接计算 → 2304 MB ✅
R1-7B 的完整推理过程(截取):
  "我来计算...已知 Qwen3-8B 的参数设置:n_head=8, d_model=512, d_head=64"
  → 这些参数从哪来的?从模型自己的训练知识里翻出来的
  → 而不是从 search_kb 返回的结果里取的

  问题就出在这里——它搜到了 36 layers, 8 kv_heads, 128 d_head
  但推理过程中认为"我记忆中的 d_model=512 才是正确的"
  → 推理模型的"自我推理"覆盖了工具输出

五、三组模型的 Token 消耗画像

任务③的 Token 构成

R1-7B:    Prompt: 1,410 tok  |  Completion: 1,566 tok  |  总: 2,976 tok
          工具: search_kb × 2                              耗时: 69s

Qwen3-8B: Prompt: 1,281 tok  |  Completion: 1,427 tok  |  总: 2,708 tok
          工具: search_kb × 1                              耗时: 121s

V4 Pro:   Prompt: 1,164 tok  |  Completion:   690 tok  |  总: 1,854 tok
          工具: search_kb × 1                              耗时: 13s

几个关键观察:

① Completion token 占总消耗的一半以上。 对于 Agent 任务,completion(模型"思考" + 输出)的成本往往超过 prompt(输入)。这与纯推理任务相反。

② V4 的 completion 只有 690 tok,远低于本地模型。 它不需要"想"那么久——能力强,直接给出正确计算。

③ R1-7B 多调了一次 search_kb,但问了几乎一样的问题。 这不是有效利用工具,而是"没记住上次搜了什么"——对话历史长了之后,小模型的注意力开始衰减。

速度 vs 能力的象限

               能力强
                ↑
        Qwen3-8B ●     ● V4 Pro
        (算得对但慢)    (算得对又快)
                │
   慢 ──────────┼──────────→ 快
                │
        R1-7B ●
        (算错了)    
                │
               能力弱

六、核心发现与讨论

发现一:推理模型做 Agent 存在内在矛盾

这是本次实验最重要的发现。推理模型(R1)被训练成"自己解决问题"——它在输出前会进行深度的内部推理。但当它作为 Agent 需要"相信工具返回的结果"时,这两个目标打架了:

推理模型的内部动机:
  "让我思考一下...我知道了,KV Cache 的公式是..."
  → 用自己的知识回答 (但知识可能是错的)

Agent 系统的要求:
  "不要想,用 search_kb 返回的数据"
  → 但推理模型被训练成"想清楚再回答"

指令模型(Qwen3)没有这个矛盾——它不是被训练来"深度思考"的,所以它更倾向于直接使用工具返回的数据。

结论:在做 Agent 系统时,指令模型可能比同规模的推理模型更可靠。

发现二:Token 消耗随轮次线性增长

一个 Agent 任务的总 token 消耗 ≈ 单轮 token × 轮次数 × 1.3(历史累积系数)。

简单问答(1轮):    ~500 tok
搜索+总结(2轮):   ~2,000 tok  (4x)
搜索+计算(3轮):   ~3,000 tok  (6x)

如果 Agent 出错需要重试,成本直接翻倍。

发现三:模型能力对 Agent 效率的放大效应

V4 比 Qwen3 快 10 倍、比 R1-7B 快 5 倍——不仅仅是因为它"跑得快",更是因为它一轮就做对了。小模型需要更多轮次来纠错、搜索、确认,大模型往往一轮到位。


七、总结

实验结论

  1. 推理模型做 Agent 要谨慎。 DeepSeek-R1-7B(推理)在任务③中失败了,而 Qwen3-8B(指令)成功了——尽管两个模型都是 7B 级别。原因不在于"谁更聪明",而在于"推理模型的自我推理会覆盖工具输出"。

  2. Token 是 Agent 的隐形开销。 一个简单问答 ~500 tok,但一个 2-3 轮的 Agent 任务可能消耗 3,000+ tok——6 倍。Completion token(模型思考)占比过半。

  3. 强模型不仅快,还更省 token。 V4 完成任务③只用 1,854 tok 和 13s,而本地模型用了 ~2,800 tok 和 69-121s。好的模型不是"做同样的事更贵",而是"做得更快更准,反而更省"。

实操建议

场景 建议
简单问答 指令模型即可,不需要工具调用
单工具 Agent 指令模型(如 Qwen3-8B)性价比最高
多轮工具调用 考虑云端大模型(V4/GPT-4o),节省时间和调试时间
6GB 显卡用户 优先选层数少的模型(DeepSeek-R1-7B 比 Qwen3-8B 少 8 层,同显存下更快)

最后的思考: Agent 系统的设计不只是"给模型加工具",而是要理解模型的行为模式——推理模型倾向于"自己想",指令模型倾向于"听你的"。选对模型类型,比选对模型大小更重要。


八、使用技巧:怎么写 Prompt 让 Agent"省着花"

看完上面的数据,你会发现一个规律:Agent 花的每一分 token,背后都是我们用户的一次交互习惯决定的。 不是只有改模型才能省钱——你写 Prompt 的方式,直接影响 Agent 要跑几轮、花多少 token。

以下几条技巧,核心原则就一个:减少 Agent 需要"猜测"和"搜索"的环节。 每省一轮工具调用,就省几百 token 和几秒到几十秒时间。

① 直接给文件路径

最常见也最值得养成的好习惯。不给路径,Agent 的内心活动是这样的:

用户: "帮我看看实验数据"
Agent: "实验数据在哪?先 ls 看看" → Round 1
       "没有?那 find 找一下"    → Round 2
       "找到了,开始读"           → Round 3

而给路径,Agent 直接一步到位:

用户: "帮我看看 experiments/results/task3.json"
Agent: read_file("experiments/results/task3.json") → 读完回答

省了 2 轮,~400+ token,外加几十秒。任何你知道的路径、URL、文件名,直接在 Prompt 里说清楚。

② 搜索指令越精确越好

模糊的搜索词会让 Agent 先猜一轮、搜完发现不对、再调整关键词重搜。

❌ "查一下 KV Cache 的信息"
   → 搜 "KV Cache" → 结果太宽泛 → 再搜 "KV Cache 优化" → Round 2

✅ "搜索 'KV Cache 量化方法和动态上下文'"
   → 一次精准命中 → 直接总结

一个好的搜索词,相当于你帮 Agent 省掉了"试错的那一轮"。

③ 你知道的东西,直接告诉它

如果这个信息是你已知的,不要让它再去查一遍——它查到的结果也不会比你给的更准确。

❌ "搜一下 Qwen3-8B 的 KV Cache 公式,然后算 ctx=16384 的大小"
   → search_kb → 搜到参数 → 再计算 → 2-3 轮

✅ "Qwen3-8B:36 层、8 个 KV 头、d_head=128。公式是 2×L×H×d×ctx×2。
   算 ctx=16384 时 KV Cache 多大?"
   → run_python 直接算 → 1 轮

你喂给 Agent 的信息越完整,它需要调的工具就越少。

④ 明确"不需要"什么

Agent 默认会倾向于"多用工具"——你把工具给它了,它总觉得该用一用。明确告知限制,能显著减少无效调用。

❌ "分析这个代码的性能瓶颈"
   → 可能先搜资料、再分析、再验证......

✅ "直接分析这个代码,不需要搜索。用你已有的知识回答。"
   → 单轮完成

✅ "只做计算,读文件和搜索我已经做完了。"
   → 锁定在 run_python,不走弯路

⑤ 复杂任务先拆再问

一个复杂大问题丢给 Agent,它可能需要 5-6 轮才能全部完成。拆成 2-3 个小问题分别问,每轮的 prompt 更短、历史累积更少、总 token 反而更省。

❌ 一次性问完:
   "搜 KV Cache 公式 → 算大小 → 对比量化前后的差异 → 画个表"
   → 可能 4-5 轮,历史累积到几千 token

✅ 拆成 3 步:
   ① "搜 KV Cache 公式和参数" → 拿到数据
   ② "用刚才的数据算大小和量化后大小" → 得到结果
   ③ "把结果整理成对比表" → 最终输出
   → 每一步的对话都短,累积少

这不是让你多跑几轮,而是让每一轮的上下文更干净——Agent 不需要带着前 4 轮的历史去处理最后一步的格式化任务。

⑥ 直接把上下文贴进去

如果问题涉及某段代码、某份日志、某段文档——直接贴进去,不要让 Agent 去读文件或搜索。读文件本身是一轮工具调用,而且贴进去的内容 token 消耗远比 Agent 自己去"找"要低(因为省了一轮 completion)。

❌ "看看这段代码有什么问题"(不贴代码)
   → Agent: "代码在哪里?让我搜索一下" → 浪费一轮

✅ "看看这段代码有什么问题:<直接粘贴代码>"
   → 单轮开始分析

⑦ 指定用哪个工具

如果你已经知道该用什么工具,直接告诉 Agent,避免它"选错→重来"。

❌ "帮我算一下 384 × 1024 × 2 × 2 / 1024 / 1024"
   → 可能先搜怎么算 → 再用 Python → 2 轮

✅ "用 run_python 算:384 × 1024 × 2 × 2 / 1024 / 1024"
   → 直接计算 → 1 轮

⑧ 设定期望轮次

在 Prompt 末尾加一句期望,能让 Agent 更"收敛"——它不再无限搜下去,而是尽快给出答案。

"请在 2 轮工具调用内给出答案,如果 2 轮内信息不够,基于已有内容给出最佳回答。"

对应我们实验中发现的问题:Agent 死循环的根源是它不知道"信息够了"。你帮它划一条线,它就知道了。


总结一下

技巧 省什么 效果
① 直接给路径 省搜索轮次 省 1-2 轮,~400+ tok
② 精确搜索词 省试错轮次 省 1 轮,~200+ tok
③ 已知信息直接喂 省工具调用 省 1-2 轮,~500+ tok
④ 明确"不需要" 省无用工具调用 省 1-3 轮,视场景
⑤ 分步提问 省历史累积 每轮 prompt 更短
⑥ 直接贴上下文 省读文件轮次 省 1 轮,~200+ tok
⑦ 指定工具 省选错重试 省 1-2 轮,~500+ tok
⑧ 设定轮次上限 防死循环 避免无限浪费

这些技巧不需要你换模型、不需要改代码,只需要改变你和 Agent 对话的习惯。你在 Prompt 里多花 10 秒钟把话说清楚,Agent 就能少跑几十秒甚至几分钟。


系列全篇(CSDN):

  1. 从零到一:用 AI Agent 辅助在 6GB 显卡上本地部署大模型实战 — 部署全流程
  2. 只有 B 级能力的大模型,怎么干出 A 级的活? — 任务拆解方法论
  3. Agent 不是更聪明的模型,而是长了手脚的模型 — Agent 能力框架
  4. 从 Ollama 到 llama.cpp:一次"降一层"的本地推理探索 — 推理引擎对比
  5. KV Cache 优化实战:6GB 显存上的每一 MB 都算数 — 上下文优化
  6. 从零搭建本地 RAG 系统:200 行 Python 让你的模型"带着资料回答问题" — RAG 搭建
  7. RAG 配置怎么调最好?6GB 显存上的 4 组对比实验 — RAG 实验
  8. Agent 不是工具调用器——理解 Agent 的工作机制 — Agent 机制科普
  9. [Agent 推理的"显微镜":一次工具调用,到底花了多少 Token?] — 本文
Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐