[changes] Semantic pruning enables the file to pass through

This commit is contained in:
lanceyq
2026-03-27 19:25:17 +08:00
parent 289b1989e5
commit 5c11da6a2e

View File

@@ -30,6 +30,18 @@ from app.core.memory.storage_services.extraction_engine.data_preprocessing.scene
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
def message_has_files(message: "ConversationMessage") -> bool:
"""检查消息是否包含文件。
Args:
message: 待检查的消息对象
Returns:
bool: 如果消息包含文件则返回 True否则返回 False
"""
return message.files and len(message.files) > 0
class DialogExtractionResponse(BaseModel): class DialogExtractionResponse(BaseModel):
"""对话级一次性抽取的结构化返回,用于加速剪枝。 """对话级一次性抽取的结构化返回,用于加速剪枝。
@@ -130,13 +142,7 @@ class SemanticPruner:
3. 常见寒暄精确匹配 3. 常见寒暄精确匹配
4. 组合寒暄模式(前缀 + 后缀组合,如"好的谢谢""同学你好""明白了" 4. 组合寒暄模式(前缀 + 后缀组合,如"好的谢谢""同学你好""明白了"
5. 纯表情/标点 5. 纯表情/标点
注意如果消息包含文件files 字段非空),则不视为填充消息,予以保留。
""" """
# 保护带有文件的消息:文件包含感知记忆信息,不应被删除
if message.files and len(message.files) > 0:
return False
t = message.msg.strip() t = message.msg.strip()
if not t: if not t:
return True return True
@@ -489,8 +495,7 @@ class SemanticPruner:
to_delete_ids: set = set() to_delete_ids: set = set()
for m in msgs: for m in msgs:
# 最高优先级保护:带有文件的消息一律保留,不参与任何剪枝判断 # 最高优先级保护:带有文件的消息一律保留,不参与任何剪枝判断
has_files = m.files and len(m.files) > 0 if message_has_files(m):
if has_files:
self._log(f" [保护] 带文件的消息(不参与剪枝):'{m.msg[:40]}',文件数={len(m.files)}") self._log(f" [保护] 带文件的消息(不参与剪枝):'{m.msg[:40]}',文件数={len(m.files)}")
continue continue
@@ -563,8 +568,7 @@ class SemanticPruner:
msg_text = m.msg.strip() msg_text = m.msg.strip()
# 最高优先级保护:带有文件的消息一律保留,不参与任何剪枝判断 # 最高优先级保护:带有文件的消息一律保留,不参与任何剪枝判断
has_files = m.files and len(m.files) > 0 if message_has_files(m):
if has_files:
self._log(f" [保护] 带文件的消息(不参与剪枝):'{msg_text[:40]}',文件数={len(m.files)}") self._log(f" [保护] 带文件的消息(不参与剪枝):'{msg_text[:40]}',文件数={len(m.files)}")
continue continue
@@ -778,11 +782,6 @@ class SemanticPruner:
original_count = len(msgs) original_count = len(msgs)
total_original_msgs += original_count total_original_msgs += original_count
# 统计带文件的消息数量
files_msg_count = sum(1 for m in msgs if m.files and len(m.files) > 0)
if files_msg_count > 0:
self._log(f"[剪枝-对话{d_idx+1}] 检测到 {files_msg_count}/{original_count} 条消息带有文件,将予以保护")
# 相关对话:根据阶段决定处理力度 # 相关对话:根据阶段决定处理力度
if extraction.is_related: if extraction.is_related:
stats["related_count"] += 1 stats["related_count"] += 1
@@ -826,8 +825,7 @@ class SemanticPruner:
msg_text = m.msg.strip() msg_text = m.msg.strip()
# 最高优先级保护:带有文件的消息一律保留,不参与分类 # 最高优先级保护:带有文件的消息一律保留,不参与分类
has_files = m.files and len(m.files) > 0 if message_has_files(m):
if has_files:
self._log(f" [保护] 带文件的消息(不参与分类,直接保留):索引{idx}, '{msg_text[:40]}', 文件数={len(m.files)}") self._log(f" [保护] 带文件的消息(不参与分类,直接保留):索引{idx}, '{msg_text[:40]}', 文件数={len(m.files)}")
llm_protected_msgs.append((idx, m)) # 放入保护列表 llm_protected_msgs.append((idx, m)) # 放入保护列表
continue continue