上一篇我们深入探讨了 Hermes Agent 的 Memory 持久记忆系统,掌握了跨会话记忆、用户画像、环境偏好等核心能力。记忆系统让 Agent 能够"记住你",但还有一个关键问题——**当你知道某个信息曾经讨论过,却不确定 Agent 是否记住了它,或者你想回顾完整的对话上下文时,该怎么办?**

Session Search 对话搜索 —— 搜索过往对话、关键词搜索、OR 查询与上下文回忆

简介

上一篇我们深入探讨了 Hermes Agent 的 Memory 持久记忆系统,掌握了跨会话记忆、用户画像、环境偏好等核心能力。记忆系统让 Agent 能够"记住你",但还有一个关键问题——当你知道某个信息曾经讨论过,却不确定 Agent 是否记住了它,或者你想回顾完整的对话上下文时,该怎么办?

想象一下这些场景:

  • 你上个月和 Agent 讨论过一个复杂的数据库优化方案,现在需要复现但想不起具体细节了
  • 你记得 Agent 提到过某个工具的使用技巧,但不记得是哪次对话
  • 你想搜索所有关于"性能优化"的对话,无论是哪个项目的
  • 你记得对话中提到了 asynciothreading,但不确定具体是哪一个

这些问题都需要一个强大的对话搜索系统。就像你在代码库中用 grep 搜索代码一样,你需要在历史对话中搜索过去的讨论。

本文将带你全面掌握 Hermes Agent 的 Session Search 系统:

  • 搜索过往对话:全局搜索、项目搜索、时间范围搜索
  • 关键词搜索:精确匹配、模糊匹配、正则表达式
  • OR/AND 组合查询:多条件组合搜索
  • 上下文回忆:搜索结果的高亮、上下文展开、对话还原

核心目标:让历史对话成为你的知识宝库,随用随查。

目录

Session Search 系统架构

搜索系统的核心组件

text
Session Search 系统架构:
├── 🔍 搜索引擎层
│   ├── 关键词索引(倒排索引)
│   ├── 语义索引(向量嵌入)
│   └── 元数据索引(时间、项目、标签)
│
├── 📝 查询解析层
│   ├── 关键词解析
│   ├── 布尔逻辑(AND/OR/NOT)
│   ├── 范围过滤(时间、项目)
│   └── 语义意图理解
│
├── 📋 结果处理层
│   ├── 相关性排序
│   ├── 上下文展开
│   ├── 高亮标记
│   └── 摘要生成
│
└── 💾 存储层
    ├── 对话原文存储
    ├── 索引存储
    └── 向量数据库

索引策略

yaml
# 搜索索引配置
search_index:
  keyword_index:
    type: "inverted_index"
    fields:
      - user_message
      - agent_message
      - tool_calls
      - code_blocks
    tokenizer: "multilingual"  # 支持中英文

  semantic_index:
    type: "vector_index"
    embedding_model: "bge-large-zh-v1.5"
    dimensions: 1024
    similarity: "cosine"

  metadata_index:
    fields:
      - timestamp
      - project_path
      - session_id
      - tags
      - message_count

基础搜索:关键词搜索

简单关键词搜索

text
用户:搜索"PostgreSQL 优化"

Agent:[执行搜索]
  session_search(
    query="PostgreSQL 优化",
    mode="keyword",
    limit=10
  )

搜索结果:
═══════════════════════════════════════

结果 1/5 - 2025-04-15 14:32
──────────────────────────────────────
用户:PostgreSQL 的慢查询怎么优化?

Agent:PostgreSQL 慢查询优化可以从以下几个方面入手:

1. 使用 EXPLAIN ANALYZE 分析执行计划
2. 添加合适的索引
3. 优化查询语句
4. 调整配置参数

具体方案...[完整对话]

──────────────────────────────────────
匹配字段:user_message, agent_message
匹配次数:3 次 (PostgreSQL: 2, 优化: 1)
──────────────────────────────────────

结果 2/5 - 2025-04-20 09:15
──────────────────────────────────────
用户:帮我看下这个 PostgreSQL 查询的性能

