提示模板(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的交互更加高效、可控,并且易于扩展。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