分享
从一次 LLM 调用到完整 Harness,Agent 到底经历了什么?
输入“/”快速插入内容
从一次 LLM 调用到完整 Harness,Agent 到底经历了什么?
用户6116
用户6116
用户4242
用户4242
9月8日修改
🔗 原文链接:
https://mp.weixin.qq.com/s/kZZac-VBgnQIZ...
腾讯程序员 · 公众号 · 腾讯技术工程 · 2026-09-07 17:36
📌 本文为转载,版权归原作者所有,全文以原文链接为准
作者:ivanxxie、davoszhang
今天的 Agent 系统看起来很像一套小型操作系统:它们管理子 Agent 进程,维护长期记忆文件,通过工具驱动接触外部世界,还要处理权限、隔离、恢复和观测。可它们的起点并不宏大。最初,开发者手里只有一个把输入映射为输出的语言模型。
复杂性并不是一次设计出来的。每当模型试图越过一次调用的边界,系统就必须在模型外面增加一个新部件:模型不知道此前聊了什么,于是出现上下文;模型无法改变世界,于是出现工具;一次工具调用解决不了任务,于是出现循环;上下文装不下历史,于是出现记忆;循环开始产生真实副作用,于是出现权限与沙箱;一个循环不够并行,于是出现子 Agent...
从一次模型调用到 Agent
LLM
最朴素的大语言模型接口可以被看成一个函数:输入一段 token,输出另一段 token。它可以在参数中编码世界知识,却不会天然记住某个用户上一轮说过什么,也不知道自己刚刚输出的命令是否被执行。
2020 年,
GPT-3
展示了大规模语言模型仅通过文本提示完成多种任务的能力;2022 年底,GPT-3.5 成为 ChatGPT 背后的模型;2023 年 2 月,Meta 发布
LLaMA
,推动开放权重模型进入主流研究与本地部署。GPT、LLaMA 以及后来出现的 Claude、Gemini、Qwen 等模型虽然能力不同,但在应用看来仍然共享同一个基本形态:接收上下文,predict next token。
代码块
Plain Text
answer = LLM(question)
最初的系统只有一次前向调用。模型负责生成文本,应用只负责把问题送进去、把答案显示出来。模型参数里的知识来自训练;一次对话中的名字、偏好和任务状态,则必须由应用在每次调用时重新提交。模型本身并没有一个不断增长的用户档案。
Q&A Bot
Q&A Bot 的第一项工程进步,不是换了一个更聪明的模型,而是在模型前面增加一个上下文装配层。它把系统指令、用户当前输入和对话历史拼成一次请求。
在 GPT-3 时代,许多应用仍然把模型包装成单轮问答接口;2022 年 11 月,
ChatGPT
把多轮对话带给大众,开发者开始普遍维护 System Prompt、User Prompt 和 Chat History。模型没有突然获得跨轮记忆,是聊天应用在每次请求前重新装配了历史。
代码块
Plain Text
working_context = [
system_prompt,
recent_chat_history,
user_prompt
]
answer = LLM(working_context)
Working Memory 不是长期存储,而是这一轮真正提交给模型的全部上下文。
这一步看似只是字符串的拼接,却奠定了后面所有 Harness 的核心原则:
模型看见的一切,都是运行时系统为它构造出来的。
运行时选择哪些历史进入上下文、哪些指令拥有更高优先级、哪些内容必须被裁剪,都会改变 Agent 的行为。
ReAct
Bot 只需要回答一次,但 Agent 必须根据行动结果继续决策。2022 年提出的 ReAct 执行架构把推理轨迹与动作交错起来:模型形成下一步意图,执行外部动作,接收 Observation,再把观察送回下一轮推理。
ReAct
论文于 2022 年 10 月公开,并在 ICLR 2023 发表。它把此前分别讨论的 Chain-of-Thought 与外部行动连接成 Thought → Action → Observation 循环。2023 年大量早期 Agent 项目沿用了这一模式,Agent 也由“一种提示词技巧”逐渐变成了一个需要程序持续驱动的执行循环。
Agent 真正的分水岭不是“会思考”,而是建立了 模型 → 动作 → 环境 → 观察 → 模型 的闭环。
代码块
Plain Text
while not finished:
response = model(context)
if response.has_action:
observation = environment.execute(response.action)
context.append(response.action, observation)
else:
return response.answer