# Chimera 项目更新日志 - 2025年9月30日
## 🎯 核心功能:个人记忆写入系统
### ✨ 新增功能
#### 1. 个人记忆写入器 (`agents/personal_memory_writer.py`)
- **功能描述**: 支持通过MCP工具直接向Graphiti(Neo4j)写入个人记忆
- **核心类**: `PersonalMemoryWriter`
- 支持用户名和别名配置(默认:陈宇函/肥猫)
- 自动生成记忆唯一ID(MD5哈希)
- 通过`source_description`提供上下文,无需硬编码用户名
- **记忆类型支持**:
- `relationship`: 人际关系(默认)
- `preference`: 个人偏好
- `event`: 事件参与
- `fact`: 事实记录
- **技术亮点**:
- 使用`EpisodeType.text`枚举(修复了字符串类型错误)
- 独立的`group_id="personal_memories"`实现数据隔离
- 保持用户原始输入,不修改内容
- 全局实例管理,支持异步初始化和关闭
#### 2. MCP工具注册 (`fastmcp_server.py`)
- **工具名称**: `write_personal_memory_tool`
- **工具标题**: "写入个人记忆(我的关系图谱)"
- **参数**:
- `content` (str): 自然语言记忆内容,支持第一人称"我"
- `memory_type` (str): 记忆类型,默认"relationship"
- **使用场景**:
```
- 人际关系: "我和JZX是同事关系"
- 项目参与: "我于2025年9月30日参与了GREEN项目的开发"
- 个人偏好: "我喜欢用Python写代码"
- 事件记录: "我上周参加了技术分享会"
- 推荐记录: "JZX推荐我看《代码大全》"
```
- **返回结果**:
```json
{
"success": true,
"data": {
"memory_id": "b4e1a4fa32216307d1cd97b47330980d",
"memory_type": "relationship",
"group_id": "personal_memories"
},
"message": "记忆已成功存入知识图谱"
}
```
#### 3. Pydantic模型定义 (`core/models.py`)
- **PersonalMemoryInput**: 输入验证模型
- 详细的字段描述和使用示例
- 支持4种记忆类型
- **PersonalMemoryResponse**: 响应模型
- 标准化的成功/失败响应
- 包含记忆唯一ID
### 🔧 代码重构
#### 文件移动
- **原路径**: `core/wechat_search.py`
- **新路径**: `agents/relationship_search.py`
- **原因**: 统一agent相关代码到agents文件夹
- **影响**: 更新了`fastmcp_server.py`中的导入路径
### 🚀 功能优化
#### 关系搜索优化 (`agents/relationship_search.py`)
**1. 扩展搜索范围**
```python
# 同时搜索微信关系和个人记忆
group_ids=["wechat_relationships", "personal_memories"]
```
**2. 智能评分算法优化**
- **提升摘要匹配权重**: 1.5 → 3.0-5.0分
- 摘要中包含查询词: +3.0分
- 摘要开头匹配: 额外+2.0分
- **提升属性匹配权重**: 0.5 → 1.5分
- **短名称保护**: 1-2字实体给予0.5基础分
**3. 低分过滤**
```python
MIN_SCORE_THRESHOLD = 1.0 # 过滤掉<1分的实体
```
- **优化效果**: 从10个Entity → 2个相关Entity
- **示例**: 过滤掉"大模型"、"毕业照拍摄"等无关实体
**4. 关系去重**
- **策略**: 基于`other_uuid`去重,保留第一个关系描述
- **效果**: 避免同一实体的重复关系(如Neo4j实体重复出现)
- **示例**: Chimera项目关系从5个去重到4个唯一关系
### 📊 测试验证
#### 功能测试 (`tests/test_personal_memory_flow.py`)
- **写入测试**: 3/3成功(event、relationship、preference)
- **检索测试**: 4/4成功(项目、人名、偏好、综合查询)
- **去重测试**: UUID完全去重 ✅
#### 测试结果示例
```
查询: "Chimera项目开发"
结果:
1. Chimera项目 (score: 6.0) - 4个唯一关系 ✅
2. 前端开发 (score: 1.5) - 1个关系 ✅
原始结果: 10个Entity(包含无关实体)
优化后: 2个相关Entity(精准匹配)
```
### 🐛 Bug修复
1. **EpisodeType类型错误**
- **问题**: 使用字符串`"text"`导致`'str' object has no attribute 'name'`错误
- **修复**: 导入`EpisodeType`枚举,使用`EpisodeType.text`
2. **检索结果重复**
- **问题**: Neo4j实体在关系列表中重复出现
- **修复**: 实现基于UUID的去重逻辑
3. **无关实体噪音**
- **问题**: 返回评分为0的无关实体(如"毕业照拍摄")
- **修复**: 添加最低分数阈值1.0
### 📁 文件变更总结
```
新增文件:
+ agents/personal_memory_writer.py # 个人记忆写入核心逻辑
+ tests/test_personal_memory_flow.py # 完整流程测试
+ docs/更新日志_2025-09-30.md # 本文件
移动文件:
- core/wechat_search.py
+ agents/relationship_search.py # 重新组织目录结构
修改文件:
~ core/models.py # 新增PersonalMemoryInput/Response
~ fastmcp_server.py # 注册write_personal_memory_tool
~ agents/relationship_search.py # 搜索优化、去重、评分改进
```
### 🎯 核心设计原则
1. **无硬编码**: 通过`source_description`提供上下文,让Graphiti自然理解"我"的指代
2. **数据隔离**: 使用独立的`group_id="personal_memories"`
3. **代码复用**: 复用现有`WeChatGraphitiClient`基础设施
4. **统一检索**: `relationship_search`同时支持微信和个人记忆检索
### 📈 性能指标
- **写入延迟**: ~5-6秒/条(包含LLM处理)
- **检索延迟**: ~1-2秒/查询
- **成功率**: 100% ✅
- **去重效果**: 关系列表无重复UUID ✅
- **精准度提升**: 10个候选 → 2个精准结果
### 🔮 后续优化方向
1. **批量写入**: 支持一次性写入多条记忆
2. **记忆更新**: 支持更新已存在的记忆
3. **记忆删除**: 支持根据ID删除特定记忆
4. **时间过滤**: 支持按时间范围检索记忆
5. **关系强度**: 为关系添加权重评分
---
## 技术栈
- **Graphiti**: 知识图谱引擎(基于Neo4j)
- **Neo4j**: 图数据库存储
- **Gemini 2.0 Flash**: 语义理解和实体提取
- **FastMCP**: MCP服务器框架
- **Pydantic**: 数据验证和类型安全
---
*Generated on 2025-09-30 by Claude (Sonnet 4.5)*