☰
go-stock 技能系统(Skill)使用与源码深度指南:创建、导入、斜杠指令、AI 自动选用与技能广场
2026/9/27 9:25:46 网站建设 项目流程
  • 人工智能
  • 大模型
  • AI 应用
  • AI Agent
  • RAG
  • 金融科技
  • 桌面应用
  • MCP Clients

【免费下载链接】go-stock

🦄🦄🦄AI赋能股票分析:AI加持的股票分析/选股工具。股票行情获取,AI热点资讯分析,AI资金/财务分析,涨跌报警推送。支持A股,港股,美股。支持市场整体/个股情绪分析,AI辅助选股等。数据全部保留在本地。支持DeepSeek,OpenAI, Ollama,LMStudio,AnythingLLM,硅基流动,火山方舟,阿里云百炼等平台或模型。

项目地址:https://gitcode.com/gh_mirrors/go/go-stock
点击查看免费下载

导读:本文以 go-stock 的 SKILL_GUIDE.md 为主线,完整讲解「技能(Skill)」的完整生命周期——从「技能是什么」「SKILL.md 格式与存储结构」「三种获取方式」到「对话中斜杠指令 / DeepAgents 自动选用」「本地管理 / 分享到广场」以及 FAQ 与开发者视角的技术细节。文中每个操作步骤均标注了可验证的仓库源码(app.go、backend/agent/skill_backend.go 等),读完你可以独立创建一套可复用的专业 AI 指令(如龙头战法、复盘模板),并理解其底层实现原理。


一、技能是什么:一组可复用的 AI 专业指令

在 go-stock 中,技能(Skill)= 一组可复用的 AI 专业指令,以文件夹形式存放。一个技能目录的核心是SKILL.md文件——它由YAML 元数据(frontmatter)+ Markdown 指令正文两部分组成,同时可以附带脚本、配置文件等任意辅助资源。

技能系统解决的痛点非常明确:每次让 AI 扮演"龙头战法交易顾问"或执行"复盘模板",你都要把角色设定、方法论、纪律铁律重新敲一遍。把这段指令固化成一个技能后,一句话就能让 AI 以该角色、按该流程执行,还可以把技能打包分享给其他用户。

两种典型用法

用法机制适合场景
斜杠指令(/手动选择)选中技能后,SKILL.md 正文覆盖系统提示词,本轮对话按该技能的指令行事明确想让 AI 扮演某个角色 / 执行固定流程
AI 自动选用(DeepAgents 模式)技能列表注入 Agent,AI 依据 frontmatter 的name/description自主判断是否加载某个技能的正文开放式提问,让 AI 自己挑合适的方法论

💡 斜杠指令在所有 Agent 模式下可用;AI 自动选用目前仅 DeepAgents 模式(默认模式)支持。

深入实现:AI 自动选用在 DeepAgents 启动时通过 backend/agent/agent.go 的buildSkillMiddleware()实现——它扫描rootDir/skills/下所有一级子目录中的SKILL.md,把解析出的 frontmatter 摘要注入 Agent;模型判断问题与某技能相关时,再通过skill工具读取该技能的完整正文执行。若无技能或skills目录不存在,中间件不注册(返回 nil)。


二、技能的存储结构与 SKILL.md 格式

2.1 目录结构

<go-stock 可执行文件所在目录>/ └── skills/ # 技能根目录(与工作目录无关) ├── 打板策略/ # 一个技能 = 一个子目录 │ ├── SKILL.md # 必需:技能定义 │ ├── scripts/run.sh # 可选:附带脚本 │ └── examples/demo.md # 可选:示例/参考资料 └── 复盘模板/ └── SKILL.md

要点:

  • 目录位置跟随可执行文件(os.Executable()所在目录),从任何工作目录启动都不会变,避免「换目录启动数据丢失」;
  • 每个一级子目录就是一个技能,必须包含SKILL.md,否则不被识别;
  • 目录名即技能的dirName(用于斜杠指令与本地管理),显示名取自 SKILL.md 的name字段。

