MCP 中采样的概念解析

让你的 MCP 服务器请求 LLM(大语言模型)的生成结果 采样是MCP的一个强大功能,它允许 MCP 服务器通过客户端请求LLM的生成结果,从而实现复杂的智能行为,同时保持安全性和隐私性。

MCP 中采样的概念解析

让你的 MCP 服务器请求 LLM(大语言模型)的生成结果

采样是MCP的一个强大功能,它允许 MCP 服务器通过客户端请求LLM的生成结果,从而实现复杂的智能行为,同时保持安全性和隐私性。

目前,Claude Desktop客户端尚不支持该功能。

采样工作流程

采样流程遵循以下步骤:

  1. MCP 服务器向 MCP 客户端发送sampling/createMessage请求
  2. MCP 客户端审查该请求,并可以进行修改
  3. MCP 客户端从 LLM 中生成一个结果
  4. MCP 客户端审查生成的结果
  5. MCP 客户端将结果返回给 MCP服务器

这种“人类参与环节”设计确保用户控制LLM看到的内容和生成的结果。

请求消息格式

采样请求使用标准化的消息格式:

{
  messages: [
    {
      role: "user" | "assistant",
      content: {
        type: "text" | "image",

        // 对于文本:
        text?: string,

        // 对于图片:
        data?: string,             // base64 编码
        mimeType?: string
      }
    }
  ],
  modelPreferences?: {
    hints?: [{
      name?: string                // 建议的模型名称/系列
    }],
    costPriority?: number,         // 0-1,最小化成本的优先级
    speedPriority?: number,        // 0-1,低延迟响应的优先级
    intelligencePriority?: number  // 0-1,先进功能的优先级
  },
  systemPrompt?: string,
  includeContext?: "none" | "thisServer" | "allServers",
  temperature?: number,
  maxTokens: number,
  stopSequences?: string[],
  metadata?: Record<string, unknown>
}

请求参数

消息

messages数组包含发送给LLM的对话历史。每条消息具有:

  • role: 可以是"用户"("user")或"助手"("assistant")
  • content: 消息内容,可以是:
    • 文本内容:使用text字段
    • 图片内容:使用data(base64编码)和mimeType字段

模型偏好

modelPreferences对象允许服务器指定其模型选择偏好:

  • hints: 一个建议的模型名称数组,客户端可以使用这些建议来选择适当的模型:
    • name: 可以是完整或部分模型名称的字符串(例如:"claude-3"、"sonnet")
    • 客户端可以将提示映射到不同提供者的等效模型
    • 多个提示按优先顺序进行评估
  • 优先级值(0-1归一化):
    • costPriority: 最小化成本的重要性
    • speedPriority: 低延迟响应的重要性
    • intelligencePriority: 先进功能的重要性

客户端基于这些偏好和其可用的模型做出最终模型选择。

系统提示

可选的systemPrompt字段允许服务器请求特定的系统提示,客户端可以修改或忽略该提示。

上下文包含

includeContext参数指定要包含哪些MCP上下文:

  • "none": 不包含任何上下文
  • "thisServer": 包含请求服务器的上下文
  • "allServers": 包含所有连接的MCP服务器的上下文

客户端控制实际包含哪些上下文。

采样参数

通过以下参数细化LLM采样:

  • temperature: 控制随机性(0.0到1.0)
  • maxTokens: 最大生成令牌数
  • stopSequences: 生成结束的序列数组
  • metadata: 提供商特定的附加参数

响应格式

客户端返回一个生成结果:

{
  model: string,  // 使用的模型名称
  stopReason?: "endTurn" | "stopSequence" | "maxTokens" | string,
  role: "user" | "assistant",
  content: {
    type: "text" | "image",
    text?: string,
    data?: string,
    mimeType?: string
  }
}

示例请求

以下是请求客户端采样的示例:

{
  "method": "sampling/createMessage",
  "params": {
    "messages": [
      {
        "role": "user",
        "content": {
          "type": "text",
          "text": "当前目录下有什么文件?"
        }
      }
    ],
    "systemPrompt": "你是一个有帮助的文件系统助手。",
    "includeContext": "thisServer",
    "maxTokens": 100
  }
}

最佳实践

在实现采样时,建议遵循以下最佳实践:

  1. 始终提供清晰、结构良好的提示
  2. 适当处理文本和图片内容
  3. 设置合理的令牌限制
  4. 通过includeContext包含相关上下文
  5. 在使用之前验证响应
  6. 优雅地处理错误
  7. 考虑对采样请求进行速率限制
  8. 记录预期的采样行为
  9. 使用不同的模型参数进行测试
  10. 监控采样成本

人类参与控制

采样设计时考虑了人类监督:

对于提示

  • 客户端应向用户展示建议的提示
  • 用户应能够修改或拒绝提示
  • 系统提示可以过滤或修改
  • 上下文包含由客户端控制

对于生成结果

  • 客户端应向用户展示生成的结果
  • 用户应能够修改或拒绝生成结果
  • 客户端可以过滤或修改生成结果
  • 用户控制所使用的模型

安全考虑

在实现采样时:

  • 验证所有消息内容
  • 清理敏感信息
  • 实现适当的速率限制
  • 监控采样使用情况
  • 加密传输中的数据
  • 处理用户数据隐私
  • 审计采样请求
  • 控制成本暴露
  • 实现超时处理
  • 优雅地处理模型错误

常见模式

智能化工作流

采样使得以下智能模式成为可能:

  • 读取和分析资源
  • 基于上下文做出决策
  • 生成结构化数据
  • 处理多步骤任务
  • 提供交互式辅助

上下文管理

关于上下文的最佳实践:

  • 请求最小必要的上下文
  • 清晰地结构化上下文
  • 处理上下文大小限制
  • 根据需要更新上下文
  • 清理过时的上下文

错误处理

强健的错误处理应当:

  • 捕获采样失败
  • 处理超时错误
  • 管理速率限制
  • 验证响应
  • 提供回退行为
  • 适当记录错误

限制

请注意以下限制:

  • 采样依赖于客户端的能力
  • 用户控制采样行为
  • 上下文大小有限制
  • 可能适用速率限制
  • 需要考虑成本
  • 模型可用性不确定
  • 响应时间可能不同
  • 并非所有内容类型都受到支持