[Agent 的分析和优化建议...]

──────────────────────────────────────
匹配字段:user_message
匹配次数:1 次 (PostgreSQL: 1)
──────────────────────────────────────

代码示例:搜索 API 调用

python
# 基础关键词搜索
from hermes import session_search

# 简单搜索
results = session_search(
    query="PostgreSQL 优化",
    mode="keyword",          # 搜索模式
    limit=10,                # 最多返回 10 条
    sort_by="relevance"      # 按相关性排序
)

# 精确短语搜索(用引号)
results = session_search(
    query='"EXPLAIN ANALYZE"',
    mode="exact_phrase",     # 精确短语匹配
    limit=5
)

# 正则表达式搜索
results = session_search(
    query=r"def\s+async_\w+\(",
    mode="regex",            # 正则表达式
    limit=10
)

搜索模式对比

模式 语法 示例 说明
关键词 关键词 PostgreSQL 分词匹配,任意位置
精确短语 "短语" "EXPLAIN ANALYZE" 完整短语匹配
正则表达式 /正则/ /def\s+\w+/ 正则匹配
前缀匹配 前缀* async_* 以某词开头
后缀匹配 *后缀 *Handler 以某词结尾
python
# 不同搜索模式的效果对比

# 关键词搜索 - 匹配包含"优化"的所有消息
session_search("优化", mode="keyword")
# 匹配:"如何优化"、"性能优化"、"优化方案"

# 精确短语搜索 - 只匹配完整的"性能优化"
session_search('"性能优化"', mode="exact_phrase")
# 匹配:"性能优化"
# 不匹配:"优化性能"、"优化"

# 正则搜索 - 匹配所有函数定义
session_search(r"def \w+\(", mode="regex")
# 匹配:"def main("、"def test_user("

高级搜索:组合查询

OR 查询:多关键词任一匹配

text
用户:搜索"asyncio 或 threading"

Agent:[执行 OR 搜索]
  session_search(
    query="asyncio OR threading",
    mode="keyword",
    operator="OR",
    limit=20
  )

搜索结果:
═══════════════════════════════════════

[匹配 asyncio 的结果]
结果 1 - 2025-03-10:Python 异步编程最佳实践
  → 匹配:asyncio
  → 上下文:讨论 asyncio.create_task vs asyncio.gather

结果 2 - 2025-04-05:FastAPI 异步路由优化
  → 匹配:asyncio
  → 上下文:讨论 async def vs def 路由

[匹配 threading 的结果]
结果 3 - 2025-02-20:多线程文件下载器
  → 匹配:threading
  → 上下文:讨论 ThreadPoolExecutor 使用

结果 4 - 2025-05-01:并发模型对比
  → 匹配:threading, asyncio(两者都匹配)
  → 上下文:对比 asyncio 和 threading 的适用场景
──────────────────────────────────────

共找到 18 条结果:
  - asyncio: 12 条
  - threading: 8 条
  - 两者都提到: 2 条

代码示例:

python
# OR 查询 - 匹配任一关键词
results = session_search(
    query="asyncio OR threading",
    operator="OR",
    limit=20
)

# 更复杂的 OR 查询
results = session_search(
    query="React OR Vue OR Angular",
    operator="OR",
    group_by="keyword",  # 按关键词分组返回
    limit=30
)

# 使用列表语法
results = session_search(
    query=["asyncio", "threading", "multiprocessing"],
    operator="OR",
    limit=20
)

AND 查询:多关键词同时匹配

text
用户:搜索"同时提到 PostgreSQL 和 索引 的对话"

Agent:[执行 AND 搜索]
  session_search(
    query="PostgreSQL AND 索引",
    operator="AND",
    limit=10
  )

搜索结果:
═══════════════════════════════════════

结果 1 - 2025-04-15
  → PostgreSQL: ✓  索引: ✓
  → 上下文:讨论 PostgreSQL 的 B-tree 索引和覆盖索引

结果 2 - 2025-04-22
  → PostgreSQL: ✓  索引: ✓
  → 上下文:讨论 GIN 索引在全文搜索中的应用