源码佐证:app.go 中skillsDir()的实现:优先取os.Executable()所在目录下的skills,获取失败时才降级到os.Getwd()。这也解释了"与工作目录无关"的设计——/斜杠指令、技能管理页、DeepAgents 自动选用统一走skillsDir(),三者数据源一致(见 app.go 的buildSingleSkillSection注释:"与技能管理页面(ListFilesystemSkills)数据源一致,确保 / 斜杠指令选择的就是用户在技能管理中看到的技能")。

2.2 SKILL.md 格式

--- name: 龙头战法 description: A股超短线龙头股识别与跟踪策略,覆盖情绪周期定位、连板高度预判、断板处理纪律 --- ## 你的任务 你是一名专注A股超短线的游资风格交易顾问…… ## 情绪周期定位 …… ## 纪律铁律 ……
  • ---包裹的头部是YAML frontmatter,只有两个字段:name(名称)与description(描述,务必写清楚适用场景——AI 自动选用全靠它判断);
  • 正文即喂给模型的完整指令,建议用 Markdown 结构化(角色设定 → 方法论 → 纪律约束 → 输出格式);
  • ⚠️ frontmatter 的字段值必须是字符串,不要写成数组或数字,否则该技能解析失败会被静默跳过(详见第七节 FAQ)。

源码佐证:frontmatter 解析由 app.go 的parseSkillFrontmatter()完成——先定位首行---与结束---,再用yaml.Unmarshal解析name/description两个字符串字段;解析失败时返回空的FilesystemSkillInfo(技能被跳过而非报错)。DeepAgents 侧的 frontmatter 分离逻辑见 backend/agent/skill_backend.go 的parseSkillFrontmatter(),其loadSkillFromFile()还会对读取内容做stripSkillLineNumbers()行号前缀兼容处理。


三、入口位置

技能管理内嵌于深入研究页(路由/research):

  • 技能管理区块:本地技能列表 / 导入技能包 / 内置编辑器 / 打开技能广场;
  • MCP 服务区块:与技能系统相邻(见 MCP_GUIDE.md)。

前端佐证:技能管理前端位于 frontend/src/components/skill-manager.vue,它通过ImportSkillPackage、ListFilesystemSkills、DeleteFilesystemSkill、ListSkillFiles、ReadSkillFile、WriteSkillFile、DeleteSkillFile、EnableFilesystemSkill、DisableFilesystemSkill、UpdateFilesystemSkillDescription等 Wails 绑定方法与 app.go 交互;技能广场前端为 frontend/src/components/skillPlaza.vue。


四、获取技能的三种方式

方式 A — 技能广场下载(推荐)

  1. 技能管理 →「技能广场」按钮;
  2. 浏览/搜索/按分类与排序(最新/最热/最多下载)筛选;
  3. 点开技能详情 → 查看 SKILL.md 内容预览;
  4. 点「导入」→ 自动下载 zip(base64)并解压到本地skills/目录,立即生效。
  • VIP 专属技能(带 VIP 标识)需开通 VIP 后才能下载;
  • 下载即本地化:之后离线可用,广场删除分享不影响已导入的本地副本。

源码佐证:广场下载走ImportSkillFromBase64()(app.go):先 base64 解码,再在内存中解压 zip,校验规则与本地导入 zip 完全一致(路径穿越拦截、SKILL.md 校验、解压限流)。VIP 校验由服务端权威完成——skillPlaza.vue 中"服务端权威校验赞助码后返回实际 VIP 状态,客户端提交的 vipLevel 仅作参考,服务端不信任"。

方式 B — 导入本地 zip 技能包

从其他渠道(网站、好友)拿到.zip技能包后:

  1. 技能管理 →「导入技能包」;
  2. 选择 zip 文件 → 自动校验并解压。

zip 包要求与安全校验:

  • 必须包含SKILL.md(在根目录或子目录均可,子目录名会作为技能名);
  • 自动拦截路径穿越(含..的条目直接拒绝);
  • 解压写入量受限(防 zip 炸弹,声明大小与实际写入双重校验)。

