news 2026/9/29 23:04:39

从零搭建一个可被 AI 维护的本地 LLM Wiki:TaoToken 统一 Key 接入与 Markdown 知识库骨架

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
从零搭建一个可被 AI 维护的本地 LLM Wiki:TaoToken 统一 Key 接入与 Markdown 知识库骨架

1. 为什么本地知识库总是变成“资料坟场”

我猜你大概率用过 Obsidian、Notion、语雀或者飞书文档中的至少一个。刚开始都很兴奋,剪藏、摘录、建双链,感觉自己马上要构建第二大脑。三个月后再打开,里面躺着几百篇没读完的文章、一堆孤立的笔记、几个永远没填完的模板。收集很多,复用很少。

问题不在于工具,而在于维护成本。传统知识库依赖人工做这些事:分类、摘要、建链接、整理概念、维护索引、定期复盘。每一件都重要,每一件都耗时。当维护成本超过使用收益,知识库就停止生长了。

LLM Wiki 的思路是把这些维护动作交给 AI:人负责判断价值和提供方向,AI 负责整理、摘要、归类、链接、维护和复盘。但这里有个前提——你的知识库结构必须对 AI 友好。目录怎么分、文件怎么命名、页面元数据怎么写、AI 改完东西往哪记日志,这些约定决定了 AI 能不能长期稳定地帮你干活。

这篇要做的,就是从零搭一套可被 AI 维护的本地 Markdown 知识库骨架,并且用 TaoToken 的统一 Key 把 AI 工具接进来,完成一次真实的“AI 写入 + 校验”闭环。适合已经在用 Markdown 做笔记、想让 AI 接手整理工作、又不想把资料全传到云端的开发者。

2. TaoToken 在 LLM Wiki 里的位置:统一 Key 与 API 通道

先说清楚 TaoToken 在这套系统里扮演什么角色。它不是知识库软件,也不是编辑器替代品。它是一个统一的模型 API 接入层:你申请一个 Key,就能通过同一套 OpenAI 兼容接口调用多个模型,不用为每个工具单独配一套 Key 和环境变量。

对 LLM Wiki 来说,这件事的价值在于“工具无关”。你的知识库可能同时被几种工具读写:命令行里的脚本、编辑器插件、独立的 Agent 工具。如果每个工具都各自维护 Key 和 base_url,配置会散落各处,换模型时要改很多地方。统一 Key 之后,所有工具指向同一个 API 地址,模型切换只改一个配置项。

接入信息如下:

  • 官网入口:https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=
  • API 基地址:https://taotoken.net/api
  • 模型对话入口:https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_content=model_chat&utm_campaign=rewrite
  • API Keys 管理:https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api_keys&utm_campaign=rewrite
  • 接入文档:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite

注意:API 基地址是https://taotoken.net/api,很多 OpenAI 兼容客户端需要的是带/v1的完整路径,具体以接入文档为准。配置时先确认客户端要求的格式,能省掉一半的 404 报错。

如果你后续要跑长期编码或 Agent 类任务,可以了解 Coding Plan:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding_plan&utm_campaign=rewrite

3. 目录结构:让 AI 知道东西该放哪

先建骨架。核心思想是分层:临时输入 → 原始证据 → AI 摘要 → 稳定知识 → 报告输出。每一层职责单一,AI 读目录名就知道该往哪写。

LLMWiki/ ├── inbox/ # 低摩擦收集箱,先扔进来不分类 ├── raw/ # 原始资料区,只新增不改写 ├── wiki/ # 正式知识库 │ ├── index.md # 总索引,AI 查询第一入口 │ ├── log.md # 操作日志,记录每次变更 │ ├── sources/ # 来源摘要 │ ├── concepts/ # 稳定概念页 │ ├── projects/ # 项目知识页 │ ├── people/ # 人物/组织页 │ └── methods/ # 可复用方法流程 ├── outputs/ │ ├── reports/ # 简报、复盘、报告 │ └── lint/ # 健康检查报告 ├── prompts/ # 可复用提示词模板 ├── docs/ │ ├── specs/ # 设计文档 │ └── plans/ # 实施计划 ├── AGENTS.md # 多 AI 协作主协议 └── README.md # 使用说明

用 PowerShell 一次性建好(Windows 环境):

$root = "D:\LLMWiki" $dirs = @( "inbox", "raw", "wiki", "wiki/sources", "wiki/concepts", "wiki/projects", "wiki/people", "wiki/methods", "outputs", "outputs/reports", "outputs/lint", "prompts", "docs", "docs/specs", "docs/plans" ) foreach ($d in $dirs) { New-Item -ItemType Directory -Force -Path (Join-Path $root $d) | Out-Null } Write-Host "目录骨架创建完成:$root"

