语义搜索

📎 引用文件

本文引用的文件 - agent/src/memory/search_index.py - agent/src/memory/semantic_links.py - agent/src/memory/compression.py - agent/src/session/search.py - agent/src/api/sessions_routes.py - agent/cli/_legacy.py - agent/tests/test_session_search.py - agent/tests/memory/test_tier2_integration.py

目录

  1. 简介
  2. 项目结构
  3. 核心组件
  4. 架构总览
  5. 详细组件分析
  6. 依赖关系分析
  7. 性能考量
  8. 故障排查指南
  9. 结论
  10. 附录:API使用示例与评估调优

简介

本系统提供面向“记忆”和“会话”的语义搜索能力,覆盖索引构建、关键词提取、相似度计算、语义链接维护以及查询优化。其核心包括: - 基于 SQLite FTS5 的全量倒排索引,支持中英文混合检索与高亮片段返回。 - 基于 BM25 的语义链接发现,自动为记忆条目建立相关关系并持久化。 - 三层压缩管线(原始/每日/摘要),利用 TF-IDF 抽取关键句与关键词,提升存储与检索效率。 - 跨会话搜索与 CLI/API 暴露,便于在工具链中复用。

项目结构

语义搜索相关代码主要分布在 memory 与 session 两个子系统: - memory:负责持久化记忆的索引、压缩、语义链接。 - session:负责跨会话消息的索引与检索。 - api:通过 FastAPI 路由对外暴露会话管理能力(含事件流)。 - cli:提供命令行检索入口。

graph TB subgraph "记忆子系统" MIdx["MemorySearchIndex<br/>FTS5 倒排索引"] SLink["SemanticLinker<br/>BM25 语义链接"] Comp["CompressionPipeline<br/>TF-IDF 压缩"] end subgraph "会话子系统" SIdx["SessionSearchIndex<br/>FTS5 跨会话索引"] end subgraph "接口层" API["FastAPI 路由<br/>sessions_routes"] CLI["CLI 命令<br/>_legacy.py"] end MIdx --> SLink Comp --> MIdx SIdx --> API MIdx --> CLI SIdx --> CLI

图表来源 - agent/src/memory/search_index.py:113-145 - agent/src/memory/semantic_links.py:158-230 - agent/src/memory/compression.py:160-218 - agent/src/session/search.py:60-135 - agent/src/api/sessions_routes.py:289-365 - agent/cli/_legacy.py:5235-5261

章节来源 - agent/src/memory/search_index.py:1-480 - agent/src/memory/semantic_links.py:1-372 - agent/src/memory/compression.py:1-353 - agent/src/session/search.py:1-365 - agent/src/api/sessions_routes.py:1-802 - agent/cli/_legacy.py:5235-5261

核心组件

章节来源 - agent/src/memory/search_index.py:113-480 - agent/src/memory/semantic_links.py:63-230 - agent/src/memory/compression.py:60-218 - agent/src/session/search.py:60-365 - agent/src/api/sessions_routes.py:289-802 - agent/cli/_legacy.py:5235-5261

架构总览

整体流程分为“索引构建”、“语义链接”、“查询检索”三部分: - 索引构建:记忆条目写入时触发 FTS5 自动同步;会话消息写入时同样触发 FTS5 同步;支持批量重建。 - 语义链接:对新增/更新条目进行 BM25 打分,生成 top-k 相关条目并保存为 .relations.json。 - 查询检索:对用户查询进行安全清洗与 CJK bigram 扩展,执行 MATCH 查询并返回带高亮的片段与相关性排序。

sequenceDiagram participant U as "用户/工具" participant API as "FastAPI 路由" participant SI as "SessionSearchIndex" participant MI as "MemorySearchIndex" participant SL as "SemanticLinker" U->>API : 创建/发送会话消息 API->>SI : index_message(session_id, role, content) Note over SI : FTS5 触发器自动同步内容 U->>MI : index_entry(记忆条目) Note over MI : FTS5 触发器自动同步标题/描述/关键词/正文 U->>SL : discover_links(新条目 tokens, 全量条目) SL-->>U : 返回 top-k 相关条目分数 U->>SI : search(query) SI-->>U : 返回匹配会话列表(去重+高亮) U->>MI : search(query) MI-->>U : 返回匹配记忆条目(高亮+rank)

图表来源 - agent/src/session/search.py:137-192 - agent/src/memory/search_index.py:207-302 - agent/src/memory/semantic_links.py:179-230

详细组件分析

记忆索引(MemorySearchIndex)

flowchart TD Start(["索引构建入口"]) --> Clean["清理与截断正文"] Clean --> Prepare["准备字段(title/description/keywords/body)"] Prepare --> Insert["插入 memories 表"] Insert --> Trigger{"FTS5 可用?"} Trigger -- 是 --> Sync["触发器自动写入 memories_fts"] Trigger -- 否 --> Fallback["记录日志并降级"] Sync --> End(["完成"]) Fallback --> End