源码佐证:app.go 的ImportSkillPackage()是这条路径的实现:

  • SKILL.md 定位与命名:SKILL.md在根目录时用 zip 文件名作技能名;在子目录时取第一级目录名(strings.SplitN(filepath.ToSlash(dir), "/", 2)[0]);
  • zip slip 防护:遍历条目时strings.Contains(f.Name, "..")直接拒绝,返回「压缩包包含非法路径」;
  • 解压限流:单文件 10MB 上限(maxFileSize = 10 * 1024 * 1024)、总计 100MB 上限(maxTotalSize = 100 * 1024 * 1024);ImportSkillFromBase64()更进一步用io.LimitReader(rc, maxFileSize+1)做实际写入字节数校验——因为 zip 头声明的UncompressedSize64可被伪造,不能仅信任声明值;
  • 覆盖导入:目标目录已存在时先删除再解压(os.RemoveAll(targetDir))。

方式 C — 手工创建

  1. 在skills/下新建文件夹(名字即 dirName,建议用英文或无特殊符号,如dragon-strategy);
  2. 新建SKILL.md,按第二节格式填写;
  3. 回到技能管理页点「刷新」即可看到。

源码佐证:目录名清洗由 app.go 的sanitizeSkillDirName()完成——剔除..、/、\、:、;、|、?、*、"、<、>等非法字符;清洗后为空时导入流程会回退为imported-skill作为技能名。手动创建者无需执行该函数,但目录命名仍建议避开上述字符,避免后续斜杠指令/管理操作出现歧义。


五、在对话中使用技能

1. 斜杠指令(所有模式)

在 AI 助手输入框输入/:

/

会弹出技能选择浮层,支持:

按键作用
继续输入文字按名称/描述过滤技能(如/龙头)
↑/↓上下选择
Enter选中(输入框中的/xxx文本自动清除)
Esc关闭浮层

选中后顶部出现技能标签,提示「已选择技能『xxx』,将忽略系统提示词」——系统提示词下拉会被禁用(技能指令优先),发送后整轮对话按技能行事。点标签上的 × 可清除恢复默认。

选中状态持久保存在本地,下次打开助手仍生效,记得按需清除。

前端佐证:斜杠指令交互实现在 frontend/src/components/FloatingAgentAssistant.vue 的checkSlashCommand()(匹配最后一个/开头的词)及技能浮层逻辑中。从源码看该交互支持技能多选:选中技能后技能名以@技能名标记追加到输入框、随消息文本一起提交——这是为了"确保 DeepAgents 子 Agent 委派时也能感知用户指定的技能"(用户消息是唯一能经 task 委派描述传播到子 Agent 的通道,子 Agent 不继承系统提示词)。停用的技能不进入可选列表,已选中的停用技能会被自动移除。

后端佐证:多选技能由 app.go 的buildSkillContext()合并构建:系统提示词返回「技能全文 + 技能激活纪律」,问题块返回<selected_skills>激活块随用户消息提交。激活纪律(buildSkillDiscipline)包含三条强制要求:【立即应用】禁止用通用泛泛分析替代、【委派传播】委派子任务时 description 必须原样包含技能名称、【输出自查】最终输出前自查是否体现技能方法论特征步骤。

2. AI 自动选用(DeepAgents 模式)

无需任何操作。DeepAgents 启动时会扫描skills/下所有合法技能,把 frontmatter 摘要交给模型;模型判断问题与某技能相关时自动读取其正文执行。

例:本地有「龙头战法」技能(description 提到情绪周期、连板),直接问:

「今天大盘冰点,怎么判断明天有没有修复的接力机会?」

模型识别到与技能描述相关 → 自动加载技能指令作答。

description 的写法决定命中率:写「做什么 + 适用于什么问题」,不要只写「很厉害的策略」。

源码佐证:这一链路的核心在 backend/agent/skill_backend.go 的tolerantSkillBackend与 backend/agent/agent.go 的buildSkillMiddleware()——List()返回所有可正常解析技能的 frontmatter 注入 Agent,Get(name)按 frontmattername精确匹配读取正文。技能名必须与skill工具的<name>参数一致(均取自 SKILL.md frontmatter name),见 app.go 的buildSkillQuestionBlock注释。


