news 2026/9/24 14:31:33

如何让 AI 智能体更聪明:CangjieMagic-Examples 中 @tool 注解与任务规划的完整指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
如何让 AI 智能体更聪明:CangjieMagic-Examples 中 @tool 注解与任务规划的完整指南

如何让 AI 智能体更聪明:CangjieMagic-Examples 中 @tool 注解与任务规划的完整指南

【免费下载链接】CangjieMagic-Examples项目地址: https://gitcode.com/Cangjie/CangjieMagic-Examples

CangjieMagic-Examples是 Cangjie Magic 框架的官方示例仓库,它用三个真实项目(端侧智能体MagicAgent、RAG 代码助手CangjieRAGCodeAssistant、MCP 工具服务集合CangjieMagicMCPServer)演示了智能体开发中最核心的两件事:@tool注解把普通函数变成大模型可调用、可自主规划的工具。读完本文,你就能理解"工具设计模式"是怎么让 Agent 从"会聊天"变成"会干活"的。


🗂️ 一图看懂:仓库里的三类智能体示例

模块定位核心看点
CangjieMagicMCPServer/工具集(MCP Server)@tool注解的完整形态:参数描述、示例、安全边界、自动修复
MagicAgent/端侧智能体 App任务规划工具 +react执行器 + MCP 混合接入
CangjieRAGCodeAssistant/本地 RAG 助手@agent声明式绑定检索源,代码问答助手

其中工具示例覆盖了 5 种典型场景:fetcher(网页抓取+语义检索)、filesystem(文件操作+摘要)、pyexec(代码执行+自动修复)、imageGen(文生图)、time(时间查询),完整源码见 CangjieMagicMCPServer/README.md。


🔧 @tool 注解深度解析:Agent 调用工具前的"说明书"

大模型本身不能执行代码,它只能"决定"调用哪个工具、传什么参数。@tool注解的作用,就是把一个普通函数翻译成模型能读懂的"说明书"。

1. 最小用法:零参数工具

最简单的工具只需要一句功能描述,见 time/src/main.cj:

@tool[ description = "获取当前时间" ] public func getCurrentTime(): String { ... }

配合一行StdioMCPServer.startWith(getCurrentTime),这个函数就成了标准 MCP 协议下的可调用工具。描述写得越准确,模型选工具、传参数就越准——这是工具设计的第一原则。

2. 进阶用法:参数描述 + 调用示例

给有参数的工具,用parameters字段逐项说明语义,见 pyexec/src/main.cj:

@tool[ description: """...环境每次执行都会重置,必须发送完整脚本...""", parameters: { code: "The python code to execute..." }, examples: [ "codeInterpreter(\"print(1+2)\")" ] ] public func codeInterpreter(code: String): String { ... }

这里有三个细节值得学习:

  • 描述中写明"坑":告诉模型环境每次重置、代码不要包在 markdown 代码块里,能显著减少无效调用;
  • 参数说明精确到格式:连字符串字面量的引号写法都做了约束;
  • examples提供调用范例:等价于给模型做 few-shot,降低幻觉参数概率。

fetcher工具则展示了"参数即检索意图"的设计——target参数描述用户期望从网页获取什么内容,工具内部直接用它做语义检索,见 fetcher/src/main.cj。

3. 工具族模式:安全边界 + 复合能力

filesystem模块(filesystem/src/main.cj)是一个完整的"工具族"设计范本:

  • 安全沙箱:所有工具入口先走checkPath校验,只允许访问启动时声明的--allowed-dir,路径越界直接返回错误信息;
  • 能力分层listDirreadFilesearchFile三个原子工具 + 一个"高阶工具"summarizeFile
  • 工具内嵌子智能体summarizeFile内部用一个@agent声明的SummaryAgent生成摘要——工具不只是执行,还可以是一个"小型智能体"。

💡 设计启示:一个高质量工具 = 清晰的 description + 明确的参数约束 + 可靠的错误返回。错误信息会直接喂给模型,让它有机会自我纠正。


🤖 智能体任务规划:让 Agent 自己"想步骤"

工具解决"能做什么",任务规划解决"怎么做"。仓库中pyexecMagicAgent展示了两种典型规划模式。

1. 代码自修复:把"试错-修复"规划进工具内部

codeInterpreter工具在内部实现了一个最多 3 轮的规划循环:执行 Python → 失败则把错误信息交给"程序修复模型" → 重试。修复模型的系统提示词里还内置了THOUGHT PROTOCOL(先理解、再分析根因、最后探索修复方案),见 pyexec/src/main.cj。

这种"工具内部自带 ReAct 循环"的模式,让上层 Agent 无需关心修复细节,一次调用就拿到可用结果。

