返回列表 发布新帖
查看: 7|回复: 0

使用 go-zero MCP 实现动态 Prompt:打造更智能的 AI 应用

发表于 2 小时前 | 查看全部 |阅读模式

这里或许是互联网从业者的最后一片净土,随客社区期待您的加入!

您需要 登录 才可以下载或查看,没有账号?立即注册

×
本帖最后由 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
  1. name: prompt-service
  2. port: 8080
复制代码
第二步:启动 MCP 服务器
  1. package main

  2. import (
  3.     "flag"
  4.     "github.com/zeromicro/go-zero/core/conf"
  5.     "github.com/zeromicro/go-zero/core/logx"
  6.     "github.com/zeromicro/go-zero/mcp"
  7. )

  8. var configFile = flag.String("f", "etc/config.yaml", "配置文件路径")

  9. func main() {
  10.     flag.Parse()

  11.     var c mcp.McpConf
  12.     conf.MustLoad(*configFile, &c)

  13.     server := mcp.NewMcpServer(c)

  14.     // 注册动态 Prompt
  15.     registerMyPrompt(server)

  16.     logx.Info("MCP 服务器已启动")
  17.     server.Start()
  18. }
复制代码
第三步:注册动态Prompt
  1. func registerMyPrompt(server mcp.McpServer) {
  2.     server.RegisterPrompt(mcp.Prompt{
  3.         Name:        "get_custom_prompt",
  4.         Description: "根据用户输入生成动态提示词",
  5.         Arguments: []mcp.PromptArgument{
  6.             {
  7.                 Name:        "user_query",
  8.                 Description: "用户输入的问题",
  9.                 Required:    true,
  10.             },
  11.             {
  12.                 Name:        "context_id",
  13.                 Description: "可选的上下文 ID",
  14.                 Required:    false,
  15.             },
  16.         },
  17.         Handler: func(ctx context.Context, args map[string]string) ([]mcp.PromptMessage, error) {
  18.             var req struct {
  19.                 UserQuery string `json:"user_query"`
  20.                 ContextID string `json:"context_id,optional"`
  21.             }

  22.             if err := mcp.ParseArguments(args, &req); err != nil {
  23.                 return nil, fmt.Errorf("参数解析失败: %w", err)
  24.             }

  25.             return []mcp.PromptMessage{
  26.                 {
  27.                     Role: mcp.RoleUser,
  28.                     Content: mcp.TextContent{
  29.                         Text: fmt.Sprintf(`你是一个乐于助人的 AI 助手,请回答用户的问题:%s%s`,
  30.                             req.UserQuery, getContextInstructions(req.ContextID)),
  31.                     },
  32.                 },
  33.             }, nil
  34.         },
  35.     })
  36. }

  37. func getContextInstructions(contextID string) string {
  38.     if contextID == "" {
  39.         return ""
  40.     }
  41.     return fmt.Sprintf("\n请结合上下文 ID [%s] 提供更准确的回答。", contextID)
  42. }
复制代码
该 Prompt 可以根据用户的输入内容,动态生成个性化的提示词,同时结合上下文 ID 提供更智能的响应。

实用案例:Go 语言代码审查助手
我们进一步通过一个实用示例,展示动态 Prompt 的强大功能 —— 创建一个 Go 代码审查助手。

  1. server.RegisterPrompt(mcp.Prompt{
  2.     Name:        "get_code_review_prompt",
  3.     Description: "生成代码审查提示词",
  4.     Arguments: []mcp.PromptArgument{
  5.         {
  6.             Name:        "code_snippet",
  7.             Description: "待审查的代码片段",
  8.             Required:    true,
  9.         },
  10.         {
  11.             Name:        "focus_areas",
  12.             Description: "审查重点(如性能、并发、安全)",
  13.             Required:    false,
  14.         },
  15.     },
  16.     Handler: func(ctx context.Context, args map[string]string) ([]mcp.PromptMessage, error) {
  17.         var req struct {
  18.             CodeSnippet string `json:"code_snippet"`
  19.             FocusAreas  string `json:"focus_areas,optional"`
  20.         }

  21.         if err := mcp.ParseArguments(args, &req); err != nil {
  22.             return nil, err
  23.         }

  24.         return []mcp.PromptMessage{
  25.             {
  26.                 Role: mcp.RoleUser,
  27.                 Content: mcp.TextContent{
  28.                     Text: fmt.Sprintf(`你是一位经验丰富的 Go 开发者,请审查以下代码并提供优化建议:

  29. <go-code>
  30. %s
  31. </go-code>

  32. 请重点关注以下方面:
  33. 1. 可读性
  34. 2. 性能
  35. 3. 并发安全
  36. 4. 潜在 Bug
  37. 5. Go 最佳实践%s`, req.CodeSnippet, getFocusAreasInstructions(req.FocusAreas)),
  38.                 },
  39.             },
  40.         }, nil
  41.     },
  42. })

  43. func getFocusAreasInstructions(focus string) string {
  44.     if focus == "" {
  45.         return ""
  46.     }
  47.     return fmt.Sprintf("\n6. 特别关注:%s", focus)
  48. }
复制代码
无论用户提交何种代码片段,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 具备“理解力”与“执行力”。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Copyright © 2001-2025 Suike Tech All Rights Reserved. 随客交流社区 (备案号:津ICP备19010126号) |Processed in 0.122307 second(s), 10 queries , Gzip On, MemCached On.
关灯 在本版发帖返回顶部
快速回复 返回顶部 返回列表