六、管理本地技能

技能管理页表格列出所有本地技能(名称 / 目录名 / 描述),每行可:

操作说明
编辑文件打开内置编辑器:左侧文件树(含子目录),右侧编辑器;支持新建文件/目录(如scripts/run.sh)、保存、删除文件(SKILL.md不可删,防技能失效)
删除技能整目录删除,二次确认
刷新重新扫描skills/(手工在文件系统里改文件后需要刷新)

编辑器常用于微调下载来的技能(比如把指令里的默认参数改成自己的),改完即时生效,无需重启。

源码佐证(编辑器的文件操作全部带目录穿越防护,app.go):

  • ListSkillFiles():递归列出技能目录所有文件(名称/相对路径/大小/修改时间);
  • ReadSkillFile()/WriteSkillFile()/DeleteSkillFile():统一先剔除..与\,再用filepath.Clean后校验路径仍以skillBase为前缀,越界即拒绝(「非法文件路径」);
  • ListFilesystemSkills()(app.go):只扫描一级子目录,优先读取启用态SKILL.md,不存在时读取停用态SKILL.md.disabled并打上disabled标志——即技能管理页的停用/启用开关背后是 DisableFilesystemSkill / EnableFilesystemSkill 对文件名的重命名;
  • UpdateFilesystemSkillDescription()(app.go):只改写 frontmatter 的description字段,其余字段与正文逐字节不变(采用行级处理而非 YAML 反序列化回写,支持单行值、块标量及无 frontmatter 时补建);
  • 停用技能可被重新启用,且每次对话重建都会重新扫描技能目录,因此停用/启用在下一次对话即实时生效。

说明:原指南提到"SKILL.md不可删",这是内置编辑器对删除操作的保护性约束(防止技能因失去定义文件而失效),删除整个技能请使用「删除技能」操作。


七、分享技能到广场

  1. 技能广场 →「分享我的技能」(需先登录广场账号);
  2. 从本地技能下拉中选择要分享的技能 → 自动打包为 base64 预填表单;
  3. 填写标题、分类、简介,可勾选VIP 专属(仅 VIP 用户可下载);
  4. 提交后广场出现你的分享,我的分享中可管理(更新/删除)。

分享的是打包快照:之后本地修改不会自动同步,需重新分享更新。

源码佐证:分享打包由 app.go 的PackSkillToBase64()完成:遍历技能目录全部文件(zip 内使用/分隔相对路径、顶层为技能目录名,便于对方导入),总大小超 2MB 拒绝分享(与服务端技能包 2MB 限制保持一致,maxShareTotal = 2 * 1024 * 1024),最后 zip 压缩后 base64 编码并附带name/description/fileCount/packageSize供前端预填分享表单。


八、常见问题

1. 技能管理页看不到我手工创建的技能

  • 确认目录在可执行文件所在目录的skills/下(不是工作目录);
  • 确认含SKILL.md且文件名大小写正确;
  • 点「刷新」重新扫描。

2./弹不出技能菜单

本地没有任何合法技能时浮层为空。先按第四节导入或创建至少一个技能。

3. AI(DeepAgents)没有自动用我的技能

  • 检查description是否描述清楚适用场景(AI 靠它判断相关性);
  • frontmatter 格式错误会被静默跳过——日志(logs/wails.log)中搜「跳过格式错误的技能」确认;
  • 常见错误:name/description值写成了 YAML 数组或数字;---前有空行;缺结束---。

4. 一个格式错误的 SKILL.md 会不会拖垮 AI?

不会。技能加载采用容错后端(tolerantSkillBackend):单个技能解析失败仅记警告并跳过,其余技能与 Agent 正常运行。历史上曾出现一个错误技能导致整个 Agent 启动失败的问题,现已修复。

