## 一、什么是Agent（智能体）

大模型上知天文下知地理，你问它什么它答什么，但是它有个最大的缺陷，就是没有“手”不能干活。

而Agent（智能体）相当于是给大模型装上了“手”，让它可以感知外部世界、思考并采取行动。

**LLM**

用户输入指令→模型检索知识后回答

**Agent**

用户输入指令→Agent自主识别可用的工具进行调用，给用户交付结果

传统编程、Workflow和Agent 的区别：

-   **传统编程：**程序员在做决策，把所有可能的情况都提前想好，写成代码；
    
-   **Workflow：**产品/开发在做决策，设计固定的流程路径；
    
-   **Agent：**AI 在做决策，根据实际情况动态调整策略；
    

## 二、Agent核心原理

目前，Agent 基本采用 ReAct 模式。该模式由姚顺雨等人于 2022 年在《[ReAct: Synergizing Reasoning and Acting in Language Models](https://blog.csdn.net/weixin_44191845/article/details/148403313)》一文中提出，其核心思想是将推理（Reasoning）与行动（Acting）相结合。CoT 思维链主要提升 LLM 的推理能力，但由于缺少与外部世界的交互，难以获得外部反馈来拓展知识空间；ReAct 在一定程度上弥补了这一不足。

ReAct Agent 的工作方式很像人类解决问题的过程：在整体目标明确的前提下，边做边调整。具体来说，它会先观察当前情况，再思考下一步行动，随后执行动作并观察结果，最后根据结果决定下一步。上述过程不断循环，直到任务完成。

-   **思考**（Reasoning）：帮助模型分解任务、制定计划、跟踪进度、处理异常、识别信息需求。这本质上是LLM的内部"独白"或元认知。
    
-   **行动**（Action）：允许模型与外部世界（如知识库API、交互式环境）交互，以获取当前思考步骤所需的信息，或执行计划中的某个具体操作。
    
-   **观察**：（Observation)：行动的结果，反馈给模型，作为下一步思考的依据。
    

