核心功能: - 新增 FrontmatterParser 解析 YAML frontmatter - 新增 KnowledgeIndexService L0 内存索引 - 新增 LookupKnowledgeTool 混合检索工具 - 增强 DocumentManagementService 文件保存和索引同步 技术实现: - 数据库迁移 V004: api_document.metadata (TEXT) - 依赖新增: snakeyaml 2.0 - 配置新增: knowledge.base-path - 可观测性: requestId 追踪 + 性能日志 质量保证: - 单元测试: 31/31 通过 - 测试覆盖: FrontmatterParser(11), KnowledgeIndexService(13), LookupKnowledgeTool(7) - 启动验证: L0 索引正常加载 归档文档: - OpenSpec: openspec/changes/lookup-knowledge-integration/ - devflow 档案: devflow/projects/2026-06-24-lookup-knowledge-integration/ - handoff: handoff/2026-06-24-lookup-knowledge-integration.md
5.6 KiB
5.6 KiB
知识库检索可观测性指南
日志层次
INFO 级别 - 关键业务流程
适用于生产环境监控,记录关键决策点和业务指标。
LookupKnowledgeTool(知识库查询)
[requestId] 收到知识库查询请求: query=ERR_TIMEOUT
[requestId] L0精确匹配完成: matches=1, time=2ms
[requestId] L0非唯一匹配,触发L1语义检索
[requestId] L1语义检索完成: matches=3, time=450ms
[requestId] 查询完成: found=true, hasL0=true, hasL1=false, confidence=high, totalTime=455ms
关键指标:
requestId: 追踪单次查询的完整流程matches: L0/L1 匹配数量time: 各阶段耗时(ms)confidence: 置信度(high/low)totalTime: 端到端总耗时
DocumentManagementService(文档上传)
开始上传文档: fileName=payment-errors.md, size=1024 bytes
解析到frontmatter: title=支付网关错误码, keywords=[ERR_TIMEOUT, 超时], time=5ms
文档分块完成: fileName=payment-errors.md, chunks=3, time=12ms
文档向量索引完成: docId=abc123, category=api, time=850ms
文档已加入L0索引: docId=abc123, title=支付网关错误码
文档上传完成: docId=abc123, fileName=payment-errors.md, hasFrontmatter=true, totalTime=920ms
关键指标:
docId: 文档唯一标识hasFrontmatter: 是否包含元数据chunks: 分块数量totalTime: 上传总耗时
KnowledgeIndexService(启动扫描)
开始扫描知识库目录: knowledge_base/
知识库索引加载完成,共 5 个文档
DEBUG 级别 - 详细诊断信息
适用于开发和调试,记录详细的执行细节。
[requestId] 置信度判断: highConfidence=true, reason=唯一匹配
[requestId] L0唯一匹配,跳过L1检索
L0结果已构建: source=knowledge_base/api/payment-errors.md, contentLength=1024
L0精确匹配: query=ERR_TIMEOUT, matches=1, indexSize=5, time=1ms
文档已加入索引: title=支付网关错误码, filePath=knowledge_base\api\payment-errors.md
WARN 级别 - 异常但可恢复
文档已存在: hash=abc123def, docId=xyz789
Frontmatter序列化失败
L0匹配但文件读取失败: knowledge_base/api/missing.md
ERROR 级别 - 严重错误
文档上传失败: fileName=test.md
知识库索引加载失败
文档索引失败: docId=abc123
可观测性场景
场景 1: 追踪单次查询
目标:查看某次查询的完整流程
步骤:
- 从日志中提取
requestId(8位UUID) - 使用 requestId 过滤所有相关日志
示例:
grep "[a1b2c3d4]" logs/application.log
输出:
[a1b2c3d4] 收到知识库查询请求: query=超时
[a1b2c3d4] L0精确匹配完成: matches=2, time=3ms
[a1b2c3d4] 置信度判断: highConfidence=false, reason=多个或零个匹配
[a1b2c3d4] L0非唯一匹配,触发L1语义检索
[a1b2c3d4] L1语义检索完成: matches=3, time=420ms
[a1b2c3d4] 查询完成: found=true, hasL0=true, hasL1=true, confidence=low, totalTime=425ms
场景 2: 性能监控
目标:监控 L0/L1 检索性能
关键指标:
- L0 耗时:通常 < 10ms
- L1 耗时:通常 200-500ms
- 总耗时:通常 < 1s
异常识别:
# 查找慢查询(总耗时 > 1000ms)
grep "totalTime=" logs/application.log | awk -F'totalTime=' '{print $2}' | awk -F'ms' '{if ($1 > 1000) print}'
场景 3: L0 命中率分析
目标:统计 L0 精确匹配效果
指标:
- 唯一匹配率(高置信度)
- 多个匹配率(低置信度)
- 未命中率(需要 L1)
统计脚本:
# 统计 L0 匹配情况
grep "L0精确匹配完成" logs/application.log | \
awk -F'matches=' '{print $2}' | \
awk -F',' '{print $1}' | \
sort | uniq -c
场景 4: 文档上传监控
目标:监控文档上传流程
关键检查点:
- Frontmatter 解析成功率
- 向量索引耗时
- L0 索引更新
查询:
# 查找上传失败的文档
grep "文档上传失败" logs/application-error.log
# 统计 frontmatter 解析率
grep "hasFrontmatter=" logs/application.log | \
awk -F'hasFrontmatter=' '{print $2}' | \
awk -F',' '{print $1}' | \
sort | uniq -c
场景 5: Agent 工具调用链
目标:观测 Agent 如何使用 lookup_knowledge 工具
配置(application.yml):
logging:
level:
org.springframework.ai: DEBUG
com.superbiz.agent.tool: INFO
日志示例:
[Agent] Calling tool: lookup_knowledge with query=ERR_TIMEOUT
[a1b2c3d4] 收到知识库查询请求: query=ERR_TIMEOUT
[a1b2c3d4] L0精确匹配完成: matches=1, time=2ms
[a1b2c3d4] 查询完成: found=true, confidence=high, totalTime=5ms
[Agent] Tool returned: {"found":true,"primary":{"content":"...","confidence":"high"}}
日志分析最佳实践
1. 使用结构化查询
# 按 requestId 分组统计耗时
grep "查询完成" logs/application.log | \
awk -F'totalTime=' '{print $2}' | \
awk -F'ms' '{sum+=$1; count++} END {print "平均耗时:", sum/count, "ms"}'
2. 监控关键指标
- L0 索引大小(启动时)
- L0 平均耗时
- L1 调用频率
- 高置信度比例
3. 告警规则
- 总耗时 > 2s
- L0 索引加载失败
- 文档上传失败率 > 10%
MVP 阶段限制
当前日志为轻量级实现,不包含:
- ❌ 结构化日志(JSON格式)
- ❌ 指标收集(Micrometer/Prometheus)
- ❌ 分布式追踪(Zipkin/Skywalking)
- ❌ 独立日志文件
- ❌ 实时监控面板
后续增强方向:
- 引入 Micrometer 指标
- 配置独立的 knowledge-lookup.log
- 集成 APM 工具
- 添加 Grafana 监控面板