采样

Model Context Protocol (MCP) 为服务端提供了标准化的方式,通过客户端请求大语言模型(LLM)的采样("补全"或"生成")。该流程允许客户端保持对模型访问、选择和权限的控制,同时使服务端能够利用AI能力——无需服务端API密钥。服务端可以请求文本或基于图像的交互,并可选地在提示中包含来自MCP服务器的上下文。

用户交互模型

MCP中的采样允许服务端通过在其他MCP服务器功能中_嵌套_LLM调用来实现智能代理行为。

具体实现可以自由选择适合其需求的交互界面模式——协议本身不强制要求任何特定的用户交互模型。

Warning

出于信任与安全考虑,应当始终保持人工审核环节,具备拒绝采样请求的能力。

应用程序应当

  • 提供直观易用的界面来审查采样请求
  • 允许用户在发送前查看和编辑提示词
  • 在交付前展示生成的响应供审核 {{< /callout >}}

能力声明

支持采样的客户端必须初始化时声明sampling能力:

{
  "capabilities": {
    "sampling": {}
  }
}

协议消息

创建消息

服务端通过发送sampling/createMessage请求来发起语言模型生成:

请求示例:

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "sampling/createMessage",
  "params": {
    "messages": [
      {
        "role": "user",
        "content": {
          "type": "text",
          "text": "What is the capital of France?"
        }
      }
    ],
    "modelPreferences": {
      "hints": [
        {
          "name": "claude-3-sonnet"
        }
      ],
      "intelligencePriority": 0.8,
      "speedPriority": 0.5
    },
    "systemPrompt": "You are a helpful assistant.",
    "maxTokens": 100
  }
}

响应示例:

{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "role": "assistant",
    "content": {
      "type": "text",
      "text": "The capital of France is Paris."
    },
    "model": "claude-3-sonnet-20240307",
    "stopReason": "endTurn"
  }
}

消息流程

LLM User Client Server LLM User Client Server 服务端发起采样 人工审核环节 模型交互 响应审核 完成请求 sampling/createMessage展示审批请求审核并批准/修改转发批准后的请求返回生成结果展示响应供审批审核并批准/修改返回批准的响应

数据类型

消息内容

采样消息可包含:

文本内容

{
  "type": "text",
  "text": "The message content"
}

图像内容

{
  "type": "image",
  "data": "base64-encoded-image-data",
  "mimeType": "image/jpeg"
}

模型偏好设置

MCP中的模型选择需要谨慎抽象,因为服务端和客户端可能使用不同AI供应商的模型。服务端不能直接按名称请求特定模型,因为客户端可能无法访问该确切模型,或可能倾向于使用不同供应商的等效模型。

MCP通过结合抽象能力优先级和可选模型提示的偏好系统来解决这个问题:

能力优先级

服务端通过三个标准化优先级值(0-1)表达需求:

  • costPriority: 成本控制重要性,值越高偏好更经济的模型
  • speedPriority: 低延迟重要性,值越高偏好更快模型
  • intelligencePriority: 高级能力需求,值越高偏好更强模型

模型提示

hints允许服务端建议特定模型或模型系列:

  • 提示作为子字符串进行灵活匹配
  • 多个提示按优先顺序评估
  • 客户端可以将提示映射到不同供应商的等效模型
  • 提示仅供参考——客户端拥有最终模型选择权

示例:

{
  "hints": [
    { "name": "claude-3-sonnet" }, // 优先Sonnet级模型
    { "name": "claude" } // 回退到任意Claude模型
  ],
  "costPriority": 0.3, // 成本次要
  "speedPriority": 0.8, // 速度关键
  "intelligencePriority": 0.5 // 中等能力需求
}

客户端根据这些偏好从其可用选项中选择合适模型。例如,如果客户端无法访问Claude模型但可以使用Gemini,可能将sonnet提示映射到gemini-1.5-pro(基于相似能力)。

错误处理

客户端应当为常见错误返回标准错误码:

示例错误:

{
  "jsonrpc": "2.0",
  "id": 1,
  "error": {
    "code": -1,
    "message": "User rejected sampling request"
  }
}

安全考虑

  1. 客户端应当实施用户审批控制
  2. 双方应当验证消息内容
  3. 客户端应当尊重模型偏好提示
  4. 客户端应当实施速率限制
  5. 双方必须妥善处理敏感数据