──────────────────────────────────────

共找到 5 条结果(同时包含 PostgreSQL 和 索引)
python
# AND 查询 - 必须同时包含所有关键词
results = session_search(
    query="PostgreSQL AND 索引",
    operator="AND",
    limit=10
)

# 多条件 AND
results = session_search(
    query="FastAPI AND pytest AND 异步",
    operator="AND",
    limit=10
)

# 带距离约束的 AND(两个词在 10 个词以内)
results = session_search(
    query="PostgreSQL 索引",
    operator="AND",
    proximity=10,  # 两个词之间的距离不超过 10 个词
    limit=10
)

NOT 查询:排除特定关键词

python
# NOT 查询 - 包含 A 但不包含 B
results = session_search(
    query="Python NOT Django",
    operator="NOT",
    limit=10
)

# 组合使用
results = session_search(
    query="(React OR Vue) AND NOT Next.js",
    operator="complex",
    limit=10
)

复杂组合查询

python
# 复杂组合查询示例
query = """
(FastAPI OR Django)
AND (PostgreSQL OR MySQL)
AND 性能优化
NOT Redis
"""

results = session_search(
    query=query,
    operator="complex",
    limit=20,
    group_by="primary_keyword"
)

# 查询解析结果:
# {
#   "must_have": ["FastAPI", "Django"],        # OR 组
#   "must_also_have": ["PostgreSQL", "MySQL"],  # OR 组
#   "must_have_anywhere": ["性能优化"],
#   "must_not_have": ["Redis"]
# }

语义搜索:理解意图

关键词搜索 vs 语义搜索

关键词搜索匹配字面上的词,语义搜索理解你的意图:

python
# 关键词搜索
results = session_search(
    query="数据库变慢",
    mode="keyword"
)
# 只匹配包含"数据库"和"变慢"的对话

# 语义搜索
results = session_search(
    query="数据库变慢",
    mode="semantic"
)
# 同时匹配:
# - "数据库变慢"
# - "查询性能下降"
# - "SQL 执行时间长"
# - "慢查询优化"
# - "DB 响应延迟"

语义搜索实战

text
用户:搜索"怎么让程序跑得更快"

Agent:[语义搜索]
  session_search(
    query="怎么让程序跑得更快",
    mode="semantic",
    top_k=10,
    similarity_threshold=0.75
  )

语义搜索结果(按语义相似度排序):
═══════════════════════════════════════

结果 1 (相似度: 0.94) - 2025-03-15
  → 原问题:"如何提升 Python 程序的执行速度?"
  → 匹配原因:语义高度相似

结果 2 (相似度: 0.87) - 2025-04-02
  → 原问题:"前端打包太慢了,怎么优化?"
  → 匹配原因:都是关于"优化速度"

结果 3 (相似度: 0.82) - 2025-04-20
  → 原问题:"数据库查询慢的排查思路"
  → 匹配原因:都是关于"性能慢"的问题

结果 4 (相似度: 0.76) - 2025-05-01
  → 原问题:"并发编程的性能优化方案"
  → 匹配原因:都是关于"提升性能"
═══════════════════════════════════════

混合搜索:关键词 + 语义

python
# 混合搜索模式 - 结合关键词和语义
results = session_search(
    query="数据库性能优化",
    mode="hybrid",           # 混合模式
    keyword_weight=0.4,      # 关键词权重
    semantic_weight=0.6,     # 语义权重
    top_k=20
)

# 混合模式的优势:
# - 关键词匹配确保精准度
# - 语义匹配确保召回率
# - 可调整权重平衡两者

搜索范围与过滤

按时间范围搜索

python
# 搜索最近 7 天的对话
results = session_search(
    query="PostgreSQL",
    time_range="7d"
)

# 搜索特定时间段
results = session_search(
    query="部署",
    time_range={
        "start": "2025-04-01",
        "end": "2025-04-30"
    }
)

# 搜索今天的对话
results = session_search(
    query="bug",
    time_range="today"
)

# 搜索本周的对话
results = session_search(
    query="API",
    time_range="this_week"
)

