采样
让您的服务器从LLM请求补全
采样是MCP的一个强大功能,它允许服务器通过客户端请求LLM补全,在保持安全性和隐私性的同时实现复杂的代理行为。
提示
MCP的这个功能目前在Claude Desktop客户端中尚未支持。
采样工作原理
采样流程遵循以下步骤:
- 服务器向客户端发送sampling/createMessage请求
- 客户端审查请求并可以修改它
- 客户端从LLM采样
- 客户端审查补全结果
- 客户端将结果返回给服务器
这种人在回路中的设计确保用户能够控制LLM看到和生成的内容。
消息格式
采样请求使用标准化的消息格式:
json
{
messages: [
{
role: "user" | "assistant",
content: {
type: "text" | "image",
// For text:
text?: string,
// For images:
data?: string, // base64 encoded
mimeType?: string
}
}
],
modelPreferences?: {
hints?: [{
name?: string // Suggested model name/family
}],
costPriority?: number, // 0-1, importance of minimizing cost
speedPriority?: number, // 0-1, importance of low latency
intelligencePriority?: number // 0-1, importance of capabilities
},
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:额外的提供商特定参数
响应格式
客户端返回补全结果:
json
{
model: string, // Name of the model used
stopReason?: "endTurn" | "stopSequence" | "maxTokens" | string,
role: "user" | "assistant",
content: {
type: "text" | "image",
text?: string,
data?: string,
mimeType?: string
}
}
请求示例
以下是向客户端请求采样的示例:
json
{
"method": "sampling/createMessage",
"params": {
"messages": [
{
"role": "user",
"content": {
"type": "text",
"text": "What files are in the current directory?"
}
}
],
"systemPrompt": "You are a helpful file system assistant.",
"includeContext": "thisServer",
"maxTokens": 100
}
}
最佳实践
在实现采样时:
- 始终提供清晰、结构良好的提示
- 适当处理文本和图像内容
- 设置合理的令牌限制
- 通过includeContext包含相关上下文
- 在使用之前验证响应
- 优雅地处理错误
- 考虑采样请求的速率限制
- 记录预期的采样行为
- 使用各种模型参数进行测试
- 监控采样成本
人在回路中的控制
采样的设计考虑到了人工监督:
对于提示
- 客户端应向用户展示建议的提示
- 用户应能够修改或拒绝提示
- 系统提示可以被过滤或修改
- 上下文包含由客户端控制
对于补全
- 客户端应向用户展示补全结果
- 用户应能够修改或拒绝补全结果
- 客户端可以过滤或修改补全结果
- 用户控制使用哪个模型
安全注意事项
在实现采样时:
- 验证所有消息内容
- 清理敏感信息
- 实施适当的速率限制
- 监控采样使用情况
- 传输中加密数据
- 处理用户数据隐私
- 审计采样请求
- 控制成本暴露
- 实现超时机制
- 优雅地处理模型错误
常见模式
代理工作流
采样支持的代理模式包括:
- 读取和分析资源
- 基于上下文做出决策
- 生成结构化数据
- 处理多步骤任务
- 提供交互式帮助
上下文管理
上下文的最佳实践:
- 请求最少必要的上下文
- 清晰地组织上下文结构
- 处理上下文大小限制
- 根据需要更新上下文
- 清理过时的上下文
错误处理
健壮的错误处理应该:
- 捕获采样失败
- 处理超时错误
- 管理速率限制
- 验证响应
- 提供后备行为
- 适当记录错误
限制
注意以下限制:
- 采样依赖于客户端能力
- 用户控制采样行为
- 上下文大小有限制
- 可能适用速率限制
- 需要考虑成本
- 模型可用性各不相同
- 响应时间不一
- 并非支持所有内容类型