deepanalyze — 本课题摘录
读了哪几篇: 01-agentic-loop(五标签循环)、02-protocol-and-template(协议与模板)。
其余几篇本轮没读。
这一家是"怎么告诉模型有哪些工具"这一问的另一个极端:根本不告诉,训进去。
它对本课题回答了什么
决定二的极端答案:协议不在提示词里,在权重里
五个控制标签不是普通字符串,而是被加进分词器词表的特殊 token,训练前先注入基座模型。
(依据: shelf=agent/deepanalyze#02-protocol-and-template @0b54741848df 事实=/
它给的三条理由和一条代价:
说的是 输出稳定 标签是一个原子 token,模型不会写成带空格的变体、不会漏闭合,外层正则才敢写得这么简单 外层极薄 不需要在提示词里塞工具说明和示例 代价是绑死 协议和模型一体,换基座、加新标签都得重训
本课题第二个决定("怎么认出模型要调工具")到这里已经有六种答案:
原生工具调用 → 自定义标签 → 让模型写代码 → 结构化输出模拟 → 代码围栏 → 训进权重。
deepanalyze 这一种可靠性最高、灵活性最低。
它自己也说了这是"用通用性换可靠性"的赌注,只有"循环固定、就是写代码-执行"这种场景才划算。
一个训练上的巧思:新标签用基座已有的"思考"标签的嵌入来初始化,让新 token 一上来就站在已有能力的肩膀上。
拆解文档在这里很诚实地标了一句:这个意图写在注释里,实际拷贝嵌入的代码在本文件 里看不到。
这种"意图与实现对不上"的标注方式值得我们的讲义学。
决定二/四:用停止词当"停车标志"
关键技巧:让模型生成到收尾标签就强制停下。
这样外层拿到的是一句干净的"半句话"——前面是想法加代码,正好可以抽出代码去执行,而不会让模型自己幻想出一段假的执行结果。
(依据: shelf=agent/deepanalyze#01-agentic-loop @0b54741848df 事实=请求时设 stop=[""],模型写完代码收尾标签生成立刻中断,外层补回标签后抽代码执行;不这么做模型会自己幻想出一段 "不给模型幻想结果的机会"这条是所有自定义格式方案的必修课。 模型很乐意一口气把"执行结果"也编出来。
原生工具调用天然没有这个问题(厂商会在工具调用处停);自己发明格式就必须自己设停止词。
循环骨架极薄:
for 最多 30 轮:
调模型(停在代码收尾标签)
截断了就把标签补回去
出现「答案」标签 → 收工
抽不出代码 → 原样追加,让它下一轮再写
抽出代码 → 真跑 → 把真结果包成「执行」块拼回去
"抽不出代码就让它下一轮再写"这个分支值得注意: 模型只想了没写代码,不算错,也不算完成——就是再转一圈。
决定一:提示词薄到反常
拼出来的最终消息只有两段:
# 指令
<用户原话>
# 数据
文件 1: {"name": "person.csv", "size": "10.6KB"}
文件 2: {"name": "enrolled.csv", "size": "20.4KB"}
没有系统提示、没有工具清单、没有"你是一个数据分析师"的人设。 (依据:Agent 库 · DeepAnalyze · 协议在权重里 + 极薄 prompt 模板 —— prepare_vllm_messages 拼出的最终用户消息只有 # Instruction 与 # Data 两段,没有 system prompt、没有工具列表、没有人设;# Data 段的数据缩略图每个文件只记 name 与 size,不读内容)
"只给文件名和大小,不读内容"是刻意的:逼模型自己写代码去探索。
它给的理由一针见血:如果把内容塞进提示词,模型就退化成"一次性看完直接答",不再是 agent。
这句话对本课题很重要。 我们讨论"一轮的输入怎么拼"时,默认倾向是"尽量多给"。 deepanalyze 提醒了反面:给多了,它就不动手了。
一般化:输入里该放的是"去哪儿找",不是"找到了什么"。
决定三:工具结果用了一个非标准的消息角色
回灌执行结果时用的角色是"execute",不是常见的三种角色之一。
这要求模型的对话模板认识这个角色——协议焊进权重的又一个体现:这个角色和五个标签是配套训练出来的,换别的模型直接喂会渲染错。
本课题第三个决定("结果怎么回填")的角色选项到这里有三种:
- 专门的工具结果角色(主流);
- 伪装成用户消息(agenticseek,理由是兼容最简接口);
- 自定义角色(deepanalyze,理由是配套训练)。
前两种我们能用,第三种要自己训模型才谈得上。
它没回答什么
- 历史怎么压——三十轮的代码和结果全在,这一篇没讲怎么控制长度。
- 并发——它一轮只跑一段代码。
- 多工具——它只有一个"跑代码",不需要工具选择。
坑与代价
- 绑死基座。 换模型就得重训,这是最大的一笔代价,它自己也承认。
- 三十轮上限是唯一的护栏。 没有连错熔断、没有打转检测。
- 只有一个工具(跑代码),所以它绕开了本课题很多问题(工具怎么选、参数怎么给、一批工具怎么并发)。
判断(无锚): "让模型写代码"这条路会把工具选择问题变成库导入问题——表面简单了,实际是把复杂度挪进了沙箱。 如果错,会错在: 如果沙箱环境是固定且预装好的(它就是数据分析场景),那这确实是净简化,不是挪。
- 拆解文档指出 RL 版里一个闭标签写成了开标签的笔误,但因为判定只看另外两对标签是否成对,不一定影响训练。
这类"自定义格式的笔误不会立刻报错"正是本课题要警惕的:格式是自己发明的,就没有人替你校验。