图表来源 - agent/src/memory/search_index.py:147-196 - agent/src/memory/search_index.py:207-250

章节来源 - agent/src/memory/search_index.py:113-480

语义链接(SemanticLinker)

classDiagram class SemanticLinker { +discover_links(entry_title, entry_tokens, all_entries_data, top_k) Tuple[] +save_relations(entry_path, links) void +load_relations(entry_path) Tuple[] +resolve_wikilinks(body) str[] +get_relation_path(entry_path) Path +remove_relations(entry_path) void } class BM25 { +compute_idf(corpus) Dict~str,float~ +compute_bm25_score(query_tokens, doc_tokens, idf_scores, avg_dl) float } SemanticLinker --> BM25 : "使用"

图表来源 - agent/src/memory/semantic_links.py:63-150 - agent/src/memory/semantic_links.py:158-372

章节来源 - agent/src/memory/semantic_links.py:1-372

压缩管线(CompressionPipeline)

flowchart TD A["原始内容"] --> B["按句子切分"] B --> C["计算句子级 IDF"] C --> D{"是否超过阈值?"} D -- 否 --> E["保持原样"] D -- 是 --> F["选择首尾+top-k 高分句"] F --> G["生成 daily 内容"] G --> H{"是否达到 digest 阈值?"} H -- 否 --> I["输出 daily"] H -- 是 --> J["提取 top-N 关键词"] J --> K["生成 digest 摘要"]

图表来源 - agent/src/memory/compression.py:69-154 - agent/src/memory/compression.py:168-256

章节来源 - agent/src/memory/compression.py:1-353

会话搜索(SessionSearchIndex)

sequenceDiagram participant T as "工具/CLI" participant S as "SessionSearchIndex" participant DB as "SQLite(FTS5)" T->>S : search(query) S->>S : _sanitize_fts_query(query) S->>DB : MATCH fts_query ORDER BY rank LIMIT DB-->>S : 行集(id, title, started_at, message_count, snippet, rank) S-->>T : 去重后的会话列表

图表来源 - agent/src/session/search.py:194-267

章节来源 - agent/src/session/search.py:1-365

API 与 CLI 暴露

章节来源 - agent/cli/_legacy.py:5235-5261 - agent/src/api/sessions_routes.py:289-802

依赖关系分析

graph LR MI["MemorySearchIndex"] --> SQL["SQLite/FTS5"] SL["SemanticLinker"] --> FS["文件系统(JSON)"] CP["CompressionPipeline"] --> TXT["文本处理"] SS["SessionSearchIndex"] --> SQL API["FastAPI 路由"] --> SS CLI["CLI 命令"] --> SS CLI --> MI

图表来源 - agent/src/memory/search_index.py:137-145 - agent/src/memory/semantic_links.py:232-281 - agent/src/session/search.py:80-135 - agent/src/api/sessions_routes.py:289-365 - agent/cli/_legacy.py:5235-5261

章节来源 - agent/src/memory/search_index.py:1-480 - agent/src/memory/semantic_links.py:1-372 - agent/src/memory/compression.py:1-353 - agent/src/session/search.py:1-365 - agent/src/api/sessions_routes.py:1-802 - agent/cli/_legacy.py:5235-5261

性能考量

[本节为通用性能讨论,不直接分析具体文件]

故障排查指南

章节来源 - agent/src/memory/search_index.py:160-173 - agent/src/memory/search_index.py:288-290 - agent/src/memory/semantic_links.py:296-305 - agent/src/memory/compression.py:306-334

结论

该语义搜索系统以 FTS5 为核心,结合 BM25 与 TF-IDF,实现了高效、可扩展的记忆与会话检索,并通过语义链接增强知识关联。压缩管线在保证信息保留的前提下显著降低了存储成本。系统具备良好的容错与降级能力,适合在生产环境中稳定运行。

[本节为总结性内容,不直接分析具体文件]

附录:API使用示例与评估调优

搜索 API 使用示例

以上端点由 FastAPI 路由注册并提供鉴权与会话状态管理。

章节来源 - agent/src/api/sessions_routes.py:335-400 - agent/src/api/sessions_routes.py:697-750 - agent/src/api/sessions_routes.py:752-802

关键词搜索与语义检索

章节来源 - agent/cli/_legacy.py:5235-5261 - agent/src/session/search.py:216-267 - agent/src/memory/search_index.py:252-302

相关性排序

章节来源 - agent/src/memory/search_index.py:273-302 - agent/src/memory/semantic_links.py:179-230

评估方法与调优建议

章节来源 - agent/tests/memory/test_tier2_integration.py:144-170 - agent/tests/memory/test_tier2_integration.py:297-328 - agent/tests/test_session_search.py:101-126