267 lines
5.5 KiB
Markdown
267 lines
5.5 KiB
Markdown
# 记忆系统工具详解
|
||
|
||
## memory_cli.py - 命令行查询工具
|
||
|
||
### 核心功能
|
||
提供SQL风格的命令行接口,支持复杂条件查询情景记忆事件。
|
||
|
||
### 命令语法
|
||
```bash
|
||
python3 memory_cli.py query [选项...]
|
||
```
|
||
|
||
### 查询选项详解
|
||
|
||
#### --select 字段选择
|
||
```bash
|
||
# 选择特定字段
|
||
--select "id,timestamp,title"
|
||
|
||
# 默认选择(不指定时)
|
||
--select "id,timestamp,title"
|
||
```
|
||
|
||
#### --where 条件过滤
|
||
支持SQL风格WHERE条件,字段包括:
|
||
- `id`, `type`, `level`, `title`, `date`, `timestamp`
|
||
- `tags` (支持 CONTAINS 操作)
|
||
|
||
```bash
|
||
# 基础条件
|
||
--where "type='decision'"
|
||
--where "date>='2025-11-14'"
|
||
--where "tags CONTAINS 'architecture'"
|
||
|
||
# 组合条件
|
||
--where "date>='2025-11-14' AND tags CONTAINS 'decision'"
|
||
--where "type='meeting' OR type='decision'"
|
||
```
|
||
|
||
#### --order-by 排序
|
||
```bash
|
||
# 单个字段排序
|
||
--order-by "timestamp desc"
|
||
--order-by "date asc"
|
||
|
||
# 多个字段排序(暂不支持)
|
||
```
|
||
|
||
#### --limit / --offset 分页
|
||
```bash
|
||
--limit 20 --offset 0 # 第一页,20条
|
||
--limit 20 --offset 20 # 第二页,20条
|
||
```
|
||
|
||
#### --format 输出格式
|
||
```bash
|
||
--format table # 表格格式(默认)
|
||
--format json # JSON格式
|
||
```
|
||
|
||
### 使用示例
|
||
|
||
#### 基础查询
|
||
```bash
|
||
# 查看所有事件
|
||
python3 memory_cli.py query
|
||
|
||
# 查看今天的事件
|
||
python3 memory_cli.py query --where "date='2025-11-14'"
|
||
```
|
||
|
||
#### 高级查询
|
||
```bash
|
||
# 查找架构决策
|
||
python3 memory_cli.py query \
|
||
--where "type='decision' AND tags CONTAINS 'architecture'" \
|
||
--order-by "timestamp desc" \
|
||
--limit 10
|
||
|
||
# 搜索错误事件
|
||
python3 memory_cli.py query \
|
||
--where "type='error'" \
|
||
--select "timestamp,title,tags" \
|
||
--format table
|
||
```
|
||
|
||
#### 时间范围查询
|
||
```bash
|
||
# 本周事件
|
||
python3 memory_cli.py query \
|
||
--where "date>='2025-11-10' AND date<='2025-11-16'"
|
||
|
||
# 最近7天
|
||
python3 memory_cli.py query \
|
||
--where "timestamp >= '2025-11-07T00:00:00'" \
|
||
--order-by "timestamp desc"
|
||
```
|
||
|
||
## memory_discovery.py - 编程接口
|
||
|
||
### 类概述
|
||
|
||
#### MemoryDiscovery 类
|
||
核心记忆发现和查询引擎。
|
||
|
||
#### MemoryEvent 类
|
||
单个记忆事件的索引信息数据类。
|
||
|
||
### 编程接口
|
||
|
||
#### 初始化
|
||
```python
|
||
from memory_discovery import MemoryDiscovery
|
||
|
||
# 初始化发现器
|
||
discovery = MemoryDiscovery("path/to/memory/root")
|
||
```
|
||
|
||
#### 刷新索引
|
||
```python
|
||
# 重新扫描episodic目录
|
||
discovery.refresh()
|
||
```
|
||
|
||
#### SQL风格查询
|
||
```python
|
||
# 基础查询
|
||
events = discovery.query()
|
||
|
||
# 条件查询
|
||
events = discovery.query(
|
||
where="date>='2025-11-14' AND tags CONTAINS 'architecture'",
|
||
order_by="timestamp desc",
|
||
limit=20,
|
||
offset=0
|
||
)
|
||
```
|
||
|
||
#### 格式化输出
|
||
```python
|
||
# 表格格式
|
||
output = discovery.format_events(events, format_type="table")
|
||
|
||
# JSON格式
|
||
output = discovery.format_events(events, format_type="json")
|
||
|
||
# 自定义字段选择
|
||
output = discovery.format_events(
|
||
events,
|
||
select=["id", "title", "date"],
|
||
format_type="table"
|
||
)
|
||
```
|
||
|
||
### 事件解析协议
|
||
|
||
#### 时间推断顺序
|
||
1. YAML front matter `timestamp`/`time` 字段
|
||
2. 正文 `## 时间` 段落第一行
|
||
3. 文件名模式 `YYYYMMDD-HHMM.md`
|
||
4. 文件名模式 `YYYYMMDD.md`
|
||
5. 文件修改时间 (mtime)
|
||
|
||
#### 标签解析顺序
|
||
1. YAML front matter `tags` 数组
|
||
2. 正文 `## 标签` 段落(逗号分隔)
|
||
3. 空数组(无标签)
|
||
|
||
#### 标题解析顺序
|
||
1. YAML front matter `title`
|
||
2. 正文第一个 `# ` 标题
|
||
3. 文件名(去除扩展名)
|
||
|
||
### 高级用法
|
||
|
||
#### 自定义查询条件
|
||
```python
|
||
# 复杂的标签组合查询
|
||
events = discovery.query(
|
||
where="tags CONTAINS 'architecture' AND (tags CONTAINS 'decision' OR tags CONTAINS 'design')"
|
||
)
|
||
```
|
||
|
||
#### 批量处理
|
||
```python
|
||
# 分页处理大量事件
|
||
page_size = 50
|
||
all_events = []
|
||
|
||
for offset in range(0, 1000, page_size): # 最多1000条
|
||
batch = discovery.query(limit=page_size, offset=offset)
|
||
if not batch:
|
||
break
|
||
all_events.extend(batch)
|
||
```
|
||
|
||
#### 事件对象操作
|
||
```python
|
||
# 访问事件属性
|
||
for event in events:
|
||
print(f"ID: {event.id}")
|
||
print(f"标题: {event.title}")
|
||
print(f"时间: {event.timestamp}")
|
||
print(f"标签: {event.tags}")
|
||
print(f"类型: {event.type}")
|
||
|
||
# 转换为字典
|
||
event_dict = event.to_dict()
|
||
```
|
||
|
||
## 工具集成
|
||
|
||
### Shell脚本集成
|
||
```bash
|
||
# 创建查询别名
|
||
alias memory-query="python3 .ai-runtime/memory/memory_cli.py query"
|
||
|
||
# 快速查看今天事件
|
||
memory-query --where "date='$(date +%Y-%m-%d)'"
|
||
```
|
||
|
||
### Python脚本集成
|
||
```python
|
||
#!/usr/bin/env python3
|
||
import sys
|
||
sys.path.insert(0, '.ai-runtime/memory')
|
||
|
||
from memory_discovery import MemoryDiscovery
|
||
|
||
def get_recent_decisions(days=7):
|
||
import datetime
|
||
cutoff = datetime.datetime.now() - datetime.timedelta(days=days)
|
||
|
||
discovery = MemoryDiscovery('.ai-runtime/memory')
|
||
return discovery.query(
|
||
where=f"type='decision' AND timestamp >= '{cutoff.isoformat()}'",
|
||
order_by="timestamp desc"
|
||
)
|
||
```
|
||
|
||
## 故障排除
|
||
|
||
### 常见问题
|
||
|
||
**查询无结果**
|
||
- 检查WHERE条件语法
|
||
- 验证字段名称拼写
|
||
- 确认时间格式(YYYY-MM-DD)
|
||
|
||
**事件不显示**
|
||
- 检查文件路径结构(episodic/YYYY/MM/DD/)
|
||
- 验证YAML front matter格式
|
||
- 确认时间戳有效性
|
||
|
||
**性能问题**
|
||
- 使用LIMIT限制结果数量
|
||
- 优化WHERE条件(先过滤时间范围)
|
||
- 考虑分页查询大量数据
|
||
|
||
### 调试技巧
|
||
```python
|
||
# 查看所有已解析事件
|
||
discovery = MemoryDiscovery('.ai-runtime/memory')
|
||
for event in discovery.events:
|
||
print(f"{event.id}: {event.title} ({event.date}) - {event.tags}")
|
||
```
|