分享
Agent 的代码谁都能写,难的是管好那串文字
输入“/”快速插入内容
Agent 的代码谁都能写,难的是管好那串文字
用户1208
用户1208
5月29日修改
上一篇我们搞清楚了 Agent 的骨架:LLM + 工具 + While 循环。
核心代码就那点。
骨架只是起点。真正决定一个 Agent 好不好用的,是每一次循环里,你塞给 LLM 的那段 message —— 也是就是上下文。
那么管理好并设计好这段上下文就叫做 —— 上下文工程(Context Enginer)
这篇我们就拆开来看三件事:
1.
每次循环里 LLM 到底看到了什么
2.
工具调用是怎么回事
3.
为什么说 Agent 工程的核心是上下文工程。
一、每次循环里,LLM 到底看到了什么
上一篇的伪代码里有一行反复出现:
代码块
Plain Text
response = LLM(system_prompt, tools, messages)
这行代码每次被执行,就是把三样东西打包丢给 LLM:
1.
系统提示词
2.
工具列表
3.
对话历史LLM
LLM 会读完上面一整个内容,LLM 来决定下一步干嘛。
关键来了 —— 其实 LLM 并没有记忆。
它不记得上一圈循环自己说了什么,不记得工具返回了什么结果。所以每次被调用,对它来说都是第一次。
它能知道之前发生了什么,完全是因为你把之前所有的对话记录塞在 messages 里,让它从头读了一遍。
我们用上一篇那个天气任务来看,每一圈循环时 LLM 看到的东西:
第一圈:
代码块
Plain Text
系统提示词:你是一个智能助手,可以查天气和设提醒...
工具列表:[查天气, 设提醒]
对话历史:
用户:查一下明天上海和北京的天气,哪个城市下雨就帮我设早上7点带伞的提醒。
LLM 读完,决定:先查上海天气。输出 → 调用 check_weather(city="上海")
第二圈:
代码块
Plain Text
系统提示词:你是一个智能助手,可以查天气和设提醒...
工具列表:[查天气, 设提醒]
对话历史:
用户:查一下明天上海和北京的天气,哪个城市下雨就帮我设早上7点带伞的提醒。
助手:[调用 check_weather(city="上海")]
工具结果:上海,明天中雨,气温 18-22℃
LLM 读完,知道上海下雨了,但北京还没查。决定:再查北京。输出 → 调用 check_weather(city="北京")
第三圈:
代码块
Plain Text
系统提示词:...
工具列表:[查天气, 设提醒]
对话历史:
用户:查一下明天上海和北京的天气...
助手:[调用 check_weather(city="上海")]
工具结果:上海,明天中雨
助手:[调用 check_weather(city="北京")]
工具结果:北京,明天晴,气温 15-26℃
LLM 读完,上海下雨要设提醒,北京晴天不用。决定:给上海设提醒。输出 → 调用 set_reminder(time="07:00", message="上海明天中雨,记得带伞")
第四圈:
代码块
Plain Text
系统提示词:...
工具列表:[查天气, 设提醒]
对话历史:
用户:查一下明天上海和北京的天气...
助手:[调用 check_weather(city="上海")]
工具结果:上海,明天中雨
助手:[调用 check_weather(city="北京")]
工具结果:北京,明天晴
助手:[调用 set_reminder(time="07:00", message="上海明天中雨,记得带伞")]
工具结果:提醒已设置成功