2. 端侧任务规划:规划工具 + react 执行器

MagicAgent的 entry/src/main/cangjie/src/pages/llm.cj 是整仓最精彩的部分:

核心技巧:把"流程"本身做成一个工具。ticketPlan工具不执行任何操作,只是返回一份购票步骤清单(定位出发地 → 推断目的地 → 确认日期 → 查票 → 确认车次 → 确认座位 → 天气提醒):

@tool[description: "购买车票流程规划(预订/购买车票相关的,优先调用该工具)"] public func ticketPlan(): String { return """具体分为以下步骤..."""; }

@prompt中再约定"涉及购票时先调用ticketPlan进行规划",模型就会先"取计划、再按步骤执行"。这就是规划与执行分离

@agent[model: "${MODEL}", executor: "react", mcp: [ http("https://mcp.amap.com/sse?key=${AMAP_MCP_KEY}"), tools(ticketPlan, starbucksBooking, getCurLocation, queryContacts, ...) ] ] class Superman { @prompt("""...""") ... }
  • react执行器:让 Agent 自主"思考 → 调用工具 → 观察结果 → 再思考";
  • mcp混合接入:既挂远程地图 MCP 服务(路线规划、天气),又挂本地@tool函数(通讯录、日历、定位);
  • askUser也是工具:向用户提问被建模为一次工具调用,配合BlockingQueue同步等待用户输入,实现多轮交互式规划。

📚 RAG 代码助手:声明式绑定知识库

CangjieRAGCodeAssistant/src/main.cj 展示了另一类"能力挂载":@agent注解里直接声明rag检索源,Agent 每次对话前自动检索仓颉官方文档语料:

@agent[model: "${MODEL}", executor: "naive", rag: {source: retriver()}] class Superman { @prompt("""...""") }

配套的@prompt用完整示例教模型"只引用有用的文档、回答末尾列出参考文档"。构建向量库只需cjpm run --name cjca --run-args "--build",详见 CangjieRAGCodeAssistant/README.md。


🚀 快速上手:3 步跑通你的第一个 @tool 服务

  1. 装环境:安装仓颉 SDK 1.0.5 与 stdx,配置CANGJIE_STDX_PATH(见 CangjieMagicMCPServer/README.md);
  2. 选最简示例:克隆仓库后先跑无外部依赖的time工具:
    cjpm build cjpm run --name time
  3. 改造为你自己的工具:参考filesystem的模式,写函数 → 加@tool注解(描述+参数)→StdioMCPServer.startWith([...])暴露出去,即可接入任意支持 MCP 的 Agent。

✅ 小结

CangjieMagic-Examples 用可运行的代码回答了智能体开发的核心问题:

  • @tool注解:description 是灵魂,parameters 是护栏,examples 是范例,三者决定工具被调用的质量;
  • 工具设计模式:安全边界(沙箱校验)、能力分层(原子工具+复合工具)、工具内嵌子智能体(摘要/自修复);
  • 任务规划react执行器负责"思考-行动"循环,规划工具负责"给模型一张流程图",askUser让规划可以中途向用户校准。

掌握这三层,你就拥有了从零构建可靠 Agent 应用的方法论——而本仓库,就是这套方法论的活教材。

【免费下载链接】CangjieMagic-Examples项目地址: https://gitcode.com/Cangjie/CangjieMagic-Examples

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/24 14:31:31

密码学入门:从古典加密到现代网络安全

什么是密码学? 密码学是保护信息安全的科学,它通过加密技术将可读的信息(明文)转换为不可读的形式(密文),只有授权方才能解密恢复原始内容。就像给信息上了一把"数字锁",只…

作者头像 李华
网站建设 2026/9/24 14:31:17

GEO实战经验分享:让AI推荐你的产品

首先GEO是啥?会取得什么效果?官方定义是指生成式引擎优化,核心目标是让你的工具,在AI生成的回答中被引用和推荐。大白话做GEO就是让豆包、deepseek这些AI收录你的工具\商铺\言论。比如你是开店卖手办的,你为你的店&quo…

作者头像 李华
网站建设 2026/9/24 14:30:50

计算机系统---CPU的进程与线程处理

在计算机系统中,CPU作为“运算核心”是通过进程与线程这两个抽象层,实现对海量任务的有序调度、资源隔离与高效并发。 理解CPU如何处理进程与线程,本质是理解操作系统如何“管理任务”与“分配算力”——这一过程覆盖了资源定义、状态流转、调…

作者头像 李华
网站建设 2026/9/24 14:25:12

Visual Studio Installer Projects打包MSI安装包实战:从配置到避坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华