背景:
AI工程重心其实经历过三次迁移:首先是Prompt工程,之后又变成了Context工程,一直到近段时间的Harness工程,这三个工程其实是解决了三种不同的问题,接下来我就带领大家详细的分析这些方案产生的背景以及是如何解决这些问题的。
1.Prompt
在大模型刚刚出来的时候,向大模型问问题,同样的问题不同的问法,会得到完全不同的结果,并且有时候大模型还会错误的理解问题,生成的内容格式混乱甚至是结果错误。总结下来有下面几个问题:1.意图误解,2.输出格式混乱。
这个问题其实就是大模型听不懂人话的问题, 我们需要做的就是**把任务描述清楚,**我们可以通过下面几个方法来解决:
- 指令优化:给具体并且清晰的任务,并且给大模型设定角色,添加输出格式的约束条件。
2.少量示例:可以给大模型少量的输出的示例,让大模型模仿样例输出。
3.思维链:在提示词中添加让我们进一步思考等,引导大模型进行思考和推理。
2.Context
即便是有了精美的提示词,大模型可能会出现幻觉,因为大模型不知道当前任务的上下文,所以便有了处理大模型的上下文工程,主要通过以下几个方面解决:
1.RAG工程:RAG其实就是给大模型添加了一个知识库,需要注意的是这是一个向量知识库,通过向量检索来匹配相似度的文档,我们不能把所有的检索出来的数据都给大模型,因为大模型的上下文有限,通过文档预处理、向量检索、重排序、结果组装这几个方面,把最合适的文档给大模型。
2.上下文窗口管理:这个方法核心的目标就是只给大模型它需要的信息,把无关的信息过滤掉,常见的方法有对话历史的压缩,滑动窗口保留最近N轮对话。
3.工具调用:要给大模型装上工具,但是不能一次把所有的工具都给大模型,因为注册工具也需要消耗上下文,只把大模型需要的工具给它,可以按需求给工具,渐进式披露,先给工具的分类索引,如果大模型真的需要再通过分类去找到这些工具注册给大模型。
4.就是上面说的Prompt工程。
3.Harness
虽然是有了上下文管理可以让AI知道更多的信息,但是这些只涉及到单轮的对话的简单任务,如果任务复杂一些,需要很多节点共同完成,当节点较多的时候,那么输出的结果就不可控也就是不稳定,接下来就给大家讲解一下具体的解决方法。
1.约束:简单来说就是管理哪些可以干,哪些不能干。
1.权限约束(工具/Api/业务数据白名单):Agent智只能调用白名单上的工具/Api/数据,其余直接拦截。
2.行为约束:禁止危险的行为,比如删除数据,修改数据,禁止随意跳着执行任务。
3.参数格式约束:入参校验,缺少字段的时候Harness补齐。
4.流量或资源约束:Api调用频率,限制内存,循环次数,任务超时约束。
2.工具调用:
1.管理工具调用的时机
2.正确处理工具调用的结果。
3.执行编排:把一个大的任务拆分成合理的多个子任务。
4.记忆状态:
1.短期的记忆(最近几轮大模型会话)
2.长期的记忆(比如说用户的喜好)
3.任务状态管理(比如说任务拆成了几步,记录已完成、待完成、失败的步骤)
(任务中途暂停、报错、重启,能记住断点,不用从头重来)
4.记忆调度(自动决定哪些记忆塞进提示词、哪些归档、哪些过期删掉、哪些敏感内容直
接过滤)
5.监测:需要监控模型的每一个动作,比如:
1.全链路的追踪:记录模型的每一次调用,工具调用,输出过程和结果
2.监控指标:任务的成功率,执行的平均时间,工具调用的准确性,幻觉率
3.错误定位:当错误失败的时候自动定位错误位置,寻自动找失败的原因
6.恢复:大模型也会遇到错误崩溃问题,比如说:
1.对于网络错误和API超时来说,会有自动重试的机制
2.对于某个步骤失败的时候会有自动回滚到上一个步骤的功能
3.模型的输出数据要经过格式和内容验证
4.当模型不可以用的时候,需要自动降级,比如返回一个预设的回答
总结:
我们可以很容易发现,其实Context工程包含Prompt工程,而Harness工程其实又包含Context工程,一个Agent通过LLM大模型来思考,通过Harness来进行工作。