macOS 或 Linux 用一行就够:

mkdir -p ~/LLMWiki/{inbox,raw,wiki/{sources,concepts,projects,people,methods},outputs/{reports,lint},prompts,docs/{specs,plans}}

几个关键约定,直接决定 AI 能不能安全协作:

raw/只新增不改写。它是证据层,AI 如果随意改写原始资料,追溯链就断了。需要更新时新增一个带新日期的版本。

wiki/下每个正式页面必须有 YAML frontmatter,AI 靠它判断页面类型和来源。

每次有意义的变更,都要同时更新wiki/index.md和wiki/log.md。这是多 AI 协作不互相覆盖的基础。

4. 配置骨架:config.toml 与 settings.json

接下来是接入配置。不同工具读不同格式的配置文件,这里给两份骨架,按你实际用的工具取用。

4.1 config.toml:命令行工具与脚本用

# LLMWiki/config.toml # 统一模型接入配置,所有本地脚本读这一份 [api] provider = "taotoken" base_url = "https://taotoken.net/api" api_key_env = "TAOTOKEN_API_KEY" # Key 从环境变量读,不写进文件 timeout_seconds = 120 max_retries = 3 [models] default = "gpt-4o-mini" # 日常摘要、标签用轻量模型 reasoning = "gpt-4o" # 概念抽取、矛盾检测用强模型 fallback = "claude-3-5-sonnet" # 主模型不可用时的备选 [wiki] root = "D:/LLMWiki" index_file = "wiki/index.md" log_file = "wiki/log.md" agents_file = "AGENTS.md" raw_dir = "raw" sources_dir = "wiki/sources" concepts_dir = "wiki/concepts" [ingest] # 摄入流程参数 max_source_chars = 12000 # 单次送入模型的原始资料上限 require_frontmatter = true auto_update_index = true auto_append_log = true

Key 不落盘,通过环境变量注入:

# Windows PowerShell,当前会话有效 $env:TAOTOKEN_API_KEY = "你的Key"
# macOS / Linux,写入 shell 配置可持久化 export TAOTOKEN_API_KEY="你的Key"

4.2 settings.json:编辑器插件与 Agent 工具用

{ "llmWiki": { "root": "D:/LLMWiki", "agentsFile": "AGENTS.md", "indexFile": "wiki/index.md", "logFile": "wiki/log.md" }, "model": { "provider": "openai-compatible", "baseUrl": "https://taotoken.net/api", "apiKeyEnv": "TAOTOKEN_API_KEY", "defaultModel": "gpt-4o-mini", "reasoningModel": "gpt-4o", "temperature": 0.3, "maxTokens": 4096 }, "ingest": { "rawDir": "raw", "sourcesDir": "wiki/sources", "conceptsDir": "wiki/concepts", "requireFrontmatter": true, "autoUpdateIndex": true, "autoAppendLog": true }, "lint": { "checkFrontmatter": true, "checkBrokenLinks": true, "checkOrphanPages": true, "checkMissingSources": true, "reportDir": "outputs/lint" } }

注意:baseUrl填https://taotoken.net/api,如果你的客户端自动补/v1/chat/completions,就不要再手动加/v1,否则会拼成/api/v1/v1/...。先发一个最小请求验证,再批量跑任务。

4.3 AGENTS.md:AI 协作的“宪法”

这个文件比配置更重要。它告诉所有 AI 工具:这个知识库怎么用、什么能改、什么不能碰。

# AGENTS.md — LLM Wiki 协作协议 ## 知识库定位 本地优先的 Markdown 知识库,AI 参与整理、摘要、归类、链接与复盘。 ## 操作原则 1. 修改 wiki/ 前,先读 AGENTS.md、wiki/index.md、wiki/log.md。 2. raw/ 下既有文件默认不改写,需要更新时新增带日期的版本。 3. 不删除 wiki 页面,除非用户明确批准;默认只新增、更新、标记废弃。 4. 每个正式 wiki 页面必须有 YAML frontmatter。 5. 断言应可追溯到 raw/ 或其他来源,推测内容标注“待确认”。 6. 每次有意义的变更,同步更新 wiki/index.md 和 wiki/log.md。 7. 不写入密码、token、access-key、secret-key、内网地址。 ## 页面类型 source / concept / project / person / method / index / log / report ## 命名约定 - raw/:日期-来源-主题.md,如 2026-07-08-csdn-llm-wiki.md - wiki/:中文标题.md,如 LLM-Wiki.md - 项目目录:00-项目入口.md 起编号

4.4 页面 frontmatter 模板

