引言
模型上下文协议(Model Context Protocol, MCP)是一种开放协议,旨在实现大型语言模型(LLM)应用与外部数据源、工具和服务之间的无缝集成。MCP可以比作AI应用的USB-C接口,它提供了一种将AI模型连接到不同数据源、工具和功能的标准方法。MCP通过标准化模型与外部资源的交互方式,提升LLM应用的功能性、灵活性和可扩展性。
在MCP框架中,提示词模板(Prompts)扮演着至关重要的角色。它们使服务器能够定义可重用的提示词模板和工作流,客户端可以轻松地将其呈现给用户和LLM。提示词提供了一种强大的方式来标准化和共享常见的LLM交互。
MCP提示词的基本概念
提示词的定义
MCP中的提示词是预定义的模板,具有以下核心功能:
- 接受动态参数
- 包含来自资源的上下文
- 链接多个交互
- 引导特定工作流
- 作为UI元素呈现(如斜杠命令)
提示词被设计为用户可控的,这意味着它们从服务器暴露给客户端时,目的是让用户能够明确地选择使用它们。
提示词的结构
每个提示词的定义包含以下部分:
{
name: string; // 提示词的唯一标识符
description?: string; // 人类可读的描述
arguments?: [ // 可选的参数列表
{
name: string; // 参数标识符
description?: string; // 参数描述
required?: boolean; // 参数是否必需
}
]
}
name
: 提示词的唯一标识符,用于唯一标识该提示词description
: 人类可读的描述,解释提示词的功能arguments
: 参数列表,每个参数包含:name
: 参数标识符description
: 参数描述required
: 布尔值,指示参数是否必需
发现和使用提示词
发现可用的提示词
客户端可以通过prompts/list
端点发现可用的提示词:
// 请求
{
"method": "prompts/list"
}
// 响应
{
"prompts": [
{
"name": "analyze-code",
"description": "分析代码以寻找潜在改进",
"arguments": [
{
"name": "language",
"description": "编程语言",
"required": true
}
]
}
]
}
获取提示词详细信息
要获取特定提示词的详细信息,客户端可以发送prompts/get
请求:
// 请求
{
"method": "prompts/get",
"arguments": {
"name": "analyze-code"
}
}
// 响应
{
"name": "analyze-code",
"description": "分析代码以寻找潜在改进",
"arguments": [
{
"name": "language",
"description": "编程语言",
"required": true
}
]
}
执行提示词
要执行提示词,客户端需要发送prompts/execute
请求:
// 请求
{
"method": "prompts/execute",
"arguments": {
"name": "analyze-code",
"arguments": {
"language": "python"
}
}
}
提示词的工作原理
提示词的生命周期
提示词的生命周期包括创建、发现、获取和执行四个主要阶段:
- 创建: 服务器创建提示词模板,并定义其参数和功能
- 发现: 客户端通过
prompts/list
发现可用的提示词 - 获取: 客户端通过
prompts/get
获取特定提示词的详细信息 - 执行: 客户端通过
prompts/execute
执行提示词,LLM根据该提示词生成响应
提示词与LLM的交互
提示词模板结合了系统提示和用户输入的占位符。当客户端调用提示词时,MCP服务器会将提示词模板与提供的参数结合起来,形成要发送给LLM的完整提示。例如,对于一个名为"summarize-text"的提示词,系统提示可能是:
“你是一个文本摘要专家。你的任务是总结给定的文本。保持简洁,抓住主要观点。”
然后,用户输入是"text"参数的值。完整的提示将是:
“你是一个文本摘要专家。你的任务是总结给定的文本。保持简洁,抓住主要观点。文本:[text_value]”
这个完整的提示被发送给LLM,它将生成相应的摘要。
提示词示例
基础提示词示例
以下是一个名为"simple_prompt"的基础提示词示例,它不接受任何参数[7]:
- 名称: simple_prompt
- 描述: 基础提示,无参数
- 返回值: 单条消息交换