172 lines
5.2 KiB
Python
172 lines
5.2 KiB
Python
"""访谈提示词:精简结构与人格/语气融合回归。"""
|
||
|
||
from langchain_core.messages import AIMessage, HumanMessage, SystemMessage
|
||
|
||
from app.agents.chat.helpers import format_history_string
|
||
from app.agents.chat.personas import normalize_interview_persona
|
||
from app.agents.chat.prompts_conversation import (
|
||
get_guided_conversation_prompt,
|
||
get_opening_prompt,
|
||
)
|
||
|
||
|
||
def test_guided_prompt_does_not_embed_raw_user_message_in_system_text():
|
||
p = get_guided_conversation_prompt(
|
||
current_stage="childhood",
|
||
empty_slots=["place"],
|
||
filled_slots={},
|
||
detected_user_stage="childhood",
|
||
user_profile_context="",
|
||
persona="default",
|
||
)
|
||
assert "__USER_SECRET_PHRASE_XYZ__" not in p
|
||
# Signature no longer takes user_message; secret would only leak via profile
|
||
p2 = get_guided_conversation_prompt(
|
||
current_stage="childhood",
|
||
empty_slots=["place"],
|
||
filled_slots={},
|
||
detected_user_stage="childhood",
|
||
user_profile_context="__USER_SECRET_PROFILE__",
|
||
persona="default",
|
||
)
|
||
assert "__USER_SECRET_PROFILE__" in p2
|
||
|
||
|
||
def test_guided_prompt_mentions_empathy_and_self_judgment():
|
||
p = get_guided_conversation_prompt(
|
||
current_stage="childhood",
|
||
empty_slots=["place"],
|
||
filled_slots={},
|
||
detected_user_stage="childhood",
|
||
user_profile_context="",
|
||
persona="default",
|
||
)
|
||
assert "接住对方" in p
|
||
assert "你自己判断" in p or "该追问" in p
|
||
assert "共情与轻量自我表露" in p
|
||
assert "意义向深挖" in p
|
||
|
||
|
||
def test_guided_prompt_era_popculture_open_questions_when_birth_year():
|
||
p = get_guided_conversation_prompt(
|
||
current_stage="childhood",
|
||
empty_slots=["place"],
|
||
filled_slots={},
|
||
detected_user_stage="childhood",
|
||
user_profile_context="",
|
||
persona="default",
|
||
profile_birth_year=1985,
|
||
profile_era_place="潍坊",
|
||
)
|
||
assert "时代与氛围参考" in p
|
||
assert "流行文化" in p
|
||
assert "开放式" in p
|
||
|
||
|
||
def test_opening_prompt_includes_era_task_when_birth_year_configured():
|
||
p = get_opening_prompt(
|
||
current_stage="childhood",
|
||
empty_slots_readable=["成长的地方"],
|
||
user_profile_context="出生年份:1985年",
|
||
persona="default",
|
||
profile_birth_year=1985,
|
||
profile_era_place="潍坊",
|
||
)
|
||
assert "年代氛围" in p
|
||
|
||
|
||
def test_guided_prompt_persona_tone_warm_listener():
|
||
p = get_guided_conversation_prompt(
|
||
current_stage="education",
|
||
empty_slots=["school"],
|
||
filled_slots={},
|
||
detected_user_stage="education",
|
||
user_profile_context="",
|
||
persona="warm_listener",
|
||
)
|
||
assert "倾听" in p or "柔和" in p
|
||
|
||
|
||
def test_guided_prompt_persona_curious_guide():
|
||
p = get_guided_conversation_prompt(
|
||
current_stage="education",
|
||
empty_slots=["school"],
|
||
filled_slots={},
|
||
detected_user_stage="education",
|
||
user_profile_context="",
|
||
persona="curious_guide",
|
||
)
|
||
assert "细节" in p
|
||
|
||
|
||
def test_normalize_interview_persona_unknown_falls_back():
|
||
assert normalize_interview_persona("not_a_real_persona") == "default"
|
||
assert normalize_interview_persona("") == "default"
|
||
|
||
|
||
def test_guided_prompt_contains_memory_section_when_evidence():
|
||
p = get_guided_conversation_prompt(
|
||
current_stage="childhood",
|
||
empty_slots=["place"],
|
||
filled_slots={},
|
||
detected_user_stage="childhood",
|
||
user_profile_context="",
|
||
persona="default",
|
||
memory_evidence_text="[摘要:rolling] 1990年生于上海。",
|
||
)
|
||
assert "相关记忆摘录" in p
|
||
assert "过往口述" in p
|
||
assert "1990年生于上海" in p
|
||
|
||
|
||
def test_guided_prompt_military_tone_in_system():
|
||
p = get_guided_conversation_prompt(
|
||
current_stage="childhood",
|
||
empty_slots=["place"],
|
||
filled_slots={},
|
||
detected_user_stage="childhood",
|
||
user_profile_context="",
|
||
persona="default",
|
||
background_voice="military",
|
||
)
|
||
assert "简洁" in p or "利落" in p or "得体" in p
|
||
|
||
|
||
def test_opening_prompt_military_style_rules_not_dialogue_samples() -> None:
|
||
p = get_opening_prompt(
|
||
current_stage="childhood",
|
||
empty_slots_readable=["成长的地方"],
|
||
user_profile_context="",
|
||
persona="default",
|
||
background_voice="military",
|
||
)
|
||
assert "军队相关" in p
|
||
assert "示例" not in p
|
||
|
||
|
||
def test_format_history_string_includes_system_for_debug_logs() -> None:
|
||
s = format_history_string(
|
||
[
|
||
SystemMessage(content="SYS_INSTRUCTIONS"),
|
||
HumanMessage(content="hi"),
|
||
AIMessage(content="hello"),
|
||
]
|
||
)
|
||
assert "System: SYS_INSTRUCTIONS" in s
|
||
assert "Human: hi" in s
|
||
assert "Assistant: hello" in s
|
||
|
||
|
||
def test_format_history_string_omit_system_body() -> None:
|
||
s = format_history_string(
|
||
[
|
||
SystemMessage(content="SYS_INSTRUCTIONS"),
|
||
HumanMessage(content="hi"),
|
||
],
|
||
omit_system_body=True,
|
||
)
|
||
assert "SYS_INSTRUCTIONS" not in s
|
||
assert "System: <omitted total_len=16" in s
|
||
assert "sha12=" in s
|
||
assert "Human: hi" in s
|