injection 策略:inject 注入 vs toolize 工具化 本节摘要:这是第 8 章的核心节,也是全书最精巧的设计之一。injection(第 4 步)要把记忆塞进请求,但不是所有记忆都用同一种方式——系统区分两种策略:稳定的 L2/L3/Skill/工具指南走 inject(拼进 system prompt,命中 KV cache),易变的 L0/L1 走 toolize(作为只读工具按需调用,避免 cache 失效)。这种区分是对「KV cache」这一 LLM 性能关键特性的精细优化。本节讲清两种策略的适用内容、性能权衡,以及为什么这个区分能让记忆「既丰富又快」。 一、为什么要分两种策略:KV cache 的约束 先理解一个 LLM 性能关键——KV cache。
本节摘要:这是第 8 章的核心节,也是全书最精巧的设计之一。injection(第 4 步)要把记忆塞进请求,但不是所有记忆都用同一种方式——系统区分两种策略:稳定的 L2/L3/Skill/工具指南走 inject(拼进 system prompt,命中 KV cache),易变的 L0/L1 走 toolize(作为只读工具按需调用,避免 cache 失效)。这种区分是对「KV cache」这一 LLM 性能关键特性的精细优化。本节讲清两种策略的适用内容、性能权衡,以及为什么这个区分能让记忆「既丰富又快」。
先理解一个 LLM 性能关键——KV cache。当 system prompt 不变时,LLM 能复用之前算的 KV cache,推理快;一旦 system prompt 变了,cache 失效,要重算,推理慢:
KV cache 的影响 system prompt 不变 → cache 命中 → 推理快 system prompt 变了 → cache 失效 → 推理慢(要重算 prompt) → 频繁变的内容若进 system prompt,每轮都让 cache 失效 → 慢
记忆内容恰好分两类:一类是「稳定的」(persona、团队约定),几乎不变;一类是「易变的」(L0 最新对话、L1 新抽事实),每轮都可能变。如果都塞进 system prompt,易变部分会让 cache 频繁失效——这就是 injection 要分两种策略的根因。
关键概念:inject vs toolize 的区分,本质是对 KV cache 的优化。稳定内容进 system prompt 享受 cache,易变内容作为工具按需调用不干扰 cache。这是「让记忆既丰富又快」的精细工程设计。
inject 策略适用于「稳定、每次都要」的记忆,把它们拼进 system prompt:
inject 策略 适用:L2 场景、L3 persona、Skill、工具使用指南 特点:稳定(不每轮变)、每次都要 做法:拼进 system prompt "你是助手... [L3 persona: 用户是资深后端,重可读性] [L2 场景: 当前在鉴权模块,有这些约束] [Skill: 排障步骤] [工具指南: 可用 wiki_search 等工具]" → 这些内容稳定,命中 KV cache,推理快
| inject 的内容 | 为什么适合 |
|---|---|
| L3 persona | 长期稳定,不变 |
| L2 场景块 | 项目周期内稳定 |
| Skill | 可执行流程,版本稳定 |
| 工具使用指南 | 工具列表不常变 |
inject 的核心收益:这些内容「常驻」system prompt,LLM 每轮都能看到,且因为稳定所以命中 cache——既保证了「Agent 时刻带着这些记忆」,又不拖慢推理。
toolize 策略适用于「易变、量大」的记忆,把它们作为「只读工具」暴露,Agent 需要时才调用:
toolize 策略 适用:L0 最新对话、L1 新抽事实、Wiki、CodeGraph 特点:易变(每轮可能变)、量大 做法:作为只读工具暴露(不进 system prompt) Agent 看到工具:recall_recent_memory、wiki_search、code_impact 需要时才 call 取回片段 → 不进 system prompt,不干扰 cache → 每轮只在「需要时」取一小片
| toolize 的内容 | 为什么适合 |
|---|---|
| L0 最新对话 | 每轮都变,进 prompt 会频繁失效 cache |
| L1 新事实 | 随抽取更新,易变 |
| Wiki | 量大,整库进 prompt 装不下 |
| CodeGraph | 同上,量大 |
toolize 的核心收益:易变内容不占 system prompt,既不让 cache 失效,又能让 Agent 按需取用——这是「知识无限、占用可控」的实现(第 7 章讲的 /v3/tools 机制)。
把两种策略对照看,分工的逻辑更清晰:
| 维度 | inject | toolize |
|---|---|---|
| 进 system prompt? | 是 | 否(作为工具) |
| 适用内容 | 稳定(L2/L3/Skill) | 易变/量大(L0/L1/Wiki/CG) |
| cache 影响 | 命中(稳定) | 不干扰(不进 prompt) |
| Agent 看到方式 | 每轮都在 | 需 call 才有 |
| 占上下文 | 常驻 | 按需 |
injection 的分流(一次请求) 召回的记忆(经装配过滤+检索+预算) ├─ 稳定部分 → inject 进 system prompt └─ 易变部分 → toolize 暴露为工具 → 同一次请求,两种策略并用,各取所长
💡 技巧:配 Loadout 时(第 5 章),「使用方式」字段(inject/toolize)的选择就基于这个区分。判断标准很简单:这条记忆「稳定且每次都要」吗?是 → inject;「易变或量大」吗?是 → toolize。比如团队约定 Skill 每次 inject,项目 CodeGraph 量大 toolize。
inject/toolize 的区分之所以精巧,在于它同时满足了三个看似矛盾的需求:
三个矛盾的 demands ① 记忆要丰富(多种内容都要带) ② 推理要快(cache 要命中) ③ 上下文有限(不能全塞) 单一策略无法同时满足: 全 inject → 违反 ③(撑爆)且易变内容违反 ②(cache 失效) 全 toolize → 违反 ①(稳定内容每次 call 慢) inject/toolize 分流: 稳定的 inject 满足 ①②(丰富+cache) 易变的 toolize 满足 ③(按需,不撑) → 三者兼顾
这种「按内容特性分流策略」的设计,是工程上「精细化优化」的典范——不是一刀切,而是识别不同内容的特性,用最适合的方式处理。这也是为什么 inject/toolize 被称为全书「最精巧的一笔」之一。
⚠️ 注意:toolize 不是「免费」——每次 call 是一次工具调用,有延迟。所以「该 inject 的别 toolize」(如团队约定,inject 进 prompt 比每轮 call 快)。反之「该 toolize 的别 inject」(如 CodeGraph,inject 会撑爆 prompt)。错误的选择会让 Agent 变慢或上下文爆炸,第 9 章 SDK 会讲同样的权衡。
核心的 injection 讲完了,下一节看执行与收尾段——rateLimit + forward + extract,限流、转发与对话回写。