Preserve independent conversational memory fragments

This commit is contained in:
WpyQwq
2026-09-05 08:55:33 +08:00
parent 516351f0b5
commit 23fd2620c0
+11 -2
View File
@@ -120,6 +120,9 @@ class QwenMemoryConfig:
text_memory_threshold: float = 0.40 text_memory_threshold: float = 0.40
text_memory_write_threshold: float = 0.5 text_memory_write_threshold: float = 0.5
text_memory_replace_threshold: float = 0.35 text_memory_replace_threshold: float = 0.35
# A slightly more permissive boundary for recognizing a same-attribute
# update. Unrelated fragments still remain independent V2 records.
text_memory_update_overlap_threshold: float = 0.30
text_memory_key_tokens: int = 128 text_memory_key_tokens: int = 128
text_memory_overlap_threshold: float = 0.22 text_memory_overlap_threshold: float = 0.22
automatic_memory: bool = False automatic_memory: bool = False
@@ -197,6 +200,8 @@ class QwenMemoryConfig:
raise ValueError("text_memory_write_threshold must be between 0 and 1") raise ValueError("text_memory_write_threshold must be between 0 and 1")
if not -1.0 <= self.text_memory_replace_threshold <= 1.0: if not -1.0 <= self.text_memory_replace_threshold <= 1.0:
raise ValueError("text_memory_replace_threshold must be between -1 and 1") raise ValueError("text_memory_replace_threshold must be between -1 and 1")
if not -1.0 <= self.text_memory_update_overlap_threshold <= 1.0:
raise ValueError("text_memory_update_overlap_threshold must be between -1 and 1")
if self.text_memory_key_tokens < 1: if self.text_memory_key_tokens < 1:
raise ValueError("text_memory_key_tokens must be positive") raise ValueError("text_memory_key_tokens must be positive")
if not 0.0 <= self.text_memory_overlap_threshold <= 1.0: if not 0.0 <= self.text_memory_overlap_threshold <= 1.0:
@@ -284,6 +289,9 @@ def load_memory_config(adapter_dir: str | Path) -> QwenMemoryConfig:
text_memory_threshold=float(saved.get("text_memory_threshold", 0.40)), text_memory_threshold=float(saved.get("text_memory_threshold", 0.40)),
text_memory_write_threshold=float(saved.get("text_memory_write_threshold", 0.5)), text_memory_write_threshold=float(saved.get("text_memory_write_threshold", 0.5)),
text_memory_replace_threshold=float(saved.get("text_memory_replace_threshold", 0.35)), text_memory_replace_threshold=float(saved.get("text_memory_replace_threshold", 0.35)),
text_memory_update_overlap_threshold=float(
saved.get("text_memory_update_overlap_threshold", 0.30)
),
text_memory_key_tokens=int(saved.get("text_memory_key_tokens", 128)), text_memory_key_tokens=int(saved.get("text_memory_key_tokens", 128)),
text_memory_overlap_threshold=float(saved.get("text_memory_overlap_threshold", 0.22)), text_memory_overlap_threshold=float(saved.get("text_memory_overlap_threshold", 0.22)),
automatic_memory=bool(saved.get("automatic_memory", False)), automatic_memory=bool(saved.get("automatic_memory", False)),
@@ -1684,7 +1692,7 @@ class QwenDynamicMemoryModel(nn.Module):
else: else:
best_similarity = torch.tensor(-1.0, device=key.device) best_similarity = torch.tensor(-1.0, device=key.device)
best_slot = torch.tensor(0, dtype=torch.long, device=key.device) best_slot = torch.tensor(0, dtype=torch.long, device=key.device)
if float(best_similarity) >= self.memory_config.text_memory_replace_threshold: if float(best_similarity) >= self.memory_config.text_memory_update_overlap_threshold:
slot = int(best_slot.item()) slot = int(best_slot.item())
else: else:
free_slots = (~valid_slots).nonzero(as_tuple=False).flatten() free_slots = (~valid_slots).nonzero(as_tuple=False).flatten()
@@ -1717,7 +1725,8 @@ class QwenDynamicMemoryModel(nn.Module):
# duplicate/update of an existing fact. # duplicate/update of an existing fact.
v2_slot_index = ( v2_slot_index = (
slot slot
if float(best_similarity) >= self.memory_config.text_memory_replace_threshold if float(best_similarity)
>= self.memory_config.text_memory_update_overlap_threshold
else -1 else -1
) )
if v2_slot_index >= 0 and self.memory_os_v2 is not None: if v2_slot_index >= 0 and self.memory_os_v2 is not None: