上下文工程——启蒙篇
上下文工程系列第一篇:为什么 Agent 比对话式 AI 好用,有效信息与边际递减,以及「恰好够用」的上下文。
人无法想象出自己完全没有见过的东西,AI亦然
前言
距离上一次更新已经过去差不多一周了,整理了很久,终于可以发这个系列的第一篇了,这个系列是上一篇文章的深入延续,没看过的可以先去找找看哦。本系列预计更新四篇,具体如下:
规划
- 原理启蒙篇(current)
- 原理进阶篇
- 方法整理篇
- 实战应用篇
前两篇主要是介绍原理,第三篇来整理一些管理上下文里常用的方法,最后一篇从我本人近期的实践出发,综合原理和方法论,介绍他们如何应用到学习/工作中
引入
我先来问一个问题:从对话式AI到AI Agent,明明模型的能力没有变化,但是Agent用起来却比对话式AI更加好用呢?
我想很多人都会回答出:因为Agent赋予了AI“双手”,让其可以自主的帮我们完成许多的任务。
这个答案是正确的,但是并不完全
来让我们先回到只有对话式AI的时代,那时我们利用AI协助工作的方式主要是提供文本/图片,然后跟着AI的回复来做,AI给我们列出怎么做,然后由我们去做。我想,在这个过程里,很多人肯定都遇到过一个问题:我明明都是照着AI说的做的,为什么最后我还是没办法弄好这个东西?
在过去这个问题并不罕见,但是现在我们可以直接把我们要做的交给AI,然后让他全权负责(环境配置,服务部署,写代码,生成word……),一般而言,任务都可以被成功的完成……
这难道真的只是因为Agent多了一双手吗?
其实不然,在这个过程当中的有一个常被我们忽视,但是实际上起着决定性作用的因素——本地化的信息!(意思是在你这个情况里特有的条件)
我们过去向AI询问某个东西要怎么做,AI其实回复的是一个通用的回答,但是当AI放在Agent里的时候,它可以看到你本地的真实情况(比如你的系统版本……),所以Agent就可以顺利的解决你的问题!
这并不难理解,这就像你去做一道数学题,如果题目给你少了条件(也就是这里说的本地化信息),那你自然是解不出来的
历史上的例子也并不少见:
- 马奇诺防线(1940)——法国照搬一战堑壕战逻辑,耗巨资修固定防线,德军直接绕道比利时突破,防线形同虚设。
- 马克思主义的中国化,中国走符合国情的特色社会主义道路
- ……
综上所述,可以引出我对上下文管理的核心观点了——一个合格的上下文里应该包含着足够的针对于你当前这个问题的信息
进一步论述
AI模型是一个生成器,或者我们可以简单的说它就是一个函数(就是数学里说的函数),对于我们给定的一个输入,它会经过一堆极其复杂的运算,最后输出给我们,也就是它的回复
我们很显然可以发现,在这个过程当中,有两个极其关键的部分
- 输入(我们的用户提示词,或者更准确的说是模型收到的上下文
- 计算的规则(也就是模型本身)
我们此处讨论的是上下文工程,因此我们主要看输入部分。不过因为最后的生成是对我们的输入进行计算,所以我们也要了解一些和计算相关的东西
计算?如何计算?
一般而言,模型的计算主要是相关度计算,然后产出概率最高的文本
这个过程里一个上下文会被切分为许多的token参与计算,因此我们的输入里,哪怕只有一个符号不一样,模型的回复也可能不一样(这里说的有点夸张了,主要是说明模型的输出是怎么来的)
我们来对我们的输入分一下类,大概是三种:
- 有效信息——可以增加我们预期输出的概率的信息,例如引入部分里说的本地化信息,它可以让模型正确的作出决策
- 无效信息——对我们的结果几乎没有影响的信息,比如一个句子末尾的句号
- 负面信息——会降低我们预期输出的概率的信息,比如一个错误的条件
(注:负面信息其实也不是完全没有用,我之后的篇目会提到)
所以,怎么提升AI回复的质量?
答案其实已经呼之欲出了——加入更多的有效信息
注意,这里说的有效信息,在绝大多数情况下,指的是完成当前这个具体任务所需要的特定信息
举个最直接的例子:你想让AI帮你改一段代码,但你连现有代码长什么样都没告诉它,那它能给你的只能是一个模板式的通用建议,而不是真正能用的修改。这不是AI不够聪明,是它根本没有做决策所需要的原材料。
更一般的说法是:任务越具体,所需要的特定信息就越多,你就越需要主动把这些信息放进上下文里
这个道理说出来很简单,但实际上很多人在用AI的时候,本能的还是在”出题”而不是在”提供原材料”
从函数的角度看这件事
我们前面说过,模型本质上是一个函数:
输出 = f(上下文)
那我们现在关心的是:怎么让输出的质量尽可能高?
如果用偏导数来描述(不懂这个名词也没关系,意思就是”单独改变某一个因素,对结果的影响有多大”):
- 增加有效信息 → 对输出质量的偏导数为正,也就是说,加越多,结果越好
- 增加无效信息/负面信息 → 偏导数为零甚至为负,加了要么没用,要么帮倒忙
到这里,结论好像是:那我就使劲往里加有效信息不就行了?
不对。这里有一个你必须知道的东西
边际递减效应
有效信息对输出质量的提升,存在边际递减效应。
用人话说就是:你加的第一条有效信息,可能让结果质量从60分变成80分,提升了20分;你加的第十条,可能只让结果从92分变成93分,提升了1分;你加的第二十条,可能已经完全没有任何帮助了
这个现象其实非常符合直觉——当模型已经掌握了完成任务所需的核心信息之后,再往里塞更多的相关细节,收益是在快速衰减的
但与此同时,你提供信息是有成本的:
- 你需要花时间整理和筛选信息
- 更长的上下文意味着更高的token消耗(如果你在意费用的话)
- 上下文越长,信噪比越难维持,反而可能引入噪音
所以把这两件事放在一起看,就会得到一个很朴素的结论:
上下文应该尽量精简,包含完成当前任务必要的信息即可。
不是越多越好,也不是越少越好——是恰好够用
写在最后
让我们总结概括这整篇文章,大概是这样的:
上下文工程,就是在有限的空间里,把”恰好够用的有效信息”放对位置。
听起来很简单,做起来不然。你得知道什么是这个任务真正需要的,什么是你本能想塞进去但其实没用的,什么时候该停下来不要再加了
这种判断力,没有办法靠一篇文章直接给你,它需要你在实际使用中不断去校准。但至少现在你有了一个框架——下次再觉得AI回复不对劲,先不要急着换模型或者重新问,先想想:我的上下文里,有效信息够吗?有没有多余的噪音在干扰它?
作者最近还在不断实践整理教程的素材呢,下一个进阶篇会聊一些更加具体的操作:多轮对话里怎么管理上下文的演变、外部信息怎么注入、以及AI Agent里信息流是怎么设计的……
下篇见