Skip to content

Blog

CEO 名言

对于领导者有很多种描绘。有一种是,他们一走进房间,好像空气都要凝固了,每个人都怕他们。突然之间,每个员工开始迎合老板的喜好,而不是客户的真正需求。这是世界上最糟糕的老板。@蔡崇信

面向 AI 智能体的有效上下文工程

要构建有效、可靠的 AI 智能体(Agent),关键在于将“上下文”(Context)视为一种有限且宝贵的资源,并对其进行精心的管理和优化。

1. 从“提示工程”到“上下文工程”的演进
Section titled “1. 从“提示工程”到“上下文工程”的演进”
  • 提示工程:主要关注如何编写和组织 LLM 的指令(尤其是系统提示)以获得最佳单次输出。
  • 上下文工程:是一个更宏观的概念,它关注在 LLM 的整个运行周期中,如何管理和维护进入其“上下文窗口”的所有信息,包括系统提示、工具、外部数据、历史对话等。这是一个持续、迭代的优化过程。
  • LLM 和人类一样,拥有有限的 “注意力预算” (attention budget)。
  • 当上下文窗口中的信息(tokens)过多时,模型的性能会下降,出现 “上下文衰减”(context rot) 现象,即模型难以准确回忆或利用其中的信息。
  • 因此,必须精心筛选进入上下文的信息,目标是:用最少、最高效的信息(high-signal tokens)来最大化达成预期结果的可能性。
  • 原则:在任何时刻,放入“最小但高信号”的 token 集合,以最大化达成目标的概率。
  • 系统提示:把握“合适高度”——足够具体以引导行为,不要用脆弱的硬编码逻辑;结构化分区(背景、指令、工具指引、输出格式);先最小可行,再基于失效模式增补。
  • 工具设计:少而精、边界清晰、参数明确、返回信息token高效;避免功能重叠与选择歧义。
  • 示例选择:少量、多样、典型的 few-shot 胜过塞满规则与边角案例;示例即高效“行为图片”。
  • 文章倡导从“预先加载所有信息”转向 “即时”(just-in-time) 的上下文检索策略。
  • 智能体不应一次性将所有可能相关的数据都加载到上下文中,而是应该利用工具(如文件系统、数据库查询)在需要时动态地、自主地检索信息。
  • 这种方法模仿了人类的认知方式(我们不会记住所有事,而是知道去哪里查找),可以实现 “渐进式信息披露”,让智能体更专注、更高效。在实践中,将预加载与即时检索相结合的 混合策略 通常效果最佳。

对于超出单个上下文窗口容量的复杂、长期任务,文章提出了三种关键技术:

  1. 压缩(Compaction)

    • 做法:在对话历史接近上下文窗口极限时,让模型对其进行总结和压缩,然后用这个精简的摘要开启一个新的对话窗口。
    • 目的:在保留核心信息(如决策、未解决的问题)的同时,丢弃冗余内容,从而实现任务的连贯性。
  2. 结构化笔记/记忆(Structured Note-taking / Agentic Memory)

    • 做法:让智能体在执行任务时,定期将关键信息、待办事项、进度等写入一个外部“记忆体”(如一个NOTES.md文件),并在需要时读取。
    • 目的:为智能体提供持久化记忆,使其能够在多次上下文重置后依然保持对任务的长期追踪和规划能力。
  3. 子代理架构(Sub-agent Architectures)

    • 做法:将一个复杂任务分解,由一个主代理负责宏观规划和协调,并将具体的、深入的子任务分配给多个专门的子代理去完成。每个子代理在自己的独立上下文中工作,完成后仅向主代理返回一个精炼的总结。
    • 目的:实现“关注点分离”,避免主代理的上下文被海量细节淹没,从而高效处理复杂的研究和分析任务。

孩子接受什么样的教育,才不会被 AI 取代?

具备持续学习、快速适应、坚韧成长、洞察人性、全球协作的能力,将是未来无法被 AI 取代的关键。

  1. 学习能力: 不仅是掌握知识,更是掌握学习的方法。培养批判性思维、问题解决能力与自主学习的习惯,使孩子能够在信息快速更迭的时代持续成长、不断进化。

  2. 适应能力: 面对快速变化的技术、行业与社会环境,能够灵活调整思维与行为。包括拥抱新技术、应对不确定性,以及在新环境中迅速找到定位的能力。

  3. 韧性: 具备从失败中恢复并持续前行的心理素质。不仅能承受压力和挑战,更能将挫折转化为成长的机会,长期保持积极的心态和动力。

  4. 理解人们的需求: 培养共情力与洞察力,真正理解他人问题与期望。这不仅是创造有价值产品与服务的基础,更是未来人机共存时代中,体现人类不可替代价值的关键。

  5. 与世界互动: 具备全球视野与跨文化沟通能力,能够有效与不同背景的人协作。同时,理解社会、技术与伦理之间的关系,积极参与构建负责任与可持续的未来。

Claude 的记忆功能:不同的产品哲学

Claude 和 ChatGPT 这两大顶尖 AI 助手,在“记忆”功能的实现上采取了完全相反的两种策略。这种差异深刻地反映了它们各自的产品定位、目标用户群体和设计哲学。

Claude 的记忆系统:显式、可控的工具
Section titled “Claude 的记忆系统:显式、可控的工具”