ReAct 的实现主要依赖于精心设计的 `Few-Shot Prompting`[https://github.com/ysymyth/ReAct。Prompt](https://github.com/ysymyth/ReAct%E3%80%82Prompt) 中包含若干个“思考-行动-观察”的完整轨迹示例，指导 LLM 在新的任务实例上生成类似的交错序列。

对于 Agent 应用开发者而言，无需在提示词中额外加入这些示例来引导模型生成。大多数模型厂商已在 API 内部进行了处理，一般通过 **Function Calling** （\*\*函数调用）\*\*的方式实现。

## 三、Agent运行流程

![](../.resources/image-1778904762459.png)![](../.resources/image-1778904772586.png)

工具调用具体过程

以天气查询为例，用户指令：今天上海天气怎么样？

1.  **初始化：**Agent 接收用户指令初始化上下文，并定义一个天气查询工具 `get_weather`
    

```python
# 初始化上下文
messages = [
   {
       "type": "message",
       "role": "user",
       "content": "查询北京今天的天气"
   }
]
# 定义工具
tools = [
    {
        "type": "function",
        "name": "get_weather",
        "description": "根据城市名称查询该城市当日天气（含温度、天气状况）",
        "parameters": {
            "type": "object",
            "properties": {
                "location": {
                    "type": "string",
                    "description": "城市名称，如北京、上海（仅支持国内地级市）"
                }
            },
            "required": ["location"]
        }
    }
]
```

2.  **第一轮请求：**将上下文和工具定义发送给大模型，大模型返回 `function_call` \*\*\*\*类型指令，包括工具名`name`和参数`arguments`，告诉Agent需要调用工具。
    

```python
{
    "created_at": 1756980000,
    "id": "resp_02175698000123456789abcdef0123", 
    "model": "doubao-seed-1-6-251015",
    "object": "response",
    "output": [
        {
            "arguments": "{\\"location\\":\\"北京\\"}", 
            "call_id": "call_abc123def456ghi789jkl0",
            "name": "get_weather",
            "type": "function_call",
            "id": "fc_02175698000abcdef0123456789gh",
            "status": "completed"
        }
    ],
    "status": "completed",
    "store": true,
    "expire_at": 1757239200
}
```

3.  **执行工具调用：**Agent `响应控制器`中解析响应数据，发现返回了 `function_call` \*\*\*\*类型指令，然后根据工具名和参数去调用外部的天气API获取天气数据。获取后将模型响应数据和查询到的天气数据存入上下文。
    

```python
{
    "city": "北京",
    "date": "2025-10-13",
    "temperature": "18~28℃",
    "condition": "晴转多云",
    "wind": "东北风2级"
}
```

4.  **第二轮请求：**将上下文发送给模型生成最终响应。
    

```python
curl <https://ark.cn-beijing.volces.com/api/v3/responses> \\
  -H "Authorization: Bearer $ARK_API_KEY" \\
  -H "Content-Type: application/json" \\
  -d '{
    "model": "doubao-seed-1-6-251015",
    "previous_response_id": "resp_02175698000123456789abcdef0123",  # Associate with the previous request
    "input": [
        {
            "type": "function_call_output",  # Return tool results
            "call_id": "call_abc123def456ghi789jkl0",   #  Consistent with the call_id of the instruction
            "output": "{\\"city\\":\\"北京\\",\\"date\\":\\"2025-10-13\\",\\"temperature\\":\\"18~28℃\\",\\"condition\\":\\"晴转多云\\",\\"wind\\":\\"东北风2级\\"}"
        }
    ]
  }'
```

最终响应如下，响应控制器解析响应发现没有 `function_call` \*\*\*\*指令了，说明本次指令模型完成处理了，则可以直接返回模型的结果：北京今天（2025-10-13）的天气为晴转多云，气温在18~28℃之间，东北风2级。否则继续执行工具调用。

```python
{
    "created_at": 1756980100,
    "id": "resp_02175698010abcdef0123456789gh",
    "model": "doubao-seed-1-6-250615",
    "object": "response",
    "output": [
        {
            "type": "message",
            "role": "assistant",
            "content": [
                {
                    "type": "output_text",
                    "text": "北京今天（2025-10-13）的天气为晴转多云，气温在18~28℃之间，东北风2级。"
                }
            ],
            "status": "completed",
            "id": "msg_02175698010abcdef0123456789ij"
        }
    ],
    "status": "completed",
    "store": true
}
```

## 四、MCP

<br>

对于产品经理来说，不需要了解MCP协议具体是如何实现的、如何开发一个MCP。

只需要了解：MCP概念、交互流程、判断是使用已有MCP还是自己开发、以及MCP需要什么参数和返回什么响应数据。

就像我们只需要了解前后端是什么、前后端是如何交互的、判断是使用外部现成 API 还是自己开发一样、以及API需要什么参数和返回什么响应数据一样，便于我们和技术更好的沟通。

<br>

### 1\. MCP解决了什么问题

**Function Calling** 解决了核心问题：让LLM能够稳定地输出结构化的工具调用请求，实现了"非结构化→结构化"的转换。这是AI Agent工具能力的基础。

但在实际应用中，开发者很快发现了几个新的问题：

1.  每个工具的API接口都不一样，需要特殊适配。
    
2.  在A应用里做了适配，B应用里又得适配一遍，无法复用。
    

这时候，MCP（Model Context Protocol 模型上下文协议）作为一个连接应用和工具的桥梁就派上用场了。

举个例子：

我们的AI应用是台笔记本电脑，每个工具是外接设备（摄像头、显示器、鼠标、键盘…）。

-   **MCP出现之前：**每个外接设备都使用不同的端口（HDMI、Type-C、VGA….），每台笔记本电脑都要适配各种端口，不仅端口特别多，而且出现了新的设备又得进行适配。另外，不同品牌适配的端口也可能存在差异。
    
-   **MCP出现之后：**MCP相当于Type-C设备端口，不同外接设备厂商只要支持Type-C端口，就可以在所有支持Type-C端口的电脑上使用，而不同笔记本厂商只要支持Type-C端口，也就可以使用所有支持Type-C端口的外接设备。
    

![](../.resources/image-1778904815118.png)![](../.resources/image-1778904822749.png)

### 2\. Agent、大语言模型和MCP是如何交互的

-   **Agent**：整个系统的编排中心（如 Claude Desktop、Cursor 或自定义 App），负责管理用户交互、协调大语言模型调用与 MCP 客户端 通信，进行权限管理。Agent 内部包含 MCP 客户端 和 大语言模型调用逻辑。
    
-   **大语言模型**：Agent 内部调用的推理引擎，负责理解用户意图、决策是否调用工具，并生成结构化的工具调用请求（function\_call）或最终回答。
    
-   **MCP 客户端**：Agent 内部的通信模块，负责与 MCP 客户端 建立连接、发现能力、转发工具调用请求并接收结果。
    
-   **MCP 服务端**：独立运行的外部服务，提供具体的工具和资源（如 Google Drive 读取器、SQLite 数据库接口等），响应 MCP 客户端 的请求并返回执行结果。
    

```mermaid
sequenceDiagram
    autonumber
    
    actor User as 用户 (User)
    participant Host as Agent
    participant LLM as 大语言模型
    participant Client as MCP 客户端 (内部模块)
    participant Server as MCP 服务端

    Note over Host,Client: Agent 集成了 MCP 客户端

    %% ================= Phase 1: 连接与初始化 =================
    Note over Client,Server: 阶段一：连接
    
    Host->>Client: 1. 读取 MCP 配置，启动 Client
    Client->>Server: 2. 请求连接
    Server-->>Client: 3. 连接成功
    
    %% ================= Phase 2: 能力发现 =================
    Note over Client,Server: 阶段二：能力发现
    Client->>Server: 4. 拉取可用工具列表、资源列表
    Server-->>Client: 5. 返回工具、资源清单
    Client-->>Host: 6. 将发现的工具、资源返回给Agent

    %% ================= Phase 3: 核心交互与执行 =================
    Note over User,Server: 阶段二：用户交互与任务执行
    
    User->>Host: 7. 发送自然语言指令<br/>(例如: "分析服务器日志资源并总结")
    Host->>LLM: 8. 用户指令 + 工具定义
    
    Note over LLM: 9. 推理决定是否需要调用工具
    
    LLM-->>Host: 返回 function_call 指令<br/>(工具名 + 参数)
    
    Host->>Client: 10. 解析指令，转发工具调用请求
    
    Client->>Server: 11. 发送工具调用请求
    Server-->>Client: 12. 返回工具执行结果
    
    Client-->>Host: 13. 返回执行结果
    Host->>LLM: 14. 将工具结果注入上下文，再次请求 LLM
    
    Note over LLM: 15. 综合上下文生成最终回答
    
    LLM-->>Host: 返回最终文本响应
    Host-->>User: 16. 输出最终结果
```

### 3\. 如何使用MCP

阿里魔塔（[https://modelscope.cn/mcp）上集成了近万个MCP，可以搜索和筛选需要的MCP。](https://modelscope.cn/mcp%EF%BC%89%E4%B8%8A%E9%9B%86%E6%88%90%E4%BA%86%E8%BF%91%E4%B8%87%E4%B8%AAMCP%EF%BC%8C%E5%8F%AF%E4%BB%A5%E6%90%9C%E7%B4%A2%E5%92%8C%E7%AD%9B%E9%80%89%E9%9C%80%E8%A6%81%E7%9A%84MCP%E3%80%82)

![](../.resources/image-1778904851109.png)

在MCP详情中有个服务配置，就是MCP配置数据，可以通过Remote或者stdio进行调用。

| 对比项 | Remote（远程调用） | Stdio（本地进程标准输入输出） |
| --- | --- | --- |
| 连接方式 | 通过网络请求连接远程服务器上的 MCP Server，只需填一个 URL 地址即可。 | 在本地启动一个进程，通过标准输入（stdin）和标准输出（stdout）与 MCP Server 通信，MCP Server 和你的应用运行在同一台机器上。 |
| 优点  | 不需要本地安装任何依赖，配置简单，填个地址就能用。 | 本地通信开销小，通常更低延迟 |
| 缺点  | 受网络、带宽影响，可能更高延迟 | 需要在本地安装对应的运行环境（如 Node.js、Python 等）和相关依赖包，配置相对复杂。 |
| 适用场景 | 适合快速体验、轻量集成、不想管理本地环境的场景。 | 适合对性能和安全性要求较高、需要频繁调用的生产环境。 |

![](../.resources/image-1778904872406.png)![](../.resources/image-1778904888142.png)

## 五、Skill

**Skill 是由 Anthropic 于 2025 年 10 月提出的一种开放标准**，核心思想是把指令、脚本和资源打包成一个标准化的文件夹（"技能包"），让 AI Agent 能够按需动态加载和执行特定任务。

### 1\. Skill 解决了什么问题

**Function Calling** 让 LLM 能调用工具，**MCP** 统一了工具接口标准。但在实际应用中，还有一个问题没解决：

1.  Agent 虽然通用能力很强，但缺乏特定领域的专业知识和流程。
    
2.  每次都要在 System Prompt 里塞入大量指令，导致上下文污染、复用性差。
    

这时候，**Skill（代理技能）** 就派上用场了。Skill 由 Anthropic 于 2025 年 10 月提出，是一种开放式构建标准，核心是将复杂的业务逻辑、操作指令和外部知识封装为标准化的模块，让 AI Agent 能像调用"技能包"一样，按需动态加载和执行特定任务。

举个例子：

Agent 就像一个刚入职的新员工，虽然综合素质很强（大模型能力），但对公司业务流程一无所知。

-   **Skill 出现之前：**每次给新员工布置任务，都要口头从头讲一遍完整流程（把所有规则塞进 System Prompt），不仅费时费力，而且容易遗漏。
    
-   **Skill 出现之后：Skill 相当于给新员工准备了一套标准化的岗位 SOP 手册**，需要做什么任务就翻对应的手册，里面有详细的操作指令、脚本和参考资料，按需查阅即可。
    

### 2\. Skill 的组成

一个 Skill 本质上就是一个包含 `SKILL.md` 的文件夹，结构如下：

```
my-skill/
├── SKILL.md          # 入口文件：技能描述、触发条件、基本指令
├── scripts/          # 可执行脚本（Python、Shell 等）
├── templates/        # 模板文件（报告模板、代码模板等）
└── resources/        # 参考资料（文档、数据、示例等）
```

-   [**SKILL.md**](http://SKILL.md)**（入口文件）**：描述这个技能是做什么的、什么时候触发、基本操作指令
    
-   **scripts（脚本）**：可执行的代码，让 Agent 从"建议者"变为"执行者"
    
-   **templates（模板）**：标准化的输出模板
    
-   **resources（资源）**：参考文档、数据等辅助材料
    

### 3\. 核心机制：渐进式披露

Skill 采用**渐进式披露**（Progressive Disclosure）机制，信息按需分级加载，而不是一次性全部塞入上下文：

**传统 System Prompt**

所有规则一次性全量塞入上下文→Token 浪费、注意力分散、指令漂移

**Skill 渐进式披露**

Agent 按需加载技能片段→Token 高效利用、执行精准

具体分为三个层级：

1.  **目录层（低成本）**：Agent 平时只知道有哪些 Skill 可用（相当于只看手册目录）
    
2.  **摘要层（按需加载）**：当用户请求匹配某个 Skill 时，加载该 Skill 的详细指令
    
3.  **执行层（深度加载）**：需要执行具体操作时，加载脚本、模板等完整资源
    

### 4\. Skill vs MCP

| 对比项 | Skill（工作手册 📖） |
| --- | --- |
| 定位  | 教 Agent **怎么做**：封装流程、知识、指令 |
| 组成  | [SKILL.md](http://SKILL.md) • 脚本 + 模板 + 资源 |
| 加载方式 | 渐进式披露，按需加载 |
| 关系  | **互补关系**：一个 Skill 内部可以调用 MCP 提供的工具来完成任务。Skill 定义"做什么、怎么做"，MCP 提供"用什么工具做"。 |

简单来说：**Skill 是 SOP 手册，MCP 是工具箱。** 手册里会写"第三步用扳手拧螺丝"，而扳手就是通过 MCP 提供的。

### 5\. 应用场景

Skill 特别适合需要**标准化、流程化**的企业任务：

-   **客户服务**：封装投诉处理、退换货等特定流程的 SOP
    
-   **数据分析**：根据文件类型自动选择分析方法并生成报告
    
-   **文档编辑**：如 Claude 的 PDF 编辑功能，就是通过 PDF Skill 实现的
    

### 6\. 如何使用 Skill

Skill 目前已获得多个平台的支持：

| 平台  | 支持状态 | 使用方式 |
| --- | --- | --- |
| Claude Code | 完整支持 | 原生集成 |
| [Claude.ai](http://Claude.ai) | 完整支持 | 设置上传 |
| VS Code | 完整支持 | chat.useAgentSkills |
| Cursor | 完整支持 | 文档支持 |
| GitHub Copilot | 完整支持 | 原生集成 |
| OpenAI Codex | 完整支持 | 官方支持 |

Anthropic 官方 Skill 仓库：[https://github.com/anthropics/skills](https://github.com/anthropics/skills)

Agent Skills 开放标准官网：[https://agentskills.io](https://agentskills.io)

## 六、Harness

![](../.resources/image-1778904905130.png)

Agent = Model + Harness。

图中最核心的位置是 Model——那个蓝色芯片图标，代表 Claude 的大语言模型。但模型本身只是一个推理引擎，它不能独立行动。真正让它变成 Agent 的，是包裹在它周围的五个 Harness 组件。

-   **Tools（工具），**模型的手脚。Read、Write、Edit、Bash、Grep……这些工具赋予模型与文件系统、终端、网络交互的能力。没有工具，模型只能说，不能做。
    
-   **Context（上下文）**，模型的记忆加载器。[CLAUDE.md](http://claude.md/)、系统提示词、对话历史、工具定义——这些上下文在每一轮循环中被注入模型，决定了模型看到什么、知道什么。上下文管理的精妙之处是，它不仅是被动的信息传递，还包括主动的压缩和重注入策略。
    
-   **Memory（记忆）**，模型的长期存储。跨会话的记忆持久化，让模型能“记住”你的偏好、项目规则和历史决策。[CLAUDE.md](http://claude.md/) 是显式记忆，自动记忆（~/.claude/memory/）是隐式记忆。没有 Memory，每次对话都从零开始。
    
-   **Hooks（钩子）**，模型的神经反射。事件驱动的自动化机制，在工具执行前后触发自定义逻辑。比如每次保存文件前自动格式化，每次提交前自动运行 lint。Hooks 让 Harness 有了“条件反射”的能力——不需要模型主动决策，某些行为会自动发生。
    
-   **Permissions（权限）**——模型的安全围栏。哪些工具可以自由使用，哪些需要人工审批，哪些完全禁止——权限系统是 Harness 的安全底线。它解决了一个核心矛盾：你希望 Agent 足够自主以提高效率，但又不希望它自主到失控。
    

注意图中的空间关系：Model 在中心，五个组件围绕它排列，整体被一个名为 Harness 的边框包裹。这不是随意的布局，它精确表达了一个架构事实：模型不直接接触外部世界，所有交互都通过 Harness 的组件中转。Harness 是模型和现实之间的唯一接口。

这五个组件也不是孤立的。Tools 的执行结果变成 Context 的一部分；Hooks 在 Tools 执行前后触发；Permissions 决定哪些 Tools 可以被调用；Memory 用于跨会话保留 Context 中的关键信息。它们构成了一个协同运转的系统，少了任何一个，Agent 的能力都会大打折扣。