# 搜索上个月的对话
results = session_search(
    query="重构",
    time_range="last_month"
)

按项目搜索

python
# 搜索特定项目的对话
results = session_search(
    query="数据库迁移",
    project="~/projects/ml-pipeline"
)

# 搜索多个项目
results = session_search(
    query="认证",
    project=["~/projects/web-app", "~/projects/api-server"]
)

# 搜索所有项目(排除个人闲聊)
results = session_search(
    query="最佳实践",
    scope="projects_only"
)

按标签搜索

python
# 给对话打标签
session_tag("session-abc123", tags=["数据库", "性能优化"])
session_tag("session-def456", tags=["前端", "React"])

# 按标签搜索
results = session_search(
    query="索引",
    tags=["数据库"]
)

# 标签组合搜索
results = session_search(
    query="state management",
    tags=["前端", "React"],
    tag_operator="AND"
)

按消息类型搜索

python
# 只搜索用户的消息
results = session_search(
    query="我想要",
    message_type="user"
)

# 只搜索 Agent 的回复
results = session_search(
    query="推荐使用",
    message_type="agent"
)

# 只搜索代码块
results = session_search(
    query="async def",
    message_type="code_block"
)

# 只搜索工具调用
results = session_search(
    query="patch",
    message_type="tool_call"
)

综合过滤示例

python
# 综合过滤搜索
results = session_search(
    query="PostgreSQL AND 性能",
    operator="AND",
    mode="hybrid",
    time_range="30d",                    # 最近 30 天
    project="~/projects/ml-pipeline",    # 特定项目
    tags=["数据库"],                      # 标签过滤
    message_type="all",                  # 所有消息类型
    min_similarity=0.7,                  # 最低语义相似度
    limit=20,                            # 返回数量
    sort_by="relevance"                  # 排序方式
)

上下文回忆:还原对话

搜索结果展开

找到匹配的消息后,可以展开查看完整上下文:

python
# 展开某条结果的上下文
context = session_search_expand(
    result_id="result-001",
    before=5,    # 展开前 5 条消息
    after=3      # 展开后 3 条消息
)

# 展开后的结果:
# ──────────────────────────────────────
# [5 条之前的消息]
# 用户:项目数据库迁移遇到问题
# Agent:什么问题?能详细描述一下吗?
# 用户:从 MySQL 迁移到 PostgreSQL,有些语法不兼容
# Agent:常见不兼容点有这些:...
# 用户:嗯,GROUP_CONCAT 怎么办?
# [匹配的消息]
# ★ Agent:PostgreSQL 中用 STRING_AGG 替代 GROUP_CONCAT:
#            SELECT id, STRING_AGG(name, ',') FROM table GROUP BY id
# [3 条之后的消息]
# 用户:那 LIMIT OFFSET 分页呢?
# Agent:PostgreSQL 支持 LIMIT/OFFSET,和 MySQL 一样...
# 用户:好的,我试试
# Agent:有问题随时问我
# ──────────────────────────────────────

对话还原

python
# 还原完整会话
session = session_restore(
    session_id="session-abc123"
)

# 还原特定主题的对话片段
fragment = session_search_restore(
    topic="数据库迁移",
    session_id="session-abc123"
)

# 生成对话摘要
summary = session_summarize(
    session_id="session-abc123"
)
# 返回:
# "这次对话讨论了从 MySQL 迁移到 PostgreSQL 的过程,
#  主要包括:1) GROUP_CONCAT 替换为 STRING_AGG,
#  2) LIMIT/OFFSET 分页兼容性确认,
#  3) 自增 ID 从 AUTO_INCREMENT 改为 SERIAL"

搜索结果可视化

text
搜索结果展示格式:
═══════════════════════════════════════════════════
📅 2025-04-15 14:32 | 项目: ml-pipeline | 会话: #47
───────────────────────────────────────────────────
用户:PostgreSQL 的慢查询怎么优化?