--- title: LLM Wiki type: concept sources: - "raw/2026-07-08-csdn-llm-wiki.md" related: - "wiki/concepts/知识库主动反馈闭环.md" created: 2026-07-08 updated: 2026-07-08 confidence: medium ---

confidence字段很有用:high表示有明确来源支撑,medium表示合理推断,low表示待确认。AI 生成内容时按这个标准自评,你复查时一眼能看出哪些需要人工核实。

5. 验证请求:跑通一次 AI 写入与校验

配置写完不验证,等于没配。这一步用一个最小脚本,让 AI 读一篇 raw 资料,生成来源摘要页,更新索引和日志,然后做一次 lint 校验。

5.1 准备一篇原始资料

在raw/下放一个文件:

<!-- raw/2026-07-08-demo-note.md --> # 演示资料:为什么知识库需要 AI 维护 来源:本地笔记 日期:2026-07-08 传统知识库的维护动作(分类、摘要、建链、索引、复盘)都是人工完成, 成本高且容易中断。把其中可标准化的部分交给 AI,人只保留价值判断和方向决策, 可以让知识库持续生长而不是变成资料坟场。

5.2 用 Python 发一次真实请求

# scripts/ingest_demo.py import os, json, urllib.request API_BASE = "https://taotoken.net/api" API_KEY = os.environ["TAOTOKEN_API_KEY"] MODEL = "gpt-4o-mini" def chat(messages): payload = json.dumps({ "model": MODEL, "messages": messages, "temperature": 0.3 }).encode("utf-8") req = urllib.request.Request( f"{API_BASE}/v1/chat/completions", data=payload, headers={ "Content-Type": "application/json", "Authorization": f"Bearer {API_KEY}" }, method="POST" ) with urllib.request.urlopen(req, timeout=120) as resp: return json.loads(resp.read().decode("utf-8")) raw_text = open("D:/LLMWiki/raw/2026-07-08-demo-note.md", encoding="utf-8").read() prompt = f"""你是 LLM Wiki 的摄入助手。请阅读下面的原始资料, 生成一个来源摘要页,严格输出 Markdown,包含 YAML frontmatter。 要求: - type: source - 包含:一句话摘要、关键观点(3条以内)、对本知识库的启发、不确定性 - 不要编造资料中没有的事实 原始资料: {raw_text} """ result = chat([{"role": "user", "content": prompt}]) content = result["choices"][0]["message"]["content"] out_path = "D:/LLMWiki/wiki/sources/2026-07-08-demo-note.md" with open(out_path, "w", encoding="utf-8") as f: f.write(content) print("写入完成:", out_path) print("--- 生成内容预览 ---") print(content[:600])

运行:

python scripts/ingest_demo.py

成功时你会看到类似输出:

写入完成: D:/LLMWiki/wiki/sources/2026-07-08-demo-note.md --- 生成内容预览 --- --- title: 演示资料:为什么知识库需要 AI 维护 type: source sources: - "raw/2026-07-08-demo-note.md" created: 2026-07-08 updated: 2026-07-08 confidence: medium --- ## 一句话摘要 ...

5.3 校验动作:lint 检查

写入之后必须校验,否则你不知道 AI 有没有漏 frontmatter、有没有断链。写一个轻量检查脚本:

# scripts/lint_wiki.py import os, re, glob ROOT = "D:/LLMWiki" WIKI = os.path.join(ROOT, "wiki") INDEX = os.path.join(WIKI, "index.md") issues = [] # 1. 检查 frontmatter for path in glob.glob(os.path.join(WIKI, "**", "*.md"), recursive=True): name = os.path.basename(path) if name in ("index.md", "log.md"): continue with open(path, encoding="utf-8") as f: text = f.read() if not text.startswith("---"): issues.append(f"[缺 frontmatter] {path}") continue if "type:" not in text.split("---")[1]: issues.append(f"[缺 type 字段] {path}") # 2. 检查页面是否进入索引 with open(INDEX, encoding="utf-8") as f: index_text = f.read() for path in glob.glob(os.path.join(WIKI, "**", "*.md"), recursive=True): name = os.path.basename(path) if name in ("index.md", "log.md"): continue rel = os.path.relpath(path, ROOT).replace("\\", "/") if rel not in index_text and name not in index_text: issues.append(f"[未进索引] {rel}") # 3. 输出报告 report_dir = os.path.join(ROOT, "outputs", "lint") os.makedirs(report_dir, exist_ok=True) report_path = os.path.join(report_dir, "lint-2026-07-08.md") with open(report_path, "w", encoding="utf-8") as f: f.write("# Lint 报告 2026-07-08\n\n") if issues: f.write("\n".join(f"- {i}" for i in issues)) else: f.write("全部检查通过。\n") print(f"检查完成,问题数:{len(issues)}") for i in issues: print(" ", i) print("报告:", report_path)

