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.