重构:删 5 零引用 crate(df-evolve/plugin/stages/task/traceability)+ 清死模块、ai.rs 拆 11 子 module、ai.ts 拆 6 composable、i18n 拆目录 功能:知识库全栈(df-project/scan + CRUD + 时间线 + 前端)、Settings 拆分、appSettings KV 迁移、模型池、LLM 并发 Semaphore 修复:审批持久化根治、ConditionEngine 默认拒绝、NodeRegistry unimplemented 清除、promote 补偿删除、工具结果截断 50KB、路径校验防 symlink 逃逸 文档:B-03 人工审批设计、决策记录三分档、规格契约自检、经验记录、todo 看板、PROGRESS 更新 详见 PROGRESS.md。src-tauri/儿童每日打卡应用/ 与本项目无关,已排除。
4.9 KiB
4.9 KiB
知识库模块
创建: 2026-06-13 | 阶段: Tier 1 已实现
概述
知识库是 DevFlow 的"共享记忆层",被动积累 AI 对话中产生的可复用经验,供后续对话注入使用。外部工具(Claude Code / CodeX / Cursor)可通过相同 IPC 接口读写,内外零差异。
实现状态
| 功能 | 状态 |
|---|---|
| candidate→published 状态机 | ✅ Tier 1 |
| 手动录入(Knowledge.vue) | ✅ Tier 1 |
| AI 自动提炼(对话完成后) | ✅ Tier 1 |
| LIKE 关键词检索 + 注入 system prompt | ✅ Tier 1 |
| 审核收件箱(人工门控) | ✅ Tier 1 |
| 向量 embedding + 混合检索 | ✅ Phase 5.5(开关控制,默认关) |
| ai_node prompt 注入 | ⬜ Tier 2 |
| MCP 对外 API | ⬜ Tier 2 |
状态机
candidate ──→ pending_review ──→ published ──→ archived
│ │ │
└────────────────┴───────────────┘
(可直接到 archived)
- AI 提炼只产 candidate,绝不自动 published(人工门控)
knowledge_archive:软删除(status=archived),不物理删除
知识类型(KnowledgeKind)
7 种:pitfall(踩坑)/ review_rule(审查规则)/ prompt_template(Prompt 模板)/ architecture_pattern(架构模式)/ diagnosis(诊断知识)/ deployment_note(部署经验)/ workflow_optimization(工作流优化)
IPC 命令(11 个)
| Command | 说明 |
|---|---|
knowledge_list(status?) |
全量列表,默认排除 archived |
knowledge_get(id) |
单条查询 |
knowledge_search(query, kind?, limit?) |
LIKE 检索,top-N≤3 |
knowledge_create(input) |
创建(status=candidate) |
knowledge_update_status(id, status) |
状态转换(含合法矩阵校验) |
knowledge_record_reuse(id) |
reuse_count +1 |
knowledge_list_candidates() |
审核收件箱(按 confidence 排序) |
knowledge_archive(id) |
软删除 |
knowledge_get_config() |
读取 KnowledgeConfig |
knowledge_save_config(config) |
保存 KnowledgeConfig |
knowledge_extract_now() |
手动触发提炼(ManualOnly 模式) |
KnowledgeConfig
pub struct KnowledgeConfig {
pub auto_extract: bool, // 提炼总开关,默认 true
pub trigger_mode: ExtractTrigger, // on_complete | on_idle | manual_only
pub min_messages: u32, // 守卫:最少消息数,默认 4
pub idle_timeout_ms: u64, // 闲置触发超时,默认 30000
pub auto_inject: bool, // 聊天注入开关,默认 true
pub vector_enabled: bool, // 向量检索开关,默认 false
pub embedding_provider_id: Option<String>, // 仅 openai_compat 类型
pub embedding_model: Option<String>,
}
存储:AppState.knowledge_config: Arc<Mutex<KnowledgeConfig>>(内存,重启恢复默认值)。
检索与注入
LIKE 检索(默认)
search(query, kind, limit=3) → WHERE title LIKE ? OR content LIKE ? → ORDER BY reuse_count DESC
混合检索(vector_enabled=true)
三层降级链:
- 开关关 → 纯 LIKE
- embed 调用失败 → 纯 LIKE
- 正常 → 双信号排序(同时命中 LIKE+向量 cos≥0.3 > 仅 LIKE > 仅向量 cos≥0.3)
嵌入时机:知识发布时(不在 candidate 阶段浪费 embed 调用),spawn_embedding_for_knowledge fire-and-forget。
注入位置
system prompt 头部([知识库上下文] --- [技能指令] --- [原始 system prompt]),仅 auto_inject=true 时生效。
AI 自动提炼流程
run_agentic_loop正常退出 →maybe_spawn_extraction()守卫检查- 守卫:
auto_extract=true+messages.len() >= min_messages tauri::async_runtime::spawn后台执行,不 await(不阻断聊天)- 取最后 6 条 user/assistant 消息 → 构造 JSON schema prompt → LLM
complete() serde_json::from_str<Vec<ExtractedItem>>解析,失败整批丢弃(warn 不报错)- 逐条写
knowledges(status=candidate,source_ref="conv:{id}")
矛盾知识处理
不做结构层消歧,在内容和 tags 中自述限制范围。检索时两条知识都可能返回,由 LLM 上下文理解取舍。
外部工具访问(规划)
Tier 1+ 目标:MCP Shell 封装(mcp-server 转发 IPC),外部工具使用逻辑与内部零差异:
- 外部写入:走 candidate → 人工审核流程
- 外部读取:
knowledge_search/knowledge_list(published)
相关文档
- df-storage 存储层 — knowledges 表结构 + 向量工具函数
- df-ai AI 集成模块 — hybrid_search / generate_embedding / extract
- 功能决策记录 — 检索方案演进决策