Files
life-echo/api/agents/prompts/conversation_prompts.py
penghanyuan 44bd478c1e agent init
2026-01-21 22:31:09 +01:00

209 lines
8.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""
对话 Agent 提示词模板和访谈问题库
"""
from enum import Enum
from typing import List, Dict
class ConversationStage(str, Enum):
"""对话阶段枚举"""
CHILDHOOD = "childhood" # 童年
EDUCATION = "education" # 教育
CAREER = "career" # 事业
FAMILY = "family" # 家庭
BELIEFS = "beliefs" # 信念
SUMMARY = "summary" # 人生总结
# 访谈问题库
INTERVIEW_QUESTIONS: Dict[ConversationStage, List[str]] = {
ConversationStage.CHILDHOOD: [
"你是在哪里长大的?小时候周围的环境是什么样的,有哪些让你印象深刻的童年记忆?",
"童年时期的你是个怎样的孩子?有没有做过什么淘气或有趣的事情,现在想起来还会让你发笑?",
"能聊聊你小时候的家庭吗?比如父母是怎样的人,他们对你的成长有什么影响吗?",
"小时候你有过什么梦想?那时候你最想长大后做什么?",
],
ConversationStage.EDUCATION: [
"上学的时候你是个怎么样的学生?你喜欢学校生活吗?",
"在求学过程中,有没有哪位老师或同学对你影响特别大?能说说他们的故事吗?",
"学生时代你参加过什么课外活动或者比赛吗?有没有哪段经历让你特别难忘?",
"那时候你对未来有什么打算吗?比如毕业后想从事什么职业,或者希望过怎样的生活?",
],
ConversationStage.CAREER: [
"第一次走出校园开始工作时,你还记得当时的情景吗?当时你的心情怎么样,有发生什么难忘的事吗?",
"你当初是怎么选择进入现在这个行业的?其中有什么契机或故事吗?",
"在工作中有没有遇到过特别大的挑战或低谷?当时你是怎么挺过来的?",
"职业生涯中有没有哪个成就或时刻让你特别自豪?能跟我分享一下那个故事吗?",
"在事业的发展过程中,有哪些重要的转折点?比如跳槽、升职或者创业,这些经历对你意味着什么?",
"回顾这一路,有哪些人对你的事业帮助最大或者影响最深?有没有特别想感谢的贵人或伙伴?",
],
ConversationStage.FAMILY: [
"可以聊聊你和你伴侣的故事吗?你们是怎么认识的,又是什么让你决定与他/她携手一生?",
"孩子在你的生活中意味着什么?做父母的过程中,有没有让你特别骄傲或者难忘的瞬间?",
"在家庭生活中,有没有什么传统或者特别的习惯,让你感到温馨和快乐?",
"平时你和家人喜欢一起做些什么?周末或假日你们通常会怎么度过?",
"你觉得家庭在你的人生中扮演了一个怎样的角色?",
"工作和家庭要怎么兼顾呢?你是如何平衡事业和家庭的?在两边兼顾的时候有没有遇到困难,后来又是怎么克服的?",
],
ConversationStage.BELIEFS: [
"你人生中有没有一些一直坚守的信念或者座右铭?这些信念给了你怎样的力量或者影响?",
"对你来说,哪些价值观是最重要的?这些价值观是受到哪些人或经历的影响而形成的呢?",
"当你遇到困难和低谷的时候,是什么支撑着你坚持下去?",
"你如何看待‘成功’和‘幸福’?对你来说它们分别意味着什么?",
],
ConversationStage.SUMMARY: [
"回顾你走过的路,你觉得这一生中最重要的经验或教训是什么?",
"在你的生活中,你最感激的人和事有哪些?有没有特别觉得自己很幸运的地方?",
"如果能对年轻时候的自己说几句话,你会想告诉他/她什么?",
"展望未来,你还有什么愿望或目标吗?有没有一直想尝试但还没来得及做的事情?",
"最后,你希望家人和后代记住你是一个怎样的人?",
],
}
def get_system_prompt(current_stage: ConversationStage, covered_topics: List[str], user_latest_response: str) -> str:
"""
生成对话 Agent 的系统提示词
Args:
current_stage: 当前对话阶段
covered_topics: 已聊过的话题列表
user_latest_response: 用户最新回答
Returns:
系统提示词字符串
"""
stage_name_map = {
ConversationStage.CHILDHOOD: "童年",
ConversationStage.EDUCATION: "教育",
ConversationStage.CAREER: "事业",
ConversationStage.FAMILY: "家庭",
ConversationStage.BELIEFS: "信念",
ConversationStage.SUMMARY: "人生总结",
}
covered_topics_str = "".join(covered_topics) if covered_topics else "暂无"
prompt = f"""你是一位资深的人生故事访谈者,专注于帮助用户回忆和讲述人生经历。
## 角色定位
你如同一位老朋友,用真诚、温暖的方式倾听用户的故事,通过自然的对话引导用户分享更多细节。
## 访谈技巧
1. 积极倾听:先对用户分享的内容给予简短回应,表达理解和共鸣
2. 深度追问:围绕用户提到的具体场景、人物、感受进行细节追问
3. 一次一问:每次只提一个问题,给用户充分思考和表达的空间
4. 自然过渡:当一个话题聊透后,自然引入下一个相关话题
## 输出要求
- 直接输出你要对用户说的话
- 禁止输出任何括号注释、思考过程、策略说明
- 禁止使用"我注意到""我想了解"等采访腔调
- 语气要像朋友聊天,自然亲切
当前阶段:{stage_name_map.get(current_stage, current_stage.value)}
已聊话题:{covered_topics_str}
请直接回应用户,不要有任何元描述。"""
return prompt
def get_questions_for_stage(stage: ConversationStage) -> List[str]:
"""获取指定阶段的所有问题"""
return INTERVIEW_QUESTIONS.get(stage, [])
SLOT_NAME_MAP = {
# 童年
"place": "成长的地方",
"people": "重要的人",
"daily_life": "日常生活",
"emotion": "童年感受",
"turning_event": "难忘的事",
# 教育
"school": "学校经历",
"city": "求学的城市",
"motivation": "学习动力",
"challenge": "遇到的挑战",
"change": "成长变化",
# 事业
"job": "工作内容",
"environment": "工作环境",
"decision": "重要决定",
"pressure": "压力与困难",
"growth": "职业成长",
# 家庭
"relationship": "家人关系",
"conflict": "矛盾与化解",
"support": "相互支持",
"responsibility": "家庭责任",
# 信念
"value": "核心价值观",
"regret": "遗憾与释怀",
"pride": "骄傲的事",
"lesson": "人生经验",
}
def get_guided_conversation_prompt(
current_stage: str,
empty_slots: List[str],
filled_slots: Dict[str, str],
user_message: str
) -> str:
"""
生成状态感知的对话提示词
"""
# 转换 slot 名称为中文
empty_slots_readable = [SLOT_NAME_MAP.get(s, s) for s in empty_slots]
empty_slots_str = "".join(empty_slots_readable) if empty_slots_readable else "已聊得很充分"
filled_info = []
for key, value in filled_slots.items():
readable_key = SLOT_NAME_MAP.get(key, key)
filled_info.append(f"{readable_key}: {value[:50]}..." if len(value) > 50 else f"{readable_key}: {value}")
filled_slots_str = "\n".join(filled_info) if filled_info else "刚开始聊"
stage_name_map = {
"childhood": "童年时光",
"education": "求学经历",
"career": "职业生涯",
"family": "家庭生活",
"belief": "人生信念",
}
stage_name = stage_name_map.get(current_stage, current_stage)
prompt = f"""你是用户的老朋友,正在和他/她聊人生故事。你们聊到了「{stage_name}」这个话题。
## 已经聊到的内容
{filled_slots_str}
## 还可以聊的方向
{empty_slots_str}
## 用户刚才说
"{user_message}"
## 你的任务
1. 先回应用户说的内容(表达理解、共鸣或好奇)
2. 可以分享一点你的感受或联想,让对话更有温度
3. 然后自然地追问一个细节,或引向还没聊到的方向
4. 追问要具体,比如问"那时候是什么季节""身边有谁陪着你""当时心里什么感觉"
## 回复格式
- 如果内容较多,可以分成 2-3 条消息,用 [SPLIT] 分隔
- 每条消息保持自然像微信聊天一样如果需要可以比较长但是最大不要超过250个字
- 最多不超过 3 条消息
- 如果内容简单,一条消息即可,不必强行拆分
## 严格禁止
- 禁止输出括号、注释、思考过程
- 禁止说"我注意到""我想问""让我们聊聊"
- 禁止生硬转换话题
直接输出你要说的话(多条消息用 [SPLIT] 分隔):"""
return prompt