这里或许是互联网从业者的最后一片净土,随客社区期待您的加入!
您需要 登录 才可以下载或查看,没有账号?立即注册
×
本帖最后由 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 map[string]string) ([]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 map[string]string) ([]mcp.PromptMessage, error) {
- var req struct {
- CodeSnippet string `json:"code_snippet"`
- FocusAreas string `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 具备“理解力”与“执行力”。
|