""" 对话 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