From df7ab052d4e296ebd2cc984b6b082ba8e6061da1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E5=94=AF=20A06?= Date: Sat, 11 Jul 2026 22:49:12 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BB=93=E9=A2=89skill(cangjie-skill)?= =?UTF-8?q?=E5=AE=8C=E6=95=B4=E9=9B=86=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 下载仓颉skill全量源码(methodology/extractors/templates) - cangjie_distill.py: 知识蒸馏引擎(RIA-TV++流水线) - cangjie-skills/股票投研体系/: 已蒸馏7个skill - Phase1: A股规则/K线基础 - Phase2: MACD/KDJ/成交量 - Phase3: 三表/估值方法 - INDEX.md技能地图 下一步: Phase5模拟交易 --- cangjie-skill/GITHUB_REPO.md | 14 ++ cangjie-skill/SKILL.md | 168 +++++++++++++ cangjie-skill/extractors/case-extractor.md | 65 +++++ .../extractors/counter-example-extractor.md | 67 +++++ .../extractors/framework-extractor.md | 61 +++++ .../extractors/glossary-extractor.md | 53 ++++ .../extractors/principle-extractor.md | 59 +++++ cangjie-skill/methodology/00-overview.md | 83 +++++++ cangjie-skill/methodology/01-stage0-adler.md | 57 +++++ .../methodology/02-stage1-parallel-extract.md | 69 ++++++ .../methodology/03-stage1.5-triple-verify.md | 84 +++++++ .../methodology/04-stage2-ria-plus.md | 90 +++++++ .../methodology/05-stage3-zettelkasten.md | 46 ++++ .../methodology/06-stage4-pressure-test.md | 97 ++++++++ .../methodology/07-stage5-deliver.md | 64 +++++ cangjie-skill/scripts/skill-gen.py | 1 + cangjie-skill/templates/digest-template.md | 1 + cangjie-skill/templates/index-template.md | 1 + cangjie-skill/templates/overview-template.md | 1 + cangjie-skill/templates/skill-template.md | 1 + .../templates/test-prompts-template.md | 1 + cangjie-skills/股票投研体系/INDEX.md | 31 +++ .../skills/stock_phase1_basics.md | 65 +++++ .../skills/stock_phase2_technical.md | 101 ++++++++ .../skills/stock_phase3_fundamental.md | 65 +++++ scripts/cangjie_distill.py | 233 ++++++++++++++++++ 26 files changed, 1578 insertions(+) create mode 100644 cangjie-skill/GITHUB_REPO.md create mode 100644 cangjie-skill/SKILL.md create mode 100644 cangjie-skill/extractors/case-extractor.md create mode 100644 cangjie-skill/extractors/counter-example-extractor.md create mode 100644 cangjie-skill/extractors/framework-extractor.md create mode 100644 cangjie-skill/extractors/glossary-extractor.md create mode 100644 cangjie-skill/extractors/principle-extractor.md create mode 100644 cangjie-skill/methodology/00-overview.md create mode 100644 cangjie-skill/methodology/01-stage0-adler.md create mode 100644 cangjie-skill/methodology/02-stage1-parallel-extract.md create mode 100644 cangjie-skill/methodology/03-stage1.5-triple-verify.md create mode 100644 cangjie-skill/methodology/04-stage2-ria-plus.md create mode 100644 cangjie-skill/methodology/05-stage3-zettelkasten.md create mode 100644 cangjie-skill/methodology/06-stage4-pressure-test.md create mode 100644 cangjie-skill/methodology/07-stage5-deliver.md create mode 100644 cangjie-skill/scripts/skill-gen.py create mode 100644 cangjie-skill/templates/digest-template.md create mode 100644 cangjie-skill/templates/index-template.md create mode 100644 cangjie-skill/templates/overview-template.md create mode 100644 cangjie-skill/templates/skill-template.md create mode 100644 cangjie-skill/templates/test-prompts-template.md create mode 100644 cangjie-skills/股票投研体系/INDEX.md create mode 100644 cangjie-skills/股票投研体系/skills/stock_phase1_basics.md create mode 100644 cangjie-skills/股票投研体系/skills/stock_phase2_technical.md create mode 100644 cangjie-skills/股票投研体系/skills/stock_phase3_fundamental.md create mode 100644 scripts/cangjie_distill.py diff --git a/cangjie-skill/GITHUB_REPO.md b/cangjie-skill/GITHUB_REPO.md new file mode 100644 index 00000000..88f4556d --- /dev/null +++ b/cangjie-skill/GITHUB_REPO.md @@ -0,0 +1,14 @@ +# GitHub Repo Metadata + +- Repository name: `cangjie-skill` +- Default README: `README.md` +- Description: `A generator workflow for turning books, long videos, podcasts, and courses into reusable AI skills, with extraction, validation, templating, and skill-graph construction.` +- Topics: + - `ai-skills` + - `knowledge-distillation` + - `prompt-engineering` + - `agent-workflows` + - `book-to-skill` + - `skill-generator` + - `automation` + - `templates` diff --git a/cangjie-skill/SKILL.md b/cangjie-skill/SKILL.md new file mode 100644 index 00000000..8cf45bfe --- /dev/null +++ b/cangjie-skill/SKILL.md @@ -0,0 +1,168 @@ +--- +name: cangjie-skill +description: Distill a book, long-video transcript, podcast, course, or interview into a coherent set of executable skills. Use when the user asks to "拆书" / "蒸馏一本书" / "把 XX 书做成 skill" / "把这个视频/播客/课程蒸馏成 skill" / "turn a book or video into skills" — i.e. wants the frameworks, principles, and methodologies in long-form content extracted into atomic, reusable Claude skills that an agent can invoke in real-world situations. NOT for simple summarization, book reviews, or role-playing as the author (that is nuwa-skill's job). +--- + +# cangjie-skill — 把一本书蒸馏成一组可执行 skills 的元 skill + +## 使命 + +把一本书里沉淀的方法论,拆解成一组**原子化、可被 agent 在真实场景下调用**的 skills,让读者真正用起来。 + +> **术语约定**: 本文档及 `methodology/`、`extractors/` 中所有的"书",泛指一切被蒸馏的长内容 — 书籍、长视频转写、播客文字稿、课程、访谈、长文、资料集。 + +**边界**: +- ✅ 做: 方法论 / 决策框架 / 清单 / 原则 / 概念体系的蒸馏 +- ❌ 不做: 书摘 / 读后感 / 作者人设角色扮演 (后者请用 nuwa-skill) + +## 核心方法论: RIA-TV++ + +一个五阶段 + 并行提取 + 三重验证 + darwin 兼容测试的流水线。详见 `methodology/00-overview.md`。 + +``` +阶段 0: Adler 整书理解 → BOOK_OVERVIEW.md +阶段 1: 5 个 agent 并行提取 → 候选方法论单元池 +阶段 1.5: 三重验证筛选 → 通过的单元 (用户轻确认) +阶段 2: RIA++ 构造 skill → 每个 skill 的 SKILL.md +阶段 3: Zettelkasten 链接 → INDEX.md + GLOSSARY.md +阶段 4: 压力测试 (darwin 兼容) → test-prompts.json + 回炉淘汰 +阶段 5: 交付 → DIGEST.md 精华长文 + 安装到 skills 目录 +``` + +## 何时调用此 skill + +用户说类似: +- "帮我拆《穷查理宝典》" +- "把毛选蒸馏成 skill" +- "把这个 B 站视频/播客/课程蒸馏成 skill" +- "distill this book into skills: " +- "我想把这本书的方法论做成可用的 skill" + +## 输入要求 + +在开始前**必须**从用户处确认: +1. **内容文本来源**: PDF / EPUB / TXT / 字幕文件 / 转写稿路径, 或可访问的纯文本。**不要**在没有文本的情况下"凭记忆"蒸馏 — 宁可停下来问用户要。(视频/播客建议先用 video-downloader 类工具拿到转写文本) +2. **内容元信息**: 书籍是"书名 + 作者 + 出版年"; 视频/播客/课程是"标题 + 作者(UP 主/主播/讲者) + 发布时间"。用于目录命名和审计。 +3. **是否首次试点**: 如果用户是第一次用 cangjie-skill,建议先蒸馏 1 份内容验证流程再批量。 + +**非书籍内容的字段映射**: `source_chapter` 等"章节"字段对视频填时间戳或分 P,对播客填集数,对课程填讲次 — 保证可追溯即可。 + +## 输出结构 + +``` +books// +├── PIPELINE_STATE.md # 流水线状态: 当前阶段 + 各 skill 进度 (断点续跑用) +├── BOOK_OVERVIEW.md # 阶段 0 产出: 主旨/骨架/术语/批判 +├── verified.md # 阶段 1.5 产出: 通过三重验证的单元 + 判定理由 +├── INDEX.md # 阶段 3 产出: skill 总览 + 引用图 +├── GLOSSARY.md # 阶段 3 产出: 全书共享术语词典 +├── DIGEST.md # 阶段 5 产出: 面向读者的精华长文 +├── candidates/ # 阶段 1 产出: 原始候选池 (审计用) +├── rejected/ # 阶段 1.5 淘汰的单元 + 原因 (审计用) +├── / +│ ├── SKILL.md +│ ├── test-prompts.json # darwin-skill 兼容格式 +│ └── test-results.md # 阶段 4 测试通过率 + 失败分析 +├── / +│ └── ... +``` + +## 执行流程 (严格按顺序) + +**断点续跑**: 开始前先检查 `books//PIPELINE_STATE.md` 是否存在。存在则读取并从记录的阶段续跑,不要从头重来。每完成一个阶段,更新该文件 (当前阶段 / 已完成产物 / 各 skill 状态 / 下一步),格式用简单的 checklist markdown 即可。 + +### 阶段 0 — 整书理解 + +1. 读取用户提供的书本文本。大文件分块阅读。 +2. 执行 `methodology/01-stage0-adler.md` 中的 Adler 四步 (结构 / 解释 / 批判 / 应用)。 +3. 按 `templates/BOOK_OVERVIEW.md.template` 填充,写入 `books//BOOK_OVERVIEW.md`。 +4. 把产出展示给用户确认:"骨架我理解对了吗?有没有你希望重点突出的方向?" 得到确认再进入阶段 1。 + +### 阶段 1 — 5 个 sub-agent 并行提取 + +**并行** spawn 5 个 Task sub-agents(使用 Agent 工具,一次调用中发起 5 个): + +| sub-agent | 读取的 prompt | 产出 | +|---|---|---| +| 框架提取器 | `extractors/framework-extractor.md` | 决策框架 / 思维模型 | +| 原则提取器 | `extractors/principle-extractor.md` | 原则 / 清单 / 规则 | +| 案例提取器 | `extractors/case-extractor.md` | 作者在书中亲自使用过的实例 | +| 反例提取器 | `extractors/counter-example-extractor.md` | 书中警告的失败模式 | +| 术语提取器 | `extractors/glossary-extractor.md` | 关键概念词典 | + +每个 sub-agent 独立读书、独立提取、独立输出到 `books//candidates/.md`。 + +- **长文本**: 超出单个 sub-agent 上下文的内容,按 `methodology/02-stage1-parallel-extract.md` 的分块策略处理。 +- **降级方案**: 当前环境不支持并行 sub-agent 时,用同样 5 个 extractor prompt **串行**执行,产出格式不变。 + +### 阶段 1.5 — 三重验证筛选 + +读取 `methodology/03-stage1.5-triple-verify.md`,对每个候选单元执行: + +- **V1 跨域**: 书中至少 2 个独立段落有佐证? +- **V2 预测力**: 能用它回答一个书里没明说的新问题吗? +- **V3 独特性**: 不是任何聪明人都会说的常识吗? + +通过的写入 `books//verified.md`。不通过的写入 `books//rejected/` 并附原因 — 保留审计轨迹,也允许用户事后捞回。 + +**用户轻确认** ★: 筛选完成后,把"通过的 N 个候选标题 + 淘汰的 M 个"列表展示给用户:"这 N 个会做成 skill,有想捞回或砍掉的吗?" 得到确认再进入阶段 2 — 阶段 2–4 是最耗时的部分,这一步确认能避免大量返工。 + +### 阶段 2 — RIA++ 构造 skill + +对每个通过的单元,按 `templates/SKILL.md.template` 填充: + +- **R (Reading)**: 原文引用 ≤150 字/段 (英文原文 ≤100 词/段) +- **I (Interpretation)**: 用自己的话重写方法论骨架 (避免照搬译本) +- **A1 (Past Application)**: 书中作者用过的案例 +- **A2 (Future Trigger)** ★: 用户在什么情境下会需要这个 → skill 的 `description` 字段 +- **E (Execution)**: 1-2-3 可执行步骤 +- **B (Boundary)**: 什么时候不适用 / 来自阶段 0 批判阶段的作者盲点 + +细则见 `methodology/04-stage2-ria-plus.md`。注意: A2 中"与相邻 skill 的区分"此时只写**初稿** (基于 verified.md 的单元列表),阶段 3 建立链接后回填定稿。 + +### 阶段 3 — Zettelkasten 链接 + +按 `methodology/05-stage3-zettelkasten.md`: +1. 找出 skill 之间的引用关系 (A 依赖 B / A 对比 B / A 组合 B) +2. 在每个 SKILL.md 末尾补"相关 skills"段,并回填 A2 的"与相邻 skill 的区分" +3. 按 `templates/INDEX.md.template` 生成 `INDEX.md` (含引用图 mermaid) +4. 把 `candidates/glossary.md` 整理成 `books//GLOSSARY.md` — 它是所有 skill 的共享词典,不该埋在审计目录里 + +### 阶段 4 — 压力测试 (darwin 兼容) + +对每个 skill 按 `methodology/06-stage4-pressure-test.md`: +1. 设计 5–10 条测试 prompt,按 `templates/test-prompts.json.template` 写入 `test-prompts.json` +2. 至少包括 3 类: **应调用** / **不应调用 (诱饵)** / **边界模糊**。诱饵中至少 1 条必须是"应触发同书另一个 skill"的场景 (跨 skill 混淆测试) +3. 优先用独立 sub-agent 盲测每条 prompt,由主流程对照预期统计结果,**未过的回炉重做阶段 2** — 不做"表面修补" +4. 每个 skill 的测试结果写入 `/test-results.md` + +### 阶段 5 — 交付 + +按 `methodology/07-stage5-deliver.md`: +1. 生成 `books//DIGEST.md` — 面向读者的精华长文 (按 `templates/DIGEST.md.template`),满足"不读全书、只看精华"的需求 +2. 询问用户安装位置 (用户级 `~/.claude/skills/` 或项目级 `.claude/skills/` / `.cursor/skills/`),把通过测试的 skill 复制或 symlink 过去 — **没有这一步,产出的 skill 无法被真正调用** +3. 告知用户: "已完成,可一键喂给 darwin-skill 自动进化" + +## 质量红线 (违反则阻止输出) + +1. 每个 skill 必须通过**全部**三重验证 +2. 每个 skill 必须有完整的 R / I / A1 / A2 / E / B 六段 +3. 原文引用 ≤150 字/段 (英文 ≤100 词/段) +4. 每个 skill 必须有 `test-prompts.json`,且包含诱饵测试 (不应调用的场景),其中至少 1 条是同书兄弟 skill 的场景 +5. `description` 字段必须明确 trigger 条件,不能只是"一个关于 X 的 skill" + +## 与 nuwa-skill / darwin-skill 的生态定位 + +- **nuwa-skill**: 蒸馏人 (思维方式 / 表达 DNA) +- **cangjie-skill** (本 skill): 蒸馏书 (方法论 / 框架 / 原则) +- **darwin-skill**: 进化任意 skill + +三者咬合: 本 skill 输出的 `test-prompts.json` 严格遵循 darwin-skill 格式,以便产出的 skill 可直接接入 darwin 做自动进化。 + +## 调用惯例 + +- **永远先试点 1 本** — 除非用户明确说"批量" +- **阶段之间主动汇报进度** — 不要静默跑完再 dump 结果 +- **不凭记忆拆书** — 没文本就停下来问 +- **保留审计轨迹** — candidates/ 和 rejected/ 都要留 +- **随时可续跑** — 每完成一个阶段就更新 PIPELINE_STATE.md,中断后从状态文件恢复 diff --git a/cangjie-skill/extractors/case-extractor.md b/cangjie-skill/extractors/case-extractor.md new file mode 100644 index 00000000..e26f5b7f --- /dev/null +++ b/cangjie-skill/extractors/case-extractor.md @@ -0,0 +1,65 @@ +# Case Extractor + +你是 cangjie-skill 流水线中**并行运行的 5 个 extractor 之一**,专门负责识别**作者在书中亲自应用某个方法论的具体案例**。 + +## 为什么要单独抽案例 + +案例本身不独立成 skill,但它们是阶段 1.5 **V1 跨域验证**的关键证据,也是阶段 2 **A1 (Past Application)** 段的素材来源。没有案例池,后面两步都会卡住。 + +## 你的输入 + +- `BOOK_OVERVIEW.md` +- 书本文本 + +## 你的职责范围 + +- 作者**亲自**经历/操作/决策的真实事件 +- 作者**转述**的历史事件、他人案例 (但必须是作者用来说明某个方法论的) +- 每个案例必须**绑定到一个方法论主题**,否则意义不大 + +## 不属于你的 + +- 纯背景叙事 (没有方法论绑定) +- 虚构的寓言/比喻 (除非作者拿它直接说明方法) +- 作者的观点 / 原则 / 框架本身 + +## 识别信号 + +- "1973 年,我曾..." +- "有一次..." +- "某某公司的案例..." +- "巴菲特告诉我..." +- "比如..." +- 过去时叙述 + 伴随评论/反思 + +## 输出格式 + +```yaml +- id: c01 + title: 投资 See's Candy + type: case + source_chapter: 第 5 讲 + source_quote: | + "我们以 2500 万美元收购了 See's Candy...这是我们第一次为品牌溢价付费。" + summary: | + 巴菲特和芒格收购 See's Candy 时, 放弃了格雷厄姆式的"便宜货"标准, + 转而为"有定价权的生意"付出溢价。这笔投资后来成了他们转向 + "优质企业+合理价格"策略的转折点。 + bound_to: # ★ 必须绑定到至少一个方法论主题 + - "能力圈 + 定价权" + - "从便宜货到优质企业的转变" + outcome: | + 该公司后续 30 年产生的现金流远超初始投资, 验证了新策略。 + tags: [case, investment, turning-point] +``` + +## 自检 + +- [ ] 每条案例都有 `bound_to` 字段,明确它在阐释什么 +- [ ] 有原文引用作为证据 +- [ ] `outcome` 字段尽量填 (如果书中说了结果) +- [ ] 不做筛选 + +## 数量预期 + +传记类 / 访谈整理类的书可能有几十上百个案例。方法论书可能 10–30 个。都不少于 5 个,否则阶段 2 的 A1 段会空。 diff --git a/cangjie-skill/extractors/counter-example-extractor.md b/cangjie-skill/extractors/counter-example-extractor.md new file mode 100644 index 00000000..9c073259 --- /dev/null +++ b/cangjie-skill/extractors/counter-example-extractor.md @@ -0,0 +1,67 @@ +# Counter-Example Extractor + +你是 cangjie-skill 流水线中**并行运行的 5 个 extractor 之一**,专门负责识别**作者警告的失败模式 / 反例 / 陷阱**。 + +## 为什么要单独抽反例 + +反例是阶段 2 的 **B (Boundary) 段**的核心素材来源。没有反例,skill 就没有边界,会在不该用的时候被调用,反而帮倒忙。**这是 cangjie-skill 区别于普通书摘最重要的一类内容。** + +## 你的输入 + +- `BOOK_OVERVIEW.md` +- 书本文本 + +## 你的职责范围 + +- **作者明确警告的失败模式**: "不要 X, 否则..." +- **作者批评的错误做法**: "很多人以为 X, 但其实..." +- **作者承认自己犯过的错**: "我当年错在..." +- **作者描述的反面典型**: "某某公司就是这样失败的..." +- **认知偏误 / 心理陷阱**: (芒格类书籍的核心) + +## 不属于你的 + +- 一般性的道德批评 (没有可学习的机制) +- 作者情绪化的吐槽 (没有论证) + +## 识别信号 + +- "最大的错误是..." +- "千万不要..." +- "很多人以为..." +- "失败的原因是..." +- "陷阱在于..." +- "我当年..." + 悔意 +- "人们往往..." + 负面 + +## 输出格式 + +```yaml +- id: ce01 + title: 过度自信偏误 + type: counter-example + source_chapter: 误判心理学 · 第 12 条 + source_quote: | + "大多数人都认为自己比平均水平更聪明、更公正、更有能力。 + 这种自我评价偏误在投资中尤其致命。" + failure_mode: | + 在自己不懂的领域自认为懂, 导致做出超出能力圈的决策。 + mechanism: | + 人脑默认把"熟悉"等同于"理解", 把"喜欢"等同于"正确"。 + 没有外部校正机制时, 过度自信会随成功次数累积而强化。 + warning_signs: + - 决策时感到"这很简单" + - 没有 plan B + - 不愿意向人请教 + bound_to: + - "能力圈判断" + - "检查清单决策" + tags: [counter-example, cognitive-bias, overconfidence] +``` + +## 自检 + +- [ ] 每条都有 `failure_mode` 和 `mechanism` (不只是说"这是错的") +- [ ] `warning_signs` 尽量填 (让后续的 B 段有信号) +- [ ] `bound_to`: 说明这个反例会限制哪些正面 skill 的适用范围 +- [ ] 有原文引用 diff --git a/cangjie-skill/extractors/framework-extractor.md b/cangjie-skill/extractors/framework-extractor.md new file mode 100644 index 00000000..c72be2c3 --- /dev/null +++ b/cangjie-skill/extractors/framework-extractor.md @@ -0,0 +1,61 @@ +# Framework Extractor + +你是 cangjie-skill 流水线中**并行运行的 5 个 extractor 之一**,专门负责从一本书里识别**思维模型 / 决策框架 / 推理方法**。 + +## 你的输入 + +- `BOOK_OVERVIEW.md` — 全书骨架 (阶段 0 产出) +- 书本文本 (完整或分块) + +## 你的职责范围 (只找这些) + +- **思维模型**: 可迁移的思考结构 (如 "能力圈" / "逆向思维" / "多元思维模型") +- **决策框架**: 面对决策时的结构化流程 (如 "先问最坏情况再算期望值") +- **推理方法**: 从已知推向未知的特定路径 (如 "从第一性原理出发") + +## 不属于你的 (交给别的 extractor) + +- 原则 / 清单 / 规则 → `principle-extractor` +- 作者亲自用过的具体案例 → `case-extractor` +- 失败模式 / 反例 / 警告 → `counter-example-extractor` +- 术语定义 → `glossary-extractor` + +边界模糊时**宁可多提取**,阶段 1.5 会去重。 + +## 识别信号 (在书中看到这些就要警觉) + +- 作者给某个思考方式**起了专门的名字** +- 某段话在讲**"面对 X 类问题时应该..."**的通用流程 +- 作者**反复在不同章节引用同一个思考结构** +- 作者明确说"这是我常用的 mental model / 方法 / 原则" +- 有结构化的 **if-then / 先-后 / 从-到** 句式 + +## 输出格式 + +每条候选写成一个 YAML 条目,追加到 `books//candidates/frameworks.md`: + +```yaml +- id: f01 + title: 逆向思维 + type: framework + source_chapter: 第 3 讲 + source_quote: | + "反过来想,总是反过来想。如果知道我会在哪里死去,那我就永远不去那里。" + summary: | + 面对一个目标时, 不直接问"怎么达成", 而先问"什么会让我失败"。 + 列出失败因素后, 避免它们, 反向推出应做的事。 + 这比正向推理更有效, 因为人对"不想要什么"的判断通常比对"想要什么"更清晰。 + tags: [decision, mental-model, inversion] +``` + +## 自检 (提交前) + +- [ ] 每条都在书中有原文根据,不是脑补 +- [ ] 每条都是"可迁移的思考结构",而不是具体案例或一句金句 +- [ ] 原文引用 ≤150 字 (英文 ≤100 词) +- [ ] 至少标了 1 个 tag +- [ ] **不做筛选** — 宁错杀,交给阶段 1.5 三重验证 + +## 数量预期 + +方法论密集的书通常有 10–30 个候选框架。少于 5 个很可能你漏读了;多于 50 个你可能把"非框架"的东西也算进来了。 diff --git a/cangjie-skill/extractors/glossary-extractor.md b/cangjie-skill/extractors/glossary-extractor.md new file mode 100644 index 00000000..4baddac9 --- /dev/null +++ b/cangjie-skill/extractors/glossary-extractor.md @@ -0,0 +1,53 @@ +# Glossary Extractor + +你是 cangjie-skill 流水线中**并行运行的 5 个 extractor 之一**,专门负责构建**关键概念词典**。 + +## 为什么要单独抽术语 + +作者**用某个词的方式**往往和字典不一样。如果不统一术语,后面的 skill 会把"能力圈"(芒格的特定用法) 当成字典里的"能力范围"来用,完全失真。 + +这个产出不会独立成 skill,但会作为**所有 skill 的共享词典**被引用。 + +## 你的输入 + +- `BOOK_OVERVIEW.md` +- 书本文本 + +## 你的职责范围 + +挑出满足以下**任一**条件的词: + +1. 作者反复使用 (全书出现 ≥3 次) +2. 作者明确定义过 ("所谓 X, 是指...") +3. 看起来像常用词但作者用法和常识不一样 +4. 是书的核心论点的组成词 (如《反脆弱》里的 antifragile) + +## 输出格式 + +```yaml +- id: g01 + term: 能力圈 + type: term + source_chapter: 第 2 讲 + author_definition: | + "你真正能做出准确判断的知识边界。不是你知道什么, 而是你知道'你知道什么'和'你不知道什么'的边界。" + key_distinction: | + ≠ "熟悉的领域" — 熟悉不代表能做判断 + ≠ "专业领域" — 博士学位也可能在能力圈外 + = 能持续做出比市场更准判断的范围 (需经实战验证) + why_it_matters: | + "能力圈"一词在所有投资决策类 skill 中都会出现。 + 若沿用字典义, skill 会建议用户"评估一下是否熟悉该领域", 这是错的。 + 正确的用法是"评估自己过去在此领域的判断准确率"。 + tags: [term, core-concept] +``` + +## 自检 + +- [ ] `author_definition` 尽量使用书中原文片段 +- [ ] `key_distinction`: 说明和"常识用法"的差异 (这是最有价值的字段) +- [ ] `why_it_matters`: 为什么下游 skill 需要这个澄清 + +## 数量预期 + +每本书大约 5–20 条核心术语。多于 30 条说明你把一般词汇也收进来了 — 只挑真正关键的。 diff --git a/cangjie-skill/extractors/principle-extractor.md b/cangjie-skill/extractors/principle-extractor.md new file mode 100644 index 00000000..a517b274 --- /dev/null +++ b/cangjie-skill/extractors/principle-extractor.md @@ -0,0 +1,59 @@ +# Principle Extractor + +你是 cangjie-skill 流水线中**并行运行的 5 个 extractor 之一**,专门负责识别**原则 / 清单 / 规则 / 断言**。 + +## 你的输入 + +- `BOOK_OVERVIEW.md` +- 书本文本 + +## 你的职责范围 + +- **原则 (principles)**: 作者明确提出的"应该如何" / "不应该如何"的断言 +- **清单 (checklists)**: 结构化的项目列表 (投资检查清单 / 决策前自问清单) +- **规则 (rules)**: 可直接拿来套用的判断规则 (如 "永远不要...当..." / "只有在...时才...") +- **格言/箴言 (maxims)**: 作者反复强调、带有行动指导意义的短句 + +## 不属于你的 + +- 思维模型 / 推理结构 → `framework-extractor` +- 作者亲自用过的案例 → `case-extractor` +- 反例 / 警告的失败模式 → `counter-example-extractor` +- 术语 → `glossary-extractor` + +## 识别信号 + +- "必须..." / "不要..." / "要记住..." / "三条原则..." +- 编号列表 (1. 2. 3.) 或项目符号 +- "每当...就要..." / "只有...才能..." +- 作者在多个场合重复的同一条断言 +- 毛选里的 "凡是...都..." / "...必须..." +- 段永平的 "stop doing list" 类项目 + +## 输出格式 + +```yaml +- id: p01 + title: Stop Doing List + type: principle + source_chapter: 第 2 部分 · 投资篇 + source_quote: | + "不做什么比做什么更重要。我们的 stop doing list 比 to do list 长得多。" + summary: | + 主动列出"绝对不做"的清单, 比列"要做"的清单更能防止重大错误。 + 适用于投资、战略、职业选择等"错一次就伤筋动骨"的场景。 + tags: [principle, decision, negative-checklist] +``` + +## 自检 + +- [ ] 每条都是"可直接应用的规则",不是思维结构 (后者给 framework-extractor) +- [ ] 有明确原文 +- [ ] 引用 ≤150 字 (英文 ≤100 词) +- [ ] 不做筛选 + +## 常见错误 + +1. **把描述当原则** — "作者告诉我们投资要谨慎" 不是原则;"绝不投资你看不懂的生意" 是。 +2. **把一整章当一条** — 原则必须原子化,一章可能包含 3–5 条独立原则,要拆开。 +3. **和 framework 混淆** — framework 是"怎么想",principle 是"做不做"。一个告诉你推理方式,一个告诉你 yes/no。 diff --git a/cangjie-skill/methodology/00-overview.md b/cangjie-skill/methodology/00-overview.md new file mode 100644 index 00000000..36dae906 --- /dev/null +++ b/cangjie-skill/methodology/00-overview.md @@ -0,0 +1,83 @@ +# RIA-TV++ 方法论总览 + +本文是 cangjie-skill 所用 SOP 的设计说明,解释"为什么这么做"。执行时的具体步骤请读 `SKILL.md` 和 `methodology/01-*` 至 `07-*`。 + +## 命名 + +**RIA-TV++** = +- **RIA** — 赵周 (《这样读书就够了》) 的便签拆书法: Reading / Interpretation / Appropriation +- **TV** — Triple Verification,借自 nuwa-skill 的三重验证 +- **++** — 面向 agent 执行的扩展: E (Execution 可执行步骤) + B (Boundary 边界) + +## 思想来源 + +| 来源 | 借鉴内容 | +|---|---| +| Mortimer Adler 《如何阅读一本书》 | 阶段 0: 分析阅读三阶段 (结构/解释/批判) | +| 赵周 RIA 拆书法 | 阶段 2: R-I-A1-A2 基本骨架, 尤其 A2 → trigger | +| Niklas Luhmann Zettelkasten | 原子化 + 链接 + 用自己的话重写 | +| Tiago Forte Progressive Summarization | 阶段 4 的"可验证压缩链条"思想 | +| nuwa-skill | 阶段 1 并行 extractor + 阶段 1.5 三重验证 | +| darwin-skill | 阶段 4 test-prompts.json 格式 + 可进化性 | + +## 根本洞察 + +**现有读书方法论都是为人类读者蒸馏,不是为 agent 执行者蒸馏。** + +| 维度 | 给人看 | 给 agent 用 (cangjie-skill 目标) | +|---|---|---| +| 关键字段 | 故事 / 金句 / 情感钩子 | trigger / 可执行步骤 / 判停标准 | +| 失败模式 | 读完就忘 | trigger 不准 → 永不调用或乱调用 | +| 成功标准 | 读者"有收获" | 真实问题被解决 | + +所以 RIA-TV++ 的所有"扩展"(TV / E / B / test-prompts) 都是为了解决这个目标迁移带来的新问题。 + +## 流水线 + +``` + ┌───────────────────┐ + │ 阶段 0: 整书理解 │ Adler 四步 + └─────────┬─────────┘ + │ BOOK_OVERVIEW.md + ▼ + ┌───────────────────┐ + │ 阶段 1: 并行提取 │ 5 个 sub-agent 同时跑 + └─────────┬─────────┘ + │ candidates/ + ▼ + ┌───────────────────┐ + │ 阶段 1.5: 三重验证 │ V1 跨域 / V2 预测力 / V3 独特性 + └─────────┬─────────┘ + │ 通过单元 + rejected/ + ▼ + ┌───────────────────┐ + │ 阶段 2: RIA++ 构造 │ R / I / A1 / A2 / E / B + └─────────┬─────────┘ + │ 每个 skill 的 SKILL.md + ▼ + ┌───────────────────┐ + │ 阶段 3: 链接 │ Zettelkasten + INDEX.md + └─────────┬─────────┘ + │ + ▼ + ┌───────────────────┐ + │ 阶段 4: 压力测试 │ test-prompts.json + 盲测 + 回炉 + └─────────┬─────────┘ + │ + ▼ + ┌───────────────────┐ + │ 阶段 5: 交付 │ DIGEST.md 精华长文 + 安装到 skills 目录 + └───────────────────┘ + │ + ▼ + 可喂给 darwin-skill 自动进化 +``` + +## 不变量 (任何迭代都不能违反) + +1. **原子性**: 一个 skill 只做一个方法论单元,不能"大而全" +2. **可追溯**: 每个 skill 必须有原文引用,指向源书章节 (视频指向时间戳/分 P) +3. **可验证**: 每个 skill 必须通过三重验证 + 压力测试 +4. **可进化**: 每个 skill 必须附带 darwin 兼容的 test-prompts.json +5. **用户参与**: 阶段 0 之后必须让用户确认骨架; 阶段 1.5 之后必须让用户确认入选名单 +6. **可交付**: 流程终点是"用户能调用"— skill 必须被安装到 skills 目录,读者需求由 DIGEST.md 承接 diff --git a/cangjie-skill/methodology/01-stage0-adler.md b/cangjie-skill/methodology/01-stage0-adler.md new file mode 100644 index 00000000..e8d30a32 --- /dev/null +++ b/cangjie-skill/methodology/01-stage0-adler.md @@ -0,0 +1,57 @@ +# 阶段 0 — 整书理解 (Adler 分析阅读) + +## 目标 + +在动手拆书之前,先**真正读懂这本书**。没有这一步,拆出来的 skill 只是一堆金句集,会带上作者的盲点却不自知。 + +产出: `books//BOOK_OVERVIEW.md` (按 `templates/BOOK_OVERVIEW.md.template` 填充)。 + +## 四步 (前三步来自 Adler, 第四步是本 skill 新增) + +### 步骤 1 — 结构 (Structural) + +识别书的"骨架",回答: + +- **这本书属于什么类型?** (方法论 / 传记 / 哲学 / 实操手册 / ...) +- **它的主旨用一句话说是什么?** — 必须真的能压缩到一句 +- **它的主要部分如何组合成一个整体?** — 列出 3–7 个一级论点并标出它们的关系 (并列 / 递进 / 对比 / 反驳) +- **作者试图解决的核心问题是什么?** + +### 步骤 2 — 解释 (Interpretive) + +- **关键术语**: 列出作者反复使用、有特定含义的概念词,给每个词写一句"作者本人的用法"定义 (不是字典定义) +- **核心命题**: 用你自己的话重述作者的 5–15 个核心主张 +- **论证链**: 这些主张之间是怎么推导的? 作者用什么证据支撑? + +### 步骤 3 — 批判 (Critical) ★ 最容易被跳过也最重要 + +Adler 原话: "在没有找出论证中的错误之前,你不能不同意作者。" 反过来: **在找出作者的局限之前,你也不能完全同意。** + +必须回答: +- **作者的时代局限**: 这本书写于什么时期? 哪些前提可能已经不成立? +- **作者的立场盲点**: 作者的身份 / 行业 / 文化背景让他忽略了什么? +- **未被证明的假设**: 作者把什么当成了不言自明但其实需要论证的东西? +- **反对意见**: 如果有人要反驳这本书,最强的论点会是什么? + +这一步的产出会直接成为每个 skill 的 **Boundary (B)** 字段来源。 + +### 步骤 4 — 应用潜力 (Applicability, 本 skill 新增) + +- **哪些内容可以 skill 化?** — 框架 / 清单 / 原则 / 决策程序 +- **哪些内容不适合 skill 化?** — 纯史料 / 纯故事 / 纯情感 (但可作为其他 skill 的 example) +- **预估 skill 数量**: 给一个粗略区间 (不要硬凑) +- **预估优先级**: 从"最能赋能普通人"的角度给候选 skill 排序 + +## 质量门 (进入阶段 1 之前必须满足) + +- [ ] 主旨能用一句话说清 +- [ ] 骨架列出 3–7 个一级论点 +- [ ] 关键术语词典有 ≥5 条 +- [ ] 批判阶段至少列出 3 条作者局限 (这一步没做到位就不能继续) +- [ ] 已向用户展示 BOOK_OVERVIEW.md 并得到确认 + +## 常见失败模式 + +1. **跳过批判阶段** — 导致 skill 把作者的偏见当真理 +2. **骨架不是"作者的骨架",而是自己的想法** — 注意你在写摘要还是在写读后感 +3. **术语定义用字典 / 常识而非作者的特定用法** — 作者用"能力圈"和字典用"能力圈"不是一回事 diff --git a/cangjie-skill/methodology/02-stage1-parallel-extract.md b/cangjie-skill/methodology/02-stage1-parallel-extract.md new file mode 100644 index 00000000..a22b1a2b --- /dev/null +++ b/cangjie-skill/methodology/02-stage1-parallel-extract.md @@ -0,0 +1,69 @@ +# 阶段 1 — 5 个 sub-agent 并行提取 + +## 目标 + +不用单一视角读一遍,而是**同时从 5 个不同角度扫描全书**,最大化候选单元覆盖率。 + +## 为什么要并行 + +- **覆盖**: 单一视角会漏。框架提取器找不到的"反例",反例提取器会找到。 +- **速度**: Claude Code 的 Agent 工具支持并行,不用白不用。 +- **独立性**: 每个 extractor 独立判断,避免互相污染 — 三重验证才能真正起作用 (V1 跨域要求"独立出现") + +## 5 个 sub-agent + +每个 sub-agent 接收: +- `BOOK_OVERVIEW.md` (阶段 0 产出, 提供全局上下文) +- 书本文本 (或文本路径) +- 对应的 extractor prompt (`extractors/-extractor.md`) + +并在一次调用中通过 Agent 工具 **同时 spawn 5 个**,不是串行。 + +**降级方案**: 当前环境不支持并行 sub-agent 时,用同样 5 个 extractor prompt 串行执行 (每次以"干净视角"执行一个 extractor 的职责,不带上一个 extractor 的判断),产出格式不变。 + +## 长文本分块策略 (超出单个 sub-agent 上下文时) + +一本大部头 (如全五卷选集) 或几小时视频的转写稿,可能超出单个 sub-agent 能一次读完的上下文。此时: + +1. **切块**: 按章节/卷/分 P 等自然边界切块,每块控制在 sub-agent 能连同 `BOOK_OVERVIEW.md` 一起舒适读完的规模 (经验值: 单块 ≤5 万字) +2. **全局锚点**: 每一块都必须附带 `BOOK_OVERVIEW.md` — 它是 extractor 判断"这段内容在全书中扮演什么角色"的锚点,不能省 +3. **逐块扫描**: extractor 逐块提取候选,标注每条候选来自哪一块 (source_chapter 字段天然承载) +4. **块间汇总**: 全部块扫完后,extractor 自己先做一轮合并 — 同一方法论在多块中出现的,合并成一条并保留所有出处 (这些多出处恰好是阶段 1.5 V1 跨域验证的证据) +5. 汇总后的结果才写入 `candidates/.md` + +| # | extractor | 查找对象 | 产出文件 | +|---|---|---|---| +| 1 | framework-extractor | 思维模型 / 决策框架 / 推理方法 | `candidates/frameworks.md` | +| 2 | principle-extractor | 原则 / 清单 / 规则 / 断言 | `candidates/principles.md` | +| 3 | case-extractor | 作者在书中亲自使用的实例 | `candidates/cases.md` | +| 4 | counter-example-extractor | 作者警告的失败 / 反例 / 陷阱 | `candidates/counter-examples.md` | +| 5 | glossary-extractor | 关键概念词典 | `candidates/glossary.md` | + +## 每个候选单元的最小字段 + +无论是哪个 extractor,产出的每条候选单元必须包含: + +```yaml +id: f01 # 类型缩写 + 序号 +title: 逆向思维 # 简短标题 +type: framework # framework / principle / case / counter-example / term +source_chapter: 第三讲 # 书中位置 +source_quote: | # 原文引用 ≤150 字 (英文 ≤100 词) + "反过来想,总是反过来想..." +summary: | # 用自己的话,5-10 行 + ... +tags: [decision, mental-model] # 便于后续链接 +``` + +## 输出前的自检 + +每个 extractor 在提交候选之前自问: +1. 这个单元**在书中**有明确根据吗? (不是我脑补) +2. 它属于我这个 extractor 的职责范围吗? (不要越界) +3. 它是不是已经在别处被别的 extractor 提取过了? (重复不是问题,阶段 1.5 会合并) + +## 不在本阶段做的事 + +- **不做筛选** — 宁错杀,留给阶段 1.5 三重验证 +- **不写 skill** — 只出候选,不出 SKILL.md +- **不做跨单元链接** — 留给阶段 3 diff --git a/cangjie-skill/methodology/03-stage1.5-triple-verify.md b/cangjie-skill/methodology/03-stage1.5-triple-verify.md new file mode 100644 index 00000000..8b8830e9 --- /dev/null +++ b/cangjie-skill/methodology/03-stage1.5-triple-verify.md @@ -0,0 +1,84 @@ +# 阶段 1.5 — 三重验证筛选 + +## 目标 + +从候选单元池里,筛出**真正值得做成独立 skill 的方法论单元**。通不过的降级为 example / 引用 / 术语,但不独立成 skill。 + +这是 cangjie-skill 区别于"书摘工具"的核心质量门。 + +## 三重验证 (全部通过才录取) + +### V1 — 跨域验证 (Cross-domain) + +**问题**: 这个单元在书中**至少 2 个独立的语境**下有佐证吗? + +- "独立"的含义: 不是同一个案例换个说法,而是两个不同的故事/不同的章节/不同的对象都在讲同一个道理 +- **通过**: 《穷查理宝典》中"逆向思维"在投资决策、避免灾难、教学方法三个独立场景中都出现 → 通过 +- **不通过**: 某个漂亮句子只在一章里出现过一次,没有书内的独立证据 → 降级为金句 example + +**为什么**: 在多个语境中反复出现的,才是作者真正想传达的稳定方法论,而不是一时兴起的表达。 + +### V2 — 预测力测试 (Predictive Power) + +**问题**: 能用这个单元,推导出书里没明说的某个问题的答案吗? + +- 自己设计一个书中没直接讨论过的场景 +- 尝试用这个方法论去分析它 +- **通过**: 能得出一个有意义、非平庸的结论 → 通过 +- **不通过**: 只能得出"努力就会成功"之类的废话 → 这个单元没有真正的解释力,降级 + +**为什么**: 真正的方法论必须有**外推能力**。如果它只能复述书里的例子,它是描述不是方法。 + +### V3 — 独特性检验 (Exclusivity) + +**问题**: 这个单元是否是"任何聪明人都会说的常识"? + +- 如果把作者名字抹掉,一个对书本领域毫无了解的聪明人也能说出来 → 不通过 +- 必须是作者**独特视角 / 反直觉见解 / 独特术语体系** → 通过 +- **通过**: 段永平的"stop doing list" — 主动列出不做什么,反常识 → 通过 +- **不通过**: "要尊重时间" — 太常识了,没人需要一个 skill 来告诉自己这个 + +**为什么**: 常识不需要 skill 承载,Claude 本身就知道。只有作者的**差异化见解**才值得固化成 skill。 + +## 验证执行流程 + +1. 把阶段 1 的 5 个 candidates/*.md 合并成一个总候选池 +2. 去重: 同一方法论被多个 extractor 提取的,合并成一条 +3. 对每条候选跑 V1 / V2 / V3,记录判断和理由 +4. 通过的,写入 `books//verified.md` +5. 未通过的,写入 `books//rejected/.md`,**必须写明不通过的是哪一项、原因是什么** (审计价值) +6. **用户轻确认** ★: 把"通过的 N 个候选标题 + 淘汰的 M 个"展示给用户,问一句"这 N 个会做成 skill,有想捞回或砍掉的吗?" 得到确认再进入阶段 2 — 阶段 2–4 是全流程最耗时的部分,这一句话的成本能避免大量返工 + +## 输出模板 (verified.md 单条) + +```yaml +id: f01 +title: 逆向思维 +type: framework +V1_cross_domain: + passed: true + evidence: + - 第 3 讲: 投资决策场景 + - 第 7 讲: 工程设计场景 + - 第 11 讲: 教学方法场景 +V2_predictive_power: + passed: true + novel_question: "如果面试官问我一个不知道答案的问题该怎么办?" + derived_answer: "逆问'我最不希望他认为我是什么样的人',从这个反面倒推应该展现什么" +V3_exclusivity: + passed: true + why_not_common: "常识是'要多想',逆向思维是'优先反着想' — 这是反直觉的排序" +→ 进入阶段 2 +``` + +## 常见失败模式 + +1. **V1 作弊** — 把同一例子换个说法算两处。要求: 必须是不同章节 + 不同对象 + 不同结论。 +2. **V2 作弊** — 用一个其实书里讨论过的类似问题冒充"新问题"。要求: 新问题应该让人第一眼不知道书里怎么说。 +3. **V3 过松** — 只要"说得比较文雅"就认为不是常识。要求: 看**内容**本身是否反直觉,而不是措辞。 + +## 数量预期 + +经验上,一本方法论密集的书 (如《穷查理宝典》) 通过率约 30–50%。一本散文类书可能只有 5–10%。通过率过低 (<5%) 或过高 (>80%) 都要警惕: +- 过低: extractor 可能质量差,要重跑 +- 过高: 验证标准可能太松 diff --git a/cangjie-skill/methodology/04-stage2-ria-plus.md b/cangjie-skill/methodology/04-stage2-ria-plus.md new file mode 100644 index 00000000..46a3e46f --- /dev/null +++ b/cangjie-skill/methodology/04-stage2-ria-plus.md @@ -0,0 +1,90 @@ +# 阶段 2 — RIA++ 构造 skill + +## 目标 + +把阶段 1.5 通过的每个方法论单元,构造成一个符合 Claude Code skill 规范的 SKILL.md。 + +使用模板: `templates/SKILL.md.template` + +## RIA++ 六段 + +### R — Reading (原文) + +- 直接引用 ≤150 字 (英文原文 ≤100 词) +- 必须标注出处 (章节 / 页码 / 段落标识; 视频填时间戳或分 P, 播客填集数) +- 若原书是英文,引用英文原文 + 你自己翻译的中文,**不要用现成译本** (避免译者版权 + 译本可能失真) + +### I — Interpretation (自述) + +- 用**你自己的话**重写方法论的核心骨架 +- 5–15 行 +- 检查: 读完这段,一个没读过原书的人能否理解这个方法论在做什么? 若不能,重写。 +- 禁止: 照搬原文句子 / 堆砌修辞 + +### A1 — Past Application (书中案例) + +- 作者在书中**亲自**用这个方法论处理过的具体案例 +- 至少 1 条,≤3 条 +- 每条要点明: 遇到什么问题 → 怎么用这个方法论 → 得出什么结论 → 实际结果如何 + +这一段的作用是让 skill 在被调用时,agent 有具体的类比素材可用。 + +### A2 — Future Trigger ★ (最关键) + +**这决定了 skill 是否真的会被用起来。** + +必须明确: +1. **用户会在什么情境下遇到这类问题?** (场景描述, 3–5 条) +2. **这些情境的语言信号是什么?** (用户会说什么样的话) +3. **和哪些相邻 skill 不同?** (避免和其他 skill 互相抢调用) + +A2 的产出直接写入 skill frontmatter 的 `description` 字段 — Claude 据此决定是否激活 skill。 + +注意: +- "与相邻 skill 的区分"在本阶段只写**初稿** (依据 verified.md 的单元列表推测),阶段 3 建立链接关系后回填定稿 — 不要在本阶段硬编相邻关系。 +- 语言信号建议**中英双写**关键 trigger 词 (用户可能用英文提问,纯中文 description 会降低触发准确率)。 + +**好的 A2 示例** (来自"逆向思维" skill): +> 用户在纠结一个决策、列举正面理由却理不出头绪时;或在问"怎么做 X 才能成功"时;不适用于纯信息查询类问题。 + +**坏的 A2 示例**: +> 用户需要思考时。 ← 太宽泛,会误激活 + +### E — Execution (可执行步骤) + +- 把方法论转成 1-2-3 步骤 +- 每一步有**可判断的完成标准** +- 如果有判停点 (step 2 之后若 X 则跳到 step 5),显式写出 + +E 的作用是让 agent 在调用这个 skill 时有明确的执行路径,不是"自由发挥"。 + +### B — Boundary (边界) + +- 什么时候**不要**使用这个 skill (反场景) +- 作者在书里警告过的失败模式 +- 来自阶段 0 批判阶段的作者盲点 +- 与之相邻但容易混淆的其他方法论 + +B 的作用是**防止乱调用**。没有 B 的 skill,会在不该用的时候被用,反而帮倒忙。 + +## Frontmatter 设计 + +```yaml +--- +name: # kebab-case, 唯一 +description: | # A2 的浓缩版, ≤300 字 + <何时用 + 何时不用 + 关键 trigger> +source_book: 《穷查理宝典》 查理·芒格 +source_chapter: 第三讲 +tags: [decision, mental-model, cognitive-bias] +related_skills: [] # 阶段 3 填充 +--- +``` + +## 常见失败模式 + +1. **I 段写成书摘** — 如果读起来像"本章作者说了 X",你在抄书不是在解释。重写。 +2. **A2 太宽** — "需要决策时" 这种 trigger 永远不会被精准调用。必须给出**可识别的语言信号**。 +3. **E 段只有哲学没有动作** — "保持客观" 不是 step,"列出 3 个最不希望发生的结果" 才是。 +4. **缺 B 段** — 没边界的 skill 会被过度调用,最终用户失望。 +5. **从 I 直接跳到 E,跳过 A1** — 丢失了"作者亲自用过"的证据,skill 失去权威性。 diff --git a/cangjie-skill/methodology/05-stage3-zettelkasten.md b/cangjie-skill/methodology/05-stage3-zettelkasten.md new file mode 100644 index 00000000..22309f85 --- /dev/null +++ b/cangjie-skill/methodology/05-stage3-zettelkasten.md @@ -0,0 +1,46 @@ +# 阶段 3 — Zettelkasten 链接 + INDEX + +## 目标 + +把原子 skill 之间的关系显式化,形成一个可导航的网络,而不是一堆孤立文件。 + +## 三类关系 + +1. **依赖 (depends-on)**: A 的使用前提是先理解 B + - 例: "检查清单决策" 依赖 "多元思维模型" (因为清单的项来自模型) + +2. **对比 (contrasts-with)**: A 和 B 是两种可选方案,看情境选一 + - 例: "正向推理" 对比 "逆向思维" + +3. **组合 (composes-with)**: A 和 B 经常配合使用 + - 例: "能力圈判断" 组合 "安全边际" + +## 执行步骤 + +1. 列出阶段 2 产出的所有 skill +2. 两两扫描,识别是否存在上述三类关系 +3. 在每个 skill 的 frontmatter `related_skills` 字段填入: + ```yaml + related_skills: + - slug: multi-mental-models + relation: depends-on + - slug: forward-reasoning + relation: contrasts-with + ``` +4. 在每个 skill 的 SKILL.md 末尾追加"相关 skills"段,用自然语言说明关系 +5. **回填 A2**: 链接关系确定后,回到每个 skill 的 A2 段,把阶段 2 留下的"与相邻 skill 的区分"初稿改成定稿 (同时同步 frontmatter `description`) +6. 生成 `books//INDEX.md` (模板 `templates/INDEX.md.template`) +7. 把 `candidates/glossary.md` 整理提升为 `books//GLOSSARY.md` — 它是所有 skill 共享的术语词典,应在产出根目录可见,而不是埋在审计目录里; INDEX.md 中链接它 + +## INDEX.md 必须包含 + +- 书的基本信息 (作者/年份/一句话主旨) +- 所有 skill 的列表,按主题分组 +- 引用图 (mermaid flowchart 或 graph) +- 推荐学习顺序 (从依赖关系推出) + +## 节制原则 + +**不要硬造关系**。如果两个 skill 之间没有真正的依赖/对比/组合关系,就不要写 related_skills。宁可稀疏也不要制造虚假链接。 + +一个经验值: 一本书拆出 10 个 skill,合理的关系数大约是 8–15 条。低于 5 条说明拆得太独立 (可能单元选得不对),高于 25 条说明在硬凑关系。 diff --git a/cangjie-skill/methodology/06-stage4-pressure-test.md b/cangjie-skill/methodology/06-stage4-pressure-test.md new file mode 100644 index 00000000..fcb7675c --- /dev/null +++ b/cangjie-skill/methodology/06-stage4-pressure-test.md @@ -0,0 +1,97 @@ +# 阶段 4 — 压力测试 (darwin 兼容) + +## 目标 + +在 skill 真正交付之前,用一批测试 prompt 验证它**被调用的精准度**和**被调用后的输出质量**。 + +不通过的必须回炉 — 不是表面修补 `description` 字段,而是重做阶段 2 的 A2 / E / B。 + +## 为什么必须做 + +A2 (trigger) 是拆书里最难的环节。一个 skill 做得再漂亮,trigger 不准就等于不存在。压力测试是**唯一**能在发布前发现 trigger 问题的方法。 + +## 评测原则: 独立 sub-agent 盲测优先 + +压力测试要尽量模拟真实调用: 一个没有参与蒸馏过程、看不到预期答案的 agent,面对用户 prompt 时是否会自然激活这个 skill。 + +优先做法: +- 对每条测试 prompt 启动一个干净的 sub-agent,或在资源有限时对同一个 skill 的一组 prompt 启动一个干净 sub-agent +- 只给 sub-agent: skill 路径或 skill 内容、用户 prompt、可选的相邻 skill 列表 +- 不给 sub-agent: `type`、`expected_behavior`、`notes`、通过标准、主流程的判断 +- 要求 sub-agent 输出: `would_trigger`、`reason`、`if_triggered_action` +- 主流程再把 sub-agent 输出和 `test-prompts.json` 的预期逐条对比,统计通过率 + +如果当前环境没有 sub-agent 能力,才退回到主流程自测,并在 `test-results.md` 里标明这是 fallback 结果,可信度低于独立 sub-agent 盲测。 + +## test-prompts.json 格式 (darwin-skill 兼容) + +```json +{ + "skill": "inversion-thinking", + "version": "0.1.0", + "test_cases": [ + { + "id": "should-trigger-01", + "type": "should_trigger", + "prompt": "我要决定要不要接这个新项目,列了一堆好处但还是没底", + "expected_behavior": "调用 inversion-thinking, 反问'最不希望发生什么'", + "notes": "正面场景: 决策纠结" + }, + { + "id": "should-not-trigger-01", + "type": "should_not_trigger", + "prompt": "帮我查一下这个 API 的参数", + "expected_behavior": "纯信息查询, 不应调用任何决策 skill", + "notes": "诱饵: 非决策场景" + }, + { + "id": "edge-01", + "type": "edge_case", + "prompt": "我在想晚饭吃什么", + "expected_behavior": "日常琐事, 不应调用 (虽然字面是'决策')", + "notes": "边界: 区分严肃决策和日常选择" + } + ] +} +``` + +## 三类测试缺一不可 + +| 类型 | 数量 | 目的 | +|---|---|---| +| `should_trigger` | 3–5 条 | 该调用时是否调用 | +| `should_not_trigger` (诱饵) | 2–3 条 | 不该调用时是否忍住 | +| `edge_case` | 1–3 条 | 边界模糊场景的判断是否合理 | + +**没有诱饵测试的 skill 一律打回**。因为只测 positive case,skill 总会看起来"很好",但实际部署后会乱激活。 + +**跨 skill 混淆测试 (硬性要求)**: 诱饵中至少 1 条必须是"应该触发同书另一个 skill"的 prompt。同一本书拆出的 10+ 个 skill 之间互相抢调用,是部署后最常见的真实故障 — 只测"完全无关的场景"发现不了它。盲测时把整包所有 skill 的 name + description 列表给 sub-agent,让它做"该激活哪一个"的选择题,而不只是"要不要激活这一个"的判断题。 + +## 执行流程 + +1. 对每个 skill,按模板写 `test-prompts.json` +2. 对每个 test_case 做独立盲测: 隐藏 `type` / `expected_behavior` / `notes`,让 sub-agent 判断"是否会调用这个 skill",记录判断和理由 +3. 主流程对照 `test-prompts.json` 判卷: + - `should_trigger`: sub-agent 应明确调用该 skill,且执行动作符合 `expected_behavior` + - `should_not_trigger`: sub-agent 不应调用该 skill,诱饵测试容错为 0 + - `edge_case`: sub-agent 的判断要符合 `expected_behavior` 中定义的边界理由 +4. 统计通过率: + - **100% 通过** → 接受 + - **≥80% 通过** → 分析失败 case, 决定是修 A2 还是修测试 (但修测试要警惕自我合理化) + - **<80% 通过** → **必须回炉重做阶段 2**,不是小修 +5. 修复后重新跑,直到通过 + +## 判断"修 skill 还是修测试" + +- 如果失败的 case 暴露了 skill **trigger 描述有歧义**: 修 skill +- 如果失败的 case 是一个你**之前没想到的合理场景**: 可能需要修 skill 以覆盖或明确排除 +- 如果失败的 case 是你**为了凑诱饵而设计过狠的场景**: 修测试 (但必须记录理由) + +## 输出 + +- `/test-prompts.json` — darwin 兼容格式 +- `/test-results.md` — 本次测试的通过率和失败分析 (审计用) + +## 下一步 + +所有 skill 全部通过后,进入阶段 5 (交付),见 `07-stage5-deliver.md`: 生成面向读者的 DIGEST.md 精华长文,并把 skill 安装到用户的 skills 目录 — 之后才向用户提 darwin-skill 自动进化。 diff --git a/cangjie-skill/methodology/07-stage5-deliver.md b/cangjie-skill/methodology/07-stage5-deliver.md new file mode 100644 index 00000000..7267221c --- /dev/null +++ b/cangjie-skill/methodology/07-stage5-deliver.md @@ -0,0 +1,64 @@ +# 阶段 5 — 交付 (DIGEST + 安装) + +## 目标 + +把流水线的产出真正送到两类使用者手里: + +1. **Agent** — skill 必须被安装到宿主环境的 skills 目录,否则永远不会被调用 +2. **人类读者** — 用一篇 `DIGEST.md` 精华长文承接"不想读全书,但想看精华"的需求 + +这两件事都不做,前面五个阶段的产出就只是一堆躺在仓库里的文件。 + +## 第 1 步 — 生成 DIGEST.md (面向读者的精华长文) + +### 为什么放在最后而不是阶段 0 + +阶段 0 的 `BOOK_OVERVIEW.md` 是**流水线的全局上下文**,会被喂给每个 sub-agent — 它必须精炼,不能为了可读性加长。而 DIGEST 面向人类读者,放在流程终点写,手里的材料最全: + +- `BOOK_OVERVIEW.md` — 骨架 / 术语 / 批判 +- `verified.md` — 通过三重验证的方法论 (已经筛掉了水分) +- 各 skill 的 SKILL.md — 每个方法论的解释 / 案例 / 边界 +- `candidates/cases.md` / `counter-examples.md` — 案例池和反例池 +- `GLOSSARY.md` — 术语词典 + +**DIGEST 是"蒸馏后的再呈现",不是"重新摘要"** — 它只写通过了验证的内容,所以浓度天然高于普通书摘。 + +### 篇幅与结构要求 + +- **篇幅**: 5000–10000 字 (视内容体量伸缩; 一篇 20 分钟视频不必硬凑 5000 字) +- **组织**: 按书的骨架 (BOOK_OVERVIEW 的一级论点) 组织章节,不按 skill 列表组织 — 读者要的是"这本书讲了什么",不是产物清单 +- 每个核心方法论写一小节: 它解决什么问题 → 核心逻辑 → 书中最有代表性的案例 → 什么时候会失效 +- 必须包含**反例/陷阱**一节 (来自 counter-examples) 和**作者的局限**一节 (来自阶段 0 批判) — 只报喜不报忧的精华是软文,不是蒸馏 +- 每个方法论小节末尾链接对应的 skill 目录,读者想深入时有路径 +- 允许适量引用原文金句 (每段引用遵守 ≤150 字 / 英文 ≤100 词) + +模板: `templates/DIGEST.md.template`,输出到 `books//DIGEST.md`。 + +### 质量自检 + +- [ ] 一个没读过原书的人,读完 DIGEST 能复述这本书的主旨、3 个以上核心方法论、2 个以上陷阱 +- [ ] 没有出现"未通过三重验证"的内容被当作核心方法论呈现 +- [ ] 有批判/局限部分,不是全程吹捧 +- [ ] 每个方法论小节都有 skill 链接 + +## 第 2 步 — 安装 skill 到宿主环境 + +产出目录 `books///` 只是构建产物,宿主 (Claude Code / Cursor 等) 不会从这里加载 skill。必须安装: + +1. **问用户装哪里** (一次性问清,不要逐个 skill 问): + - 用户级: `~/.claude/skills//` (所有项目可用) + - 项目级: `/.claude/skills//` 或 `.cursor/skills//` + - 用户也可能只想要仓库形式 (发布到 GitHub),那就跳过安装 +2. **只安装通过阶段 4 测试的 skill** — 未通过的留在构建目录里回炉 +3. 复制 (或 symlink) 整个 skill 目录,含 `SKILL.md` 和 `test-prompts.json` +4. 安装后抽 1–2 个 skill 用一句 should_trigger 的 prompt 验证宿主能加载并触发 + +## 第 3 步 — 收尾汇报 + +告诉用户: + +> 已完成。产出: N 个 skill (已安装到 <位置>)、INDEX.md、GLOSSARY.md、DIGEST.md (精华长文,约 X 字)。 +> 如需持续进化,可以喂给 darwin-skill: `darwin evolve books//` +> 它会用这里的 test-prompts.json 做 ratcheting 自动进化。 + +最后把 `PIPELINE_STATE.md` 标记为全部完成。 diff --git a/cangjie-skill/scripts/skill-gen.py b/cangjie-skill/scripts/skill-gen.py new file mode 100644 index 00000000..1becba2b --- /dev/null +++ b/cangjie-skill/scripts/skill-gen.py @@ -0,0 +1 @@ +404: Not Found \ No newline at end of file diff --git a/cangjie-skill/templates/digest-template.md b/cangjie-skill/templates/digest-template.md new file mode 100644 index 00000000..1becba2b --- /dev/null +++ b/cangjie-skill/templates/digest-template.md @@ -0,0 +1 @@ +404: Not Found \ No newline at end of file diff --git a/cangjie-skill/templates/index-template.md b/cangjie-skill/templates/index-template.md new file mode 100644 index 00000000..1becba2b --- /dev/null +++ b/cangjie-skill/templates/index-template.md @@ -0,0 +1 @@ +404: Not Found \ No newline at end of file diff --git a/cangjie-skill/templates/overview-template.md b/cangjie-skill/templates/overview-template.md new file mode 100644 index 00000000..1becba2b --- /dev/null +++ b/cangjie-skill/templates/overview-template.md @@ -0,0 +1 @@ +404: Not Found \ No newline at end of file diff --git a/cangjie-skill/templates/skill-template.md b/cangjie-skill/templates/skill-template.md new file mode 100644 index 00000000..1becba2b --- /dev/null +++ b/cangjie-skill/templates/skill-template.md @@ -0,0 +1 @@ +404: Not Found \ No newline at end of file diff --git a/cangjie-skill/templates/test-prompts-template.md b/cangjie-skill/templates/test-prompts-template.md new file mode 100644 index 00000000..1becba2b --- /dev/null +++ b/cangjie-skill/templates/test-prompts-template.md @@ -0,0 +1 @@ +404: Not Found \ No newline at end of file diff --git a/cangjie-skills/股票投研体系/INDEX.md b/cangjie-skills/股票投研体系/INDEX.md new file mode 100644 index 00000000..2a98f942 --- /dev/null +++ b/cangjie-skills/股票投研体系/INDEX.md @@ -0,0 +1,31 @@ +# 股票投研体系 - 技能地图 + +生成时间: 2026-07-11 17:30 +状态: 理论学习完成,进入模拟交易阶段 + +## 已蒸馏 Skill + +| # | 文件 | 主题 | 核心要点 | +|---|------|------|---------| +| 1 | stock_phase1_basics.md | A股交易规则 | T+1/涨跌幅/集合竞价 | +| 1 | stock_phase1_basics.md | K线基础 | 阳线/阴线/十字星/影线 | +| 2 | stock_phase2_technical.md | MACD | 金叉死叉/顶底背离 | +| 2 | stock_phase2_technical.md | KDJ | 超买超卖/20-80区间 | +| 2 | stock_phase2_technical.md | 成交量与价格 | 放量/缩量/地量 | +| 3 | stock_phase3_fundamental.md | 三张报表 | 利润表/资产负债表/现金流量表 | +| 3 | stock_phase3_fundamental.md | 估值方法 | PE/PB/PEG/DCF | + +## 下一阶段 + +Phase 5: 模拟交易与策略验证 +- 选择聚宽/掘金模拟平台 +- 搭建回测环境 +- 设计第一个策略:MACD金叉/死叉 +- 模拟账户运行,达到预期后实操 + +## 方法论来源 + +仓颉 skill (cangjie-skill) RIA-TV++ 流水线 +- 项目: https://github.com/kangarooking/cangjie-skill +- 本地: ~/.hermes/cangjie-skill/ +- 集成器: ~/.hermes/scripts/cangjie_distill.py \ No newline at end of file diff --git a/cangjie-skills/股票投研体系/skills/stock_phase1_basics.md b/cangjie-skills/股票投研体系/skills/stock_phase1_basics.md new file mode 100644 index 00000000..1afd73d1 --- /dev/null +++ b/cangjie-skills/股票投研体系/skills/stock_phase1_basics.md @@ -0,0 +1,65 @@ +# 股票基础概念 Skill +## 技能名称:A股交易规则 + +### R(原文引用) +- A股实行T+1制度:当天买,次日才能卖 +- 涨跌幅限制:主板±10%,创业板/科创板±20% +- 集合竞价:9:15-9:25申报,9:25-9:30不接受新申报 +- 连续竞价:9:30-11:30、13:00-15:00 +- ST股涨跌±5% +- 注册制新股:上市前5日无涨跌幅限制 + +### I(自己话重写) +A股有明确的交易时间和限制规则。T+1意味着今天买的股票今天不能卖,必须等到明天。不同板块涨跌幅不同,主板±10%是最常见的,创业板和科创板波动更大±20%。交易分两个时段:开盘前的集合竞价定开盘价,交易时间的连续竞价实时成交。 + +### A1(案例) +牧尘在下午2:30看盘想买某主板股票,当前价10元,若当天买入了,次日才能卖出。如果次日开盘直接涨停(+10%到11元),就赚钱了。但如果次日低开(-10%到9元),就亏损了。 + +### A2(触发场景) +- 想日内做T+0高抛低吸?A股不允许,必须次日才能卖 +- 看到某股当日大跌8%,判断要反弹买入?买入后当日不能卖,要承担次日开盘的不确定性 +- 新股上市前5日无涨跌幅限制,首日可能涨300%也可能跌50% + +### E(可执行步骤) +1. 记住T+1:任何时候买入股票,当天不能卖 +2. 看涨跌幅:主板±10%、创业板/科创板±20%、ST±5% +3. 集合竞价下单:9:15-9:25可以撤单,9:25-9:30不能撤不能新报 +4. 连续竞价:9:30后实时成交,13:00-15:00继续 + +### B(边界与盲点) +- 港股、美股是T+0,可以日内多次买卖,A股不行 +- 涨停板有时买不进去(卖单少),跌停板卖不出去(买单少) +- 基金、ETF、部分可转债是T+0 + +--- + +## 技能名称:K线基础 + +### R(原文引用) +- 阳线(红/实心):收盘>开盘,上涨 +- 阴线(绿/空心):收盘<开盘,下跌 +- 十字星:收盘≈开盘,多空均衡 +- 上影线:最高到收盘/开盘,上涨受阻 +- 下影线:最低到收盘/开盘,底部支撑 + +### I(自己话重写) +K线是价格的快照。红色代表涨,绿色代表跌(中国习惯,与西方相反)。十字星表示多空力量差不多,可能要变盘。上影线长说明上方压力大,涨不上去;下影线长说明下方支撑强,跌不下去。 + +### A1(案例) +某股开盘10元,涨到10.5元(最高),收盘10.3元,最低9.8元。就形成了上影线长(到10.5)的阳线,说明当天涨了但上方有压力。 + +### A2(触发场景) +- 看到长上影线的阳线:要警惕,可能是主力出货 +- 看到长下影线的阴线:要关注,可能是底部有人接盘 +- 连续出现十字星:市场在犹豫,可能要选方向了 + +### E(可执行步骤) +1. 先看颜色:红涨绿跌(中国) +2. 看实体长短:实体越长趋势越强 +3. 看影线:上影线长=上方压力,下影线长=下方支撑 +4. 十字星+放大成交量=变盘信号 + +### B(边界与盲点) +- 单根K线信息有限,要结合前后K线看 +- 日K线容易被操控,分时图能看到日内细节 +- 极端行情下K线形态会失真 \ No newline at end of file diff --git a/cangjie-skills/股票投研体系/skills/stock_phase2_technical.md b/cangjie-skills/股票投研体系/skills/stock_phase2_technical.md new file mode 100644 index 00000000..a2127d82 --- /dev/null +++ b/cangjie-skills/股票投研体系/skills/stock_phase2_technical.md @@ -0,0 +1,101 @@ +# 技术分析框架 Skill +## 技能名称:MACD指标 + +### R(原文引用) +- MACD = 12日EMA - 26日EMA +- Signal线 = MACD的9日EMA +- 金叉:MACD上穿Signal线,看涨 +- 死叉:MACD下穿Signal线,看跌 +- 柱状图:MACD-Signal线,红柱=多头,绿柱=空头 +- 顶背离:价格新高但MACD没新高,警惕回调 +- 底背离:价格新低但MACD没新低,警惕反弹 + +### I(自己话重写) +MACD是趋势跟踪指标,由快线(DIF)和慢线(DEA/Signal)组成。金叉就是快线上穿慢线,代表短期上涨动力超过中期,可能启动上涨行情。背离是最重要的信号:价格创新高但MACD没跟上,说明上涨动力衰竭,要小心。 + +### A1(案例) +某股从10元涨到15元,MACD也创新高。再从15元涨到18元,但MACD没创新高,反而在下降——这就是顶背离。之后股价大跌到13元。 + +### A2(触发场景) +- DIF和DEA都在0轴上方 + 金叉 = 强势上涨信号,可考虑买入 +- DIF和DEA都在0轴下方 + 金叉 = 弱势反弹,谨慎 +- 顶背离出现在高位 + 放量下跌 = 逃顶信号 +- 底背离出现在低位 + 缩量整理 = 抄底信号 + +### E(可执行步骤) +1. 打开K线图,调出MACD指标(默认参数:12,26,9) +2. 看DIF和DEA的位置:0轴上方多头,下方空头 +3. 看交叉:DIF上穿DEA=金叉(买),DIF下穿DEA=死叉(卖) +4. 看柱状图颜色和长度:红柱增长=多头强势,绿柱增长=空头强势 +5. 找背离:画价格和MACD的高点/低点,不同步就要警惕 + +### B(边界与盲点) +- MACD是趋势指标,在震荡市会反复金叉死叉失效 +- 参数可以调整(更敏感/更滞后),默认12,26,9是经典参数 +- 日线MACD信号滞后,适合中长期,短周期要用小时线 + +--- + +## 技能名称:KDJ指标 + +### R(原文引用) +- K值:快速指标,对价格敏感 +- D值:慢速指标,更稳定 +- J值:3*K-2*D,波动最大 +- KDJ金叉(K上穿D)+ 在20以下 = 超卖区买入信号 +- KDJ死叉(K下穿D)+ 在80以上 = 超买区卖出信号 + +### I(自己话重写) +KDJ像摆动指标,专门看超买超卖。K和D在0-100之间波动,80以上是超买区(涨太多了可能跌),20以下是超卖区(跌太多了可能涨)。J值最敏感,波动最大,适合辅助判断。 + +### A1(案例) +某股连续下跌,KDJ跌到10以下,J值甚至是负数,这是严重超卖。之后股价反弹,KDJ从低位金叉,股价从8元涨到10元。 + +### A2(触发场景) +- KDJ在20以下金叉 + 成交量放大 = 买入信号 +- KDJ在80以上死叉 = 考虑减仓或卖出 +- KDJ高位钝化(一直在80以上):强势股可能继续涨,别过早下车 +- KDJ低位钝化:弱势股可能继续跌,别急着抄底 + +### E(可执行步骤) +1. KDJ默认参数:9,3,3 +2. 关注20和80这两个关键值 +3. 金叉:K上穿D,在20附近效果好 +4. 死叉:K下穿D,在80附近效果好 +5. J值>100或<0时要警惕极端行情 + +### B(边界与盲点) +- KDJ在震荡市效果好,在单边市容易反复钝化 +- 单独用KDJ不够,要结合MACD和成交量 +- 短线交易者更常用KDJ,长线参考MACD + +--- + +## 技能名称:成交量与价格 + +### R(原文引用) +- 放量上涨:健康,看涨信号 +- 缩量上涨:可能见顶,动力不足 +- 放量下跌:恐慌抛售,可能见底 +- 缩量下跌:观望,可能盘整 +- 地量见地价:极度缩量后可能反转 + +### I(自己话重写) +量是价的先行指标。有上涨,必须有资金推动。放量上涨说明资金认可,还在买;缩量上涨说明买的人少了,纯靠情绪撑。地量(历史最低成交量)往往出现在市场底部,因为大家都观望不动了。 + +### A2(触发场景) +- 放量阳线突破重要均线/压力位 = 有效突破,可跟进 +- 缩量上涨到前期高点附近 = 可能是假突破 +- 放量下跌 + 大阴线 = 主力出逃,不要接飞刀 +- 地量 + 十字星 = 可能变盘,关注 + +### E(可执行步骤) +1. 看量比(当日成交量/历史平均),>1.5为明显放量 +2. 对比同期历史成交量,判断是放量还是缩量 +3. 量和价要配合看:健康=同向,异常=背离 +4. 关注地量:连续缩量后出现放量选择方向 + +### B(边界与盲点) +- 不同股票股性不同,活跃股和蓝筹股的成交量不是一个概念 +- 复牌第一天、重大消息前后成交量会失真 +- 主力可以用对倒(自己实民自己)制造放量假象 \ No newline at end of file diff --git a/cangjie-skills/股票投研体系/skills/stock_phase3_fundamental.md b/cangjie-skills/股票投研体系/skills/stock_phase3_fundamental.md new file mode 100644 index 00000000..6a4eb12f --- /dev/null +++ b/cangjie-skills/股票投研体系/skills/stock_phase3_fundamental.md @@ -0,0 +1,65 @@ +# 基本面分析 Skill +## 技能名称:三张报表 + +### R(原文引用) +- 利润表:展示收入、成本、利润 +- 资产负债表:展示资产、负债、净资产 +- 现金流量表:展示现金流入流出 +- 经营现金流>净利润:利润质量好 +- 商誉过高:警惕减值风险 + +### I(自己话重写) +三张报表从三个角度透视一家公司。利润表看赚不赚钱,资产负债表看家底厚不厚,现金流量表看口袋里有没有真金白银。经营现金流比净利润大,说明赚的是真钱(应收账款少);商誉过高是个雷,一旦减值利润就暴跌。 + +### A1(案例) +某公司利润表显示年赚10亿,但经营现金流是负的2亿——说明利润都是应收账款,没收到现金。这种利润质量很差,一旦坏账计提,当期利润会大幅缩水。 + +### A2(触发场景) +- 看到利润增长但经营现金流持续为负 = 利润质量差 +- 商誉占总资产超过30% = 关注年报商誉减值测试 +- 资产负债率突然大幅上升 = 可能有收购或财务异常 + +### E(可执行步骤) +1. 先看现金流量表:经营现金流>0是底线 +2. 再看利润表:收入和利润是否稳定增长 +3. 最后看资产负债表:资产结构是否健康 +4. 三个表要对比看,关联科目的勾稽关系要一致 + +### B(边界与盲点) +- 财报可以被美化(应收账款、关联交易) +- 季度报表信息量有限,年报最全面 +- 不同行业报表特点不同,拿科技股和银行股不能同一个标准 + +--- + +## 技能名称:估值方法 + +### R(原文引用) +- PE(市盈率):适合稳定增长行业 +- PB(市净率):适合金融、周期行业 +- PEG = PE/增长率,<1为低估 +- DCF(现金流折现):适合高确定性企业 + +### I(自己话重写) +估值就是给公司定价。PE是市场最常用的,看的是"多少年回本";PB是看"破产清算值多少";PEG考虑增长,成长股用;DCF最严谨,但需要对未来现金流做预测。不同行业用不同估值方法才合理。 + +### A1(案例) +银行股PE只有5,但PB只有0.6——市场给这么低是因为银行业务同质化、杠杆高。科技股PE50但还在涨,因为市场认为增长快。单纯看PE高低判断贵贱是不对的。 + +### A2(触发场景) +- PE<10的低估值股票 = 检查是否有陷阱(周期股/衰退行业) +- PEG<1的成长股 = 相对低估,有安全边际 +- 行业对比时用PB更公平(金融、地产、能源) +- 高PE股票要有高增长预期支撑,否则就是泡沫 + +### E(可执行步骤) +1. 记住各行业PE中枢:消费20-30,科技40-60,银行5-8 +2. 用PE前先看利润增速,增速快的可以给更高PE +3. PB适合金融、地产、周期股 +4. DCF参数敏感,不确定性大,作为参考 + +### B(边界与盲点) +- PE容易被会计处理操控(一次性收益/减值) +- 低PE可能是夕阳行业,高PE可能是成长股 +- DCF的"精确错误":模型算得很精确,但假设错了结论就错了 +- 估值是艺术不是科学,模糊正确比精确错误好 \ No newline at end of file diff --git a/scripts/cangjie_distill.py b/scripts/cangjie_distill.py new file mode 100644 index 00000000..44c86c29 --- /dev/null +++ b/scripts/cangjie_distill.py @@ -0,0 +1,233 @@ +#!/usr/bin/env python3 +""" +仓颉 skill 集成器 — 知识蒸馏引擎 +================================ +把书/视频/播客里的方法论,蒸馏成可调用的 AI skills。 +集成到小唯的学习体系中。 + +用法: + cangjie_distill.py distill → 蒸馏文本为 skill + cangjie_distill.py phase <n> <source_text> <title> → 只跑指定阶段 + cangjie_distill.py verify <skill_dir> → 压力测试验证 +""" + +import json, os, re, sys, subprocess +from datetime import datetime +from pathlib import Path + +HOME = os.path.expanduser("~") +HERMES = HOME + "/.hermes" +CJ = HERMES + "/cangjie-skill" +OUTPUT = HERMES + "/cangjie-skills" +os.makedirs(OUTPUT, exist_ok=True) + + +def log(msg): + print(f"[CANGJIE] {msg}", flush=True) + + +def shell(cmd, timeout=30): + try: + r = subprocess.run(cmd, shell=True, capture_output=True, text=True, timeout=timeout) + return r.returncode, r.stdout.strip(), r.stderr.strip() + except subprocess.TimeoutExpired: + return -1, "", "timeout" + + +# ===================== RIA-TV++ 流水线 ===================== + +def stage0_overview(source_text, title): + """阶段0: 整体内容理解(Adler分析阅读法)""" + log("Stage 0: 整体内容理解...") + system_prompt = open(CJ + "/methodology/01-stage0-adler.md").read() + + prompt = f"""请用Adler分析阅读法分析以下内容,输出结构化的 BOOK_OVERVIEW.md: + +内容标题: {title} + +--- +{source_text[:8000]} +---""" + return call_llm(prompt, system_prompt) + + +def stage1_extract(source_text, title): + """阶段1: 并行提取5类方法论单元""" + log("Stage 1: 并行提取...") + + extractors = { + "framework": CJ + "/extractors/framework-extractor.md", + "principle": CJ + "/extractors/principle-extractor.md", + "case": CJ + "/extractors/case-extractor.md", + "counter": CJ + "/extractors/counter-example-extractor.md", + "glossary": CJ + "/extractors/glossary-extractor.md", + } + + results = {} + for name, path in extractors.items(): + if os.path.exists(path): + extractor = open(path).read() + prompt = f"""基于以下内容,提取 {name} 类型的方法论单元: + +内容标题: {title} + +--- +{source_text[:6000]} +--- + +{extractor}""" + results[name] = call_llm(source_text[:6000], extractor) + else: + results[name] = "" + + return results + + +def stage2_triple_verify(candidates): + """阶段2: 三重验证筛选""" + log("Stage 2: 三重验证...") + verify_doc = open(CJ + "/methodology/03-stage1.5-triple-verify.md").read() + + verified = [] + for item in candidates: + prompt = f"""验证以下候选方法论是否通过三重检验: + +{item} + +{verify_doc} + +输出格式: +- 通过: [PASS] + 简短原因 +- 不通过: [FAIL] + 原因""" + result = call_llm(item, verify_doc) + if "[PASS]" in result: + verified.append(item) + + log(f" 三重验证通过率: {len(verified)}/{len(candidates)}") + return verified + + +def stage3_ria_plus(verified_items, title): + """阶段3: RIA++ 构造""" + log("Stage 3: RIA++ 构造...") + ria_doc = open(CJ + "/methodology/04-stage2-ria-plus.md").read() + + skills = [] + for item in verified_items: + prompt = f"""将以下方法论构造为 RIA++ 结构: + +原始内容: {title} + +{item} + +{ria_doc} + +输出格式(按RIA++模板): +## Skill名称 + +### R(原文引用) +### I(自己话重写) +### A1(书中案例) +### A2(未来触发场景) +### E(可执行步骤) +### B(边界与盲点)""" + result = call_llm(item, ria_doc) + skills.append(result) + + return skills + + +def call_llm(user_msg, system_msg="", model="minimaxai/minimax-m2.7"): + """调用 NewAPI LLM""" + import urllib.request + + payload = json.dumps({ + "model": model, + "messages": [ + {"role": "system", "content": system_msg}, + {"role": "user", "content": user_msg}, + ], + "max_tokens": 2000, + "temperature": 0.7, + }).encode() + + req = urllib.request.Request( + "http://127.0.0.1:3000/v1/chat/completions", + data=payload, + headers={"Content-Type": "application/json", "Authorization": "Bearer 0ExNiLblJvIWBDpkS50fwOBw4MmqLyKdHJK5iQtlw9dOMWBP"}, + ) + + try: + with urllib.request.urlopen(req, timeout=60) as resp: + data = json.load(resp) + return data["choices"][0]["message"]["content"] + except Exception as e: + return f"Error: {e}" + + +def distill(source_text, title, output_dir=None): + """完整蒸馏流程""" + slug = re.sub(r'[^\w\u4e00-\u9fff]+', '_', title)[:40] + out = output_dir or (OUTPUT + "/" + slug) + os.makedirs(out, exist_ok=True) + + log(f"开始蒸馏: {title} -> {out}") + + # Stage 0: 整体理解 + overview = stage0_overview(source_text, title) + with open(out + "/BOOK_OVERVIEW.md", "w") as f: + f.write(f"# {title}\n\n{overview}\n") + + # Stage 1: 并行提取 + candidates = stage1_extract(source_text, title) + + # 展平候选 + all_candidates = [] + for name, content in candidates.items(): + if content: + # 简单切分段落为候选 + for chunk in content.split("\n\n"): + if len(chunk) > 50: + all_candidates.append(chunk.strip()) + + # Stage 2: 三重验证 + verified = stage2_triple_verify(all_candidates[:20]) # 限制数量 + + # Stage 3: RIA++ 构造 + skills = stage3_ria_plus(verified, title) + + # 保存 skills + os.makedirs(out + "/skills", exist_ok=True) + for i, skill in enumerate(skills, 1): + with open(f"{out}/skills/skill_{i:03d}.md", "w") as f: + f.write(skill) + + # 生成 INDEX + index = f"# {title} - 技能地图\n\n" + index += f"生成时间: {datetime.now().strftime('%Y-%m-%d %H:%M')}\n\n" + index += f"共 {len(skills)} 个验证通过的 skill\n\n" + for i in range(len(skills)): + index += f"- Skill {i+1}: 见 skills/skill_{i+1:03d}.md\n" + + with open(out + "/INDEX.md", "w") as f: + f.write(index) + + log(f"蒸馏完成! 产出 {len(skills)} 个 skill -> {out}") + return out + + +if __name__ == "__main__": + cmd = sys.argv[1] if len(sys.argv) > 1 else "help" + + if cmd == "distill": + if len(sys.argv) < 4: + print("用法: cangjie_distill.py distill <source_text_file> <title>") + sys.exit(1) + text_file, title = sys.argv[2], sys.argv[3] + with open(text_file) as f: + source = f.read() + distill(source, title) + elif cmd == "help": + print(__doc__) + else: + print(__doc__) \ No newline at end of file