06-agents如何工作

By 刘志军 , 2026-03-21, 分类: agentic-patterns-translation

与任何工具一样,了解编程智能体(Coding Agents)的底层运作机制能帮助你更好地决定如何应用它们。

编程智能体本质上是一套为大语言模型(LLM)提供支持的软件“外壳”(Harness)。它通过隐藏的提示词(Prompts)来扩展 LLM 的能力,并将其实现为可调用的工具。

大语言模型 (LLM)

任何编程智能体的核心都是大语言模型。它们拥有诸如 GPT-5.4、Claude Opus 4.6、Gemini 3.1 Pro 或 Qwen3.5-35B-A3B 之类的名称。

LLM 是一种能够完成文本句子的机器学习模型。如果你给模型一个短语“the cat sat on the ”,它(几乎肯定)会建议“mat”作为句子的下一个词。

随着这些模型变得越来越大,并接受更多数据的训练,它们可以完成更复杂的句子,例如:“a python function to download a file from a URL is def download_file(url):”。

LLM 实际上并不直接处理单词,而是处理 Token(标记)。一段文本会被转换成一系列整数 Token,因此“the cat sat on the ”变成了 [3086, 9059, 10139, 402, 290, 220]。这一点值得了解,因为 LLM 供应商是根据处理的 Token 数量收费的,且模型一次能处理的 Token 数量也是有限的。

你可以在 platform.openai.com/tokenizer 使用 OpenAI 的分词器进行实验,观察其工作原理。

LLM 的输入被称为 Prompt(提示词)。LLM 返回的文本被称为 Completion(补全)或 Response(响应)。

如今许多模型都是多模态的,这意味着它们不仅能接受文本输入。视觉 LLM (vLLM) 可以接受图像作为输入的一部分,这意味着你可以向它们提供草图、照片或截图。一个常见的误解是,这些图像会通过独立的 OCR 或图像分析流程处理,但实际上这些输入会被转化为更多的整数 Token,并以与文本相同的方式进行处理。

对话模板提示词

早期的 LLM 像补全引擎一样工作——用户需要提供一段提示词,然后由模型补全,如上述两个例子所示。

这对用户并不友好,因此模型大多转向使用对话模板提示词(Chat Templated Prompts),将与模型的通信模拟为一场对话。

这实际上只是补全提示词的一种特殊格式,看起来像这样:

user: 编写一个从 URL 下载文件的 Python 函数 assistant:

这个提示词的自然补全方式就是 Assistant(由 LLM 代表)用一段 Python 代码回答用户的问题。

LLM 是无状态的:每次执行提示词时,它们都从同一张白纸开始。

为了维持对话的模拟状态,与模型通信的软件需要维护自己的状态,并在用户每次输入新的聊天提示词时,重新发送整个现有的对话历史:

user: 编写一个从 URL 下载文件的 Python 函数 assistant: `def download_url(url): return urllib.request.urlopen(url).read() user: 改用 requests 库 assistant:

由于供应商对输入和输出 Token 都会收费,这意味着随着对话变长,由于每次输入 Token 数量都在增加,每个提示词的成本也会变得更高。

Token 缓存

大多数模型供应商通过对缓存输入 Token(Cached Input Tokens)提供更优惠的费率来缓解这一问题。如果在短时间内处理过共同的 Token 前缀,由于底层基础设施可以缓存并重用处理该输入时产生的大量昂贵计算,因此可以按较低费率收费。

编程智能体在设计时考虑了这种优化——它们会尽量避免修改早期的对话内容,以确保缓存得到最有效的利用。

调用工具

LLM 智能体(Agent)的特征是它们可以调用工具。但什么是工具呢?

工具是智能体外壳提供给 LLM 调用的一种函数。

在提示词层面,它看起来像这样:

system: 如果你需要获取天气,请在回复末尾加上 <tool>get_weather(city_name)</tool> user: 旧金山的天气怎么样? assistant:

此时,助手可能会返回如下文本: <tool>get_weather("San Francisco")</tool>

智能体外壳软件随后从响应中提取该函数调用请求(通常使用正则表达式),并执行该工具。

然后,它将结果返回给模型,并构建一个类似这样的提示词:

system: 如果你需要获取天气,请在回复末尾加上 <tool>get_weather(city_name)</tool> user: 旧金山的天气怎么样? assistant: <tool>get_weather("San Francisco")</tool> user: <tool-result>61°, 多云</tool-result> assistant:

LLM 现在可以利用该工具结果来生成用户问题的答案。

大多数编程智能体会定义十几个或更多的工具供智能体调用。其中最强大的是允许代码执行的工具——例如用于执行终端命令的 Bash() 工具,或用于运行 Python 代码的 Python() 工具。

系统提示词 (System Prompt)

在前面的例子中,我包含了一个标为“system”的初始消息,它告知了 LLM 可用的工具以及如何调用。

编程智能体通常在每次对话开始时都带有一个类似的系统提示词。它对用户不可见,但提供了指导模型行为的指令。

这些系统提示词可能长达数百行。例如 2026 年 3 月时的 OpenAI Codex 系统提示词,它清晰地展示了让这些编程智能体正常工作所需的各类指令。

推理 (Reasoning)

2025 年的一项重大进展是在尖端模型系列中引入了推理能力。

推理(在 UI 中有时显示为“思考”)是指模型在向用户提供答复之前,花费额外的时间生成文本,详细分析问题及其潜在解决方案。

这看起来类似于人类的大声思考,且效果也类似。关键在于,它允许模型在问题上投入更多时间(和更多 Token),从而有望获得更好的结果。

推理对于调试代码中的问题特别有用,因为它让模型有机会梳理更复杂的代码路径,结合工具调用,并利用推理阶段追溯函数调用以寻找问题的潜在根源。

许多编程智能体提供了调节推理力度级别的选项,鼓励模型在处理难题时花费更多精力去推敲。

LLM + 系统提示词 + 工具循环

信不信由你,构建一个编程智能体基本上只需要这些!

如果你想更深入地理解这些事物是如何运作的,一个有用的练习是尝试从零开始构建自己的智能体。只需在现有的 LLM API 之上编写几十行代码,就可以实现一个简单的工具循环。

当然,一个优秀的工具循环需要投入更多工作,但其基本原理却出人意料地简单直接。


原文:Agentic Engineering Patterns by Simon Willison


关注公众号「Python之禅」,回复「1024」免费获取Python资源

python之禅