MCP(Model Context Protocol)模型上下文协议 理论篇6 - 提示模板(Prompts)
在MCP(Model Context Protocol)中,提示模板(Prompts)是预定义的模板。提示模板允许服务器定义可重用的提示模板和工作流,客户端可以轻松地将这些模板呈现给用户和语言模型(LLMs)。
·
提示模板(Prompts)允许服务器定义可重用的提示模板和工作流,客户端可以轻松地将这些模板呈现给用户和语言模型(LLMs)。通过提示模板,可以标准化并共享常见的LLM交互,提升交互的一致性和效率。
提示模板的设计理念是用户可控的,即服务器将这些模板暴露给客户端,用户可以明确选择并使用它们。
概述
在MCP(Model Context Protocol)中,提示模板是预定义的模板,具有以下功能:
- 接受动态参数:可以根据用户输入动态调整。
- 包含资源上下文:可以引用外部资源(如代码文件、日志等)。
- 链式交互:支持多个步骤的交互流程。
- 引导特定工作流:帮助用户完成特定任务。
- 作为UI元素呈现:例如以斜杠命令的形式出现在用户界面中。
提示结构
每个提示模板由以下字段定义:
{
"name": "string", // 提示的唯一标识符
"description": "string", // 人类可读的描述
"arguments": [ // 可选的参数列表
{
"name": "string", // 参数标识符
"description": "string", // 参数描述
"required": boolean // 是否为必填参数
}
]
}
发现提示
客户端可以通过prompts/list
端点发现可用的提示模板:
// 请求
{
"method": "prompts/list"
}
// 响应
{
"prompts": [
{
"name": "analyze-code",
"description": "分析代码以发现潜在改进",
"arguments": [
{
"name": "language",
"description": "编程语言",
"required": true
}
]
}
]
}
使用提示
客户端通过prompts/get
请求使用特定提示模板:
// 请求
{
"method": "prompts/get",
"params": {
"name": "analyze-code",
"arguments": {
"language": "python"
}
}
}
// 响应
{
"description": "分析Python代码以发现潜在改进",
"messages": [
{
"role": "user",
"content": {
"type": "text",
"text": "请分析以下Python代码以发现潜在改进:\n\n```python\ndef calculate_sum(numbers):\n total = 0\n for num in numbers:\n total = total + num\n return total\n\nresult = calculate_sum([1, 2, 3, 4, 5])\nprint(result)\n```"
}
}
]
}
动态提示
提示模板可以动态包含外部资源上下文,例如日志文件或代码文件:
{
"name": "analyze-project",
"description": "分析项目日志和代码",
"arguments": [
{
"name": "timeframe",
"description": "要分析的日志时间范围",
"required": true
},
{
"name": "fileUri",
"description": "要审查的代码文件URI",
"required": true
}
]
}
在处理prompts/get
请求时,可以动态嵌入资源内容:
{
"messages": [
{
"role": "user",
"content": {
"type": "text",
"text": "分析这些系统日志和代码文件中的问题:"
}
},
{
"role": "user",
"content": {
"type": "resource",
"resource": {
"uri": "logs://recent?timeframe=1h",
"text": "[2024-03-14 15:32:11] ERROR: 网络连接超时 in network.py:127\n[2024-03-14 15:32:15] WARN: 重试连接 (尝试 2/3)\n[2024-03-14 15:32:20] ERROR: 超过最大重试次数",
"mimeType": "text/plain"
}
}
},
{
"role": "user",
"content": {
"type": "resource",
"resource": {
"uri": "file:///path/to/code.py",
"text": "def connect_to_service(timeout=30):\n retries = 3\n for attempt in range(retries):\n try:\n return establish_connection(timeout)\n except TimeoutError:\n if attempt == retries - 1:\n raise\n time.sleep(5)\n\ndef establish_connection(timeout):\n # 连接实现\n pass",
"mimeType": "text/x-python"
}
}
}
]
}
多步骤工作流
提示模板还可以支持多步骤工作流,例如调试错误:
const debugWorkflow = {
name: "debug-error",
async getMessages(error: string) {
return [
{
role: "user",
content: {
type: "text",
text: `我遇到了以下错误:${error}`
}
},
{
role: "assistant",
content: {
type: "text",
text: "我会帮助分析这个错误。你已经尝试了哪些方法?"
}
},
{
role: "user",
content: {
type: "text",
text: "我尝试了重启服务,但错误仍然存在。"
}
}
];
}
};
示例实现
以下是一个完整的MCP服务器实现示例:
import { Server } from "@modelcontextprotocol/sdk/server";
import {
ListPromptsRequestSchema,
GetPromptRequestSchema
} from "@modelcontextprotocol/sdk/types";
const PROMPTS = {
"git-commit": {
name: "git-commit",
description: "生成Git提交信息",
arguments: [
{
name: "changes",
description: "Git diff或更改描述",
required: true
}
]
},
"explain-code": {
name: "explain-code",
description: "解释代码的工作原理",
arguments: [
{
name: "code",
description: "要解释的代码",
required: true
},
{
name: "language",
description: "编程语言",
required: false
}
]
}
};
const server = new Server({
name: "example-prompts-server",
version: "1.0.0"
}, {
capabilities: {
prompts: {}
}
});
// 列出可用提示
server.setRequestHandler(ListPromptsRequestSchema, async () => {
return {
prompts: Object.values(PROMPTS)
};
});
// 获取特定提示
server.setRequestHandler(GetPromptRequestSchema, async (request) => {
const prompt = PROMPTS[request.params.name];
if (!prompt) {
throw new Error(`未找到提示:${request.params.name}`);
}
if (request.params.name === "git-commit") {
return {
messages: [
{
role: "user",
content: {
type: "text",
text: `为这些更改生成简洁但描述性的提交信息:\n\n${request.params.arguments?.changes}`
}
}
]
};
}
if (request.params.name === "explain-code") {
const language = request.params.arguments?.language || "未知";
return {
messages: [
{
role: "user",
content: {
type: "text",
text: `解释这段${language}代码的工作原理:\n\n${request.params.arguments?.code}`
}
}
]
};
}
throw new Error("未找到提示实现");
});
总结
通过提示模板(Prompts),MCP 提供了一种灵活且标准化的方式来定义和管理与 LLM 的交互。提示模板不仅支持动态参数和资源上下文,还可以通过多步骤工作流引导用户完成复杂任务。这种设计使得LLM的交互更加高效、可控,并且易于扩展。
更多推荐
所有评论(0)