「Qwen3, Token, Agent」分析 added_tokens, 如主板上的卡槽,预留大模型新功能空间。 昨天Qwen3发布,最亮眼的是,原生支持agentic tool call以及MCP。这篇分析,主要从tool call入手,了解大模型中added_tokens的作用和意义。 每当大模型发布,我都会打开它的tokenizer.json去看added_tokens。 added_tokens的意义在于,在LLM的vacabulary中添加特殊token,我自己称之为 “协议token”,这部分token不会被BPE分词,会完成输出,目的就是规则性地提示大模型此处要进行特别的功能,比如tool call和thinking。 当我们打开Qwen3的tokenizer.json, 会很看十几个added_tokens,我把它们总结如下,并加上我对他们功能的理解和猜想: 普通会话类: <|endoftext|> <|im_start|> <|im_end|> :会话边界 Tool call,Agent类: <tool_call> / </tool_call> : 函数执行JSON <tool_response> / </tool_response>:工具执行结果 <think> / </think>: 思考 短评: [像不像Paper: ReCall? 参考我前一篇分享] 多模态类: <|vision_start|End>: 预留视觉空间 <|image_pad|>:预留图片空间 <|video_pad|>: 预留视频空间 短评:Qwen3只支持文本,但未来一定会多模态! 代码和RAG类: <|fim_prefix|>: 代码类 <|repo_name|>:代码repo <|file_sep|>:大文件 比喻的来说,这些added_token就像是计算机主板的卡槽,为新的功能,新的性能,提前预留空间。 比如tool call,agent类,Qwen3已经支持,那就说明这个卡槽被利用,如何实现的,就是training recipe (SFT+RL),具体的可以参考我分享的ReCall, ReSearch, ReTool, APR, PASTA等文章。 那Qwen3是如何支持MCP的呢? 一个完整例子 用户问题:When will the ISS fly over Stockholm next, and could you add a calendar reminder for me? 在mcp server中定义了两个tool来追踪国际空间站: def get_next_iss_pass(city: str) -> dict: def add_calendar_event(title: str, datetime_utc: str) -> str Jinja template会直接把用户的问题结合added_token,render给大模型: <|im_start|>user When will the ISS fly over Stockholm next, and could you add a calendar reminder for me? <|im_end|> <|im_start|>assistant <think>I need an orbital pass → then a calendar entry.</think> <tool_call>{"name":"get_next_iss_pass","arguments":{"city":"Stockholm"}} </tool_call> <|im_end|> 工具get_next_iss_pass的返回结果,直接给mcp host side, <tool_response>{"datetime_utc":"2025-04-30T19:12:00Z"}</tool_response> <|im_end|> 然后继续触发下一个tool call。 喜欢钻研的朋友,会发现其实DeepSeek R1也有类似的add_token, "<|tool▁calls▁begin|>", 但它不支持mcp,因为它只是预留了,并没有在实际训练中让LLM跟mcp互动。 希望看完这篇分享的你,明白了added_token是什么,你也许也更加深刻地理解了我之前分享的一系列“协议token”的文章,ReCall, ReSearch, ReTool, APR, PASTA.
读书笔记:当 LLM 成为 Agent——从自然语言到“协议语言”的演化 这两周选了四篇极其出色的文章做了分享,ReSearch, ReTool, APR 和 PASTA。 它们虽然解决的具体问题不相同,但 general 的目标都一致,即让LLM知道 when and how 做决策,这就是agent的核心,要做精准的决策。 而这种精准与人类语言的模糊性不一致,但 LLM 的 token 与人类的语言一致性更强,所以 LLM 的输出具有一定的模糊性,作为 Agent , 在做上述精准决策的时候就会出现问题。 于是四篇文章的方法在思想上完全一致,即在自然语言中,插入“协议 token”,让自然语言更有结构化,更偏近机器语言。 PASTA, 引入 <<promise>> <<async>> <<sync>>, 来完成精准的切换异步/同步解码。 APR,引入spawn() / join(), 来决策何时并行/收束多推理线程。 ReSearch, <think> <search> <result> , 来决策何时搜索、何时用结果。 ReTool, 引入<code> <interpreter>, 来决策何时执行代码解释器。 这些“协议 token”,并不存在于人类的自然语言中,但却跟机器语言息息相关。 它们都用显式标记把“语言”切片成更像API 调用或并发原语的片段,让模型能在生成阶段“自编写脚本”,再由调度器或工具链执行。 人类语言 vs. 机器语言: 人类语言:高容错、重语义、含糊其辞,适合表达不确定性与情感。 机器语言:零歧义、结构化、强约束,适合编排确定性任务。 当 LLM 既要与人类沟通又要驱动工具,它必须在两种范式间切换。于是“协议语言(Protocol Language)”就必然出现了:在自然语言流中嵌入可解析的指令标记,既让人类读得懂,又让机器能精准执行。 一些展望: 未来的一段时间,类似的在自然语言中插入“协议 token”的工作一定会越来越多。 未来的“协议 token”可能携带类型、权限、资源预算等元数据,让决策粒度从 When 进一步细化到用多少 computing resource 。 目前的“协议 token”还基本停留在,一套协议解决一个问题的阶段。如果LLM的generalization继续演化,可以会出现一套协议多个问题,或者多套协议多个问题的形态。 当 LLM 从Chatbot演化为Agent,语言的角色正在从沟通媒介变成执行协议。但自然语言不会被淘汰,而是被包裹进更精确、更可组合的结构化符号中——让instruct与action在同一个文本流里无缝衔接。
「Agent, RAG, Reasoning」论文 ReSearch: Learning to Reason with Search for LLMs via Reinforcement Learning ReSearch,充满了 ReAct 的影子。它教会模型“何时求助于世界”;但局限在于,ReSearch 只能依赖一种工具。 作者提出了一种创新的框架,名为 ReSearch,旨在通过强化学习(RL)训练 LLM 在推理过程中有效地反复利用 search API 完成任务。 从任务形式上,它解决的是增强LLM+ RAG的问题,但并不同于基于 embedding 的单轮相似度检索方法。 它关注的是多次 query、反复调用 search API 来完成信息查询任务。 并不同于基于embedding去单次算相似度的方法,它解决的是多次query,反复调用search API完成外部信息查询的问题。 而反复调用 API,涉及推理能力去决策调用的时机,以及生成调用的参数 —— 这是一个典型的 agent + function calling 场景。 ReSearch目标将这种search的reasoning能力通过RL学到。 具体来说,ReSearch 采用了专门为搜索功能设计的训练模版: <think>...</think>:表示模型的思考过程; <search>...</search>:表示模型发起的搜索查询; <result>...</result>:表示搜索引擎返回的结果; <answer>...</answer>:表示模型给出的最终答案。 特别地,ReSearch 的奖励函数不是仅仅基于答案对错,而是采用 rule-based 的组合机制:基于答案的 F1 相似度 + 输出格式是否符合模板,以此优化 policy,微调语言模型参数。 此时不免再次提及 ReAct:ReSearch 充满了 ReAct 的循环影子——: Reasoning:模型的思考过程; Action:模型发起的调用; Observation:工具返回的反馈。 ReAct 是神作,它以 verbal reasoning (人话)的方式,将原本充满数学公式的 RL 概念转化为语言链式推理,让 LLM 学会如何使用工具,优雅而简洁。 一些思考: ReSearch 以及前几天分享的 ReTool 是非常类似的工作,它们都通过强化学习微调,将使用工具的能力内化于语言模型中,增强工具调用的鲁棒性。 但它们的局限性也非常明显:ReSearch 和 ReTool 都只支持一种工具 —— search API 和 code interpreter。 而 ReAct,通过 Prompt Engineering,就可以灵活调用多个外部工具。 ReSearch 和 ReTool 的 RL 框架是为“单工具、二选一调度”设计的。如果强行扩展为多工具,训练信号将更加稀疏、credit assignment 更加困难,其策略网络、reward assignment、以及 rollout 表达能力都需要重新设计。 我们距离真正原生具备多轮、多工具能力的通用 Agent,还有一段距离。
「codex, ACI, Agent」论文 SWE-agent: Agent-Computer Interfaces Enable Automated Software Engineering 从 Human‑Computer Interaction (HCI) 到 Agent‑Computer Interaction (ACI) —— AI IDE 的基石与框架 今天 OpenAI 开源了 Codex CLI。这正是 NeurIPS 2024 论文 SWE‑agent 中提出的精彩概念 Agent‑Computer Interface(ACI) 的一次产品级实践。 SWE‑agent = ReAct + CLI 原生 = ACI 1. ReAct:Thought → Action → Observation 在运行 Codex CLI 时,你会清晰看到经典的 ReAct 循环: 这一流程与 SWE‑agent 在论文中描述完全一致: “At each step, SWE‑agent generates a thought and a command, then incorporates the feedback from the command’s execution in the environment (ReAct).” 2. CLI 原生:让 Linux CLI 成为Agent的工具 Codex CLI 构建在 Linux shell 之上,必要时会直接调CLI(如 sed, grep, pytest)完成代码检查与测试,对应论文中的另一句: “Built atop the Linux shell, SWE‑agent also allows access to common Linux commands and utilities when needed.” 3. 从思想上,SWE-agent提出了精彩的新概念,ACI。 LLM在编程场景中就像“新型用户”,需要专门为其量身定制的人机交互层——ACI。与HCI的不同之处在于: HCI 面向人类直觉,ACI 面向Agent推理; HCI用GUI追求“让人觉得好用”,ACI追求“让Agent更容易reasoning、有更简洁精确的context, 指令和工具”。 ACI的特点是: 精简指令集合 把嘈杂的Linux CLI抽象成少量高杠杆动作,降低回合数与成本。 反馈充分且简洁 固定格式 + 必要元数据,避免上下文膨胀。 内置护栏 语法 lint、无效编辑回滚,阻断错误连锁。 值得一提的是,codex是纯CLI系统,是ACI的纯粹实践。 其他如cursor,Windsurf或者是devin,是HCI和ACI的结合。 但只从agent的角度来说,理解ACI才能更加当我们vibe coding的时候,到底是怎么回事。
「LLM, Reasoning」论文: (How) Do reasoning models reason? “真正的智能,是让模型在生成时就做出正确选择,而不是事后去验证哪个选项是对的。” 作者Subbarao Kambhampati,我不完全同意他,但我很喜欢他。2024年ACL Keynote,他批评当前对 Chain of Thought 的信仰如同宗教。——我们喜欢看到推理的样子,但并未真正验证推理的实质。 这篇论文,简直就是把当前 LLM 推理潮流一锅端,按住OpenAI o1 和 DeepSeek R1 提出了两个灵魂拷问: 1: Large Reasoning Model 是在推理还是在检索? 作者认为,LRM 并非真正“推理”,它们的行为更像经过训练强化的“近似检索”系统。 所谓“推理”,往往只是模型通过被筛选过的训练样本“生成看起来像推理的输出”。 如果模型生成的候选解中压根就没有一个是对的,也就无法进行强化训练。 这意味着 LRM 的“推理”质量依赖于它是否能撞上一个正确答案。 2: Chain of Thought 是否跟“思考相关”? 作者认为,CoT,(如step-by-step 的文字、公式、甚至“wait...”、“aha moment”这类表述)并不能证明模型真的在“思考”,它们很可能只是模仿人类风格的产物——大型模仿模型(Large Mumbling Models, LMMs)。😂 例如,CoT可以胡说八道但仍“撞对”答案, 模型通过 RL 训练输出的CoT只要能让最终答案更准确,哪怕是乱码也无所吊谓。 最后,此片论文同样是对test time scaling的犀利审视,test time scaling本质是把原本在“测试时”才能验证的东西,提前“编译”进了模型的生成过程中。 换句话说,模型不是学会了推理,而是学会了如何在多次尝试中更容易猜对答案。这跟真正的智能背道而驰。 按照作者的思路,当下post training的套路如下: - 测试阶段:拼命尝试多个答案 - 筛选阶段:用外部验证器选出对的那个 - 训练阶段:把这套套路“硬塞回生成器”,形成“像在思考的样子” 所以它不是真的学会了推理,而是学会了:如何让自己看起来像在推理,并增加猜中率。 Intelligence is the ability to shift the test part of generate-and-test into the generate part. inspriing!