源码佐证:backend/agent/skill_backend.go 的注释记录了修复背景——eino 内置的filesystemBackend.list()遇到任意一个 frontmatter 解析失败的技能,错误会经Info()传播到NewToolNode,导致整个 DeepAgents 工具列表构建失败(failed to unmarshal frontmatter: yaml: unmarshal errors: line 2: cannot unmarshal !!seq into string)。tolerantSkillBackend复用 eino 的 frontmatter 提取解析逻辑,但单个技能失败只logger.SugaredLogger.Warnf("skill 中间件: 跳过格式错误的技能文件: %v", e)并跳过。对应测试 backend/agent/skill_backend_test.go 的TestTolerantSkillBackendSkipsBadFrontmatter构造了"正常技能 + name 写成 YAML 序列的坏技能 + 缺 frontmatter 分隔符的技能"三个用例,断言List只返回 1 个可用技能且不报错、Get坏技能返回未找到——与指南中「日志搜『跳过格式错误的技能』」的排查方式完全对应。

5. 导入 zip 报「压缩包包含非法路径」

zip 内条目名含..(路径穿越攻击特征),已按安全策略拒绝。来源不可信的包不要强行导入。

6. VIP 技能下载提示「请先开通 VIP」

广场侧权限控制(服务端校验,非客户端判断)。开通 VIP 后重新下载即可。

7. 选了技能后系统提示词不生效

这是设计行为:斜杠指令选中的技能正文会覆盖系统提示词。清除技能标签即可恢复。


九、技术细节(开发者参考)

下表汇总技能系统各环节的实现位置,便于深入研读:

内容位置
技能目录定位(skills/,跟随可执行文件)app.go →skillsDir()
zip 导入(zip slip 防护 / SKILL.md 校验 / 解压限流)app.go →ImportSkillPackage();app.go →ImportSkillFromBase64()
本地技能列表 / 删除 / 停用 / 启用app.go →ListFilesystemSkills();app.go →DeleteFilesystemSkill();app.go →DisableFilesystemSkill();app.go →EnableFilesystemSkill()
描述在线编辑app.go →UpdateFilesystemSkillDescription()/replaceFrontmatterDescription()
技能文件树 / 读 / 写 / 删(含穿越防护)app.go →ListSkillFiles()/ReadSkillFile()/WriteSkillFile()/DeleteSkillFile()
分享打包(base64,2MB 上限)app.go →PackSkillToBase64()
frontmatter 解析 / 技能提示词组装app.go →parseSkillFrontmatter();app.go →buildSkillContext();app.go →buildSkillDiscipline()/buildSkillQuestionBlock()
目录名清洗(去..//等非法字符)app.go →sanitizeSkillDirName()
容错技能后端(DeepAgents 自动选用)backend/agent/skill_backend.go →tolerantSkillBackend
技能中间件注册(扫描rootDir/skills/)backend/agent/agent.go →buildSkillMiddleware()
容错后端测试用例backend/agent/skill_backend_test.go →TestTolerantSkillBackendSkipsBadFrontmatter
技能管理前端frontend/src/components/skill-manager.vue
技能广场前端frontend/src/components/skillPlaza.vue
斜杠指令交互frontend/src/components/FloatingAgentAssistant.vue →checkSlashCommand()等

许可证

go-stock 的技能系统遵循项目根目录 LICENSE 的开源许可。本文档对应的原始指南位于 docs/SKILL_GUIDE.md,MCP 服务与技能系统的配套说明见 docs/MCP_GUIDE.md。

  • 人工智能
  • 大模型
  • AI 应用
  • AI Agent
  • RAG
  • 金融科技
  • 桌面应用
  • MCP Clients

【免费下载链接】go-stock

🦄🦄🦄AI赋能股票分析:AI加持的股票分析/选股工具。股票行情获取,AI热点资讯分析,AI资金/财务分析,涨跌报警推送。支持A股,港股,美股。支持市场整体/个股情绪分析,AI辅助选股等。数据全部保留在本地。支持DeepSeek,OpenAI, Ollama,LMStudio,AnythingLLM,硅基流动,火山方舟,阿里云百炼等平台或模型。

项目地址:https://gitcode.com/gh_mirrors/go/go-stock
点击查看免费下载

相关推荐

上一篇:解锁ESP32 CNC控制新可能:Grbl_Esp32深度实践指南
下一篇:探索Grbl_Esp32:多轴协同控制的革新实践全解析

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

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询