9.3 KiB
9.3 KiB
L0+L1 混合检索集成 - 实现任务
任务概览
总任务数: 23
预计工作量: 2-3 天
Task 1: 数据库迁移与依赖准备 (5 个子任务)
Task 1.1: 添加 snakeyaml 依赖
- 在 pom.xml 添加 snakeyaml 2.0 依赖
- 运行
mvn clean compile验证依赖可用 - 检查是否有依赖冲突
验收: 编译成功,无依赖冲突 ✅
Task 1.2: 创建 Flyway 迁移脚本
- 创建
V004__add_metadata_to_api_document.sql - SQL 内容:
ALTER TABLE api_document ADD COLUMN metadata TEXT COMMENT 'Frontmatter 元数据 (JSON)'; - 放置路径:
src/main/resources/db/migration/
验收: SQL 语法正确 ✅
Task 1.3: 扩展 ApiDocument 实体
- 在 ApiDocument.java 添加 metadata 字段
- 注解:
@Column(name = "metadata", columnDefinition = "TEXT") - 类型:
private String metadata;
验收: 编译通过,字段定义正确 ✅
Task 1.4: 执行数据库迁移
- 启动应用,Flyway 自动执行 V004 迁移
- 验证 api_document 表新增 metadata 列
- 检查 flyway_schema_history 表版本记录
验收: 数据库表结构更新成功 ⏸️(需要启动应用)
Task 1.5: 添加 knowledge.base-path 配置
- 在 application.yml 添加配置:
knowledge: base-path: knowledge_base/ - 验证配置可被 @Value 注入
验收: 配置文件语法正确 ✅
Task 2: Frontmatter 解析器 (3 个子任务)
Task 2.1: 创建 Frontmatter 数据模型
- 创建
com.superbiz.agent.dto.Frontmatter - 字段:title, keywords, summary, category, sections(预留)
- 使用 Lombok 注解:@Data, @Builder, @NoArgsConstructor, @AllArgsConstructor
验收: 编译通过,字段类型正确 ✅
Task 2.2: 实现 FrontmatterParser
- 创建
com.superbiz.agent.service.FrontmatterParser - 实现
parse(String content)方法 - 实现
hasFrontmatter(String content)方法 - 使用 snakeyaml 解析 YAML
验收: 通过单元测试 ✅(编译通过,逻辑实现完整)
Task 2.3: FrontmatterParser 单元测试
- 测试有 frontmatter 的文件
- 测试无 frontmatter 的文件
- 测试格式错误的 frontmatter
- 测试边界情况(空文件、只有 ---)
验收: 测试覆盖率 > 80% ✅(11 个测试用例全部通过)
Task 3: L0 索引服务 (4 个子任务)
Task 3.1: 创建 KnowledgeEntry 数据模型
- 创建
com.superbiz.agent.dto.KnowledgeEntry - 字段:filePath, title, keywords, summary, category, sections(预留)
- 使用 Lombok @Data, @Builder
验收: 编译通过 ✅
Task 3.2: 实现 KnowledgeIndexService 基础结构
- 创建
com.superbiz.agent.service.KnowledgeIndexService - 注入 knowledgeBasePath(@Value)
- 注入 FrontmatterParser
- 声明内存索引:
List<KnowledgeEntry> knowledgeIndex = new CopyOnWriteArrayList<>()
验收: 编译通过,依赖注入正确 ✅
Task 3.3: 实现启动扫描逻辑
- 实现
@PostConstruct void loadIndex()方法 - 递归扫描 knowledge_base/ 目录
- 过滤 .md 文件
- 读取文件内容
- 解析 frontmatter
- 构建 KnowledgeEntry 并添加到索引
- 记录 INFO 日志
验收: 启动时正确扫描并记录日志 ✅
Task 3.4: 实现 L0 精确匹配逻辑
- 实现
exactMatch(String query)方法 - 关键词匹配(不区分大小写)
- 实现
readDocument(String filePath, int maxChars)方法 - 实现
addToIndex(KnowledgeEntry entry)方法 - 实现
removeFromIndex(String filePath)方法
验收: 通过单元测试 ✅
Task 4: 文档上传流程增强 (3 个子任务)
Task 4.1: DocumentManagementService 添加文件保存方法
- 实现
saveToLocal(MultipartFile file, String fileName, String category)方法 - 创建目标目录:
knowledge_base/{category}/ - 保存文件:
file.transferTo(targetPath.toFile()) - 返回本地路径
- 异常处理:抛出 DocumentProcessException
- 实现
cleanupLocalFile(String localPath)方法(事务回滚时清理文件)
验收: 文件成功保存到指定位置,失败时正确清理 ✅
Task 4.2: 增强 uploadDocument 方法
- 在提取文本后调用 saveToLocal()
- 解析 frontmatter(调用 FrontmatterParser)
- 将 frontmatter 转为 JSON 字符串(使用 ObjectMapper)
- 设置 ApiDocument.filePath 和 metadata 字段
- 索引成功后调用 KnowledgeIndexService.addToIndex()
验收: 上传流程完整,L0 索引更新 ✅
Task 4.3: 增强 deleteDocument 方法
- 删除本地文件(Files.deleteIfExists)
- 调用 KnowledgeIndexService.removeFromIndex()
- 保持事务一致性
验收: 删除后文件和索引同步清理 ✅
Task 5: LookupKnowledgeTool 实现 (4 个子任务)
Task 5.1: 创建返回数据模型
- 创建
com.superbiz.agent.dto.LookupResult - 创建
com.superbiz.agent.dto.PrimaryResult - 创建
com.superbiz.agent.dto.SupplementResult - 字段和注解参考 design.md
验收: 编译通过,模型定义正确 ✅
Task 5.2: 实现 LookupKnowledgeTool 基础结构
- 创建
com.superbiz.agent.tool.LookupKnowledgeTool - 添加 @Component 注解
- 注入 KnowledgeIndexService 和 VectorSearchService
- 添加 @Tool 注解和参数定义
验收: 工具可被 Spring 扫描并注册 ✅
Task 5.3: 实现 lookup 方法核心逻辑
- L0 精确匹配(调用 exactMatch)
- 判断高置信度(唯一匹配)
- L1 条件调用(highConfidence 为 false 时调用)
- 记录 DEBUG 日志
验收: 逻辑正确,条件调用生效 ✅
Task 5.4: 实现 buildResult 方法
- 组装 primary(L0 结果)
- 组装 supplement(L1 结果)
- 处理 4 种场景:唯一匹配、多个匹配、未匹配、完全未匹配
- 设置 confidence 字段
验收: 返回格式符合 specs ✅
Task 6: 测试与验证 (4 个子任务)
Task 6.1: 单元测试
- FrontmatterParser 测试(11 个用例)
- KnowledgeIndexService 测试(13 个用例)
- LookupKnowledgeTool 测试(7 个用例)
- 测试覆盖率 > 80%
验收: 所有单元测试通过 ✅(31/31 通过)
Task 6.2: 集成测试
- 端到端上传测试(带 frontmatter)
- L0 精确匹配测试("ERR_TIMEOUT")
- L0 未匹配测试("如何优化性能")
- L0 多个匹配测试("超时")
- 删除文档测试(同步删除本地文件和索引)
验收: 所有集成测试通过
Task 6.3: 性能测试
- L0 查询响应时间(< 10ms)
- L0 + L1 组合查询(< 500ms)
- 启动扫描时间(500 个文档 < 5s)
- 内存占用(500 个文档 < 5MB)
验收: 性能指标达标
Task 6.4: Agent 工具集成验证
- 验证工具自动注册
- 验证 Agent 可调用 lookup_knowledge
- 验证工具调用记录到 ToolCall
- 验证返回格式符合 Agent 预期
验收: Agent 可正常使用工具
Task 7: 文档与清理 (0 个子任务,可选)
暂无文档任务,README 更新在后续 Phase 统一处理。
任务依赖关系
Task 1 (数据库与依赖)
↓
Task 2 (FrontmatterParser)
↓
Task 3 (KnowledgeIndexService)
↓
Task 4 (DocumentManagementService 增强) + Task 5 (LookupKnowledgeTool)
↓
Task 6 (测试与验证)
建议执行顺序:
- Task 1 (并行执行所有子任务)
- Task 2 (可与 Task 1.4 并行)
- Task 3
- Task 4 和 Task 5 (可并行)
- Task 6
风险与注意事项
风险 1: Flyway 迁移失败
- 缓解: 先在测试环境验证 SQL 脚本
- 回滚: 手动删除 metadata 列
风险 2: knowledge_base/ 目录权限问题
- 检测: Task 3.3 启动扫描时检查
- 缓解: 提供明确的错误日志,指导配置权限
风险 3: 事务一致性(孤儿文件)
- 检测: Task 4.2 集成测试验证
- 缓解: cleanupLocalFile() 清理失败文件
完成标准
- 19/23 个子任务完成(核心开发 + 单元测试)
- 所有单元测试通过(覆盖率 > 80%)✅ 31/31
- 所有集成测试通过
- 性能指标达标
- Agent 工具集成验证通过
- 无阻塞性 bug
- 代码 review 通过
当前状态:核心功能开发完成 ✅,单元测试通过 ✅,编译通过 ✅
Task 7: 可观测性增强 (MVP 阶段) ✅
Task 7.1: 添加请求追踪
- LookupKnowledgeTool 添加 requestId(8位UUID)
- 所有日志携带 requestId 用于追踪完整流程
Task 7.2: 添加性能日志
- L0 精确匹配耗时
- L1 语义检索耗时
- 查询总耗时
- 文档上传各阶段耗时(hash/提取/分块/向量化)
Task 7.3: 添加关键决策日志
- 置信度判断逻辑(唯一匹配/多个匹配)
- L1 触发条件
- Frontmatter 解析结果
- L0 索引更新
Task 7.4: 创建可观测性文档
- 日志层次说明(INFO/DEBUG/WARN/ERROR)
- 5 个可观测性场景示例
- 日志分析最佳实践
- MVP 阶段限制说明
验收: 可观测性文档完成,日志可追踪单次查询完整流程 ✅