跑一次:

python scripts/lint_wiki.py

如果摘要页没进索引,你会看到[未进索引] wiki/sources/2026-07-08-demo-note.md。这时候让 AI 补一步:把该页面挂到wiki/index.md的“来源”章节,并在wiki/log.md追加一条记录。补完再跑 lint,问题数归零,闭环就通了。

6. 本篇常见错排查

报错 401 Unauthorized。九成是 Key 没读到。先确认环境变量在当前终端可见:echo $env:TAOTOKEN_API_KEY(PowerShell)或echo $TAOTOKEN_API_KEY(bash)。如果为空,说明 Key 只写进了配置文件但没导出到环境。另外检查请求头是不是Authorization: Bearer <key>,少个空格也会 401。

报错 404 Not Found。通常是 base_url 拼接问题。https://taotoken.net/api后面到底加不加/v1,取决于客户端。用 curl 先测一次最小请求:

curl -X POST "https://taotoken.net/api/v1/chat/completions" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $TAOTOKEN_API_KEY" \ -d '{"model":"gpt-4o-mini","messages":[{"role":"user","content":"ping"}]}'

返回正常 JSON 说明路径对,再回去改客户端配置。

AI 生成的页面没有 frontmatter。提示词里要明确写“严格输出 Markdown,包含 YAML frontmatter”,并给出字段清单。模型有时会“忘记”,在 lint 里把缺 frontmatter 作为硬性检查项,跑一次就能发现。

AI 改写了 raw/ 里的文件。这是协议问题,不是模型问题。检查 AGENTS.md 里“raw/ 只新增不改写”这条有没有写清楚,以及你的摄入脚本是不是只读 raw、只写 wiki。脚本层面做限制比靠提示词更可靠。

索引和日志没更新。把“更新 index 和 log”作为摄入流程的最后一步写进提示词,并在 lint 里检查页面是否进索引。漏了就让 AI 补,补完再校验。

模型返回超时。长资料一次送进去容易超时。config.toml 里的max_source_chars就是干这个的,超过就分段处理,或者换长上下文模型。重试次数设 3 次,偶发网络抖动自动恢复。

Key 泄露风险。任何时候不要把 Key 写进 config.toml、settings.json 或提交到 Git。统一走环境变量,.gitignore里加上*.env和本地配置文件。项目 RAG 文档里也禁止记录任何凭据。

7. 把 AI 接进知识库之后

骨架搭好、配置跑通、lint 归零之后,这套系统就能持续运转了。日常动作变成:资料先进inbox/,AI 定期消化进raw/和wiki/sources/,稳定概念沉淀到wiki/concepts/,项目资料整理成wiki/projects/下的 RAG 文档包,每天生成简报、每周做复盘,定期跑 lint 检查健康状态。

如果你要长期跑编码或 Agent 类任务,建议把 Coding Plan 配上,统一 Key 在多个工具间复用会省很多事:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding_plan&utm_campaign=rewrite

想先验证模型输出质量,可以直接在模型对话页试:https://taotoken.net/models?utm_source=taotoken_aicg_blog_end&utm_content=model_chat&utm_campaign=rewrite

Key 管理和接入细节看这里:https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api_keys&utm_campaign=rewrite 和 https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite

最后留一个我踩过的坑:别一上来就把目录建得特别复杂。先用inbox/ raw/ wiki/ outputs/ prompts/这五个跑通一次完整摄入,确认 AI 能正确读写、lint 能发现问题,再按需扩展projects/和methods/。结构是长出来的,不是一次设计出来的。

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

普及一下AI应用开发,需要达到的强度!

在AI应用开发领域&#xff0c;仅仅会调接口和构建基础RAG系统已无法满足企业需求。企业更看重的是能够将大模型融入具体业务并确保线上服务稳定的人才。文章提出了五项关键技能&#xff1a;扎实的Python工程基础、掌握RAG数据链、理解框架原理而非仅调包、独立部署线上服务以及…

作者头像 李华
网站建设 2026/9/29 23:03:44

股票分析MCP服务stock-scanner-mcp配TaoToken:settings.json与config.toml骨架

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

作者头像 李华
网站建设 2026/9/29 22:59:32

Claude Code 模型选择指南:Opus/Sonnet/Haiku 的配置与验证

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

作者头像 李华
网站建设 2026/9/29 22:59:06

CostBench横空出世!大模型智能体的“成本盲区“被彻底曝光,程序员必看!TaoToken配置实战:settings.json与config.toml骨架一次讲清

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

作者头像 李华