feat(memory): 增强查询规划以支持未读消息上下文分析

新增未读消息上下文集成功能,提升记忆检索的精准度和相关性。
通过分析当前对话流中的未读消息内容、关键词和参与者信息,
生成更贴合实际对话场景的记忆检索策略。

主要改进:
- 查询规划器现在能够结合未读消息生成语义查询
- 新增未读消息上下文收集和摘要构建机制
- 优化向量存储的兜底逻辑以兼容新的记忆结构
- 改进记忆转换过程中的调试和空内容处理

这些功能使记忆系统能够更好地理解当前对话的上下文,
提供更相关的历史记忆来支持生成更准确的回复。
This commit is contained in:
Windpicker-owo
2025-10-02 11:03:47 +08:00
parent 59bda71f29
commit 82bb2df369
4 changed files with 265 additions and 44 deletions

View File

@@ -587,15 +587,25 @@ class DefaultReplyer:
# 转换格式以兼容现有代码
running_memories = []
if enhanced_memories:
for memory_chunk in enhanced_memories:
logger.debug(f"[记忆转换] 收到 {len(enhanced_memories)} 条原始记忆")
for idx, memory_chunk in enumerate(enhanced_memories, 1):
# 获取结构化内容的字符串表示
structure_display = str(memory_chunk.content) if hasattr(memory_chunk, 'content') else "unknown"
# 获取记忆内容优先使用display
content = memory_chunk.display or memory_chunk.text_content or ""
# 调试:记录每条记忆的内容获取情况
logger.debug(f"[记忆转换] 第{idx}条: display={repr(memory_chunk.display)[:80]}, text_content={repr(memory_chunk.text_content)[:80]}, final_content={repr(content)[:80]}")
running_memories.append({
"content": memory_chunk.display or memory_chunk.text_content or "",
"content": content,
"memory_type": memory_chunk.memory_type.value,
"confidence": memory_chunk.metadata.confidence.value,
"importance": memory_chunk.metadata.importance.value,
"relevance": getattr(memory_chunk, 'relevance_score', 0.5),
"relevance": getattr(memory_chunk.metadata, 'relevance_score', 0.5),
"source": memory_chunk.metadata.source,
"structure": memory_chunk.content_structure.value if memory_chunk.content_structure else "unknown",
"structure": structure_display,
})
# 构建瞬时记忆字符串
@@ -604,7 +614,7 @@ class DefaultReplyer:
if top_memory:
instant_memory = top_memory[0].get("content", "")
logger.info(f"增强记忆系统检索到 {len(running_memories)} 条记忆")
logger.info(f"增强记忆系统检索到 {len(enhanced_memories)} 条原始记忆,转换为 {len(running_memories)}可用记忆")
except Exception as e:
logger.warning(f"增强记忆系统检索失败: {e}")
@@ -640,10 +650,17 @@ class DefaultReplyer:
# 调试相关度信息
relevance_info = [(m.get('memory_type', 'unknown'), m.get('relevance', 0.0)) for m in sorted_memories]
logger.debug(f"记忆相关度信息: {relevance_info}")
logger.debug(f"[记忆构建] 准备将 {len(sorted_memories)} 条记忆添加到提示词")
for running_memory in sorted_memories:
for idx, running_memory in enumerate(sorted_memories, 1):
content = running_memory.get('content', '')
memory_type = running_memory.get('memory_type', 'unknown')
# 跳过空内容
if not content or not content.strip():
logger.warning(f"[记忆构建] 跳过第 {idx} 条记忆:内容为空 (type={memory_type})")
logger.debug(f"[记忆构建] 空记忆详情: {running_memory}")
continue
# 映射记忆类型到中文标签
type_mapping = {
@@ -661,10 +678,12 @@ class DefaultReplyer:
if "(类型:" in content and "" in content:
clean_content = content.split("(类型:")[0].strip()
logger.debug(f"[记忆构建] 添加第 {idx} 条记忆: [{chinese_type}] {clean_content[:50]}...")
memory_parts.append(f"- **[{chinese_type}]** {clean_content}")
memory_str = "\n".join(memory_parts) + "\n"
has_any_memory = True
logger.debug(f"[记忆构建] 成功构建记忆字符串,包含 {len(memory_parts) - 2} 条记忆")
# 添加瞬时记忆
if instant_memory: