feat(ai-protocols): add MCP and A2A protocol demos and documentation
docs(ai-protocols): update AI protocols page with visual demos and detailed explanations style(git-demos): improve responsive design and layout for git visualization components refactor(ai-history): simplify and clean up demo components chore: update config to register new AI protocol components
This commit is contained in:
@@ -1,553 +1,124 @@
|
||||
# API 设计哲学(REST / GraphQL / gRPC)
|
||||
::: tip 🎯 核心问题
|
||||
**前后端如何高效对话?** 这就像问:餐厅的菜单怎么设计,客人一看就懂?服务员怎么记单,不会出错?上菜怎么规范,客人满意?API 设计解决的就是"对话规则"的问题。
|
||||
:::
|
||||
# API 设计:前后端的通用语言
|
||||
|
||||
> 💡 **学习指南**:这一章我们聊聊前后端如何高效对话。如果你被后端接口的命名搞晕过,或者不知道该返回 200 还是 404,这篇文章就是为你准备的。我们将通过一个交互式 Demo,带你理解 RESTful API 的设计精髓。
|
||||
|
||||
---
|
||||
|
||||
## 1. 为什么要"API 设计"?
|
||||
## 0. 先问一个问题:你有没有经历过这些噩梦?
|
||||
|
||||
### 1.1 从混乱到规范
|
||||
**场景一:接口猜谜**
|
||||
|
||||
想象一下你走进一家餐厅:
|
||||
后端给你一个接口 `/getUser`,你调用了,返回 `null`。
|
||||
你是传错了参数?还是数据库没数据?还是服务器崩了?完全不知道。
|
||||
|
||||
- **菜单(API 文档)**:清楚标注了每道菜的口味、配料、价格
|
||||
- **服务员(HTTP 协议)**:用标准化的方式记录你的点餐
|
||||
- **后厨(服务端)**:按约定流程烹饪
|
||||
- **上菜(响应)**:盘子摆盘规范,附带小票说明
|
||||
|
||||
**好的 API 设计就像这套点餐系统**——双方约定好"说什么话"、"怎么说话"、"出错怎么办",才能高效协作。
|
||||
|
||||
但很多团队的真实情况是:
|
||||
|
||||
- 接口命名随心所欲:`/getUserData`、`/fetchUserInfo`、`/queryUserById` 并存
|
||||
- 错误处理五花八门:有的返回 HTTP 状态码,有的返回 `code: 500`,有的直接抛异常
|
||||
- 响应结构千人千面:同一个项目里,有的用 `data`,有的用 `result`,有的用 `content`
|
||||
|
||||
<RestfulDesignDemo />
|
||||
|
||||
**结果就是**:前后端互相猜,联调痛苦,维护成本高,新人入职一脸懵。
|
||||
|
||||
::: tip 💡 通俗解释
|
||||
**API**(Application Programming Interface,应用程序编程接口)就像"餐厅的服务协议":
|
||||
|
||||
- **RESTful** = 餐厅点餐:有菜单、有流程、有规范
|
||||
- **GraphQL** = 自助餐:想要什么,自己组合
|
||||
- **gRPC** = 快递:二进制格式,速度最快
|
||||
|
||||
**为什么需要设计?**
|
||||
|
||||
- 没有设计 = 服务员随机记单 → 后厨看不懂、客人等半天
|
||||
- 有设计 = 标准化流程 → 效率高、错误少
|
||||
:::
|
||||
|
||||
---
|
||||
|
||||
## 2. RESTful 设计:让你的 URL 会说话
|
||||
|
||||
### 2.1 什么是 RESTful?
|
||||
|
||||
**REST**(Representational State Transfer,表述性状态传递)是一种软件架构风格,由 Roy Fielding 在 2000 年提出。
|
||||
|
||||
**核心思想**:把网络上的所有事物都抽象为"资源"(Resource),用 URL 标识资源,用 HTTP 方法操作资源。
|
||||
|
||||
<ResourceAnalogyDemo />
|
||||
|
||||
::: tip 💡 资源是什么?
|
||||
**资源**(Resource)是 REST 架构的核心概念:
|
||||
|
||||
- 有唯一标识(URL)
|
||||
- 有表达方式(JSON/XML/HTML)
|
||||
- 有操作方法(GET/POST/PUT/DELETE)
|
||||
|
||||
**比喻**:
|
||||
|
||||
- URL 是"仓库的货架地址":`/warehouse/products` 是"产品区"
|
||||
- HTTP 方法是"允许的操作":GET(查看)、POST(入库)、PUT(更新)、DELETE(出库)
|
||||
|
||||
**关键点**:
|
||||
|
||||
- URL 是名词,不是动词:`/users` 而不是 `/getUsers`
|
||||
- HTTP 方法已经表达了操作,不需要在 URL 里重复
|
||||
:::
|
||||
|
||||
### 2.2 URL 设计的 7 个黄金法则
|
||||
|
||||
<HttpMethodsDemo />
|
||||
|
||||
| 法则 | 正确示例 | 错误示例 | 原因 |
|
||||
| ---------------------- | --------------------------------------------- | ----------------------------------------- | ---------------------------------------- |
|
||||
| **1. 用名词,不用动词** | `GET /users` | `GET /getUsers` | URL 是资源地址,不是操作 |
|
||||
| **2. 用复数** | `GET /orders` | `GET /order` | 一致性好,表示集合 |
|
||||
| **3. 小写字母** | `/user-profiles` | `/UserProfiles` | URL 大小写敏感,统一小写避免混乱 |
|
||||
| **4. 用连字符** | `/user-profiles` | `/user_profiles` | 连字符是 URL 规范,下划线在某些场景会转义 |
|
||||
| **5. 避免层级过深** | `/users/123/orders` | `/users/123/orders/456/items/789/status` | 超过 3 层考虑用查询参数或重构 |
|
||||
| **6. 用查询参数过滤** | `GET /products?category=phone&price_max=5000` | `GET /products/category/phone/price/5000` | 过滤条件多且变动,不适合放路径 |
|
||||
| **7. 版本号放 URL** | `/v1/users` 或 `v1.users.api.com` | 混用新旧接口无版本 | 便于灰度发布和向后兼容 |
|
||||
|
||||
::: tip 📊 从表格中你能看到什么?
|
||||
**规则 1-4**是"一致性"原则:
|
||||
|
||||
- 统一名词、复数、大小写,让团队所有人写的 URL 风格一致
|
||||
- 减少认知负担,一眼就知道这是什么资源
|
||||
|
||||
**规则 5-6**是"灵活性"原则:
|
||||
|
||||
- 层级太深 = 耦心度太高,难以维护
|
||||
- 查询参数 = 更灵活,可以组合任意过滤条件
|
||||
|
||||
**规则 7**是"兼容性"原则:
|
||||
|
||||
- API 是长期契约,不能随意改
|
||||
- 版本号让新旧接口并存,平滑升级
|
||||
:::
|
||||
|
||||
### 2.3 HTTP 方法的选择
|
||||
|
||||
| 方法 | 用途 | 幂等性\* | 安全性\*\* | 典型场景 |
|
||||
| ---------- | -------- | -------- | ---------- | -------------------------- |
|
||||
| **GET** | 获取资源 | 是 | 是 | 查询列表、查看详情 |
|
||||
| **POST** | 创建资源 | 否 | 否 | 新增用户、提交订单 |
|
||||
| **PUT** | 全量更新 | 是 | 否 | 替换整个用户资料 |
|
||||
| **PATCH** | 部分更新 | 否 | 否 | 修改用户昵称(只传一个字段) |
|
||||
| **DELETE** | 删除资源 | 是 | 否 | 删除用户、取消订单 |
|
||||
|
||||
> **\*幂等性**:多次执行结果相同。比如 PUT 同一个资源 10 次,结果还是那一个资源。\***\*安全性**:不会改变服务器状态。GET 是安全的,POST/PUT/DELETE 都不安全。
|
||||
|
||||
::: details 🔧 幂等性为什么重要?
|
||||
**场景**:用户点击"支付"按钮,但网络延迟,用户又点了一次。
|
||||
|
||||
- **幂等的操作**(PUT/DELETE):点击 10 次和点击 1 次,结果相同。不会重复扣款。
|
||||
- **不幂等的操作**(POST):点击 10 次,可能创建 10 个订单。
|
||||
|
||||
**解决方案**:
|
||||
|
||||
- **客户端**:按钮点击后禁用,防止重复提交
|
||||
- **服务端**:POST 操作用唯一 ID 校验,避免重复处理
|
||||
|
||||
**关键点**:幂等性是分布式系统正确性的重要保证。
|
||||
:::
|
||||
|
||||
### 2.4 实战示例:电商系统的 RESTful API
|
||||
|
||||
```
|
||||
# 用户模块
|
||||
GET /v1/users # 获取用户列表(支持分页、过滤)
|
||||
POST /v1/users # 创建新用户
|
||||
GET /v1/users/{id} # 获取用户详情
|
||||
PUT /v1/users/{id} # 全量更新用户信息
|
||||
PATCH /v1/users/{id} # 部分更新(如:修改密码)
|
||||
DELETE /v1/users/{id} # 删除用户
|
||||
|
||||
# 订单模块(嵌套资源,最多 3 层)
|
||||
GET /v1/users/{id}/orders # 获取某用户的所有订单
|
||||
POST /v1/users/{id}/orders # 为用户创建订单
|
||||
GET /v1/orders/{orderId} # 获取订单详情(扁平化,避免过深)
|
||||
PATCH /v1/orders/{orderId}/status # 更新订单状态(子资源操作)
|
||||
|
||||
# 商品模块(复杂过滤用查询参数)
|
||||
GET /v1/products?category=electronics&price_min=100&price_max=5000&sort=price_desc&page=2&page_size=20
|
||||
|
||||
# 复杂报表(特殊场景,URL 可带动词)
|
||||
POST /v1/reports/sales/export # 导出销售报表(非纯 CRUD,动词可接受)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 3. 状态码:让错误"会说话"
|
||||
|
||||
### 3.1 为什么状态码很重要?
|
||||
|
||||
<StatusCodeDemo />
|
||||
|
||||
想象一下,如果你的 API 不管成功失败都返回 `200 OK`,客户端该怎么判断?
|
||||
|
||||
```json
|
||||
// ❌ 错误的做法:HTTP 200,但业务失败
|
||||
HTTP/1.1 200 OK
|
||||
{
|
||||
"success": false,
|
||||
"error": "用户不存在"
|
||||
}
|
||||
```
|
||||
|
||||
**问题在哪?**
|
||||
|
||||
- 缓存层(CDN、浏览器)会缓存这个"成功的"响应
|
||||
- 监控工具以为一切正常
|
||||
- 前端需要额外解析 JSON 才知道有没有错
|
||||
|
||||
**正确的做法**:用 HTTP 状态码表示传输层状态,和业务成功/失败解耦。
|
||||
|
||||
### 3.2 常用状态码速查表
|
||||
|
||||
| 状态码 | 含义 | 使用场景 | 响应体内容 |
|
||||
| ------------------------- | -------------- | ---------------------------------------------- | ------------------------ | --- |
|
||||
| **2xx 成功** | | | | |
|
||||
| 200 OK | 通用成功 | GET 查询成功、PUT/PATCH 更新成功 | 资源数据 |
|
||||
| 201 Created | 创建成功 | POST 创建资源成功 | 新资源数据 + Location 头 |
|
||||
| 202 Accepted | 已接受 | 异步任务提交成功(如:导出报表) | 任务状态/轮询地址 |
|
||||
| 204 No Content | 无内容 | DELETE 删除成功、PUT 更新但无需返回数据 | 空(用缓存) |
|
||||
| **3xx 重定向** | | | | |
|
||||
| 301 Moved Permanently | 永久重定向 | 资源 URL 永久变更(如:v1 废弃,跳转 v2) | 新 URL |
|
||||
| 302 Found | 临时重定向 | 临时跳转(较少用于 API) | 临时 URL |
|
||||
| 304 Not Modified | 未修改 | 缓存有效(配合 If-None-Match/If-Modified-Since) | 空(用缓存) |
|
||||
| **4xx 客户端错误** | | | | |
|
||||
| 400 Bad Request | 请求格式错误 | 参数缺失、JSON 格式错误、字段类型不对 | 错误详情 |
|
||||
| 401 Unauthorized | 未认证 | 缺少 Token、Token 过期、签名错误 | 认证方式说明 |
|
||||
| 403 Forbidden | 禁止访问 | 已登录但无权限(如:普通用户访问管理员接口) | 无权限说明 |
|
||||
| 404 Not Found | 资源不存在 | URL 错误、资源已删除 | 错误详情 |
|
||||
| 405 Method Not Allowed | 方法不允许 | 如:对只读资源调用 POST | 允许的 Methods |
|
||||
| 409 Conflict | 资源冲突 | 重复创建(唯一约束冲突)、乐观锁版本冲突 | 冲突详情 |
|
||||
| 422 Unprocessable Entity | 语义错误 | 请求格式对,但业务校验失败(如:密码太短) | 校验错误详情 |
|
||||
| 429 Too Many Requests | 请求过多 | 触发限流(Rate Limiting) | 重试时间 |
|
||||
| **5xx 服务端错误** | | | | |
|
||||
| 500 Internal Server Error | 服务器内部错误 | 未捕获的异常、代码 bug | 错误 ID(不要暴露堆栈) |
|
||||
| 502 Bad Gateway | 网关错误 | 反向代理(Nginx)无法连接到后端服务 | - |
|
||||
| 503 Service Unavailable | 服务不可用 | 服务正在维护、过载保护触发 | 恢复时间估计 |
|
||||
| 504 Gateway Timeout | 网关超时 | 后端响应太慢,被代理层切断 | - |
|
||||
|
||||
::: tip 📊 从表格中你能看到什么?
|
||||
**2xx(成功)** vs **3xx(重定向)** vs **4xx(客户端错误)** vs **5xx(服务端错误)**:
|
||||
|
||||
- **2xx**:一切正常,客户端可以继续
|
||||
- **3xx**:资源换地方了,告诉客户端去哪找
|
||||
- **4xx**:客户端搞错了,修正请求后重试
|
||||
- **5xx**:服务端出问题了,客户端等一等再试,或者联系管理员
|
||||
|
||||
**关键点**:正确的状态码让客户端、浏览器、CDN、监控工具都能正确理解响应。
|
||||
:::
|
||||
|
||||
### 3.3 状态码使用的"避坑指南"
|
||||
|
||||
**坑 1:所有错误都用 400**
|
||||
|
||||
```
|
||||
❌ GET /users/999 → 400 (用户不存在应该返回 404)
|
||||
❌ POST /login 密码错误 → 400 (应该返回 401 或 422)
|
||||
❌ 删除已删除的资源 → 400 (应该返回 404 或 204)
|
||||
```
|
||||
|
||||
**坑 2:业务状态混在 HTTP 状态码里**
|
||||
|
||||
```
|
||||
❌ 订单支付失败 → 402 Payment Required (这个状态码是为数字钱包预留的,不要滥用)
|
||||
✅ 订单支付失败 → 200 OK + body: { "code": "PAYMENT_FAILED", "message": "余额不足" }
|
||||
```
|
||||
|
||||
**坑 3:暴露敏感信息**
|
||||
|
||||
```
|
||||
❌ 500 响应里返回完整的堆栈跟踪、SQL 查询语句、数据库连接信息
|
||||
✅ 只返回 "错误 ID",详细日志记录到服务器,通过错误 ID 关联
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 4. 请求与响应:标准化的数据契约
|
||||
|
||||
### 4.1 请求结构设计
|
||||
|
||||
<RequestStructureDemo />
|
||||
|
||||
**HTTP 请求由 3 部分组成**:
|
||||
|
||||
```http
|
||||
# 1. 请求行(方法 + URL + 协议版本)
|
||||
POST /v1/users HTTP/1.1
|
||||
|
||||
# 2. 请求头(元数据)
|
||||
Host: api.example.com
|
||||
Content-Type: application/json
|
||||
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
|
||||
X-Request-ID: req-123456789
|
||||
Accept: application/json
|
||||
Accept-Language: zh-CN,zh;q=0.9
|
||||
|
||||
# 3. 请求体(仅 POST/PUT/PATCH 需要)
|
||||
{
|
||||
"name": "张三",
|
||||
"email": "zhangsan@example.com",
|
||||
"phone": "13800138000"
|
||||
}
|
||||
```
|
||||
|
||||
#### 查询参数设计规范
|
||||
|
||||
```http
|
||||
# 分页(必须)
|
||||
GET /products?page=1&page_size=20
|
||||
|
||||
# 排序(可选)
|
||||
GET /products?sort=created_at&order=desc
|
||||
|
||||
# 过滤(可选,支持多种操作符)
|
||||
GET /products?price_min=100&price_max=5000 # 范围
|
||||
GET /products?category=electronics,clothing # 多选(IN)
|
||||
GET /products?status=active&is_featured=true # 布尔
|
||||
GET /products?search=iphone # 全文搜索
|
||||
|
||||
# 字段选择(可选,减少数据传输)
|
||||
GET /products?fields=id,name,price
|
||||
|
||||
# 组合使用
|
||||
GET /products?page=1&page_size=20&sort=price&order=asc&category=electronics&price_max=5000&fields=id,name,price
|
||||
```
|
||||
|
||||
#### 请求头设计规范
|
||||
|
||||
| 头部字段 | 用途 | 示例 | 是否必需 |
|
||||
| ------------------ | ------------ | ----------------------------------------- | --------------------- |
|
||||
| `Authorization` | 认证信息 | `Bearer eyJhbGciOiJIUzI1NiIs...` | 受保护接口必需 |
|
||||
| `Content-Type` | 请求体格式 | `application/json` | POST/PUT/PATCH 必需 |
|
||||
| `Accept` | 期望响应格式 | `application/json` | 建议携带 |
|
||||
| `Accept-Language` | 期望语言 | `zh-CN,zh;q=0.9,en;q=0.8` | 多语言应用必需 |
|
||||
| `X-Request-ID` | 请求唯一标识 | `req-550e8400-e29b-41d4-a716-44665544000` | 建议携带,便于追踪 |
|
||||
| `X-Client-Version` | 客户端版本 | `iOS-2.5.1` / `Web-3.0.0` | 建议携带,便于问题排查 |
|
||||
| `If-None-Match` | 缓存校验 | `"abc123"` | 可选,用于乐观并发控制 |
|
||||
|
||||
### 4.2 响应结构设计
|
||||
|
||||
<ResponseStructureDemo />
|
||||
|
||||
**标准化响应结构**(无论成功与否,结构一致):
|
||||
**场景二:状态码撒谎**
|
||||
|
||||
你收到了一个 HTTP 200 OK 的响应,心想“稳了”。
|
||||
结果打开 Body 一看:
|
||||
```json
|
||||
{
|
||||
"code": 0,
|
||||
"message": "success",
|
||||
"data": { ... },
|
||||
"request_id": "req-123456789",
|
||||
"timestamp": "2024-01-15T09:30:00.000Z"
|
||||
"code": 500,
|
||||
"msg": "系统内部错误",
|
||||
"data": null
|
||||
}
|
||||
```
|
||||
浏览器缓存了它,监控系统认为它成功了,只有你的前端代码在风中凌乱。
|
||||
|
||||
#### 响应字段说明
|
||||
**场景三:版本地狱**
|
||||
|
||||
| 字段 | 类型 | 说明 | 示例 |
|
||||
| ------------ | ------- | ---------------------------------------------------------- | ------------------------------------------- |
|
||||
| `code` | integer | 业务状态码,`0` 表示成功,非 `0` 表示失败 | `0`, `10001`, `20003` |
|
||||
| `message` | string | 状态描述,成功时为 `"success"`,失败时为错误描述 | `"success"`, `"用户不存在"` |
|
||||
| `data` | any | 业务数据,成功时返回具体数据,失败时可返回 `null` 或错误详情 | `{ "id": 1, "name": "张三" }` |
|
||||
| `request_id` | string | 请求唯一标识,用于问题追踪 | `"req-550e8400-e29b-41d4-a716-44665544000"` |
|
||||
| `timestamp` | string | 响应时间戳,ISO 8601 格式 | `"2024-01-15T09:30:00.000Z"` |
|
||||
|
||||
#### 分页响应结构
|
||||
|
||||
```json
|
||||
{
|
||||
"code": 0,
|
||||
"message": "success",
|
||||
"data": {
|
||||
"list": [
|
||||
{ "id": 1, "name": "商品A", "price": 100 },
|
||||
{ "id": 2, "name": "商品B", "price": 200 }
|
||||
],
|
||||
"pagination": {
|
||||
"page": 1,
|
||||
"page_size": 20,
|
||||
"total": 156,
|
||||
"total_pages": 8,
|
||||
"has_next": true,
|
||||
"has_prev": false
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
::: tip 💡 为什么要 request_id?
|
||||
**request_id** 是问题追踪的关键:
|
||||
|
||||
1. **用户反馈**:"支付失败,错误 ID 是 abc123"
|
||||
→ 技术人员直接在日志里搜索 abc123,立即定位问题
|
||||
|
||||
2. **分布式追踪**:
|
||||
- 请求经过 API Gateway → Service A → Service B
|
||||
- 每个服务都记录相同的 request_id
|
||||
- 日志系统可以把所有相关日志聚合起来
|
||||
|
||||
3. **性能分析**:
|
||||
- 统计某个 request_id 的完整链路耗时
|
||||
|
||||
- 发现瓶颈在哪个服务
|
||||
|
||||
**关键点**:request_id 是可观测性的基础,没有它,分布式系统的问题排查是地狱模式。
|
||||
:::
|
||||
项目迭代了三年,你的代码里充满了这样的 URL:
|
||||
- `/api/v1/user/update`
|
||||
- `/api/v2/user/update_new`
|
||||
- `/api/user/update_final_real`
|
||||
|
||||
---
|
||||
|
||||
## 5. 错误处理:优雅地"拒绝"
|
||||
**API 设计就是为了解决这些问题。**
|
||||
|
||||
### 5.1 为什么错误处理如此重要?
|
||||
它就像餐厅的菜单和点餐流程:规定了我们**怎么点菜(请求)**、**怎么上菜(响应)**、**没菜了怎么办(错误处理)**。
|
||||
|
||||
<ErrorHandlingDemo />
|
||||
|
||||
一个好的错误处理机制,能让客户端"看状态码就知道怎么回事",而不是去猜。
|
||||
|
||||
**错误的示范**:
|
||||
|
||||
```json
|
||||
HTTP/1.1 200 OK
|
||||
{
|
||||
"error": "出错了"
|
||||
}
|
||||
```
|
||||
|
||||
**问题**:
|
||||
|
||||
- HTTP 状态码说"成功",但业务说"出错"
|
||||
- 错误信息太笼统,无法定位问题
|
||||
- 没有错误代码,难以程序化判断
|
||||
|
||||
**正确的示范**:
|
||||
|
||||
```json
|
||||
HTTP/1.1 422 Unprocessable Entity
|
||||
{
|
||||
"code": 20003,
|
||||
"message": "密码强度不足",
|
||||
"errors": [
|
||||
{
|
||||
"field": "password",
|
||||
"code": "VALIDATION_ERROR",
|
||||
"message": "密码必须包含至少 1 个大写字母、1 个小写字母、1 个数字,且长度至少 8 位"
|
||||
}
|
||||
],
|
||||
"request_id": "req-550e8400-e29b-41d4-a716-44665544000",
|
||||
"timestamp": "2024-01-15T09:30:00.000Z",
|
||||
"help_url": "https://docs.example.com/errors/20003"
|
||||
}
|
||||
```
|
||||
|
||||
### 5.2 错误码设计规范
|
||||
|
||||
::: tip 💡 错误码的分层设计
|
||||
**分层错误码**的好处:
|
||||
|
||||
- **可程序化判断**:前端根据 `code` 字段决定行为,而不是解析 `message`
|
||||
- **国际化友好**:`code` 不变,`message` 可以根据用户语言返回不同文本
|
||||
- **文档化**:每个错误码都有文档,开发者可以查
|
||||
|
||||
**结构**:1XXYY
|
||||
|
||||
- 第 1 位(1):固定,表示错误
|
||||
- 第 2-3 位(XX):模块/层次
|
||||
- 第 3-4 位(YY):具体错误
|
||||
|
||||
**示例**:
|
||||
|
||||
- `10001`:通用错误(参数错误)
|
||||
- `10010`:用户模块(用户不存在)
|
||||
- `20003`:业务错误(密码强度不足)
|
||||
:::
|
||||
|
||||
#### 分层错误码体系
|
||||
|
||||
```
|
||||
错误码格式:1XXYY
|
||||
- 第 1 位(1):固定,表示错误
|
||||
- 第 2-3 位(XX):模块/层次
|
||||
- 第 4-5 位(YY):具体错误
|
||||
```
|
||||
|
||||
| 模块代码 | 模块名称 | 说明 |
|
||||
| -------- | ---------- | ------------------------ |
|
||||
| 00 | 通用 | 系统级、通用错误 |
|
||||
| 10 | 用户模块 | 注册、登录、用户信息相关 |
|
||||
| 11 | 认证授权 | Token、权限相关 |
|
||||
| 20 | 商品模块 | 商品 CRUD、库存相关 |
|
||||
| 30 | 订单模块 | 下单、支付、物流相关 |
|
||||
| 40 | 支付模块 | 支付渠道、退款相关 |
|
||||
| 50 | 营销模块 | 优惠券、活动相关 |
|
||||
| 90 | 第三方服务 | 短信、邮件、云存储等 |
|
||||
目前最流行的设计风格是 **RESTful**。
|
||||
|
||||
---
|
||||
|
||||
## 6. 版本控制:API 的"向后兼容"
|
||||
## 1. 核心概念:RESTful 是什么?
|
||||
|
||||
### 6.1 为什么要做 API 版本控制?
|
||||
REST (Representational State Transfer) 听起来很学术,其实核心就三句话:
|
||||
|
||||
<VersioningStrategyDemo />
|
||||
1. **资源 (Resource)**:网络上的所有东西都是资源(用户、订单、商品)。
|
||||
2. **统一接口 (Uniform Interface)**:用标准的 HTTP 方法(GET, POST, DELETE)来操作这些资源。
|
||||
3. **无状态 (Stateless)**:每次请求都包含所有必要信息,服务器不记“你是谁”(除非你带了 Token)。
|
||||
|
||||
场景:你的电商系统已经上线,App 有 100 万用户。现在需要修改订单接口,添加一个新字段,同时废弃一个旧字段。
|
||||
### 比喻:餐厅点餐
|
||||
|
||||
**如果不做版本控制**:
|
||||
|
||||
- 新 App 调用新接口 → 正常工作
|
||||
- 旧 App 调用新接口 → 字段缺失,崩溃
|
||||
- 用户投诉 → 老板震怒 → 你背锅
|
||||
|
||||
**正确的做法**:
|
||||
|
||||
```
|
||||
/v1/orders - 旧接口,继续服务旧 App
|
||||
/v2/orders - 新接口,新功能在这里
|
||||
```
|
||||
|
||||
旧 App 继续调用 `/v1/orders`,新功能上线不会崩。等旧 App 用户都升级了,再考虑废弃 v1。
|
||||
|
||||
### 6.2 4 种版本控制策略
|
||||
|
||||
| 策略 | 示例 | 优点 | 缺点 | 推荐度 |
|
||||
| ----------------------- | ------------------------------------- | -------------------------- | ---------------------------------- | -------- |
|
||||
| **URL Path** | `/v1/users` | 最直观、易于缓存、文档清晰 | URL 变化 | ⭐⭐⭐⭐ |
|
||||
| **Header** | `API-Version: v1` | URL 不变 | 不直观,难以缓存,需要读 Header 文档 | ⭐⭐ |
|
||||
| **Content Negotiation** | `Accept: application/vnd.api.v1+json` | 标准 HTTP 规范 | 复杂,理解成本高 | ⭐⭐ |
|
||||
| **Query Parameter** | `/users?version=v1` | 简单 | 不专业,容易被忽视,缓存麻烦 | ⭐ |
|
||||
|
||||
**推荐做法**:URL Path 版本控制,简单直观,行业主流。
|
||||
- **URL 是桌号**:`/tables/5` (资源地址)
|
||||
- **HTTP 方法是动作**:
|
||||
- `GET`:看菜单
|
||||
- `POST`:下单
|
||||
- `PUT`:换一桌菜
|
||||
- `DELETE`:吃完走人
|
||||
|
||||
---
|
||||
|
||||
## 7. 总结:API 设计 checklist
|
||||
## 2. 交互演示:RESTful API 全流程
|
||||
|
||||
### 7.1 设计阶段
|
||||
别光听概念,我们来动手玩一下。
|
||||
下面是一个模拟的“用户管理系统”。试着点击不同的场景,观察 **客户端发出了什么** 以及 **服务端返回了什么**。
|
||||
|
||||
- [ ] URL 设计符合 RESTful 规范(名词、复数、小写、连字符)
|
||||
- [ ] HTTP 方法使用正确(GET/POST/PUT/PATCH/DELETE)
|
||||
- [ ] 状态码选择恰当(2xx/4xx/5xx 区分清楚)
|
||||
- [ ] 错误码体系设计完成(分层、易扩展)
|
||||
- [ ] 响应结构标准化(code/message/data 统一)
|
||||
- [ ] 版本控制策略确定(URL Path 推荐)
|
||||
- [ ] 分页/排序/过滤参数设计统一
|
||||
<RestfulApiFlow />
|
||||
|
||||
### 7.2 实现阶段
|
||||
### 💡 观察重点
|
||||
|
||||
- [ ] 所有接口都有完善的 OpenAPI 文档
|
||||
- [ ] 参数校验规则清晰(类型、长度、必填)
|
||||
- [ ] 敏感信息脱敏处理(密码、Token 等)
|
||||
- [ ] 错误日志记录完整(带 request_id)
|
||||
- [ ] 接口性能监控到位(响应时间、错误率)
|
||||
- [ ] 限流熔断策略配置(防刷、降级)
|
||||
|
||||
### 7.3 维护阶段
|
||||
|
||||
- [ ] 接口变更走评审流程(兼容性检查)
|
||||
- [ ] 废弃接口有明确的 Sunset 计划
|
||||
- [ ] 客户端接入文档及时更新
|
||||
- [ ] 错误码文档随代码同步维护
|
||||
1. **URL 是名词**:注意看 URL 都是 `/users` 或者 `/users/1`,没有动词(如 `/getUsers`)。因为 HTTP 方法(GET/POST)已经表示了动作。
|
||||
2. **状态码会说话**:
|
||||
- 创建成功返回 `201 Created`,而不是 200。
|
||||
- 删除成功返回 `204 No Content`(没有 Body)。
|
||||
- 找不到返回 `404 Not Found`。
|
||||
3. **复数形式**:通常使用 `/users` 而不是 `/user`,表示这是“用户集合”下的资源。
|
||||
|
||||
---
|
||||
|
||||
## 8. 名词对照表
|
||||
## 3. 设计黄金法则
|
||||
|
||||
| 英文术语 | 中文对照 | 解释 |
|
||||
| -------------------------- | ---------------- | ----------------------------------------------------- |
|
||||
| **REST** | 表述性状态传递 | 一种软件架构风格,用 URL 标识资源,用 HTTP 方法操作资源 |
|
||||
| **RESTful** | 符合 REST 规范的 | 遵循 REST 架构风格设计的 API |
|
||||
| **Endpoint** | 端点 | API 的具体 URL 地址,如 `/users` |
|
||||
| **Resource** | 资源 | REST 架构中的核心概念,网络上的任何事物都可抽象为资源 |
|
||||
| **URI** | 统一资源标识符 | 标识资源的字符串,URL 是 URI 的一种 |
|
||||
| **HTTP Method** | HTTP 方法 | GET、POST、PUT、PATCH、DELETE 等 |
|
||||
| **Status Code** | 状态码 | HTTP 响应中的 3 位数字,表示请求的处理结果 |
|
||||
| **Payload** | 载荷 | HTTP 请求或响应的主体数据 |
|
||||
| **Header** | 头部 | HTTP 请求或响应的元数据 |
|
||||
| **Query String** | 查询字符串 | URL 中 `?` 后面的参数部分 |
|
||||
| **Path Parameter** | 路径参数 | URL 路径中的变量,如 `/users/{id}` |
|
||||
| **Pagination** | 分页 | 大数据量时分批返回的机制 |
|
||||
| **Idempotency** | 幂等性 | 多次执行结果相同的特性 |
|
||||
| **Deprecation** | 弃用 | 标记即将废弃的功能或接口 |
|
||||
| **Backward Compatibility** | 向后兼容 | 新版本兼容旧版本的接口调用 |
|
||||
| **Rate Limiting** | 限流 | 限制单位时间内的请求数量 |
|
||||
| **OpenAPI** | 开放 API 规范 | 描述 REST API 的标准格式(原 Swagger) |
|
||||
| **SDK** | 软件开发工具包 | 封装 API 调用的开发工具包 |
|
||||
### 3.1 URL 设计:让路径清晰
|
||||
|
||||
| 法则 | 正确 ✅ | 错误 ❌ | 原因 |
|
||||
| :--- | :--- | :--- | :--- |
|
||||
| **用名词,不用动词** | `GET /products` | `GET /getProducts` | HTTP 方法已经是动词了 |
|
||||
| **用复数** | `/users/1` | `/user/1` | 保持一致性,`/users` 代表集合 |
|
||||
| **层级不要太深** | `/users/1/orders` | `/users/1/orders/2/items/3` | 超过 3 层建议拆分或用查询参数 |
|
||||
| **使用连字符** | `/user-profiles` | `/userProfiles` | URL 对大小写敏感,连字符更易读 |
|
||||
|
||||
### 3.2 HTTP 方法:动作要有语义
|
||||
|
||||
- **GET** (查):**安全且幂等**。不管调用多少次,服务器状态不变。
|
||||
- **POST** (增):**不安全,不幂等**。调用 10 次可能创建 10 个用户。
|
||||
- **PUT** (改-全量):**幂等**。把 ID=1 的用户替换为新数据,替换 10 次结果一样。
|
||||
- **PATCH** (改-局部):通常用于只修改一个字段(如只改密码)。
|
||||
- **DELETE** (删):**幂等**。删除 ID=1 的用户,删 1 次和删 10 次,结果都是“用户没了”。
|
||||
|
||||
### 3.3 状态码:别只用 200
|
||||
|
||||
| 类别 | 状态码 | 含义 | 场景 |
|
||||
| :--- | :--- | :--- | :--- |
|
||||
| **2xx 成功** | 200 OK | 通用成功 | GET, PUT |
|
||||
| | 201 Created | 创建成功 | POST |
|
||||
| | 204 No Content | 成功但无返回 | DELETE |
|
||||
| **4xx 客户端错** | 400 Bad Request | 参数错 | 必填项没填,格式不对 |
|
||||
| | 401 Unauthorized | 未登录 | 没有 Token 或 Token 过期 |
|
||||
| | 403 Forbidden | 无权限 | 普通用户想删管理员 |
|
||||
| | 404 Not Found | 找不到 | URL 错了或 ID 不存在 |
|
||||
| **5xx 服务端错** | 500 Internal Error | 崩了 | 代码抛异常了,数据库挂了 |
|
||||
|
||||
---
|
||||
|
||||
## 4. 总结
|
||||
|
||||
好的 API 设计是**“自解释”**的。
|
||||
当你的前端同事看到 `DELETE /api/orders/123`,他不需要问你,就应该知道:
|
||||
1. 这是一个删除操作。
|
||||
2. 操作对象是 ID 为 123 的订单。
|
||||
3. 如果成功,应该收到 204 或 200。
|
||||
4. 如果失败,应该去看状态码是 4xx 还是 5xx。
|
||||
|
||||
这就是**约定优于配置**的力量。
|
||||
|
||||
@@ -1,348 +1,154 @@
|
||||
# AI 简史与核心概念
|
||||
> 💡 **学习指南**:本章节通过交互式演示,带你回顾 AI 如何从“只会算数的机器”进化成“能写诗的艺术家”。
|
||||
>
|
||||
> 我们将聚焦于三次核心的思维跃迁:从**教它规则**,到**让它模仿**,最终实现**让它创造**。同时,我们也会梳理关键的历史节点,带你理清技术发展的脉络。
|
||||
---
|
||||
title: 'AI 简史:从符号逻辑到千亿参数大模型'
|
||||
description: 'AI 发展 70 年,经历了三次浪潮、两次寒冬,最终融合为今天的大模型时代。'
|
||||
---
|
||||
|
||||
# AI 简史:从符号逻辑到千亿参数大模型
|
||||
|
||||
AI 发展 70 年,经历了**三次浪潮、两次寒冬**,从符号主义的逻辑推演,到连接主义的神经网络,再到行为主义的强化学习,最终融合为今天的大模型时代。以下是清晰的发展脉络与关键里程碑。
|
||||
|
||||
<AiEvolutionDemo />
|
||||
|
||||
### 关键里程碑 (Timeline)
|
||||
---
|
||||
|
||||
<AIEvolutionTimelineDemo />
|
||||
## 一、理论奠基与符号主义的诞生(1940s-1950s)
|
||||
|
||||
## 0. 引言:机器能思考吗?
|
||||
### 核心人物与理论
|
||||
|
||||
1950 年,艾伦·图灵提出了一个问题:**"机器能思考吗?"**
|
||||
- **1943 年**:沃伦・麦卡洛克与沃尔特・皮茨提出 **MP 神经元模型**,首次用数学描述神经网络
|
||||
- **1950 年**:艾伦・图灵发表《计算机器与智能》,提出**图灵测试**,定义机器智能标准
|
||||
- **1956 年**:**达特茅斯会议**,约翰・麦卡锡首次提出"人工智能"概念,标志 AI 学科正式诞生
|
||||
|
||||
为了回答这个问题,人类尝试了三种截然不同的解法:
|
||||
::: tip 符号主义兴起
|
||||
**符号主义**(逻辑主义/计算机学派)主张 **智能 = 符号推理**,将知识编码为符号,通过逻辑规则推导解决问题,是**自上而下**的智能模拟路径。
|
||||
:::
|
||||
|
||||
1. **教它规则**(逻辑):像教小孩一样,把所有规则写给它。
|
||||
2. **让它模仿**(概率):给它看大量数据,让它自己找规律。
|
||||
3. **让它创造**(生成):不仅能分类,还能根据理解创造新东西。
|
||||
### 早期突破
|
||||
|
||||
本教程将带你亲手体验这三个阶段。
|
||||
- **1956 年**:纽厄尔和西蒙开发**逻辑理论家**(Logic Theorist),首个能证明数学定理的 AI 程序
|
||||
- **1958 年**:麦卡锡发明 **LISP 语言**,成为 AI 研究的重要工具
|
||||
- **1959 年**:乔治・德沃尔与约瑟夫・恩格尔伯格开发首台**工业机器人**,标志 AI 从理论走向应用
|
||||
|
||||
---
|
||||
|
||||
## 1. 符号主义:教机器"守规矩"(20世纪50年代 - 80年代)
|
||||
## 二、符号主义黄金时代与第一次 AI 浪潮(1960s-1970s)
|
||||
|
||||
早期的 AI 科学家认为:智慧就是**逻辑推理**。
|
||||
只要我们把世界上的所有知识都写成 `If...Then...` 的规则,机器就能像人一样聪明。
|
||||
### 专家系统的辉煌
|
||||
|
||||
这被称为**专家系统**或**符号主义人工智能**。
|
||||
符号主义在**专家系统**领域取得巨大成功,通过将领域专家知识编码为规则库,解决特定领域复杂问题。
|
||||
|
||||
### 1.1 什么是"基于规则"?
|
||||
| 时间 | 标志性成果 | 意义 |
|
||||
| --- | --- | --- |
|
||||
| **1965 年** | Dendral 系统 | 首个专家系统,用于化学分子结构分析 |
|
||||
| **1977 年** | MYCIN 系统 | 诊断血液感染的专家系统,准确率达 69% |
|
||||
| **1980 年** | XCON 系统 | 为 DEC 公司配置计算机,节省 4000 万美元/年 |
|
||||
|
||||
就像教小孩:
|
||||
### 第一次 AI 寒冬(1974-1980)
|
||||
|
||||
- 如果看到红灯,就停下。
|
||||
- 如果下雨,就带伞。
|
||||
::: warning ❄️ 第一次 AI 寒冬
|
||||
符号主义局限性显现:
|
||||
- **知识获取瓶颈**:规则需人工编写,无法自动获取
|
||||
- **脆性问题**:难以处理例外情况,稍微偏离规则就崩溃
|
||||
- **计算能力不足**:当时的硬件无法支撑复杂推理
|
||||
|
||||
在代码中,这表现为:
|
||||
|
||||
```javascript
|
||||
// 基于规则的 AI 示例
|
||||
function decideTrafficLight(color) {
|
||||
if (color === 'red') {
|
||||
return 'stop'
|
||||
} else if (color === 'yellow') {
|
||||
return 'caution'
|
||||
} else if (color === 'green') {
|
||||
return 'go'
|
||||
} else {
|
||||
return 'unknown'
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 1.2 专家系统的巅峰:MYCIN
|
||||
|
||||
1970 年代,斯坦福大学开发的 MYCIN 系统能诊断血液感染,准确率达到专家水平。
|
||||
|
||||
它的工作原理是:
|
||||
|
||||
```lisp
|
||||
// MYCIN 系统的规则示例 (伪代码)
|
||||
(IF
|
||||
(organism IS gram-positive) AND
|
||||
(morphology IS coccus) AND
|
||||
(growth-chains IS chains)
|
||||
THEN
|
||||
(identity IS 0.7 streptococcus))
|
||||
```
|
||||
|
||||
_数据示例 (知识库格式)_:
|
||||
|
||||
```json
|
||||
// 专家系统知识库示例
|
||||
{
|
||||
"rules": [
|
||||
{
|
||||
"id": "RULE-001",
|
||||
"conditions": ["traffic_light == red", "speed > 0"],
|
||||
"action": "brake",
|
||||
"priority": 1
|
||||
},
|
||||
{
|
||||
"id": "RULE-002",
|
||||
"conditions": ["weather == rainy", "visibility < 100m"],
|
||||
"action": "turn_on_lights",
|
||||
"priority": 2
|
||||
}
|
||||
]
|
||||
// 系统按优先级依次匹配规则,遇到匹配就执行
|
||||
}
|
||||
```
|
||||
|
||||
### 1.3 交互演示:规则 vs 学习
|
||||
|
||||
下方的演示展示了两种方式的区别。
|
||||
|
||||
- **左边 (规则)**:你必须显式地写代码 `if (size > 6)`。如果世界变了(比如苹果变小了),你的代码就失效了。
|
||||
- **右边 (学习)**:你不需要写规则。你只需要给机器看一堆苹果和樱桃的数据,点击 **Train**,它自己会"悟"出一个分界线。
|
||||
|
||||
<RuleBasedVsLearningDemo />
|
||||
|
||||
### 1.4 符号主义的局限性
|
||||
|
||||
规则看起来很完美,但现实世界太复杂了。
|
||||
|
||||
<CombinatorialExplosionDemo />
|
||||
|
||||
**问题 1:组合爆炸**
|
||||
|
||||
- 试图写下"识别猫"的所有规则?不可能!
|
||||
- "有胡须"?老鼠也有。
|
||||
- "有尖耳朵"?狗也有。
|
||||
- "毛茸茸的"?兔子也是。
|
||||
- 现实世界有无限边界情况,规则永远写不完。
|
||||
|
||||
**问题 2:无法处理不确定性**
|
||||
|
||||
- 如果规则冲突怎么办?
|
||||
- 如果遇到没见过的情况怎么办?
|
||||
- 规则系统很"脆弱",缺少人类常识。
|
||||
|
||||
> ⚠️ **教训**:试图用有限规则描述无限现实,注定失败。这导致了 1980 年代的**AI 寒冬**。
|
||||
美国 DARPA 削减 AI 研究经费,AI 进入第一次低谷期。
|
||||
:::
|
||||
|
||||
---
|
||||
|
||||
## 2. 连接主义:教机器"像人脑一样思考"(21世纪10年代至今)
|
||||
## 三、专家系统复兴与第二次 AI 浪潮(1980s)
|
||||
|
||||
既然规则写不完,不如换个思路:**让机器自己学**?
|
||||
科学家开始模仿人脑的结构——**神经元**。
|
||||
### 商业应用爆发
|
||||
|
||||
这就是**连接主义**的核心思想。
|
||||
- 日本"**第五代计算机计划**"(1982)推动全球 AI 投资热潮
|
||||
- 美国 DEC、IBM 等公司推出商用专家系统开发工具
|
||||
- 符号主义达到巅峰,成为 AI 领域绝对主流
|
||||
|
||||
### 2.1 人脑的启示
|
||||
|
||||
人脑有约 860 亿个神经元,每个神经元通过突触连接成千上万个其他神经元。
|
||||
|
||||
**关键发现**:
|
||||
|
||||
- 单个神经元很"笨"(只是兴奋或不兴奋)
|
||||
- 但几百亿个神经元连在一起,就产生了智能
|
||||
|
||||
### 2.2 感知机
|
||||
|
||||
1957 年,康奈尔大学的 Frank Rosenblatt 发明了感知机——这是最简单的人工神经元。
|
||||
|
||||
它的工作原理:
|
||||
|
||||
1. **接收输入**:从多个"突触"接收信号($x_1, x_2, ...$)
|
||||
2. **加权求和**:每个输入有对应的**权重**,代表重要性
|
||||
3. **激活判断**:如果总和超过某个**阈值(偏置)**,就激活(输出 1)
|
||||
|
||||
```text
|
||||
如果不带公式,怎么理解?
|
||||
|
||||
简单来说就是:打分机制。
|
||||
总分 = (输入1 × 权重1) + (输入2 × 权重2) + ... + 基础分
|
||||
如果 总分 > 0,输出 1 (激活)
|
||||
否则,输出 0 (静默)
|
||||
```
|
||||
|
||||
### 2.3 交互演示:玩转神经元
|
||||
|
||||
调整下方的**权重**和**偏置**,看看能否控制神经元的输出。
|
||||
|
||||
- **权重($w$)**:代表输入的"重要性"。$w$ 越大,这个输入对结果影响越大。
|
||||
- **偏置($b$)**:代表神经元的"门槛"。$b$ 越小,神经元越容易兴奋(输出 1)。
|
||||
### 连接主义的早期尝试
|
||||
|
||||
<PerceptronDemo />
|
||||
|
||||
### 2.4 从单神经元到深度学习
|
||||
- **1958 年**:罗森布拉特发明**感知机**,首个可学习的神经网络模型
|
||||
- **1969 年**:明斯基与佩珀特出版《感知机》,指出单层感知机无法解决**异或问题**,导致连接主义研究陷入停滞
|
||||
|
||||
单个神经元能做什么?只能做简单分类(比如判断"苹果还是樱桃")。
|
||||
### 第二次 AI 寒冬(1987-1993)
|
||||
|
||||
但如果把神经元分层连接:
|
||||
::: warning ❄️ 第二次 AI 寒冬
|
||||
- 专家系统**维护成本高昂**,难以扩展到复杂领域
|
||||
- 个人电脑崛起,第五代计算机计划失败
|
||||
- AI 市场崩盘,研究经费再次大幅削减
|
||||
:::
|
||||
|
||||
```
|
||||
输入层 (图片像素)
|
||||
↓
|
||||
隐藏层 1 (识别边缘)
|
||||
↓
|
||||
隐藏层 2 (识别形状)
|
||||
↓
|
||||
隐藏层 3 (识别物体部件)
|
||||
↓
|
||||
输出层 (识别物体)
|
||||
```
|
||||
---
|
||||
|
||||
这就是**神经网络**。当网络有很多层时,我们称之为**深度学习**。
|
||||
## 四、机器学习兴起与连接主义复苏(1990s-2000s)
|
||||
|
||||
<NeuralNetworkVisualizationDemo />
|
||||
### 符号主义衰落,机器学习崛起
|
||||
|
||||
### 2.5 神经网络是如何学习的?
|
||||
- **1997 年**:IBM **深蓝** 击败国际象棋世界冠军卡斯帕罗夫,是符号主义最后的辉煌
|
||||
- 同时,**统计机器学习**开始取代基于规则的方法,支持向量机(SVM)、决策树等算法成为主流
|
||||
|
||||
不像专家系统需要人写规则,神经网络通过**看数据**自己学。
|
||||
|
||||
**学习过程(反向传播)**:
|
||||
|
||||
1. **前向传播**:输入数据,得到预测结果
|
||||
2. **计算误差**:对比预测和真实答案
|
||||
3. **反向传播**:根据误差调整每个神经元的权重
|
||||
4. **重复**:重复几百万次,直到误差足够小
|
||||
### 连接主义的重生
|
||||
|
||||
<BackpropagationDemo />
|
||||
|
||||
_数据示例 (训练数据格式)_:
|
||||
|
||||
```json
|
||||
// 图像分类训练数据示例
|
||||
{
|
||||
"dataset": "cats_vs_dogs",
|
||||
"samples": [
|
||||
{
|
||||
"image": "cat_001.jpg",
|
||||
"label": 1, // 1 = 猫
|
||||
"features": [0.2, 0.8, 0.5, ...] // 提取的特征向量
|
||||
},
|
||||
{
|
||||
"image": "dog_001.jpg",
|
||||
"label": 0, // 0 = 狗
|
||||
"features": [0.7, 0.3, 0.9, ...]
|
||||
}
|
||||
]
|
||||
// 神经网络会自动学习:什么样的 feature 组合更可能是猫
|
||||
}
|
||||
```
|
||||
|
||||
### 2.6 连接主义的突破:2012 年 AlexNet
|
||||
|
||||
2012 年,AlexNet 在 ImageNet 竞赛中以压倒性优势夺冠,标志着深度学习时代的到来。
|
||||
|
||||
**关键因素**:
|
||||
|
||||
- **大数据**:ImageNet 提供了 1400 万张标注图片
|
||||
- **大算力**:GPU 的并行计算能力让训练深度网络成为可能
|
||||
- **新算法**:ReLU 激活函数、Dropout 正则化等技术突破
|
||||
|
||||
### 2.7 连接主义的局限
|
||||
|
||||
深度学习很强大,但也不是完美的:
|
||||
|
||||
- **黑盒问题**:虽然能识别猫,但我们说不清"它是怎么识别的"
|
||||
- **数据饥渴**:需要海量标注数据,获取成本高
|
||||
- **缺乏常识**:能识别出这是“猫”,但理解不了“猫喜欢抓老鼠”或“猫通常怕狗”这种常识关系(因为它只是在做像素级的统计匹配,而非真正的概念理解)
|
||||
- **1986 年**:鲁梅尔哈特等人提出**反向传播算法**,解决多层神经网络训练难题
|
||||
- **1997 年**:李飞飞创立 **ImageNet 数据集**,为后续深度学习提供数据基础
|
||||
- **2006 年**:杰弗里・辛顿提出**深度信念网络**,通过逐层预训练解决梯度消失问题,开启深度学习时代
|
||||
|
||||
---
|
||||
|
||||
## 3. 生成式人工智能:机器有了"创造力"(21世纪20年代至今)
|
||||
## 五、深度学习革命与连接主义主导(2010s)
|
||||
|
||||
以前的 AI 主要是**判别式**(这是猫还是狗?)。
|
||||
现在的 AI 是**生成式**(画一只猫!)。
|
||||
### 关键技术突破
|
||||
|
||||
这一切的背后,是 **Transformer** 架构的诞生。它让 AI 学会了理解上下文,学会了"举一反三"。
|
||||
<NeuralNetworkVisualizationDemo />
|
||||
|
||||
### 3.1 从"识别"到"创造"
|
||||
|
||||
传统深度学习(判别式模型):
|
||||
|
||||
- 输入:一张图
|
||||
- 输出:这是猫(概率 98%)
|
||||
|
||||
生成式 AI:
|
||||
|
||||
- 输入:一句话"一只戴着墨镜的猫"
|
||||
- 输出:生成一张对应的图片
|
||||
|
||||
<DiscriminativeVsGenerativeDemo />
|
||||
|
||||
### 3.2 Transformer:AI 的"瑞士军刀"
|
||||
|
||||
2017 年,Google 发表论文《Attention Is All You Need》(注意力机制就是你所需的全部),提出 Transformer 架构。
|
||||
|
||||
它的核心创新:**注意力机制**
|
||||
|
||||
**原理**:让模型在处理一个词时,能"关注"到句子中其他相关的词。
|
||||
|
||||
例如:"小明把苹果给了**他**的母亲"
|
||||
|
||||
当模型处理"他"时,注意力机制会让它关注到"小明",从而理解"他"指代的是小明。
|
||||
| 时间 | 突破 | 影响 |
|
||||
| --- | --- | --- |
|
||||
| **2012 年** | AlexNet 在 ImageNet 竞赛中错误率降至 15.3% | 标志深度学习超越传统方法,引爆计算机视觉革命 |
|
||||
| **2014 年** | GAN(生成对抗网络)提出 | AI 具备生成逼真图像、音频能力,推动生成式 AI 发展 |
|
||||
| **2015 年** | ResNet(残差网络)解决深层网络训练难题 | 网络层数突破 1000 层,进一步提升模型性能 |
|
||||
| **2016 年** | AlphaGo 击败围棋世界冠军李世石 | 结合深度强化学习与蒙特卡洛树搜索,实现复杂决策能力 |
|
||||
| **2017 年** | **Transformer 架构**发布 | 基于自注意力机制,解决长距离依赖问题,为大模型奠定基础 |
|
||||
|
||||
<AttentionMechanismDemo />
|
||||
|
||||
### 3.3 GPT:从文本生成到通用智能
|
||||
::: tip 行为主义的发展
|
||||
**行为主义**(进化主义)主张智能来自与环境的互动,通过试错学习优化行为,**强化学习**是其核心技术。AlphaGo 就是深度学习与强化学习结合的代表作。
|
||||
:::
|
||||
|
||||
2018 年,OpenAI 发布 GPT-1(生成式预训练变换器)。
|
||||
---
|
||||
|
||||
**核心思想**:
|
||||
## 六、大模型时代与通用智能曙光(2018 至今)
|
||||
|
||||
1. **预训练**:在海量文本上学习"预测下一个词"
|
||||
2. **微调**:在特定任务上调整(比如问答、翻译)
|
||||
|
||||
从 GPT-1 (2018) → GPT-2 (2019) → GPT-3 (2020) → GPT-4 (2023)
|
||||
|
||||
- 参数量从 1.17 亿 → 1750 亿 → 1.8 万亿(估计)
|
||||
- 能力从文本生成 → 多模态(图片、音频、视频)
|
||||
### 预训练模型范式确立
|
||||
|
||||
<GPTEvolutionDemo />
|
||||
|
||||
### 3.4 生成式人工智能的局限
|
||||
- **2018 年**:OpenAI 发布 **GPT-1**(1.17 亿参数),谷歌发布 **BERT**,确立"**预训练 + 微调**"新范式
|
||||
- **2019 年**:**GPT-2**(15 亿参数)展现惊人的文本生成能力,引发对 AI 伦理的广泛讨论
|
||||
- **2020 年**:**GPT-3**(1750 亿参数)通过"暴力美学"展现**涌现能力**,无需微调即可完成多种任务
|
||||
|
||||
虽然强大,但也存在问题:
|
||||
### 生成式 AI 爆发
|
||||
|
||||
- **幻觉**:一本正经地胡说八道
|
||||
- **偏见放大**:从训练数据中学到人类偏见
|
||||
- **不可解释**:仍然是个黑盒,不知道内部怎么运作
|
||||
- **2022 年 11 月**:**ChatGPT**(GPT-3.5)发布,通过 RLHF(人类反馈强化学习)大幅提升对话能力,成为现象级产品
|
||||
- **2023 年 3 月**:**GPT-4** 发布,具备**多模态能力**(文本 + 图像),进一步提升逻辑推理与安全性
|
||||
- **2023 年**:Stable Diffusion、Midjourney 等图像生成模型兴起,多模态大模型成为主流
|
||||
- **2024 年**:**Sora** 等视频生成模型发布,AI 生成能力扩展到动态内容领域
|
||||
|
||||
---
|
||||
|
||||
## 4. AI 范式对比总结
|
||||
## 七、AI 三大学派的融合与未来展望
|
||||
|
||||
| 时代 | 核心理念 | 代表产物 | 优势 | 局限 |
|
||||
| :----------------- | :-------------- | :-------------------------- | :----------------------- | :--------------------------- |
|
||||
| **符号主义** | 智慧 = 规则 | 深蓝(下棋)、MYCIN(诊断) | 可解释性强,逻辑清晰 | 无法处理模糊、复杂的现实世界 |
|
||||
| **连接主义** | 智慧 = 神经网络 | AlphaGo、人脸识别 | 能处理复杂模式,性能强大 | 需要海量数据,是个"黑盒" |
|
||||
| **生成式人工智能** | 智慧 = 通用理解 | ChatGPT、Midjourney | 能创造新内容,理解上下文 | 幻觉、偏见、不可解释 |
|
||||
<DiscriminativeVsGenerativeDemo />
|
||||
|
||||
**AI 的进化趋势**:
|
||||
### 未来趋势
|
||||
|
||||
1. **从人工到自动**:从人写规则 → 机器自动学习
|
||||
2. **从单一到通用**:从下棋专用 → 通用人工智能
|
||||
3. **从判别到生成**:从分类识别 → 创造新内容
|
||||
- **多模态融合**:文本、图像、音频、视频等信息的统一处理
|
||||
- **高效大模型**:降低训练成本,提升推理效率,推动边缘部署
|
||||
- **可解释 AI**:解决黑箱问题,增强 AI 可信度
|
||||
- **AGI 探索**:从专用智能向通用人工智能迈进,追求更全面的人类智能模拟
|
||||
|
||||
> 关于大语言模型的详细原理,请移步下一章:[大语言模型入门](./llm-intro.md)
|
||||
|
||||
---
|
||||
|
||||
## 5. 名词速查表
|
||||
|
||||
| 名词 | 英文原文 | 解释 |
|
||||
| :----------------- | :--------------------------------- | :-------------------------------------------------------------------------------------------------- |
|
||||
| **符号主义** | Symbolic AI | 基于规则的人工智能。认为智能可以用逻辑规则表示。代表:专家系统、深蓝。 |
|
||||
| **专家系统** | Expert Systems | 符号主义的代表产物。通过人工编写大量规则来模拟专家决策。代表:MYCIN(医疗诊断)。 |
|
||||
| **连接主义** | Connectionism | 基于神经网络的人工智能。模仿人脑神经元连接结构,通过数据自动学习。 |
|
||||
| **感知机** | Perceptron | 最简单的神经网络单元。接收多个输入,加权求和后通过激活函数输出。 |
|
||||
| **神经网络** | Neural Network | 由多个感知机分层连接组成的模型。通过调整权重来学习数据中的模式。 |
|
||||
| **深度学习** | Deep Learning | 使用**多层**神经网络的学习方法。能自动提取层次化特征(边缘 → 形状 → 物体)。 |
|
||||
| **反向传播** | Backpropagation | 神经网络的学习算法。通过计算预测误差,反向调整每层的权重,逐步优化模型。 |
|
||||
| **生成式人工智能** | Generative AI | 能**创造新内容**的人工智能(文本、图片、音频等),而非仅仅是分类或识别。代表:ChatGPT、Midjourney。 |
|
||||
| **判别式人工智能** | Discriminative AI | 用于**分类**的人工智能(如:这是猫还是狗?)。传统深度学习大多是判别式的。 |
|
||||
| **Transformer** | Transformer | 2017 年由 Google 提出的架构,基于注意力机制。是现代大语言模型(GPT、BERT)的基础。 |
|
||||
| **注意力机制** | Attention Mechanism | 让模型在处理一个元素时,能动态"关注"其他相关元素的技术。是 Transformer 的核心。 |
|
||||
| **GPT** | Generative Pre-trained Transformer | OpenAI 的系列模型。通过"预训练 + 微调"范式,在大量文本上学习生成能力。 |
|
||||
| **预训练** | Pre-training | 在大规模无标注数据上进行初步训练,学习通用知识(如语言规律)。 |
|
||||
| **微调** | Fine-tuning | 在预训练模型基础上,使用特定任务的小规模数据进行调整,使模型适应具体应用。 |
|
||||
| **幻觉** | Hallucination | 生成式人工智能模型"自信地编造错误内容"的现象。如 ChatGPT 编造不存在的论文或事实。 |
|
||||
| **通用人工智能** | Artificial General Intelligence | 像人类一样具备多领域智能、能自主学习推理的人工智能(尚未实现)。 |
|
||||
AI 的发展是一条**螺旋式上升**的道路,每个时代的技术都为后续突破奠定基础。今天的大模型并非完全抛弃符号主义,而是在连接主义框架下,通过海量数据学习到了类似符号推理的能力,实现了**不同学派思想的深度融合**。
|
||||
|
||||
@@ -1,3 +1,318 @@
|
||||
# AI 协议(MCP 等)
|
||||
# AI Agent 协议(MCP & A2A)
|
||||
|
||||
> 待实现
|
||||
::: tip 核心问题
|
||||
**AI Agent 如何与外部世界"对话"?** 就像互联网需要 HTTP 协议,AI Agent 也需要标准化的通信协议。本章介绍两个最主流的 Agent 协议:MCP 和 A2A,它们分别解决了 AI 与工具、Agent 与 Agent 之间的通信问题。
|
||||
:::
|
||||
|
||||
---
|
||||
|
||||
## 0. 什么是协议?
|
||||
|
||||
在计算机领域,**协议(Protocol)** 是一套标准化的规则和约定,让不同的系统、程序能够相互"理解"和"通信"。
|
||||
|
||||
### 0.1 为什么需要协议?
|
||||
|
||||
想象一个场景:你给朋友寄快递,需要填写地址。如果每个人写的地址格式都不一样,快递员就没法投递。协议就是规定了"地址怎么写"的标准——省、市、区、街道、门牌号,按这个格式写,谁都能看懂。
|
||||
|
||||
计算机也是一样。两个程序要通信,必须约定好:
|
||||
- 数据格式是什么?(JSON?二进制?)
|
||||
- 怎么建立连接?(握手流程)
|
||||
- 出错了怎么办?(错误处理)
|
||||
|
||||
### 0.2 计算机中常见的协议
|
||||
|
||||
| 协议 | 作用 | 你每天都在用 |
|
||||
|------|------|-------------|
|
||||
| **HTTP** | 网页传输协议 | 浏览器打开网页 |
|
||||
| **HTTPS** | 加密的 HTTP | 网银、支付页面 |
|
||||
| **TCP/IP** | 互联网基础协议 | 所有网络通信 |
|
||||
| **DNS** | 域名解析协议 | 把 `google.com` 变成 IP 地址 |
|
||||
| **SMTP** | 邮件发送协议 | 发送邮件 |
|
||||
| **WebSocket** | 双向实时通信 | 聊天软件、在线游戏 |
|
||||
| **SSH** | 安全远程登录 | 连接服务器 |
|
||||
| **FTP** | 文件传输协议 | 上传/下载文件 |
|
||||
|
||||
这些协议构成了互联网的基石。没有它们,你无法浏览网页、发送邮件、观看视频。
|
||||
|
||||
### 0.3 协议的价值
|
||||
|
||||
协议的核心价值是**标准化**和**互操作性**:
|
||||
|
||||
- **标准化**:大家都按同一套规则办事,减少沟通成本
|
||||
- **互操作性**:不同厂商、不同技术栈的系统可以无缝对接
|
||||
|
||||
比如 HTTP 协议,让 Chrome 浏览器可以访问 Nginx 服务器,让 Python 爬虫可以抓取 Java 网站的数据。不需要 Chrome 和 Nginx 互相"认识",只要都遵守 HTTP 协议就行。
|
||||
|
||||
### 0.4 AI Agent 也需要协议
|
||||
|
||||
AI Agent 要真正"干活",需要:
|
||||
- 调用外部工具(查天气、发邮件、操作数据库)
|
||||
- 与其他 Agent 协作(分工合作完成复杂任务)
|
||||
|
||||
这就需要标准化的协议来规定"AI 怎么调用工具"、"Agent 之间怎么对话"。这就是 **MCP** 和 **A2A** 的由来。
|
||||
|
||||
---
|
||||
|
||||
## 1. Agent 协议的层次
|
||||
|
||||
在深入了解具体协议之前,让我们先看看 Agent 生态中的通信层次:
|
||||
|
||||
| 层级 | 协议 | 解决的问题 | 类比 |
|
||||
|------|------|-----------|------|
|
||||
| **1** | Function Call | AI 如何调用本地函数 | 大脑发出指令 |
|
||||
| **2** | **MCP** | AI 如何连接外部工具和数据源 | USB-C 接口 |
|
||||
| **3** | **A2A** | Agent 之间如何协作通信 | 企业微信 |
|
||||
|
||||
::: tip 逐行解读这张表
|
||||
**第1层(Function Call)**:这是大模型最基础的能力——通过输出结构化数据(JSON)来触发函数执行。它是"协议"的基础,但本身更像是一种能力而非标准协议。
|
||||
|
||||
**第2层(MCP)**:Model Context Protocol,由 Anthropic 于 2024 年 11 月发布。它标准化了 AI 与外部工具、数据源的连接方式,就像 USB-C 统一了各种设备的充电接口。
|
||||
|
||||
**第3层(A2A)**:Agent-to-Agent Protocol,由 Google 于 2025 年 4 月发布。它让不同的 Agent 能够相互发现、通信和协作,就像企业微信让同事之间可以发任务、聊天。
|
||||
:::
|
||||
|
||||
本章重点介绍第 2、3 层的两个正式协议:MCP 和 A2A。
|
||||
|
||||
---
|
||||
|
||||
## 2. MCP (Model Context Protocol)
|
||||
|
||||
### 2.1 协议基本信息
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| **全称** | Model Context Protocol |
|
||||
| **发起方** | Anthropic |
|
||||
| **发布时间** | 2024 年 11 月 25 日 |
|
||||
| **官方文档** | [modelcontextprotocol.io](https://modelcontextprotocol.io) |
|
||||
| **开源协议** | MIT License |
|
||||
| **GitHub** | [github.com/modelcontextprotocol](https://github.com/modelcontextprotocol) |
|
||||
|
||||
::: tip 为什么叫"Context Protocol"?
|
||||
**Context(上下文)** 是大模型理解任务的关键。MCP 的核心思想是:**让 AI 能够动态获取所需的上下文信息**,而不是把所有信息都塞进 Prompt。
|
||||
|
||||
比如,AI 需要读取一个文件时,不需要你把文件内容复制粘贴给它,而是通过 MCP 直接访问文件系统。
|
||||
:::
|
||||
|
||||
### 2.2 发布的背景
|
||||
|
||||
2024 年,随着 Claude 3.5 Sonnet 的发布,Anthropic 发现一个问题:**每个工具都要单独集成**。
|
||||
|
||||
想象一下:
|
||||
- 你想让 AI 读取 GitHub 仓库 → 要写 GitHub 集成代码
|
||||
- 你想让 AI 查询数据库 → 要写数据库集成代码
|
||||
- 你想让 AI 操作文件系统 → 要写文件系统集成代码
|
||||
|
||||
每个集成都要重复写类似的代码:认证、错误处理、数据转换……
|
||||
|
||||
Anthropic 在官方博客中写道:
|
||||
> "We're introducing the Model Context Protocol (MCP), an open protocol that standardizes how applications provide context to LLMs."
|
||||
|
||||
**核心目标**:让工具开发者写一次代码,所有支持 MCP 的 AI 应用都能使用。
|
||||
|
||||
### 2.3 MCP 是什么?
|
||||
|
||||
<McpVisualDemo />
|
||||
|
||||
**三大核心能力**:
|
||||
|
||||
| 能力 | 英文 | 作用 | 示例 |
|
||||
|------|------|------|------|
|
||||
| **工具** | Tools | AI 可以调用的功能 | 查询天气、发送邮件 |
|
||||
| **资源** | Resources | AI 可以读取的数据 | 文件内容、数据库记录 |
|
||||
| **提示** | Prompts | 预定义的提示模板 | 代码审查模板、写作模板 |
|
||||
|
||||
### 2.4 MCP 的内部实现
|
||||
|
||||
<McpDetailedDemo />
|
||||
|
||||
### 2.5 类比理解:USB-C 接口
|
||||
|
||||
MCP 就像 **USB-C 接口**:
|
||||
|
||||
- **以前**:每个设备都有自己的充电口(圆口、扁口、磁吸……)
|
||||
- **现在**:USB-C 统一了所有设备的充电和数据传输
|
||||
- **MCP**:统一了 AI 与所有工具的连接方式
|
||||
|
||||
工具开发者只需要实现一次 MCP Server,所有支持 MCP 的 AI 应用(Claude、Cursor、Windsurf 等)都能直接使用。
|
||||
|
||||
### 2.6 MCP 的典型应用场景
|
||||
|
||||
| 场景 | 说明 | 示例 |
|
||||
|------|------|------|
|
||||
| **本地文件操作** | 让 AI 读取/修改本地文件 | 读取代码库、分析日志文件 |
|
||||
| **数据库查询** | 让 AI 直接查询数据库 | SQL 查询、数据分析 |
|
||||
| **API 调用** | 让 AI 调用第三方服务 | GitHub API、Slack、邮件 |
|
||||
| **开发工具集成** | 让 AI 使用开发工具 | Git 操作、终端命令 |
|
||||
|
||||
**实际案例**:
|
||||
- **Cursor/Windsurf**:通过 MCP 连接文件系统、Git、终端
|
||||
- **Claude Desktop**:通过 MCP 连接笔记软件、邮件客户端
|
||||
- **自动化脚本**:让 AI 执行自动化任务(备份、部署、数据同步)
|
||||
|
||||
---
|
||||
|
||||
## 3. A2A (Agent-to-Agent Protocol)
|
||||
|
||||
### 3.1 协议基本信息
|
||||
|
||||
| 项目 | 内容 |
|
||||
|------|------|
|
||||
| **全称** | Agent-to-Agent Protocol |
|
||||
| **发起方** | Google |
|
||||
| **发布时间** | 2025 年 4 月 9 日 |
|
||||
| **官方文档** | [google.github.io/A2A](https://google.github.io/A2A) |
|
||||
| **开源协议** | Apache 2.0 |
|
||||
| **GitHub** | [github.com/google/A2A](https://github.com/google/A2A) |
|
||||
|
||||
::: tip 为什么是 Google 发起?
|
||||
Google 在 Cloud Next 2025 大会上发布 A2A,与其企业级 AI 战略密切相关。
|
||||
|
||||
Google 认为:未来的企业 AI 不是单个超级 Agent,而是**多个专业 Agent 协作**——有的负责数据分析,有的负责代码生成,有的负责文档处理。
|
||||
|
||||
这些 Agent 需要一种标准化的方式相互通信,A2A 应运而生。
|
||||
:::
|
||||
|
||||
### 3.2 发布的背景
|
||||
|
||||
MCP 解决了"AI 如何连接工具"的问题,但还有一个问题:**多个 Agent 如何协作?**
|
||||
|
||||
想象一个场景:
|
||||
- Agent A 是"需求分析专家"
|
||||
- Agent B 是"代码生成专家"
|
||||
- Agent C 是"测试专家"
|
||||
|
||||
用户说:"帮我开发一个登录功能"
|
||||
|
||||
Agent A 分析需求后,需要把任务分配给 Agent B;Agent B 写完代码后,需要让 Agent C 测试。它们之间如何通信?
|
||||
|
||||
Google 在官方博客中写道:
|
||||
> "A2A is an open protocol that enables AI agents to communicate with each other, facilitating collaboration across different frameworks and vendors."
|
||||
|
||||
**核心目标**:让不同厂商、不同框架开发的 Agent 能够无缝协作。
|
||||
|
||||
### 3.3 A2A 是什么?
|
||||
|
||||
<A2AVisualDemo />
|
||||
|
||||
**三大核心概念**:
|
||||
|
||||
| 概念 | 英文 | 作用 | 类比 |
|
||||
|------|------|------|------|
|
||||
| **Agent Card** | Agent 名片 | 描述 Agent 的能力 | 员工工牌 |
|
||||
| **Task** | 任务 | 要执行的工作单元 | 工单 |
|
||||
| **Message** | 消息 | Agent 之间的通信内容 | 聊天记录 |
|
||||
|
||||
### 3.4 A2A 的内部实现
|
||||
|
||||
<A2ADetailedDemo />
|
||||
|
||||
### 3.5 类比理解:企业微信
|
||||
|
||||
A2A 就像 **企业微信**:
|
||||
|
||||
- **Agent Card**:每个人的名片,显示姓名、部门、职责
|
||||
- **发任务**:@某人,分配一个任务
|
||||
- **聊天沟通**:任务执行过程中可以随时沟通
|
||||
- **任务追踪**:能看到任务的进度和状态
|
||||
|
||||
不同的 Agent 就像不同的同事,A2A 让它们能够协作完成复杂项目。
|
||||
|
||||
### 3.6 A2A 的典型应用场景
|
||||
|
||||
| 场景 | 说明 | 示例 |
|
||||
|------|------|------|
|
||||
| **软件开发** | 多 Agent 协作完成开发任务 | 需求分析→代码→测试→部署 |
|
||||
| **企业工作流** | 不同部门 Agent 协作处理业务 | HR Agent + 财务 Agent + 法务 Agent |
|
||||
| **智能客服** | 多个专业 Agent 分工处理 | 接待→解答→转接→记录 |
|
||||
| **数据分析** | 多个 Agent 协作分析数据 | 收集→清洗→分析→可视化→报告 |
|
||||
|
||||
**实际案例**:
|
||||
- **Google Agent Space**:企业内部多个 Agent 协作处理文档、邮件、日程
|
||||
- **软件开发团队**:需求 Agent → 代码 Agent → 测试 Agent → 部署 Agent
|
||||
- **智能客服系统**:接待 Agent → 专业解答 Agent → 人工转接 Agent
|
||||
|
||||
---
|
||||
|
||||
## 4. MCP vs A2A:对比与关系
|
||||
|
||||
### 4.1 核心差异
|
||||
|
||||
| 维度 | MCP | A2A |
|
||||
|------|-----|-----|
|
||||
| **发起方** | Anthropic (2024.11) | Google (2025.04) |
|
||||
| **定位** | AI 与工具的连接 | Agent 与 Agent 的协作 |
|
||||
| **通信范围** | Client-Server | Peer-to-Peer |
|
||||
| **数据格式** | JSON-RPC 2.0 | HTTP + JSON |
|
||||
| **类比** | USB-C 接口 | 企业微信 |
|
||||
|
||||
### 4.2 两者的关系
|
||||
|
||||
MCP 和 A2A **不是竞争关系,而是互补关系**:
|
||||
|
||||
<ProtocolComparisonDemo />
|
||||
|
||||
### 4.3 如何选择?
|
||||
|
||||
| 场景 | 选择 |
|
||||
|------|------|
|
||||
| 让 AI 调用本地函数或工具 | Function Call |
|
||||
| 使用第三方工具(数据库、API、文件系统) | MCP |
|
||||
| 构建多 Agent 协作系统 | A2A |
|
||||
| 同时需要工具集成和多 Agent 协作 | MCP + A2A |
|
||||
|
||||
---
|
||||
|
||||
## 5. 协议的未来趋势
|
||||
|
||||
### 5.1 生态发展
|
||||
|
||||
**MCP 生态**(截至 2025 年初):
|
||||
- 官方提供的 Server:文件系统、SQLite、Git、PostgreSQL 等
|
||||
- 社区贡献的 Server:Slack、Notion、Figma、Stripe 等
|
||||
- 支持 MCP 的应用:Claude Desktop、Cursor、Windsurf、Zed 等
|
||||
|
||||
**A2A 生态**(刚发布):
|
||||
- Google 自家的 Agent 产品率先支持
|
||||
- 开源社区正在开发各种语言的 SDK
|
||||
- 企业级应用正在探索中
|
||||
|
||||
### 5.2 标准化进程
|
||||
|
||||
目前 Agent 协议还处于"战国时代":
|
||||
- MCP 和 A2A 是最主流的两个
|
||||
- 还有其他新兴协议如 ANP、AGP 等
|
||||
- 未来可能会融合或统一
|
||||
|
||||
类比互联网的发展:
|
||||
- 早期:各种局域网协议并存
|
||||
- 后来:TCP/IP 成为标准
|
||||
- 现在:Agent 协议可能也会走向统一
|
||||
|
||||
---
|
||||
|
||||
## 6. 小结
|
||||
|
||||
::: tip 核心要点
|
||||
| 协议 | 一句话理解 | 发布时间 | 发起方 | 适用场景 |
|
||||
|------|-----------|---------|--------|---------|
|
||||
| **MCP** | AI 连接工具的"USB-C" | 2024.11 | Anthropic | 工具集成、数据源连接 |
|
||||
| **A2A** | Agent 协作的"企业微信" | 2025.04 | Google | 多 Agent 协作、任务委托 |
|
||||
|
||||
**关键洞察**:
|
||||
1. MCP 解决"AI 如何获取外部能力"的问题
|
||||
2. A2A 解决"多个 AI 如何协作"的问题
|
||||
3. 两者互补,未来可能会融合使用
|
||||
4. 选择协议要根据具体场景,没有银弹
|
||||
:::
|
||||
|
||||
---
|
||||
|
||||
## 参考资料
|
||||
|
||||
1. **MCP 官方文档**: [modelcontextprotocol.io](https://modelcontextprotocol.io)
|
||||
2. **MCP GitHub**: [github.com/modelcontextprotocol](https://github.com/modelcontextprotocol)
|
||||
3. **Anthropic 发布博客**: "Introducing the Model Context Protocol" (2024-11-25)
|
||||
4. **A2A 官方文档**: [google.github.io/A2A](https://google.github.io/A2A)
|
||||
5. **A2A GitHub**: [github.com/google/A2A](https://github.com/google/A2A)
|
||||
6. **Google Cloud Blog**: "Announcing the Agent-to-Agent Protocol" (2025-04-09)
|
||||
|
||||
Reference in New Issue
Block a user