使用 go-zero MCP 实现动态 Prompt:打造更智能的 AI 应用
本帖最后由 mrkong 于 2025-5-13 16:51 编辑在 AI 快速发展的时代,单纯依赖大模型本身,已无法满足多变且复杂的业务需求。要打造真正“聪明”的 AI 应用,模型不仅要理解用户意图,还需具备行动能力(Agency)——能感知上下文、动态生成响应、调用外部工具,甚至访问实时数据。
go-zero 的 MCP(Model Context Protocol)框架,正是为此而设计。它帮助开发者更高效地构建基于大模型的智能系统,让 AI 拥有灵活、可控、结构化的提示词(Prompt)机制。本文将带你深入了解如何借助 go-zero MCP 实现动态 Prompt,让你的 AI 应用具备真正的“上下文感知”与“任务理解”能力。
什么是 MCP Prompt?MCP Prompt 是一种 标准化提示词协议,用于封装向大语言模型(LLM)传递的输入、结构化模型响应,并可灵活集成上下文、参数和外部资源。它具备以下核心能力:✅ 支持 参数化输入 与 上下文感知交互
✅ 规范化 LLM 的输入输出结构
✅ 支持 多步骤工作流调度
✅ 可与工具链(Tools)及资源系统(如日志、数据库、代码仓库等)无缝集成特别地,MCP 的最大亮点是支持 动态 Prompts —— 能根据用户输入和上下文,在运行时动态生成提示词,而不是一成不变的模板。
MCP 支持的 Prompt 类型
类型描述
静态 Prompt固定内容,不依赖用户输入
动态 Prompt实时构建,结合用户输入与上下文
动态 Prompt 更加灵活,是实现智能交互、上下文适配的关键能力。
实战:用 go-zero MCP 构建动态提示词服务
下面我们通过实际代码,构建一个 MCP 动态 Prompt 服务。第一步:配置文件 etc/config.yaml
name: prompt-service
port: 8080
第二步:启动 MCP 服务器package main
import (
"flag"
"github.com/zeromicro/go-zero/core/conf"
"github.com/zeromicro/go-zero/core/logx"
"github.com/zeromicro/go-zero/mcp"
)
var configFile = flag.String("f", "etc/config.yaml", "配置文件路径")
func main() {
flag.Parse()
var c mcp.McpConf
conf.MustLoad(*configFile, &c)
server := mcp.NewMcpServer(c)
// 注册动态 Prompt
registerMyPrompt(server)
logx.Info("MCP 服务器已启动")
server.Start()
}第三步:注册动态Prompt
func registerMyPrompt(server mcp.McpServer) {
server.RegisterPrompt(mcp.Prompt{
Name: "get_custom_prompt",
Description: "根据用户输入生成动态提示词",
Arguments: []mcp.PromptArgument{
{
Name: "user_query",
Description: "用户输入的问题",
Required: true,
},
{
Name: "context_id",
Description: "可选的上下文 ID",
Required: false,
},
},
Handler: func(ctx context.Context, args mapstring) ([]mcp.PromptMessage, error) {
var req struct {
UserQuery string `json:"user_query"`
ContextID string `json:"context_id,optional"`
}
if err := mcp.ParseArguments(args, &req); err != nil {
return nil, fmt.Errorf("参数解析失败: %w", err)
}
return []mcp.PromptMessage{
{
Role: mcp.RoleUser,
Content: mcp.TextContent{
Text: fmt.Sprintf(`你是一个乐于助人的 AI 助手,请回答用户的问题:%s%s`,
req.UserQuery, getContextInstructions(req.ContextID)),
},
},
}, nil
},
})
}
func getContextInstructions(contextID string) string {
if contextID == "" {
return ""
}
return fmt.Sprintf("\n请结合上下文 ID [%s] 提供更准确的回答。", contextID)
}
该 Prompt 可以根据用户的输入内容,动态生成个性化的提示词,同时结合上下文 ID 提供更智能的响应。
实用案例:Go 语言代码审查助手我们进一步通过一个实用示例,展示动态 Prompt 的强大功能 —— 创建一个 Go 代码审查助手。
server.RegisterPrompt(mcp.Prompt{
Name: "get_code_review_prompt",
Description: "生成代码审查提示词",
Arguments: []mcp.PromptArgument{
{
Name: "code_snippet",
Description: "待审查的代码片段",
Required: true,
},
{
Name: "focus_areas",
Description: "审查重点(如性能、并发、安全)",
Required: false,
},
},
Handler: func(ctx context.Context, args mapstring) ([]mcp.PromptMessage, error) {
var req struct {
CodeSnippet string `json:"code_snippet"`
FocusAreasstring `json:"focus_areas,optional"`
}
if err := mcp.ParseArguments(args, &req); err != nil {
return nil, err
}
return []mcp.PromptMessage{
{
Role: mcp.RoleUser,
Content: mcp.TextContent{
Text: fmt.Sprintf(`你是一位经验丰富的 Go 开发者,请审查以下代码并提供优化建议:
<go-code>
%s
</go-code>
请重点关注以下方面:
1. 可读性
2. 性能
3. 并发安全
4. 潜在 Bug
5. Go 最佳实践%s`, req.CodeSnippet, getFocusAreasInstructions(req.FocusAreas)),
},
},
}, nil
},
})
func getFocusAreasInstructions(focus string) string {
if focus == "" {
return ""
}
return fmt.Sprintf("\n6. 特别关注:%s", focus)
}
无论用户提交何种代码片段,Prompt 都能根据输入实时生成审查要求,甚至支持指定关注点(如并发或安全问题),极大增强了 AI 审查工具的灵活性和可用性。
交互流程演示
整个交互过程如下:1.客户端调用 prompts/list 获取可用的 Prompt 列表;2.客户端调用 prompts/list 获取可用的 Prompt 列表;3.MCP 服务根据参数生成 Prompt 并返回;4.客户端调用 LLM,执行推理并获取结果。这一标准流程为 Prompt 的复用、调试和版本控制提供了极大便利。
总结:MCP 让AI更聪明通过 go-zero 的 MCP,你可以:✅ 统一 Prompt 调用与交互规范
✅ 实现上下文感知、动态提示词生成
✅ 支持多步骤工作流与外部工具集成
✅更好地控制 LLM 的行为,提升输出质量MCP 正在推动 AI 应用从“静态交互”向“智能体交互”进化,是构建高质量 AI 产品的重要基石。借助 go-zero MCP,你可以轻松打造更灵活、可扩展、可维护的智能系统。如果你也在构建基于大模型的应用,欢迎尝试 go-zero MCP,让你的 AI 具备“理解力”与“执行力”。
页:
[1]