AgentPostgreSQL 慢查询优化可以从以下几个方面入手:

  1. 📊 使用 EXPLAIN ANALYZE 分析执行计划
     ```sql
     EXPLAIN ANALYZE SELECT * FROM users WHERE email = 'test';
     ```

  2. 📇 添加合适的索引
     ```sql
     CREATE INDEX idx_users_email ON users(email);
     ```

  3. ✏️ 优化查询语句...

───────────────────────────────────────────────────
🔍 匹配:PostgreSQL (2次) | 优化 (1次) | 慢查询 (1次)
📌 关键词:数据库 | 性能优化
📋 操作:[展开上下文] [标记重要] [导出] [删除]
═══════════════════════════════════════════════════

搜索实战案例

实战 1:定位过去的技术方案

text
═══════════════════════════════════════
需求:找到之前讨论的"分页方案"
═══════════════════════════════════════

用户:我记得之前讨论过游标分页的方案

Agent:[执行搜索]
  session_search(
    query="游标分页 OR cursor pagination",
    mode="hybrid",
    operator="OR",
    limit=10
  )

Agent:找到了!以下是相关讨论:

📅 2025-03-28 | 项目: web-app
──────────────────────────────────────
你:OFFSET 分页在大数据量时太慢了,
   有没有更好的方案?

我:推荐使用游标分页(Cursor-based Pagination):

```python
# 游标分页实现
def get_items(cursor: str | None, limit: int = 20):
    if cursor:
        # 基于上一次最后一条记录的 ID
        items = db.query(Item).filter(
            Item.id < decode_cursor(cursor)
        ).order_by(Item.id.desc()).limit(limit).all()
    else:
        items = db.query(Item).order_by(
            Item.id.desc()
        ).limit(limit).all()

    return items, encode_cursor(items[-1].id) if items else None
```

游标分页的优势:
1. 不受偏移量影响,大数据量也稳定
2. 避免了 OFFSET 的扫描开销
3. 不会出现数据重复或遗漏

──────────────────────────────────────
要我把完整的实现代码导出来吗?

实战 2:多项目技术方案对比

text
═══════════════════════════════════════
需求:对比不同项目中用到的"认证方案"
═══════════════════════════════════════

用户:帮我搜一下各个项目用的什么认证方案

Agent:[执行多项目搜索]
  session_search(
    query="认证 OR authentication OR auth",
    mode="hybrid",
    scope="all_projects",
    group_by="project"
  )

Agent:各项目的认证方案汇总:

📁 ml-pipeline
  → JWT + OAuth2 (FastAPI)
  → 最后讨论: 2025-04-15

📁 web-app
  → NextAuth.js (Next.js)
  → 最后讨论: 2025-05-02

📁 api-server
  → API Key + HMAC 签名
  → 最后讨论: 2025-03-20

需要我详细展开某个项目的实现吗?

实战 3:搜索自己说过的话

text
═══════════════════════════════════════
需求:找到自己说过的特定需求
═══════════════════════════════════════

用户:我之前说过 API 要用什么前缀来着?

Agent:[搜索用户消息]
  session_search(
    query="API 前缀 OR prefix",
    message_type="user",
    mode="hybrid",
    limit=10
  )

Agent:你之前提到过:

📅 2025-04-10
  → "API 统一用 /api/v2/ 作为前缀"

📅 2025-04-12
  → "旧版 /api/v1/ 保留 3 个月后下线"

所以你的 API 前缀规范是 `/api/v2/`。

实战 4:OR 查询查找工具使用记录

text
═══════════════════════════════════════
需求:查找所有用过特定工具的对话
═══════════════════════════════════════

用户:我什么时候用过 Playwright 或者 Cypress?

Agent:[OR 查询]
  session_search(
    query="Playwright OR Cypress",
    mode="keyword",
    operator="OR",
    limit=20
  )

Agent:找到以下记录:

🔵 匹配 Playwright(3 条)
  1. 2025-03-15:用 Playwright 做 E2E 测试
  2. 2025-04-02:Playwright 配置 CI/CD
  3. 2025-05-10:Playwright 视觉回归测试

🟢 匹配 Cypress(1 条)
  1. 2025-02-20:对比 Cypress 和 Playwright

🔵🟢 两者都提到(1 条)
  1. 2025-02-20:最终选择了 Playwright

总结:你主要在 2025-02-20 对比后选择了 Playwright,
     之后有 3 次使用 Playwright 的讨论。

搜索优化技巧

1. 使用精确短语提高准确性

python
# ❌ 关键词搜索太宽泛
results = session_search("数据库优化方案")
# 匹配任何包含"数据库"、"优化"、"方案"的对话

# ✅ 精确短语更准确
results = session_search('"数据库优化方案"')
# 只匹配完整短语

# ✅ 或者用 AND 组合
results = session_search("数据库 AND 优化 AND 方案", operator="AND")

2. 合理使用时间范围缩小结果

python
# ❌ 搜索全部历史,结果太多
results = session_search("bug", limit=100)

# ✅ 限定最近时间
results = session_search("bug", time_range="7d", limit=20)

3. 利用标签快速定位

python
# 给重要对话打标签
session_tag("session-001", tags=["重要", "架构决策"])
session_tag("session-002", tags=["踩坑", "解决方案"])

# 按标签快速搜索
results = session_search(
    query="数据库",
    tags=["架构决策"]
)

4. 混合搜索平衡精准度和召回率

python
# 纯关键词可能漏掉语义相关的对话
results = session_search("程序运行慢", mode="keyword")
# 只匹配字面包含"程序运行慢"的对话

# 纯语义可能返回不够精准的结果
results = session_search("程序运行慢", mode="semantic")
# 可能匹配到"程序运行速度快"

# 混合模式最佳
results = session_search("程序运行慢", mode="hybrid",
                        keyword_weight=0.5, semantic_weight=0.5)

5. 搜索记忆和搜索对话结合使用

python
# 先搜索记忆,获取关键信息
memory_results = memory_search("数据库配置")

# 再用关键信息搜索对话
if memory_results:
    db_type = memory_results[0].value.get("database")  # e.g., "PostgreSQL"
    session_results = session_search(
        query=f"{db_type} AND 配置",
        operator="AND",
        mode="hybrid"
    )

6. 保存常用搜索

python
# 保存常用搜索为快捷方式
search_saved(
    name="db_optimization",
    query="PostgreSQL AND (优化 OR 慢查询 OR 索引)",
    operator="AND",
    mode="hybrid",
    time_range="90d"
)

# 使用保存的搜索
results = search_run("db_optimization")

# 查看所有保存的搜索
search_list()

总结

本文全面介绍了 Hermes Agent 的 Session Search 对话搜索系统:

  1. 搜索系统架构:关键词索引、语义索引、元数据索引三层架构
  2. 基础搜索:关键词匹配、精确短语、正则表达式、前缀/后缀匹配
  3. 组合查询:OR 查询(任一匹配)、AND 查询(同时匹配)、NOT 查询(排除)、复杂组合
  4. 语义搜索:理解搜索意图,不局限于字面匹配
  5. 搜索范围与过滤:时间范围、项目过滤、标签过滤、消息类型过滤
  6. 上下文回忆:搜索结果展开、完整对话还原、对话摘要生成
  7. 搜索实战:定位技术方案、多项目对比、搜索自己说的话、工具使用记录
  8. 搜索优化技巧:精确短语、时间范围、标签利用、混合搜索、搜索记忆结合

核心原则:

  • 关键词搜索保精准,语义搜索保召回:根据场景选择或组合使用
  • 善用过滤缩小范围:时间、项目、标签是最高效的过滤维度
  • OR 查询找关联,AND 查询找交集:灵活组合满足各种搜索需求
  • 上下文回忆很重要:找到匹配的消息后,展开上下文才能理解完整含义
  • 搜索 + 记忆 = 完整知识体系:搜索对话原文,记忆提取要点,两者配合

📌 下篇预告

Hermes Agent 进阶工作流 —— 多步骤任务自动化、条件分支、循环处理、错误重试与人类审批。掌握了记忆和搜索能力后,如何让 Agent 自主完成复杂的多步骤任务?下一篇将带你构建真正能独立工作的 AI 工作流。