mrkong 发表于 2025-5-13 16:50:36

使用 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]
查看完整版本: 使用 go-zero MCP 实现动态 Prompt:打造更智能的 AI 应用