llm-wiki-academic-engineering
学术文献 → 结构化知识库。你只需要提供文献,AI 自动整理、关联、生成综述。
这个 skill 做什么
llm-wiki 帮你构建一个持续增长的学术文献知识库。专为传统工科领域(电气、机械、船舶、振动等)设计:
- 只接收学术文献 Markdown 和研究笔记 Markdown(其他格式会提示不支持)
- AI 提取核心概念、研究方法、关键发现,整理成互相链接的 wiki 页面
- 支持文献综述、方法对比、研究路线图(Mermaid)
- 知识库随着每次使用变得越来越丰富,而不是每次重新开始
- 所有内容都是本地 markdown 文件,用 Obsidian 或任何编辑器都能查看
重要限制
只接收以下两类素材进入知识库:
- 学术文献 Markdown - 放在
raw/literature/目录 - 研究笔记 Markdown - 放在
raw/notes/目录
不支持的素材类型(会拒绝处理):
- 网页链接 / URL
- 微信公众号文章
- 社交媒体内容(Twitter/X、小红书等)
- YouTube 视频
- 其他非 Markdown 格式
如果用户提供了不支持的素材类型,明确告知并提供替代方案。
核心理念
传统方式(RAG/聊天记录)的问题:每次问问题,AI 都要从头阅读原始文件,没有积累。知识库的价值在于知识被编译一次,然后持续维护,而不是每次重新推导。
快速开始
告诉用户这两步就够了:
- 初始化:说"帮我初始化一个知识库"
- 添加素材:给一个链接或文件,说"帮我消化这篇"
Script Directory
Scripts located in scripts/ subdirectory.
Path Resolution:
SKILL_DIR= this SKILL.md's directory- Script path =
${SKILL_DIR}/scripts/<script-name>
工作流路由
根据用户的意图,路由到对应的工作流:
| 用户意图关键词 | 工作流 |
|---|---|
| "初始化知识库"、"新建 wiki"、"创建知识库" | → init |
| 文件路径(.md)/ "消化"、"整理" | → ingest |
| "批量消化"、"把这些都整理" / 文件夹路径 | → batch-ingest |
| "关于 XX"、"查询"、"XX 是什么" | → query |
| "综述 XX"、"对比一下 X 和 Y"、"文献综述" | → digest |
| "检查知识库"、"健康检查"、"lint" | → lint |
| "知识库状态"、"现在有什么"、"有多少文献" | → status |
| "删除文献"、"remove"、"删除" | → delete |
重要:
- 如果用户直接给了一个 Markdown 文件路径,默认走 ingest
- 如果知识库还不存在,先自动走 init 再走 ingest
- 非 Markdown 文件会被拒绝,提示用户转换为 Markdown
通用前置检查
除 init 外,其他工作流默认先执行这段检查:
- 先检查当前工作目录是否包含
.wiki-schema.md- 如果包含 → 用当前目录作为知识库根路径
- 如果不包含 → 回退到读取
~/.llm-wiki-path
- 如果两者都没有:
ingest/batch-ingest→ 先运行initquery/lint/status/digest/delete→ 提示用户先初始化知识库
- 读取知识库根目录下的
.wiki-schema.md
工作流 1:init(初始化知识库)
前置检查(含多知识库 CWD 检查)
- 先检查当前工作目录是否包含
.wiki-schema.md- 如果包含 → 当前目录已经是一个知识库,提示用户已存在并询问是否要重新初始化
- 如果当前目录没有 → 读取
~/.llm-wiki-path文件- 如果存在 → 提示用户已有一个知识库(显示路径),询问是要新建还是切换到那个
- 两个都没有 → 进入初始化流程
交互式问答引导
初始化时,必须通过对话引导用户完成以下信息收集(不能直接用模板占位内容):
问题 1:知识库主题
"你的知识库要围绕什么主题?比如'船舶振动控制研究'、'机械系统动力学'、'电机振动分析'"
- 如果用户没想法,默认用"学术文献知识库"
- 记录用户回答作为后续分析的指导方向
问题 2:研究领域
"你主要研究哪个具体领域?"
- 可选方向示例:
- 船舶推进系统振动与控制
- 电磁-结构耦合动力学
- 有限元模态分析与实验验证
- 机械系统动力学建模
- 电气设备振动与噪声
- 其他(用户自定义)
- 记录用户选择,作为 topic 分类的基准
问题 3:是否有确定的研究内容/方案
"你目前是否有确定的研究问题或方案?"
- 如果有:
- "请描述一下你的研究问题和目标"
- "你打算用什么方法/技术路线?"
- "有没有初步的假设或预期结论?"
- 如果没有:
- "你是想先积累文献,了解领域现状?"
- "有没有特别想探索的方向或空白领域?"
- 记录用户回答,用于后续文献取舍的优先级判断
问题 4:整理原则(可选)
"你希望知识库在整理时遵循什么原则?"(可多选)
- 优先提取可重复的实验方法和验证数据
- 关注理论与方法的演进历史
- 重视工程应用和实践案例
- 追踪最新研究进展
- 其他(用户自定义)
- 这些原则会影响后续 ingest 时实体和关联的取舍
步骤
-
收集用户信息(通过上述问答)
-
询问保存位置(先向用户提问):
- 默认:
~/Documents/我的学术知识库/ - 用户可以自定义路径
- 默认:
-
生成个性化 purpose.md:
根据问答结果,用模板
templates/purpose-template.md生成文件,但必须:- 将"核心目标"替换为用户的实际研究方向
- 将"关键问题"替换为用户的具体研究问题(或"探索领域现状")
- 将"研究范围"限制在用户选择的领域
- 将"整理原则"替换为用户选择的优先级
生成后的 purpose.md 示例结构:
# 研究目的与方向 ## 核心目标 [用户的具体研究目标] ## 关键问题 1. [用户的具体研究问题] 2. [如果无确定问题:领域现状探索] ## 研究范围 **涵盖:** - [用户选择的领域] **不涵盖:** - [根据用户选择排除的领域] ## 整理原则 - [用户选择的优先级] -
运行初始化脚本:
bash ${SKILL_DIR}/scripts/init-wiki.sh "<路径>" "<主题>"注意:
init-wiki.sh生成的是基础结构,个性化 purpose.md 由 AI 在此步骤后生成并覆盖 -
生成并写入个性化 purpose.md:
- 将问答结果编译成完整的 purpose.md
- 写入
<知识库路径>/purpose.md
-
记录路径到
~/.llm-wiki-path:echo "<路径>" > ~/.llm-wiki-path -
输出引导:
知识库已创建!路径:<路径> 研究方向:<用户选择的研究领域> 核心问题:<用户的研究问题或探索目标> 接下来你可以: - 给我一个本地 Markdown 文献路径,我会消化并整理 - 批量消化:给我一个文件夹路径,我会逐个处理 - 查询知识库:问我关于已有文献的问题 - 生成综述:让我综合多篇文献写综述报告 推荐:用 Obsidian 打开这个文件夹,可以实时看到知识库的构建效果。
工作流 2:ingest(消化文献)
这是最核心的工作流。用户给一个 Markdown 文献进来,AI 做所有的整理工作。
前置检查
执行通用前置检查(见上方定义)。
素材类型验证(必须执行)
-
检查文件扩展名:
.md→ 继续- 其他扩展名 → 拒绝处理,提示用户转换为 Markdown
-
检查文件内容类型:
- 优先路由到
local_literature(学术文献) - 次路由到
local_notes(研究笔记) - 其他内容 → 拒绝处理,提示"知识库只接收学术文献 Markdown 和研究笔记 Markdown"
- 优先路由到
-
检查 source-registry.tsv 确认文件类型:
bash ${SKILL_DIR}/scripts/source-registry.sh match-file "<文件路径>"
隐私自查提示(首次进入 ingest 必须执行)
在开始提取或分析任何内容之前,AI 必须先对用户说下面这句话,然后等待确认:
在开始分析这份素材前,请先快速确认里面不包含这些敏感内容:
- 手机号码(如 138xxxxxxxx)
- 身份证号(18 位数字)
- API 密钥(
sk-...、AIzaSy...、OPENAI_API_KEY=、ANTHROPIC_API_KEY=、Bearer ...)- 明文密码(
password=、passwd=)- 其他你不希望进入知识库的个人信息
如果素材里有上面任何一项,请先用文本编辑器删除或脱敏后再继续。 llm-wiki 不会自动过滤这些内容,处理后的内容会进入你的知识库。
确认无上述内容请回复
y,要中止请回复n。
流程规则:
- 用户回复
y(或"可以"、"继续"、"没有"等明确肯定)→ 继续执行后续步骤 - 用户回复
n(或"停"、"取消"等明确否定)→ 终止本次 ingest,提示用户清理后再来 - 其他不明确的回复 → 再问一次,最多两次;两次都不是明确 y/n 则终止
- 绕过规则:如果用户在当前对话里已经明确说过"素材里没有敏感信息,直接开始",
或者用户是在
batch-ingest流程中(已经在顶层确认过一次),AI 可以跳过这一步
为什么是自查清单而不是脚本:
- 正则在非结构化文本(聊天记录、笔记)里误报率很高,错过真的敏感词,误报无害的普通词
- 把判断权还给用户,比让脚本决定更可靠
- 对新手更友好,不会遇到看不懂的脚本报错
素材提取
直接读取本地 Markdown 文件:
- 检查
source-registry.sh确认文件类型 - 直接读取文件内容
内容分级处理
根据素材长度和信息密度自动选择处理级别:
判断标准:
- 素材内容 > 1000 字 → 完整处理
- 素材内容 <= 1000 字(短推文、小红书笔记等)→ 简化处理
完整处理流程(长素材 > 1000 字)
-
提取素材内容:直接读取本地 Markdown 文件
-
保存原始素材到
raw/literature/目录:- 文件名格式:
{日期}-{短标题}.md - 在文件头部记录文献基本信息(标题、作者、年份等)
- 文件名格式:
-
读取上下文:
- 优先顺序:
purpose.md>.wiki-schema.md>index.md - 如果
purpose.md存在,先读取其中的核心目标、关键问题和研究范围 - 用
purpose.md指导后续实体、主题、关联的取舍和权重
- 优先顺序:
-
缓存检查:
- 在进入 LLM 处理前,先运行:
bash ${SKILL_DIR}/scripts/cache.sh check “<raw 文件路径>” - 如果返回
HIT或HIT(repaired)→ 跳过本次 LLM 调用,直接读取已有 wiki 页面,并告诉用户这是”无变化,直接复用已有结果”HIT(repaired)表示缓存自愈修复成功(上次 update 被跳过但 source 页面存在)
- 如果返回
MISS:<reason>→ 继续执行下面的两步流程MISS:no_entry— 首次处理此素材(正常情况)MISS:hash_changed— 素材内容有变化,需要重新处理MISS:no_source— 有缓存记录但 source 页面被删除了
- 在进入 LLM 处理前,先运行:
-
Step 1:结构化分析:
- 输入:原始内容 +
purpose.md+ 现有 wiki 结构(至少读取index.md概要) - 输出:JSON 格式的分析结果,不持久化,只在当前 ingest 流程里临时传递
- JSON 至少包含
entities、topics、connections confidence是必需字段,缺失就视为格式异常并触发单步回退
{ "source_summary": "一句话概括", "entities": [{"name": "xxx", "type": "concept", "relevance": "high", "confidence": "EXTRACTED"}], "topics": [{"name": "xxx", "importance": "high"}], "connections": [{"from": "A", "to": "B", "type": "因果", "confidence": "INFERRED"}], "contradictions": [{"claim_a": "...", "claim_b": "...", "context": "..."}], "new_vs_existing": {"new_entities": [], "updates": []} }置信度赋值规则(Claude 必须遵守):
- EXTRACTED:信息直接出现在原文里,字面可以找到
- INFERRED:信息是从多处原文推断出来的,原文没有直接说
- AMBIGUOUS:原文说法不清楚,或者有歧义
- UNVERIFIED:信息来自 Claude 的背景知识,原文没有证据
Step 1 完成后,必须执行验证:
- mkdir -p {wiki_root}/.wiki-tmp
- 将 Step 1 JSON 写入 {wiki_root}/.wiki-tmp/step1-latest.json
- 调用 bash ${SKILL_DIR}/scripts/validate-step1.sh {wiki_root}/.wiki-tmp/step1-latest.json
- 验证完成后删除 {wiki_root}/.wiki-tmp/step1-latest.json
如果脚本返回非 0,自动回退到单步 ingest(不进行 Step 2)。
- 输入:原始内容 +
-
Step 2:页面生成:
- 输入:原始内容 +
purpose.md+ Step 1 的分析结果 + 现有相关 wiki 页面 - 输出:所有需要创建或更新的 wiki 页面内容
- Step 2 负责完成原流程中的素材摘要、实体页、主题页、index、log 更新
- 输入:原始内容 +
-
容错回退:
- 如果 Step 1 不是有效 JSON,或者缺少
entities、topics、confidence等必需字段,自动回退到原来的单步流程 - 回退时,所有本次新生成内容统一加上:
<!-- confidence: UNVERIFIED --> - 同时在页面顶部加注释说明本次处理因格式问题降级,避免出现“部分标注、部分没标注”的状态
- 如果 Step 1 不是有效 JSON,或者缺少
-
生成分类路由:
- 如果素材类型是
local_literature(学术文献 Markdown)→ 走学术文献专用摄取流程(见下文) - 其他素材类型继续走标准流程
- 如果素材类型是
-
生成素材摘要页(
wiki/literature/{日期}-{短标题}.md):- 参考
templates/literature-template.md的格式 - 包含:基本信息、核心观点、关键概念、与其他素材的关联、原文精彩摘录
- 对 Step 1 中标记为
INFERRED或AMBIGUOUS的关系,用 HTML 注释保留置信度:<!-- confidence: INFERRED --> <!-- confidence: AMBIGUOUS --> - frontmatter 必须包含
source_path:- 值为原始素材文件的相对路径(相对于知识库根目录),如
raw/literature/2026-04-17-shaft-vibration.md
- 值为原始素材文件的相对路径(相对于知识库根目录),如
- 参考