Session Search 对话搜索 —— 搜索过往对话、关键词搜索、OR 查询与上下文回忆
简介
上一篇我们深入探讨了 Hermes Agent 的 Memory 持久记忆系统,掌握了跨会话记忆、用户画像、环境偏好等核心能力。记忆系统让 Agent 能够"记住你",但还有一个关键问题——当你知道某个信息曾经讨论过,却不确定 Agent 是否记住了它,或者你想回顾完整的对话上下文时,该怎么办?
想象一下这些场景:
- 你上个月和 Agent 讨论过一个复杂的数据库优化方案,现在需要复现但想不起具体细节了
- 你记得 Agent 提到过某个工具的使用技巧,但不记得是哪次对话
- 你想搜索所有关于"性能优化"的对话,无论是哪个项目的
- 你记得对话中提到了
asyncio或threading,但不确定具体是哪一个
这些问题都需要一个强大的对话搜索系统。就像你在代码库中用 grep 搜索代码一样,你需要在历史对话中搜索过去的讨论。
本文将带你全面掌握 Hermes Agent 的 Session Search 系统:
- 搜索过往对话:全局搜索、项目搜索、时间范围搜索
- 关键词搜索:精确匹配、模糊匹配、正则表达式
- OR/AND 组合查询:多条件组合搜索
- 上下文回忆:搜索结果的高亮、上下文展开、对话还原
核心目标:让历史对话成为你的知识宝库,随用随查。
目录
Session Search 系统架构
搜索系统的核心组件
Session Search 系统架构:
├── 🔍 搜索引擎层
│ ├── 关键词索引(倒排索引)
│ ├── 语义索引(向量嵌入)
│ └── 元数据索引(时间、项目、标签)
│
├── 📝 查询解析层
│ ├── 关键词解析
│ ├── 布尔逻辑(AND/OR/NOT)
│ ├── 范围过滤(时间、项目)
│ └── 语义意图理解
│
├── 📋 结果处理层
│ ├── 相关性排序
│ ├── 上下文展开
│ ├── 高亮标记
│ └── 摘要生成
│
└── 💾 存储层
├── 对话原文存储
├── 索引存储
└── 向量数据库索引策略
# 搜索索引配置
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基础搜索:关键词搜索
简单关键词搜索
用户:搜索"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 调用
# 基础关键词搜索
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 |
以某词结尾 |
# 不同搜索模式的效果对比
# 关键词搜索 - 匹配包含"优化"的所有消息
session_search("优化", mode="keyword")
# 匹配:"如何优化"、"性能优化"、"优化方案"
# 精确短语搜索 - 只匹配完整的"性能优化"
session_search('"性能优化"', mode="exact_phrase")
# 匹配:"性能优化"
# 不匹配:"优化性能"、"优化"
# 正则搜索 - 匹配所有函数定义
session_search(r"def \w+\(", mode="regex")
# 匹配:"def main("、"def test_user("高级搜索:组合查询
OR 查询:多关键词任一匹配
用户:搜索"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 条代码示例:
# 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 查询:多关键词同时匹配
用户:搜索"同时提到 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 和 索引)# 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 查询:排除特定关键词
# 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
)复杂组合查询
# 复杂组合查询示例
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 语义搜索
关键词搜索匹配字面上的词,语义搜索理解你的意图:
# 关键词搜索
results = session_search(
query="数据库变慢",
mode="keyword"
)
# 只匹配包含"数据库"和"变慢"的对话
# 语义搜索
results = session_search(
query="数据库变慢",
mode="semantic"
)
# 同时匹配:
# - "数据库变慢"
# - "查询性能下降"
# - "SQL 执行时间长"
# - "慢查询优化"
# - "DB 响应延迟"语义搜索实战
用户:搜索"怎么让程序跑得更快"
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
→ 原问题:"并发编程的性能优化方案"
→ 匹配原因:都是关于"提升性能"
═══════════════════════════════════════混合搜索:关键词 + 语义
# 混合搜索模式 - 结合关键词和语义
results = session_search(
query="数据库性能优化",
mode="hybrid", # 混合模式
keyword_weight=0.4, # 关键词权重
semantic_weight=0.6, # 语义权重
top_k=20
)
# 混合模式的优势:
# - 关键词匹配确保精准度
# - 语义匹配确保召回率
# - 可调整权重平衡两者搜索范围与过滤
按时间范围搜索
# 搜索最近 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"
)按项目搜索
# 搜索特定项目的对话
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"
)按标签搜索
# 给对话打标签
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"
)按消息类型搜索
# 只搜索用户的消息
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"
)综合过滤示例
# 综合过滤搜索
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" # 排序方式
)上下文回忆:还原对话
搜索结果展开
找到匹配的消息后,可以展开查看完整上下文:
# 展开某条结果的上下文
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:有问题随时问我
# ──────────────────────────────────────对话还原
# 还原完整会话
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"搜索结果可视化
搜索结果展示格式:
═══════════════════════════════════════════════════
📅 2025-04-15 14:32 | 项目: ml-pipeline | 会话: #47
───────────────────────────────────────────────────
用户:PostgreSQL 的慢查询怎么优化?
Agent:PostgreSQL 慢查询优化可以从以下几个方面入手:
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:定位过去的技术方案
═══════════════════════════════════════
需求:找到之前讨论的"分页方案"
═══════════════════════════════════════
用户:我记得之前讨论过游标分页的方案
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:多项目技术方案对比
═══════════════════════════════════════
需求:对比不同项目中用到的"认证方案"
═══════════════════════════════════════
用户:帮我搜一下各个项目用的什么认证方案
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:搜索自己说过的话
═══════════════════════════════════════
需求:找到自己说过的特定需求
═══════════════════════════════════════
用户:我之前说过 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 查询查找工具使用记录
═══════════════════════════════════════
需求:查找所有用过特定工具的对话
═══════════════════════════════════════
用户:我什么时候用过 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. 使用精确短语提高准确性
# ❌ 关键词搜索太宽泛
results = session_search("数据库优化方案")
# 匹配任何包含"数据库"、"优化"、"方案"的对话
# ✅ 精确短语更准确
results = session_search('"数据库优化方案"')
# 只匹配完整短语
# ✅ 或者用 AND 组合
results = session_search("数据库 AND 优化 AND 方案", operator="AND")2. 合理使用时间范围缩小结果
# ❌ 搜索全部历史,结果太多
results = session_search("bug", limit=100)
# ✅ 限定最近时间
results = session_search("bug", time_range="7d", limit=20)3. 利用标签快速定位
# 给重要对话打标签
session_tag("session-001", tags=["重要", "架构决策"])
session_tag("session-002", tags=["踩坑", "解决方案"])
# 按标签快速搜索
results = session_search(
query="数据库",
tags=["架构决策"]
)4. 混合搜索平衡精准度和召回率
# 纯关键词可能漏掉语义相关的对话
results = session_search("程序运行慢", mode="keyword")
# 只匹配字面包含"程序运行慢"的对话
# 纯语义可能返回不够精准的结果
results = session_search("程序运行慢", mode="semantic")
# 可能匹配到"程序运行速度快"
# 混合模式最佳
results = session_search("程序运行慢", mode="hybrid",
keyword_weight=0.5, semantic_weight=0.5)5. 搜索记忆和搜索对话结合使用
# 先搜索记忆,获取关键信息
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. 保存常用搜索
# 保存常用搜索为快捷方式
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 对话搜索系统:
- 搜索系统架构:关键词索引、语义索引、元数据索引三层架构
- 基础搜索:关键词匹配、精确短语、正则表达式、前缀/后缀匹配
- 组合查询:OR 查询(任一匹配)、AND 查询(同时匹配)、NOT 查询(排除)、复杂组合
- 语义搜索:理解搜索意图,不局限于字面匹配
- 搜索范围与过滤:时间范围、项目过滤、标签过滤、消息类型过滤
- 上下文回忆:搜索结果展开、完整对话还原、对话摘要生成
- 搜索实战:定位技术方案、多项目对比、搜索自己说的话、工具使用记录
- 搜索优化技巧:精确短语、时间范围、标签利用、混合搜索、搜索记忆结合
核心原则:
- 关键词搜索保精准,语义搜索保召回:根据场景选择或组合使用
- 善用过滤缩小范围:时间、项目、标签是最高效的过滤维度
- OR 查询找关联,AND 查询找交集:灵活组合满足各种搜索需求
- 上下文回忆很重要:找到匹配的消息后,展开上下文才能理解完整含义
- 搜索 + 记忆 = 完整知识体系:搜索对话原文,记忆提取要点,两者配合
📌 下篇预告
Hermes Agent 进阶工作流 —— 多步骤任务自动化、条件分支、循环处理、错误重试与人类审批。掌握了记忆和搜索能力后,如何让 Agent 自主完成复杂的多步骤任务?下一篇将带你构建真正能独立工作的 AI 工作流。