# kb-cli 草稿录入集成设计文档 **日期**: 2026-07-26 **状态**: 设计中 **版本**: v0.4.0 ## 背景 当前知识库草稿录入依赖 Python 脚本 `draft-intake.py`,需要 Hermes Agent 手动调用。本次设计将草稿录入功能集成到 kb-cli,实现: 1. AI 生成草稿标题和正文 2. kb-cli 自动提取 tags(调用本地 LLM) 3. kb-cli 自动搜索相关文档并生成合并指示 4. 通过知识图谱创建 wikilinks ## 目标 - **简化流程**: 一条命令完成草稿创建 + tags 提取 + 合并指示生成 - **智能标签**: 使用本地 LLM 提取问题匹配型 tags + 扩展词 - **自动关联**: 基于 tags 搜索知识库,生成合并指示和 wikilinks - **批量重建**: 支持为现有文档批量重建 tags ## 核心流程 ``` 草稿内容 → LLM 生成 tags → kb-cli search(tags) → 搜索到 top3 文档 → LLM 生成合并指示 ``` ### 详细步骤 1. **LLM 提取 tags + related_docs** - 输入:草稿内容 - 输出:5-10 个 tags + 0-5 个相关文档标题 - tags 类型:核心问题标签 + 扩展词 + 平台/设备标签 2. **kb-cli search(tags)** - 使用 tags 作为关键词搜索知识库 - 返回 top3 相关文档 3. **LLM 生成合并指示** - 输入:草稿内容 + top3 文档 - 输出:merge.md(包含合并建议 + 理由) 4. **创建 wikilinks** - 通过 graph 匹配 related_docs 对应的节点 - 创建 wikilink edges 5. **写入文件** - draft.md:包含 frontmatter(tags)+ 正文 - merge.md:合并指示 ## 命令设计 ### 1. draft create 创建草稿,自动生成 tags 和合并指示。 ```bash kb-cli draft create --type 售后 --title "标题" --content-file /path/to/content.md ``` **参数**: - `--type`: 草稿类型(售后/产品/运营/行业/TAPD) - `--title`: 草稿标题 - `--content-file`: 草稿正文文件路径 - `--source`: 来源标识(可选) - `--force`: 强制创建,跳过重复检查 **流程**: 1. 读取 content-file 内容 2. 调用 LLM 提取 tags + related_docs 3. 使用 tags 搜索知识库,获取 top3 文档 4. 调用 LLM 生成合并指示(基于 top3 文档) 5. 检查待审阅区是否已存在相同标题的草稿 6. 创建目录结构:`待审阅/{类型}/NNN-YYYYMMDD-标题/` 7. 写入 draft.md(包含 frontmatter + 正文) 8. 写入 merge.md(合并指示) 9. 通过 graph 匹配 related_docs,创建 wikilink edges ### 2. tags rebuild 批量重建现有文档的 tags。 ```bash kb-cli tags rebuild [--vault=<路径>] [--dry-run] [--limit=100] ``` **参数**: - `--vault`: 知识库路径(默认 ~/aisim/note/001/笔记001) - `--dry-run`: 仅预览,不实际写入 - `--limit`: 限制处理文档数量(默认 100) **流程**: 1. 扫描知识库所有 .md 文件 2. 对每个文件: - 读取内容 - 调用 LLM 提取 tags - 更新 frontmatter 中的 tags 字段 - 重建索引(更新 nodes 表的 tags 字段) 3. 输出统计:处理文件数、更新 tags 数 ## LLM 配置 复用 `generate-merge-hint.py` 的配置: - **API**: `http://192.168.3.246:1127/v1/chat/completions` - **Model**: `qwen3.6-35b-a3b` - **参数**: temperature=0.3, max_tokens=2000, enable_thinking=False ### Prompt 设计 #### 提取 tags + related_docs ``` 分析以下知识库草稿,提取: 1. tags(5-10个): - 核心问题标签(如"充不进气"、"档案下载失败") - 扩展词(不同人可能的描述,如"充气慢"、"进气不足") - 平台/设备标签(如"电子秤平台"、"智能枪") 2. related_docs(0-5个):相关文档标题(用于创建链接) 输出 JSON: { "tags": ["充不进气", "充气慢", "进气不足", "智能枪", "电子秤平台"], "related_docs": ["智能枪通气杆卡住漏气", "角阀充装功率不足"] } 草稿内容: {content} ``` #### 生成合并指示 ``` 你是一个知识库管理助手。请判断以下草稿与哪些知识库文档相关。 ## 草稿内容 {draft_content} ## 候选文档(Top 3) 1. 标题: {title1}, 路径: {path1}, 相关度: {score1} 2. 标题: {title2}, 路径: {path2}, 相关度: {score2} 3. 标题: {title3}, 路径: {path3}, 相关度: {score3} ## 任务 请分析草稿与每个候选文档的相关性,输出 JSON 格式: { "recommendation": { "action": "merge|new|split", "target": "目标路径(如果 action=merge)", "reason": "判断理由", "confidence": "high|medium|low" }, "analysis": [ { "path": "文档路径", "relevance": "high|medium|low", "reason": "相关性说明" } ] } 判断标准: - action=merge: 草稿内容与某个候选文档高度相关,应该合并 - action=new: 草稿内容是全新的,应该新建文档 - action=split: 草稿内容包含多个独立主题,应该拆分 - confidence=high: 判断很确定 - confidence=medium: 判断比较确定 - confidence=low: 判断不太确定 只输出 JSON,不要其他内容。 ``` ## 文件结构 ``` 待审阅/ ├── 售后提取/ │ ├── 001-20260726-充不进气问题/ │ │ ├── draft.md # 草稿内容(包含 tags) │ │ └── merge.md # 合并指示 │ └── 002-20260726-档案下载失败/ │ ├── draft.md │ └── merge.md ├── 产品提取/ ├── 运营提取/ ├── TAPD提取/ └── counter.json # 编号计数器 ``` ### draft.md 格式 ```markdown --- title: "充不进气问题" type: "售后" status: 待确认 draft: true source: "售后诊断" tags: [充不进气, 充气慢, 进气不足, 智能枪, 电子秤平台] created: 2026-07-26 10:30:00 --- ## 问题描述 客户反馈充装时充不进气,或充气速度很慢... ## 排查过程 1. 检查智能枪是否正常连接 2. 检查角阀是否打开 ... ## 解决方案 1. 更换智能枪通气杆 2. 清理角阀滤网 ... ``` ### merge.md 格式 ```markdown --- draft_id: 001-20260726-充不进气问题 generated_at: 2026-07-26 10:35:00 confidence: high --- ## 合并指示 **操作类型**: merge **目标**: FAQ/充装类/001-智能枪通气杆卡住漏气.md **理由**: 草稿描述的"充不进气"问题与现有 FAQ 001 高度相关,都是智能枪通气杆问题导致的充气异常 ## 依据 ### 搜索到的相关文档(Top 3) 1. **智能枪通气杆卡住漏气** (相似度: 0.92) - 路径: `FAQ/充装类/001-智能枪通气杆卡住漏气.md` - 摘要: 智能枪通气杆卡住导致漏气,影响充装... 2. **角阀充装功率不足** (相似度: 0.78) - 路径: `FAQ/充装类/017-角阀充装功率不足.md` - 摘要: 角阀供电不足导致充装功率低... 3. **充不进气与老瓶芯片问题** (相似度: 0.75) - 路径: `FAQ/充装类/013-充不进气与老瓶芯片问题.md` - 摘要: 老瓶芯片兼容性问题导致充不进气... ## LLM 判断 - **FAQ/充装类/001-智能枪通气杆卡住漏气.md**: high - 草稿描述的充气慢、充不进气现象与 FAQ 001 的通气杆卡住问题高度一致 - **FAQ/充装类/017-角阀充装功率不足.md**: medium - 功率不足也会导致充气慢,但根因不同 - **FAQ/充装类/013-充不进气与老瓶芯片问题.md**: medium - 都是充不进气问题,但老瓶芯片是识别问题,不是充气问题 ``` ## 技术实现 ### 依赖 - `github.com/mattn/go-sqlite3` (需要 CGO + FTS5 标签) - 本地 LLM API(OpenAI 兼容格式) ### 模块设计 #### 1. internal/llm/client.go LLM 客户端,封装 API 调用。 ```go type Client struct { apiBase string apiKey string model string } func NewClient(apiBase, apiKey, model string) *Client func (c *Client) ExtractTags(content string) (*ExtractResult, error) func (c *Client) GenerateMergeHint(draftContent string, candidates []SearchResult) (*MergeHint, error) ``` #### 2. internal/draft/intake.go 草稿录入逻辑。 ```go type DraftIntake struct { vaultPath string llmClient *llm.Client store *index.Store } func NewDraftIntake(vaultPath string, llmClient *llm.Client, store *index.Store) *DraftIntake func (d *DraftIntake) CreateDraft(draftType, title, content, source string, force bool) error func (d *DraftIntake) RebuildTags(limit int, dryRun bool) error ``` #### 3. cmd/draft.go CLI 命令定义。 ```go var draftCmd = &cobra.Command{ Use: "draft", Short: "草稿管理", } var draftCreateCmd = &cobra.Command{ Use: "create", Short: "创建草稿", RunE: runDraftCreate, } var tagsRebuildCmd = &cobra.Command{ Use: "rebuild", Short: "重建 tags", RunE: runTagsRebuild, } ``` ## 待解决问题 ### 1. FTS5 模块缺失 **问题**: go-sqlite3 编译时未启用 FTS5,导致 `kb-cli search` 报错 `no such module: fts5` **解决方案**: 编译时添加 CGO 标签 ```bash go build -tags fts5 -o ~/go/bin/kb-cli ``` **验证**: ```bash kb-cli search 充装 ``` ### 2. LLM API 配置 **问题**: 需要硬编码 API 地址和密钥,还是从配置文件读取? **方案**: 从环境变量读取,支持回退到默认值 ```go apiBase := os.Getenv("KB_LLM_API_BASE") if apiBase == "" { apiBase = "http://192.168.3.246:1127/v1" } ``` ## 实现计划 ### Phase 1: 修复 FTS5 问题 1. 重新编译 kb-cli,添加 `-tags fts5` 2. 验证 `kb-cli search` 正常工作 ### Phase 2: 实现 LLM 客户端 1. 创建 `internal/llm/client.go` 2. 实现 `ExtractTags` 和 `GenerateMergeHint` 方法 3. 编写单元测试 ### Phase 3: 实现 draft create 命令 1. 创建 `internal/draft/intake.go` 2. 实现草稿创建逻辑 3. 创建 `cmd/draft.go`,定义 CLI 命令 4. 集成测试 ### Phase 4: 实现 tags rebuild 命令 1. 实现批量重建 tags 逻辑 2. 添加 `--dry-run` 支持 3. 集成测试 ### Phase 5: 文档与发布 1. 更新 README.md 2. 更新技能文档 3. 发布 v0.4.0 ## 风险与缓解 ### 风险 1: LLM 输出不稳定 **缓解**: - 使用 temperature=0.3 降低随机性 - 添加 JSON 解析容错(尝试提取 ```json 代码块) - 失败时回退到简单模式(只生成 tags,不生成 related_docs) ### 风险 2: tags 质量不高 **缓解**: - Prompt 明确要求三类 tags(核心问题 + 扩展词 + 平台/设备) - 提供示例,引导 LLM 输出高质量 tags - 后续可通过 `tags rebuild` 批量优化 ### 风险 3: 合并指示不准确 **缓解**: - 提供 top3 候选文档,让 LLM 有足够信息判断 - 要求 LLM 输出 confidence 字段,低置信度时提示人工审核 - 保留 merge.md 文件,方便人工修正 ## 成功标准 - `kb-cli draft create` 能成功创建草稿,包含 tags 和合并指示 - `kb-cli tags rebuild` 能批量重建现有文档的 tags - tags 质量满足搜索需求(能匹配用户描述的问题) - 合并指示准确率达到 80% 以上(high + medium confidence) ## 后续优化 1. **智能分类**: 根据内容自动判断草稿类型(售后/产品/运营) 2. **增量更新**: 只重建 tags 变化的文档,减少 LLM 调用 3. **批量模式**: 支持从文件批量导入草稿(如 CSV、JSON) 4. **Web UI**: 提供 Web 界面管理草稿和审阅流程