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

让你的 MCP 服务器请求 LLM(大语言模型)的生成结果
采样是MCP的一个强大功能,它允许 MCP 服务器通过客户端请求LLM的生成结果,从而实现复杂的智能行为,同时保持安全性和隐私性。
目前,Claude Desktop客户端尚不支持该功能。
采样工作流程
采样流程遵循以下步骤:
- MCP 服务器向 MCP 客户端发送
sampling/createMessage
请求 - MCP 客户端审查该请求,并可以进行修改
- MCP 客户端从 LLM 中生成一个结果
- MCP 客户端审查生成的结果
- 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
}
}
最佳实践
在实现采样时,建议遵循以下最佳实践:
- 始终提供清晰、结构良好的提示
- 适当处理文本和图片内容
- 设置合理的令牌限制
- 通过
includeContext
包含相关上下文 - 在使用之前验证响应
- 优雅地处理错误
- 考虑对采样请求进行速率限制
- 记录预期的采样行为
- 使用不同的模型参数进行测试
- 监控采样成本
人类参与控制
采样设计时考虑了人类监督:
对于提示
- 客户端应向用户展示建议的提示
- 用户应能够修改或拒绝提示
- 系统提示可以过滤或修改
- 上下文包含由客户端控制
对于生成结果
- 客户端应向用户展示生成的结果
- 用户应能够修改或拒绝生成结果
- 客户端可以过滤或修改生成结果
- 用户控制所使用的模型
安全考虑
在实现采样时:
- 验证所有消息内容
- 清理敏感信息
- 实现适当的速率限制
- 监控采样使用情况
- 加密传输中的数据
- 处理用户数据隐私
- 审计采样请求
- 控制成本暴露
- 实现超时处理
- 优雅地处理模型错误
常见模式
智能化工作流
采样使得以下智能模式成为可能:
- 读取和分析资源
- 基于上下文做出决策
- 生成结构化数据
- 处理多步骤任务
- 提供交互式辅助
上下文管理
关于上下文的最佳实践:
- 请求最小必要的上下文
- 清晰地结构化上下文
- 处理上下文大小限制
- 根据需要更新上下文
- 清理过时的上下文
错误处理
强健的错误处理应当:
- 捕获采样失败
- 处理超时错误
- 管理速率限制
- 验证响应
- 提供回退行为
- 适当记录错误
限制
请注意以下限制:
- 采样依赖于客户端的能力
- 用户控制采样行为
- 上下文大小有限制
- 可能适用速率限制
- 需要考虑成本
- 模型可用性不确定
- 响应时间可能不同
- 并非所有内容类型都受到支持