# 知识库检索使用指南 ## 快速开始 ### 1. 文档格式要求 所有知识库文档必须包含 YAML frontmatter: ```markdown --- title: 文档标题(必填) keywords: [关键词1, 关键词2, 关键词3](必填) summary: 文档摘要(必填) category: api(可选) version: 1.0(可选) author: zhangsan(可选) --- # 正文内容 这里是文档的正文... ``` ### 2. 上传文档 **API 端点**: ``` POST /api/documents/upload Content-Type: multipart/form-data 参数: - file: Markdown 文件 - category: 分类(如 api, infrastructure, domain, troubleshooting) ``` **示例**: ```bash curl -X POST http://localhost:9900/api/documents/upload \ -F "file=@payment-errors.md" \ -F "category=api" ``` **返回**: ```json { "docId": "abc123-def456-...", "status": "success" } ``` ### 3. Agent 调用 在 Agent 对话中,工具会自动可用: ``` 用户:ERR_TIMEOUT 是什么错误? Agent 内部: 1. 调用 lookup_knowledge("ERR_TIMEOUT") 2. L0 精确匹配找到 payment-errors.md 3. 返回完整错误码定义(高置信度) Agent 回复: ERR_TIMEOUT 是支付网关超时错误。 原因:... 排查方向:... ``` --- ## 编写知识库文档 ### Frontmatter 字段说明 #### 必填字段 **title**(标题) ```yaml title: 支付网关错误码定义 ``` - 简洁明了,能准确描述文档内容 - 建议 10-30 字 **keywords**(关键词列表) ```yaml keywords: [ERR_TIMEOUT, 超时, 支付网关, 错误码] ``` - 用于 L0 精确匹配 - 包含所有可能的查询词 - 建议 3-10 个关键词 - 既要精确(ERR_TIMEOUT),也要通用(超时) **summary**(摘要) ```yaml summary: 记录了支付网关所有核心错误码的含义、原因分析及排查方向 ``` - 一句话描述文档用途 - 建议 30-100 字 #### 可选字段 **category**(分类) ```yaml category: api ``` - 推荐值:api, infrastructure, domain, troubleshooting - 用于目录组织 **version**(版本) ```yaml version: 1.0 ``` - 文档版本号 - 便于追踪更新 **author**(作者) ```yaml author: zhangsan ``` - 文档维护者 ### 关键词设计技巧 #### ✅ 好的关键词设计 ```yaml keywords: [ERR_TIMEOUT, 超时, 支付网关, timeout, 网关超时, 支付超时] ``` **特点**: - 包含精确术语(ERR_TIMEOUT) - 包含通用描述(超时) - 包含组合词(网关超时、支付超时) - 包含英文(timeout) #### ❌ 不好的关键词设计 ```yaml keywords: [错误, 问题] ``` **问题**: - 太宽泛,导致多个文档匹配 - Agent 获得低置信度结果 ### 文档内容建议 #### 结构化内容 ```markdown # 支付网关错误码定义 ## ERR_TIMEOUT **错误说明**:支付网关调用超时 **可能原因**: 1. 网络延迟 2. 支付网关响应慢 3. 本地超时配置过短 **排查步骤**: 1. 检查网络连通性 2. 查看支付网关监控 3. 检查超时配置 **解决方案**: - 增加超时时间 - 优化网络链路 - 联系支付网关排查 ``` #### 包含实际示例 ```markdown ## 配置示例 ```yaml payment: gateway: timeout: 5000ms # 推荐 5 秒 retry: 3 ``` ## 日志示例 ``` 2026-06-24 10:00:00 ERROR PaymentService - ERR_TIMEOUT: 支付请求超时 orderId: 12345, timeout: 3000ms ``` ``` --- ## 使用场景 ### 场景 1: 错误码查询 **用户输入**: ``` ERR_TIMEOUT 是什么意思? ``` **Agent 流程**: 1. 调用 `lookup_knowledge("ERR_TIMEOUT")` 2. L0 精确匹配 → 唯一匹配 → 高置信度 3. 返回完整文档内容(前 2000 字符) 4. Agent 基于文档内容回答 **响应时间**:< 10ms ### 场景 2: 配置项查询 **用户输入**: ``` Redis 连接池怎么配置? ``` **Agent 流程**: 1. 调用 `lookup_knowledge("Redis")` 2. L0 精确匹配 → 可能多个匹配 → 低置信度 3. 同时调用 L1 语义检索补充 4. 返回 primary (L0) + supplement (L1) 5. Agent 综合两份结果回答 **响应时间**:< 500ms ### 场景 3: 流程查询 **用户输入**: ``` 如何排查生产故障? ``` **Agent 流程**: 1. 调用 `lookup_knowledge("故障排查")` 2. L0 精确匹配 → 找到故障诊断文档 3. 返回标准诊断流程 4. Agent 按照流程指导用户 ### 场景 4: 最佳实践查询 **用户输入**: ``` Spring AI 工具怎么写? ``` **Agent 流程**: 1. 调用 `lookup_knowledge("Spring AI")` 2. L0 + L1 混合检索 3. 返回最佳实践文档 4. Agent 提供具体建议和代码示例 --- ## 维护知识库 ### 文档更新流程 1. **修改本地文件** ```bash vim knowledge_base/api/payment-errors.md ``` 2. **重新上传** ```bash curl -X POST http://localhost:9900/api/documents/upload \ -F "file=@payment-errors.md" \ -F "category=api" ``` 3. **验证更新** - 重启应用(L0 索引重建) - 或等待下次部署 ### 文档删除 ```bash DELETE /api/documents/{docId} ``` **注意**: - 同时删除 MySQL 记录 - 删除 Milvus 向量索引 - 删除本地文件 - 从 L0 索引移除 ### 查看已索引文档 启动日志中查看: ``` [INFO] 开始扫描知识库目录: knowledge_base/ [DEBUG] 文档已加入索引: title=支付网关错误码定义 [DEBUG] 文档已加入索引: title=Redis 缓存配置指南 [INFO] 知识库索引加载完成,共 6 个文档 ``` --- ## 故障排查 ### 问题 1: 文档未被索引 **症状**: - 上传成功,但 Agent 查询不到 **排查**: 1. 检查 frontmatter 格式是否正确 2. 查看启动日志是否有 WARN 3. 确认文件保存位置 **解决**: ```bash # 检查文件是否存在 ls knowledge_base/api/payment-errors.md # 检查 frontmatter 格式 head -20 knowledge_base/api/payment-errors.md # 重启应用重建索引 ``` ### 问题 2: 总是调用 L1(低置信度) **症状**: - 查询耗时 > 200ms - 日志显示调用 L1 **原因**: - L0 未匹配(关键词不在 keywords 中) - L0 多个匹配(关键词重复) **解决**: ```yaml # 检查关键词是否覆盖查询词 keywords: [ERR_TIMEOUT, 超时, timeout] # 避免关键词过于宽泛 ❌ keywords: [错误, 问题] # 太宽泛 ✅ keywords: [ERR_TIMEOUT, 超时] # 精准 ``` ### 问题 3: 查询返回不完整 **症状**: - 文档内容被截断 **原因**: - 文档过长,L0 只返回前 2000 字符 **解决**: 1. 将长文档拆分成多个短文档 2. 每个文档聚焦一个主题 3. 或等待 Phase 2 章节锚点功能 ### 问题 4: 启动扫描很慢 **症状**: - 应用启动时间过长 **原因**: - knowledge_base/ 文件过多 **解决**: ```bash # 检查文档数量 find knowledge_base -name "*.md" | wc -l # 清理无用文档 rm knowledge_base/.backup/*.md ``` **参考指标**: - 500 个文档:< 1s - 1000 个文档:可能需要优化 --- ## 性能优化 ### 优化关键词匹配率 **目标**:提高高置信度命中率(减少 L1 调用) **方法**: 1. 分析查询日志,找到常见查询词 2. 将常见查询词加入 keywords 3. 定期审查和优化 keywords **示例**: ```bash # 查看低置信度查询 grep "confidence=low" logs/application.log | \ awk -F'query=' '{print $2}' | \ awk -F',' '{print $1}' | \ sort | uniq -c | sort -rn ``` ### 减少文档数量 **策略**: - 删除过时文档 - 合并相似文档 - 归档不常用文档 ### 监控关键指标 **配置监控**: - L0 查询耗时(目标 < 10ms) - L1 调用频率(目标 < 30%) - 高置信度命中率(目标 > 70%) --- ## 最佳实践总结 ### ✅ 推荐做法 1. **关键词全面** - 包含精确术语和通用描述 - 包含英文和中文 - 包含常见拼写变体 2. **文档聚焦** - 一个文档一个主题 - 避免大而全的文档 3. **结构化内容** - 使用清晰的标题层次 - 包含实际示例 - 提供具体步骤 4. **定期维护** - 定期审查和更新 - 删除过时内容 - 优化关键词 ### ❌ 避免做法 1. **关键词模糊** ```yaml ❌ keywords: [错误, 问题] ✅ keywords: [ERR_TIMEOUT, 超时] ``` 2. **文档过长** ```markdown ❌ 一个文档包含 50 个错误码定义(会被截断) ✅ 每个错误码一个文档,或按类型分组 ``` 3. **缺少实际示例** ```markdown ❌ Redis 配置很重要,需要优化 ✅ ```yaml spring: redis: lettuce: pool: max-active: 8 ``` ``` 4. **长期不更新** - 定期审查(建议每季度) - 删除过时内容 - 添加新的常见问题 --- ## 参考资料 - **架构文档**:`mvp/architecture/knowledge-retrieval-architecture.md` - **可观测性**:`.docs/knowledge-observability.md` - **Handoff 文档**:`handoff/2026-06-24-lookup-knowledge-integration.md` - **OpenSpec**:`openspec/changes/lookup-knowledge-integration/`