智能体编程

编程智能体是具有工具访问能力的对话式 AI 模型,可以读写文件、搜索网页、执行 Shell 命令等。它们可以运行在 IDE 中,也可以作为独立的命令行或 GUI 工具使用。编程智能体高度自主且功能强大,能支持广泛的应用场景。

本节在开发环境与工具中 AI 辅助开发内容的基础上展开。作为快速演示,继续使用AI 辅助开发一节的示例:

from urllib.request import urlopen

def download_contents(url: str) -> str:
    with urlopen(url) as response:
        return response.read().decode('utf-8')

def extract(content: str) -> list[str]:
    import re
    pattern = r'\[.*?\]\((.*?)\)'
    return re.findall(pattern, content)

print(extract(download_contents("https://raw.githubusercontent.com/missing-semester/missing-semester/refs/heads/master/_2026/development-environment.md")))

我们可以尝试向编程智能体发出以下任务:

将这段代码改写为一个正规的命令行程序,使用 argparse 进行参数解析。添加类型注解,并确保程序通过类型检查。

智能体会先阅读文件理解代码,然后进行编辑,最后调用类型检查器确保类型注解正确。如果犯了导致类型检查失败的错误,它很可能会自动迭代修正——不过这个任务很简单,不太会出现这种情况。由于编程智能体可以访问可能有害的工具,默认情况下智能体框架会提示用户确认工具调用。

如果编程智能体犯了错——比如 mypy 可执行文件就在 $PATH 里,但智能体却尝试用 python -m mypy——你可以通过文字反馈帮它纠正方向。

编程智能体支持多轮交互,你可以通过与智能体的来回对话不断迭代。如果智能体走错了方向,你甚至可以中断它。一个有用的心智模型是把它当作管理一个实习生:实习生做那些繁琐的工作,但需要你的指导,偶尔也会做错事需要纠正。

为了获得更直观的演示,你可以作为后续任务让智能体运行生成的脚本。观察输出结果,然后尝试让它做些修改(例如,要求它只保留绝对 URL)。

AI 模型和智能体的工作原理

全面解释现代大语言模型 (LLM)及智能体框架等基础设施的内部原理超出了本课程范围。但对一些关键概念建立高层次的理解,有助于有效地使用这项前沿技术并理解其局限。

LLM 可以被看作是对给定提示字符串(输入)的补全字符串(输出)概率分布进行建模。LLM 推理(即向对话聊天应用提交查询时发生的事情)会从这个概率分布中采样。LLM 具有固定的上下文窗口,即输入和输出字符串的最大长度。

对话聊天和编程智能体等 AI 工具都建立在这个基础原语之上。对于多轮交互,聊天应用和智能体使用回合标记,每次有新的用户提示时将整个对话历史作为提示字符串提供,每次用户提示调用一次 LLM 推理。对于工具调用智能体,框架会将特定的 LLM 输出解释为工具调用请求,并把工具调用的结果反馈给模型作为提示字符串的一部分(因此每次工具调用/响应都会再次运行 LLM 推理)。工具调用智能体的核心概念可以用 200 行代码实现

隐私

大多数 AI 编程工具在默认配置下会将大量数据发送到云端。有时框架在本地运行而 LLM 推理在云端;有时更多软件也在云端运行(比如服务提供商可能会获取你的整个代码库副本以及你与 AI 工具的所有交互记录)。

目前已经有一些不错的开源 AI 编程工具和开源 LLM(但还不及专有模型),不过就目前而言,受硬件限制,大多数用户在本地运行最前沿的开源 LLM 还不现实。

应用场景

编程智能体在各种各样的任务中都能发挥作用。以下是一些示例:

高级智能体

这里简要概述编程智能体的一些更高级使用模式和功能。

对于很多需要编写提示词的高级功能(如 Skills 或子智能体),你可以用 LLM 来帮忙入门。一些编程智能体甚至内置了这种支持。比如 Claude Code 可以从简短提示词生成子智能体(调用 /agents 并创建新智能体)。试试用以下提示词创建一个子智能体:

一个 Python 代码检查智能体,使用 `mypy` 和 `ruff` 对自上次 git 提交以来修改过的所有文件进行类型检查、Lint 检查和格式检查。

然后,你可以让顶层智能体通过类似”使用代码检查子智能体”的消息来显式调用子智能体。你甚至可以让顶层智能体在适当的时候自动调用子智能体,例如,在修改任何 Python 文件之后。

注意事项

AI 工具可能会犯错。它们建立在 LLM 之上,而 LLM 只是概率性的下一词预测模型,并不像人类那样具有「智能」。请审查 AI 输出的正确性和安全性。有时验证代码可能比自己写更困难;对于关键代码,请考虑手动编写。AI 可能会钻牛角尖并试图误导你;注意调试死循环。不要把 AI 当拐杖,警惕过度依赖或理解浮于表面。仍有大量编程任务是 AI 目前无法完成的。计算思维依然有价值。

推荐软件

许多 IDE/AI 编程扩展都包含编程智能体(参见开发环境一讲的推荐)。其他流行的编程智能体包括 Anthropic 的 Claude Code、OpenAI 的 Codex,以及开源的 opencode

练习

  1. 把同一编程任务分别用手动编码、AI 自动补全、内联聊天和智能体各做一次,比较体验差异。最佳选择是你正在开发的项目中的一个小功能。如果没有合适的,可以考虑在 GitHub 上做”good first issue”类型的任务,或者做 Advent of CodeLeetCode 上的题目。
  2. 用 AI 编程智能体浏览一个陌生的代码库。最好在调试或为你在意的项目添加新功能的背景下进行。如果想不出合适的,可以试试用 AI 智能体理解 opencode 中安全相关功能的工作原理。
  3. 从零开始氛围编程一个小应用。不要手动编写一行代码。
  4. 为你选择的编程智能体创建并测试一个 AGENTS.md(或等效文件,如 CLAUDE.md)、一个 Skill(如 Claude Code 的 SkillCodex 的 Skill),以及一个子智能体(如 Claude Code 的子智能体)。思考什么情况下会选择用其中某一种而不是另一种。注意,你选的智能体可能不支持其中某些功能;可以跳过或换一个支持的智能体试试。
  5. 用编程智能体完成与代码质量一讲中 Markdown 无序列表正则表达式练习相同的目标。它是通过直接编辑文件来完成的吗?智能体直接编辑文件有什么缺点和局限?想办法提示智能体不通过直接编辑文件来完成。提示:让智能体使用第一讲中提到的某个命令行工具。
  6. 大多数编程智能体都支持某种”YOLO 模式”(例如,在 Claude Code 中是 --dangerously-skip-permissions)。直接使用此模式并不安全,但在虚拟机或容器等隔离环境中运行编程智能体然后启用自主操作可能是可以接受的。在你的机器上搭建这样的环境。Claude Code devcontainersDocker Sandboxes / Claude Code 等文档可能会派上用场。搭建方式不止一种。

Edit this page.

Licensed under CC BY-NC-SA.