WIP: memory system improvements (in progress)
Interview/chat prompt layers, reply planner, style profiles, memory injection, interview meta store, and related tests. Work not finished. Made-with: Cursor
This commit is contained in:
@@ -3,6 +3,7 @@
|
||||
import pytest
|
||||
|
||||
from app.features.memory import evidence as evidence_mod
|
||||
from app.features.memory.evidence_format import format_evidence_chunks_for_chat_prompt
|
||||
from app.features.memory.evidence import (
|
||||
EMPTY_EVIDENCE_BUNDLE,
|
||||
_facts_to_dicts,
|
||||
@@ -85,3 +86,107 @@ def test_format_helpers_empty() -> None:
|
||||
assert _facts_to_dicts([]) == []
|
||||
assert _timeline_to_dicts([]) == []
|
||||
assert _stories_to_dicts([]) == []
|
||||
|
||||
|
||||
def test_format_evidence_chunks_for_chat_prompt_reframes_and_labels() -> None:
|
||||
evidence = {
|
||||
"relevant_chunks": [
|
||||
{"id": "chunk-1", "content": "我小时候在河边长大,夏天常去玩水。"},
|
||||
],
|
||||
"relevant_summaries": [],
|
||||
"relevant_facts": [],
|
||||
"timeline_hints": [],
|
||||
"relevant_stories": [],
|
||||
}
|
||||
text = format_evidence_chunks_for_chat_prompt(evidence)
|
||||
assert "聊天专用" in text
|
||||
assert "归因" in text
|
||||
assert "[M1]" in text
|
||||
assert "用户曾说" in text
|
||||
assert "我小时候在河边长大" in text
|
||||
|
||||
|
||||
def test_slice_interview_memory_empty_bundle():
|
||||
from app.features.memory.chat_memory_injection import slice_interview_memory
|
||||
|
||||
s = slice_interview_memory(None, "你好")
|
||||
assert s.prompt_excerpt == ""
|
||||
assert s.anchor_source == ""
|
||||
assert s.planner_preview == ""
|
||||
assert s.had_retrieval is False
|
||||
|
||||
|
||||
def test_slice_interview_memory_retrieval_not_equal_inject_dismissive():
|
||||
"""有检索预览但 gating 后不进主 prompt / anchor。"""
|
||||
from app.features.memory.chat_memory_injection import slice_interview_memory
|
||||
|
||||
evidence = {
|
||||
"relevant_chunks": [
|
||||
{"id": "c1", "content": "很久以前在校园礼堂排练到很晚。"},
|
||||
],
|
||||
"relevant_summaries": [],
|
||||
"relevant_facts": [],
|
||||
"timeline_hints": [],
|
||||
"relevant_stories": [],
|
||||
}
|
||||
s = slice_interview_memory(evidence, "哈哈,早就不会了")
|
||||
assert s.prompt_excerpt == ""
|
||||
assert s.anchor_source == ""
|
||||
assert s.planner_preview.strip() != ""
|
||||
assert s.had_retrieval is True
|
||||
|
||||
|
||||
def test_slice_interview_memory_minimal_inject_when_aligned():
|
||||
from app.features.memory.chat_memory_injection import slice_interview_memory
|
||||
|
||||
evidence = {
|
||||
"relevant_chunks": [
|
||||
{"id": "c1", "content": "你在校园演出里饰演罗密欧。"},
|
||||
],
|
||||
"relevant_summaries": [],
|
||||
"relevant_facts": [],
|
||||
"timeline_hints": [],
|
||||
"relevant_stories": [],
|
||||
}
|
||||
s = slice_interview_memory(evidence, "那次排练其实挺紧张的,灯光一打我就忘词。")
|
||||
assert "记忆线索" in s.prompt_excerpt
|
||||
assert "校园演出" in s.prompt_excerpt or "罗密欧" in s.prompt_excerpt
|
||||
assert s.anchor_source
|
||||
assert s.had_retrieval is True
|
||||
|
||||
|
||||
def test_slice_interview_memory_keeps_first_person_but_marks_ownership():
|
||||
from app.features.memory.chat_memory_injection import slice_interview_memory
|
||||
|
||||
evidence = {
|
||||
"relevant_chunks": [
|
||||
{"id": "c1", "content": "我小时候在河边长大,夏天常去玩水。"},
|
||||
],
|
||||
"relevant_summaries": [],
|
||||
"relevant_facts": [],
|
||||
"timeline_hints": [],
|
||||
"relevant_stories": [],
|
||||
}
|
||||
s = slice_interview_memory(evidence, "那条河一到夏天就特别热闹,我现在都记得。")
|
||||
assert "用户曾说" in s.prompt_excerpt
|
||||
assert "我小时候在河边长大" in s.prompt_excerpt
|
||||
assert s.anchor_source.startswith("用户曾说")
|
||||
|
||||
|
||||
def test_slice_interview_memory_suppresses_long_new_topic():
|
||||
from app.features.memory.chat_memory_injection import slice_interview_memory
|
||||
|
||||
evidence = {
|
||||
"relevant_chunks": [
|
||||
{"id": "c1", "content": "旧记忆关于河边。"},
|
||||
],
|
||||
"relevant_summaries": [],
|
||||
"relevant_facts": [],
|
||||
"timeline_hints": [],
|
||||
"relevant_stories": [],
|
||||
}
|
||||
long_msg = "我今天想随便聊聊工作里的事,项目压力很大。" * 6
|
||||
assert len(long_msg) > 72
|
||||
s = slice_interview_memory(evidence, long_msg)
|
||||
assert s.prompt_excerpt == ""
|
||||
assert s.anchor_source == ""
|
||||
|
||||
Reference in New Issue
Block a user