模型上下文协议(MCP) 提供了一种标准化的方式,使服务器能够通过客户端请求语言模型(LLM)的采样(“生成”或“补全”)。该流程允许客户端控制模型访问、选择和权限,同时使服务器能够利用AI能力,而无需服务器提供API密钥。服务器可以请求基于文本或图像的交互,并可选择在提示中包含来自MCP服务器的上下文。
用户交互模型
MCP中的采样允许服务器实现代理行为,通过嵌套在其他MCP服务器功能中的LLM调用来实现。
实现可以自由地通过任何适合其需求的接口模式公开采样功能——协议本身并不强制要求特定的用户交互模型。
为了信任与安全以及安全性,应始终在采样请求中保留一个人工审核环节,以便能够拒绝采样请求。
应用程序应:
- 提供易于使用且直观的UI,以便用户审查采样请求。
- 允许用户在发送前查看和编辑提示。
- 在交付前展示生成的响应以供审查。
功能
支持采样的客户端必须在初始化时声明采样功能:
{
"capabilities": {
"sampling": {}
}
}
协议消息
创建消息
要请求语言模型生成内容,服务器发送一个 sampling/createMessage
请求:
请求:
{
"jsonrpc": "2.0",
"id": 1,
"method": "sampling/createMessage",
"params": {
"messages": [
{
"role": "user",
"content": {
"type": "text",
"text": "法国的首都是什么?"
}
}
],
"modelPreferences": {
"hints": [
{
"name": "claude-3-sonnet"
}
],
"intelligencePriority": 0.8,
"speedPriority": 0.5
},
"systemPrompt": "你是一个有帮助的助手。",
"maxTokens": 100
}
}
响应:
{
"jsonrpc": "2.0",
"id": 1,
"result": {
"role": "assistant",
"content": {
"type": "text",
"text": "法国的首都是巴黎。"
},
"model": "claude-3-sonnet-20240307",
"stopReason": "endTurn"
}
}
消息流程
数据类型
消息
采样消息可以包含以下内容:
文本内容:
{
"type": "text",
"text": "消息内容"
}
图像内容:
{
"type": "image",
"data": "base64编码的图像数据",
"mimeType": "image/jpeg"
}
总结
由于Claude官方桌面应用尚未支持采样功能,这一功能的实际应用场景尚不明确。然而,我个人认为,采样功能在根据请求的难度动态调用不同成本的模型,或者在构建多代理系统(multi-agent)时具有关键作用。
目前,我正在进行采样功能的代码开发尝试,预计在后续的实战篇2中(大概元旦后吧),将为大家带来更多关于这一功能的实际应用和代码实现。