Claude 的记忆功能被设计成一个由用户主动调用的工具,而非一个持续运行的后台服务。其主要特点是:

  1. 从零开始 (Blank Slate):每次对话都始于一个空白状态,不会预先加载任何用户画像或历史记录。
  2. 用户主动触发 (Explicit Invocation):记忆功能只有在用户使用“我们上次聊了什么?”等明确指令时才会被激活。
  3. 基于原始对话的搜索 (Raw History Search):它不会创建 AI 生成的用户摘要或压缩档案,而是通过实时搜索用户的原始聊天记录来回忆信息。
  4. 两大搜索工具
    • conversation_search:根据关键词或主题在全部历史记录中进行搜索。
    • recent_chats:根据时间范围(如“最近10次对话”或“去年11月的最后一周”)来检索对话。
ChatGPT 的记忆系统:隐式、自动的体验
Section titled “ChatGPT 的记忆系统:隐式、自动的体验”

与 Claude 相反,ChatGPT 的记忆功能是为大众消费市场设计的,其特点是:

  1. 自动运行 (Always-On):记忆功能自动加载,无需用户干预,提供即时的个性化体验。
  2. 创建用户画像 (User Profiling):系统会持续学习用户的偏好和模式,构建详细的用户档案。
  3. 追求“魔法般”的体验:目标是让产品感觉智能、贴心、无缝,让用户无需思考其工作原理。

这种设计上的分歧源于两家公司不同的市场策略:

  • Claude 瞄准专业用户:其用户群体主要是开发者、研究人员等技术型专业人士。这些人理解 LLM 的工作原理,偏爱精准的控制权,并能接受为了调用记忆而产生的额外延迟。对他们而言,记忆是一个强大的、可预测的专业工具,隐私和可控性至关重要。

  • ChatGPT 瞄准大众市场:其用户群体覆盖学生、家长等各类普通消费者。他们希望产品开箱即用、简单方便,能自动记住他们的信息。这是典型的消费级科技产品的策略:先通过“魔法般”的体验吸引并留住海量用户,后续再探索商业化模式。

作者认为,两大巨头采取截然相反的路径,说明 AI 记忆功能的设计空间极其广阔,没有唯一的正确答案。最佳方案取决于产品的目标用户和具体需求。目前,这个领域仍处于早期探索阶段(“寒武纪大爆发”),各大公司都在尝试不同的方法,远未形成行业标准。

最后更新:文章发布后不久,Anthropic (Claude 的母公司) 宣布为其团队版和企业版用户推出一项新的记忆功能,该功能看起来更接近 ChatGPT 的自动画像模式。这表明,AI 记忆领域的发展和演变速度极快。

攻克 LLM 推理中的非确定性

Model Deterministic Nondeterministic User requests Other user requests Output

LLM 推理的非确定性是一个系统性问题。它源于为追求极致性能而设计的、对批次大小敏感的底层计算库,与现实世界中动态变化的服务器负载之间的矛盾。解决方案是存在的,即强制使用批次不变的计算内核,但这通常需要以牺牲部分性能为代价。

LLM(大语言模型)推理结果的不可复现性(非确定性),并非像通常认为的那样,是由于 GPU 并行计算的随机性与浮点数计算误差的简单结合。真正的罪魁祸首是:核心计算操作(Kernel)缺乏“批次不变性”(Batch Invariance),再结合服务器上不断变化的负载(即变化的批处理大小 Batch Size)

  1. 普遍的误解 vs. 事实

    • 普遍误解(“并发+浮点数”假说):人们普遍认为,由于浮点数加法不满足结合律(即 (a+b)+c ≠ a+(b+c)),而 GPU 又以不确定的顺序并行执行这些加法,导致了结果的随机性。
    • 文章指出的事实:这个假说并不完全。虽然浮点数非结合律是产生数值差异的根源,但 LLM 推理(前向传播)中使用的绝大多数计算核心(如矩阵乘法)本身是 “运行确定” 的。即对于一个固定批次的输入,多次运行会得到完全相同的结果。
  2. 真正的非确定性来源

    • 缺乏“批次不变性”:尽管单个计算核心是确定性的,但其计算结果会受到 批处理大小(Batch Size) 的影响。例如,对一个向量进行计算,当它被单独处理(batch size=1)与和其他上千个向量一起处理(batch size=1000)时,得到的数值结果会有微小的差异。这是因为为了优化不同批次大小下的性能,底层会采用不同的计算策略和指令,从而改变了浮点数的累加顺序。
    • 可变的服务器负载:从用户的角度来看,他们发送的请求会被推理服务器与其他用户的请求动态地组合成一个批次进行处理。服务器的负载是实时变化的,这意味着用户的同一个请求,这次可能在一个大小为 8 的批次中处理,下次可能在一个大小为 128 的批次中处理。
    • 两者结合的结果:一个缺乏“批次不变性”的计算核心,被应用在一个“批次大小不确定”的系统中,最终导致了用户感知的 非确定性
如何实现确定性推理(即实现“批次不变性”)
Section titled “如何实现确定性推理(即实现“批次不变性”)”

文章指出,要实现完全可复现的推理,必须让模型中的每一个计算环节都做到批次不变,主要涉及以下三个部分:

  • RMSNorm:相对容易实现。只需固定使用一种并行化策略,即使在小批量时性能稍差,也要避免切换到会改变计算顺序的策略。
  • 矩阵乘法(Matrix Multiplication):挑战更大。高性能的矩阵乘法库会根据输入尺寸选择不同的 Tensor Core 指令或并行策略(如 Split-K)。要实现确定性,必须强制使用同一种内核配置,这会牺牲在某些尺寸下的极致性能。
  • 注意力机制(Attention):最复杂。不仅要对批次大小保持不变,还要对序列的处理方式(如分块处理 Prefill、使用 KV Cache 解码)保持不变。这意味着一个 token 在计算注意力时,无论其上下文(KV Cache)有多少,其内部的计算顺序都必须完全一致。