第2章 Agent 的骨架:对象模型
2.1 问题引入:如何让 Agent 拥有"手脚" 一个纯粹的大语言模型(LLM),无论多么聪明,都只是一颗"大脑"——它能思考、推理、生成文本,却无法触及真实世界。它读不了磁盘上的文件,执不了终端里的命令,搜不了代码库中的符号。要将这颗大脑变成一个真正能解决问题的 Agent,就必须为它接上"手脚"——一套能够操作外部世界的能力体系。 这套能力体系在 Claude Code 中被称为工具(Tool)。截至当前版本,Claude Code 内建了约 45 种工具,涵盖以下截然不同的能力域: 能力域 代表性工具 特征 文件操作 FileReadTool、FileEditTool、FileWriteTool 输入为文件路径,输出为文件内容或操作状态 Shell 执行 BashTool、PowerShellTool 输入为命令字符串,输出为标准输出流 代码搜索 GrepTool、GlobTool 输入为正则/通配模式,输出为匹配结果集 网络访问 WebFetchTool、WebSearchTool 输入为 URL 或查询词,输出为网页内容 Agent 派生 AgentTool 输入为任务描述,输出为子 Agent 的执行结果 外部协议 MCPTool 输入完全由外部服务器定义,输出格式未知 用户交互 AskUserQuestionTool 输入为问题文本,输出取决于用户回答 问题的核心在于:这些工具的输入结构不同(有的是文件路径,有的是 Shell 命令,有的是完全开放的 JSON)、输出类型不同(有的返回纯文本,有的返回二进制图像,有的返回结构化对象)、执行语义不同(有的只读、有的破坏性写入、有的会派生出新的 Agent 循环)、安全要求不同(有的需要沙箱隔离,有的需要用户授权,有的可以自由执行)。 然而,从调用方——也就是 Agent 主循环——的视角来看,它不关心这些差异。主循环的逻辑永远是: 收到 LLM 的工具调用请求 → 找到对应工具 → 验证输入 → 检查权限 → 执行 → 返回结果 这就是本章要探讨的核心设计问题:如何构建一个统一的工具抽象,使得 45 种截然不同的能力共享同一套接口,让调用方的代码在工具数量翻倍时依然一行不改? 2.2 算法思想:工具多态的四重设计 2.2.1 接口不变性原则 在软件工程中,接口不变性(Interface Invariance)是多态设计的基石。其核心命题是: ...