日期: 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
草稿内容 → LLM 生成 tags → kb-cli search(tags) → 搜索到 top3 文档 → LLM 生成合并指示
创建草稿,自动生成 tags 和合并指示。
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
批量重建现有文档的 tags。
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 数
复用 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
分析以下知识库草稿,提取:
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 # 编号计数器
title: "充不进气问题"
type: "售后"
status: 待确认
draft: true
source: "售后诊断"
tags: [充不进气, 充气慢, 进气不足, 智能枪, 电子秤平台]
客户反馈充装时充不进气,或充气速度很慢...
draft_id: 001-20260726-充不进气问题
generated_at: 2026-07-26 10:35:00
操作类型: merge
目标: FAQ/充装类/001-智能枪通气杆卡住漏气.md
理由: 草稿描述的"充不进气"问题与现有 FAQ 001 高度相关,都是智能枪通气杆问题导致的充气异常
FAQ/充装类/001-智能枪通气杆卡住漏气.mdFAQ/充装类/017-角阀充装功率不足.mdFAQ/充装类/013-充不进气与老瓶芯片问题.mdgithub.com/mattn/go-sqlite3 (需要 CGO + FTS5 标签)LLM 客户端,封装 API 调用。
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)
草稿录入逻辑。
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
CLI 命令定义。
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,
}
问题: 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 充装
问题: 需要硬编码 API 地址和密钥,还是从配置文件读取?
方案: 从环境变量读取,支持回退到默认值go apiBase := os.Getenv("KB_LLM_API_BASE") if apiBase == "" { apiBase = "http://192.168.3.246:1127/v1" }
-tags fts5kb-cli search 正常工作internal/llm/client.goExtractTags 和 GenerateMergeHint 方法internal/draft/intake.gocmd/draft.go,定义 CLI 命令--dry-run 支持缓解:
- 使用 temperature=0.3 降低随机性
- 添加 JSON 解析容错(尝试提取 ```json 代码块)
- 失败时回退到简单模式(只生成 tags,不生成 related_docs)
缓解:
- Prompt 明确要求三类 tags(核心问题 + 扩展词 + 平台/设备)
- 提供示例,引导 LLM 输出高质量 tags
- 后续可通过 tags rebuild 批量优化
缓解:
- 提供 top3 候选文档,让 LLM 有足够信息判断
- 要求 LLM 输出 confidence 字段,低置信度时提示人工审核
- 保留 merge.md 文件,方便人工修正
kb-cli draft create 能成功创建草稿,包含 tags 和合并指示kb-cli tags rebuild 能批量重建现有文档的 tags