feat(memory): 添加时间规范化处理功能

在记忆构建器中增加时间规范化处理逻辑,将相对时间表达式转换为绝对日期格式。添加了相对时间映射规则和正则替换机制,确保记忆内容中的时间信息统一使用YYYY-MM-DD格式。同时更新了系统提示语,明确时间处理原则和要求。

- 新增_normalize_time_in_memory方法处理时间规范化
- 添加相对时间到绝对时间的映射规则
- 更新系统提示语包含时间处理原则
- 支持记忆内容和对象信息中的时间规范化
This commit is contained in:
Windpicker-owo
2025-09-30 00:41:32 +08:00
parent b95784d004
commit 335e5d5c5f
2 changed files with 74 additions and 1 deletions

View File

@@ -277,6 +277,19 @@ class MemoryBuilder:
3. **上下文关联** - 结合对话背景理解信息重要性
4. **细节丰富** - 记录具体的细节和描述
### 🕒 时间处理原则(重要):
1. **绝对时间要求** - 涉及时间的记忆必须使用绝对时间(年月日)
2. **相对时间转换** - 将"明天""后天""下周"等相对时间转换为具体日期
3. **时间格式规范** - 使用"YYYY-MM-DD"格式记录日期
4. **当前时间参考** - 当前时间:{current_date},基于此计算相对时间
**相对时间转换示例:**
- "明天""2024-09-30"
- "后天""2024-10-01"
- "下周""2024-10-07"
- "下个月""2024-10-01"
- "明年""2025-01-01"
### 🎯 重要性等级标准:
- **4分 (关键)**:个人核心信息(姓名、联系方式、重要日期)
- **3分 (高)**:重要偏好、观点、经历事件
@@ -311,6 +324,12 @@ class MemoryBuilder:
3. 使用主谓宾结构确保信息清晰
4. 重要性等级: 1=低, 2=一般, 3=高, 4=关键
5. 置信度: 1=低, 2=中等, 3=高, 4=已验证
## 🚨 时间处理要求(强制):
- **绝对时间优先**:任何涉及时间的记忆都必须使用绝对日期格式
- **相对时间转换**:遇到"明天""后天""下周"等相对时间必须转换为具体日期
- **时间格式**:统一使用 "YYYY-MM-DD" 格式
- **计算依据**:基于当前时间 {current_date} 进行转换计算
"""
return prompt
@@ -538,6 +557,9 @@ class MemoryBuilder:
context: Dict[str, Any]
) -> MemoryChunk:
"""增强记忆块"""
# 时间规范化处理
self._normalize_time_in_memory(memory)
# 添加时间上下文
if not memory.temporal_context:
memory.temporal_context = {
@@ -555,6 +577,58 @@ class MemoryBuilder:
return memory
def _normalize_time_in_memory(self, memory: MemoryChunk):
"""规范化记忆中的时间表达"""
import re
from datetime import datetime, timedelta
# 获取当前时间作为参考
current_time = datetime.fromtimestamp(memory.metadata.created_at)
# 定义相对时间映射
relative_time_patterns = {
r'今天|今日': current_time.strftime('%Y-%m-%d'),
r'昨天|昨日': (current_time - timedelta(days=1)).strftime('%Y-%m-%d'),
r'明天|明日': (current_time + timedelta(days=1)).strftime('%Y-%m-%d'),
r'后天': (current_time + timedelta(days=2)).strftime('%Y-%m-%d'),
r'大后天': (current_time + timedelta(days=3)).strftime('%Y-%m-%d'),
r'前天': (current_time - timedelta(days=2)).strftime('%Y-%m-%d'),
r'大前天': (current_time - timedelta(days=3)).strftime('%Y-%m-%d'),
r'本周|这周|这星期': current_time.strftime('%Y-%m-%d'),
r'上周|上星期': (current_time - timedelta(weeks=1)).strftime('%Y-%m-%d'),
r'下周|下星期': (current_time + timedelta(weeks=1)).strftime('%Y-%m-%d'),
r'本月|这个月': current_time.strftime('%Y-%m-01'),
r'上月|上个月': (current_time.replace(day=1) - timedelta(days=1)).strftime('%Y-%m-01'),
r'下月|下个月': (current_time.replace(day=1) + timedelta(days=32)).replace(day=1).strftime('%Y-%m-01'),
r'今年|今年': current_time.strftime('%Y'),
r'去年|上一年': str(current_time.year - 1),
r'明年|下一年': str(current_time.year + 1),
}
# 检查并替换记忆内容中的相对时间
memory_content = memory.content.description
# 应用时间规范化
for pattern, replacement in relative_time_patterns.items():
memory_content = re.sub(pattern, replacement, memory_content)
# 更新记忆内容
memory.content.description = memory_content
# 如果记忆有对象信息,也进行时间规范化
if hasattr(memory.content, 'object') and isinstance(memory.content.object, dict):
obj_str = str(memory.content.object)
for pattern, replacement in relative_time_patterns.items():
obj_str = re.sub(pattern, replacement, obj_str)
try:
# 尝试解析回字典(如果原来是字典)
memory.content.object = eval(obj_str) if obj_str.startswith('{') else obj_str
except:
memory.content.object = obj_str
# 记录时间规范化操作
logger.debug(f"记忆 {memory.memory_id} 已进行时间规范化")
def _auto_tag_memory(self, memory: MemoryChunk):
"""自动为记忆添加标签"""
# 基于记忆类型的自动标签

View File

@@ -497,7 +497,6 @@ class DefaultReplyer:
chat_id=self.chat_stream.stream_id
)
)
# 检索相关记忆
enhanced_memories = await recall_memories(
query=target,