Agentic Coding

编程代理是具有工具访问能力的对话式 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.