一、大模型与多模态:底层到底发生了什么
很多人初学大模型时会有一个固有印象:大模型只能处理文字。这个说法在早期(GPT-3 时代)是对的,但现在早已过时。
1. 核心事实
大模型内部处理的从来不是"文字"或"图片",而是向量(高维数字) 。所谓多模态,本质是:
- 识图:图片 → 视觉编码器 → 向量 → 喂入大模型
- 画图:文字 prompt → 扩散模型 → 从噪点逐步去噪 → 图片
对大模型来说,它从来没有"看到"过图片,它读的是图片的数学表示。图片和文字在训练时被对齐到同一个向量空间中------"猫的图片"和"猫"这个词的向量表示是相近的。
2. 两种多模态实现路径
| 路径 | 原理 | 能力 |
|---|---|---|
| 外挂式 | 图片 → 视觉模型 → 文字描述 → 大模型 | 有限,中间翻译会丢信息 |
| 联合训练式 | 图片 → 视觉编码器 → 向量 → 与文字向量一起训练 | 精细理解图中细节关系 |
GPT-4V、Qwen-VL、Gemini 走的是联合训练路线,属于真正的原生多模态。
二、Harness:Agent 的运行时骨架
1. 概念
Harness 原意是"马具",DeepSeek 用它比喻套在模型外面的控制框架。DeepSeek 提出的核心设计理念是 Everything is a Plugin(一切皆插件) 。
2. Harness 管什么
Harness 不等于 tools list,它是整个运行时容器,职责包括:
| 职责 | 说明 |
|---|---|
| 工具注册与发现 | 管理当前可用的所有工具 |
| 工具调用调度 | 模型决定调哪个工具后,harness 负责实际执行 |
| 上下文管理 | 多轮对话历史、窗口压缩 |
| 循环控制 | 模型 → 调工具 → 拿结果 → 再思考 → 再调(Loop) |
| 权限与沙箱 | 工具能否访问文件系统、网络等 |
| 记忆管理 | 跨会话的用户信息持久化 |
3. 一个实际例子
假设你做了一个财务 BI Agent:
python
# 传统写法:把复杂计算逻辑嵌在 agent 代码里
def calculate_irr(cash_flows):
# 复杂的 IRR 计算逻辑
...
def generate_pnl(revenue, costs):
# 损益表生成逻辑
...
在 harness 架构下,这些函数被封装成标准化的 tools,模型通过 prompt 被告知"什么时候该调哪个工具"。Harness 负责接收模型输出的调用指令、执行对应函数、将结果返回给模型继续推理。
4. 关键认知
大模型负责"想",Harness 负责"做"。
模型决定调不调、调哪个、传什么参数;Harness 负责真正执行并把结果喂回去。
三、MCP:工具调用的行业标准协议
1. 为什么需要 MCP
在没有标准协议之前,每个 Agent 项目都自己写工具调用逻辑:
- 换一个模型 → 重写
- 换一个工具 → 重写
- 别人想用你的工具 → 拷代码
MCP(Model Context Protocol,模型上下文协议)由 Anthropic 提出,解决的核心问题是:让工具和模型之间的通信标准化,工具不再嵌在代码里,而是变成独立的标准化服务。
2. 架构
scss
┌─────────────────┐ MCP 协议 ┌──────────────────┐ ┌─────────────────┐
│ AI 应用 │ ◄──────────────► │ MCP Server │ ◄───► │ 数据源/工具 │
│ (Host/客户端) │ JSON-RPC │ (标准化接口) │ │ (DB/API/文件) │
└─────────────────┘ └──────────────────┘ └─────────────────┘
三个角色:
| 角色 | 职责 |
|---|---|
| MCP Host | AI 应用本身(Claude Desktop、Cursor、自研 Agent) |
| MCP Server | 暴露 tools / resources / prompts 的标准化服务 |
| 数据源 | 数据库、文件系统、第三方 API 等 |
3. MCP Server 暴露的三类能力
Tools(工具) ------模型可以主动调用的函数:
json
{
"name": "calculate_tax",
"description": "计算企业所得税",
"inputSchema": {
"revenue": "number",
"cost": "number",
"type": "string"
}
}
Resources(资源) ------模型可以读取的数据(文件内容、数据库记录、API 响应等)。
Prompts(提示模板) ------预定义的 prompt 模板,直接供模型或用户调用。
4. 实际代码示例
python
# mcp_finance_server.py
from mcp import Server
server = Server("finance-tools")
@server.tool()
def calculate_irr(cash_flows: list[float]) -> float:
"""计算内部收益率"""
# 复杂计算逻辑
...
@server.tool()
def generate_pnl(revenue: float, costs: dict) -> dict:
"""生成损益表"""
...
# 启动服务后,任何支持 MCP 的 AI 应用都能自动发现并调用这些工具
5. MCP vs 自写 Harness Tools
| 对比维度 | 自写 Harness Tools | MCP |
|---|---|---|
| 工具位置 | 嵌在应用代码中 | 独立服务进程 |
| 通信方式 | 函数调用 | JSON-RPC over stdio / HTTP |
| 跨模型复用 | 绑死特定模型 | 任何支持 MCP 的模型都能用 |
| 工具发现 | 手动维护 tools list | Server 启动时自动声明 |
| 跨项目复用 | 拷贝代码 | 直接连接同一 MCP Server |
6. MCP 与 Harness 的关系
MCP 不是替代 Harness,而是 Harness 的一种标准化实现方式:
javascript
Harness(架构概念层)
├── 自写 Tool 调用(传统方式)
├── MCP 协议调用(标准化方式)
├── OpenAI Function Calling
├── Google Gemini Tools
└── 其他协议...
DeepSeek 的"一切皆插件"理念,MCP 是目前最接近其理想形态的标准化落地方案。
四、总结
| 概念 | 一句话 |
|---|---|
| 多模态 | 图片/音频被编码为向量,与文字在同一空间中处理 |
| Harness | 套在模型外面的运行时框架,管工具、上下文、循环、权限 |
| Tools | Harness 管理的可调用能力单元 |
| MCP | 工具与模型之间的标准化通信协议,实现"一次编写,到处调用" |
Agent 开发的核心认知:模型负责推理和决策,Harness 负责执行和调度,MCP 让工具调用标准化、可复用。
如有理解偏差或需要补充的地方,欢迎交流指正。