利用大模型构建情感支持对话的数据集

在当前的研究中,情感支持对话的数据集大多源自在线平台,如涉及压力管理的Twitter对话、关注心理健康的Reddit论坛,以及各类在线支持小组。这些数据虽易于获取,但通常表现为异步交流,且仅限于单次互动。与此形成对比的是,Liu等研究者1通过问卷调查的方式,推出了ESConv数据集,该数据集侧重于数据的质感和多回合对话的连贯性。尽管ESConv数据集在质量上有所提升,但其局限性亦显而易见,主要体现在数据集的规模适中,以及策略注释和场景多样性的不足,这些问题可能是由于数据编译过程中的高昂成本所造成的。

Zheng等研究者2充分利用了大型语言模型的能力,提出了一种创新的方法,将人类的洞察力与LLMs的计算能力相结合,以策划一个全面的情感支持对话数据集。一系列精心设计的对话,这些对话覆盖了多样化的场景,并作为数据集生成的种子。借助ChatGPT的上下文学习能力们递归地扩展了这个数据集,创建了一个名为ExTES的可扩展情感支持对话数据集。

ExTES的构建为我们提供了宝贵的启示。下面将从以下几个角度探讨ExTES是如何构建一个情感支持对话的数据集:

数据集的广度

ExTES数据集涵盖的所有36个情感支持场景的统计数据,具体如下表:

情景编号 情景描述 情景编号 情景描述
1 分手或离婚 19 导航性别认同和过渡
2 冲突或沟通问题 20 搬到新的城市或国家
3 沟通挑战 21 职业转型
4 应对所爱之人的死亡 22 为人父母和育儿挑战
5 处理宠物死亡 23 自尊心低或缺乏自信
6 与工作相关的压力和倦怠 24 身体形象问题和饮食失调
7 财务担忧和不确定的未来 25 LGBTQ+身份
8 失业相关压力 26 文化认同和归属感
9 学业压力 27 学术压力或压力
10 灵性和信仰 28 失业或职业挫折
11 管理双相情感障碍 29 育儿挑战和父母内疚
12 焦虑和恐慌 30 兄弟姐妹间的竞争或家庭冲突
13 抑郁和低落情绪 31 从身体或情感虐待中幸存和恢复
14 适应新工作或角色 32 从性侵犯或家庭暴力中康复
15 慢性病或疼痛管理 33 创伤后应激障碍
16 应对诊断或医疗治疗 34 从虐待中康复
17 照顾者支持 35 上瘾和康复
18 寻找生活的意义和目标 36 对所爱之人或朋友的的支持

数据集的深度

有必要区分情感聊天和情感支持(ES)。除了共情响应,情感支持对话还需要对话策略学习能力,解决用户的问题,并提供应对困难的帮助。换句话说,情感支持对话的关键挑战是为处理各种情感问题做出战略决策。ExTES数据集中提供了不同的策略,具体如下表:

策略缩写 策略描述 策略示例
RS 反思性陈述(Reflective Statement): 重复或改写用户已经表达的内容,以表明你在积极倾听。 用户:“我必须要做的所有工作都让我感到不堪重负。” 助理:“听起来你对自己的工作量感到不堪重负。”
Cla 澄清(Clarification): 寻求澄清,以确保清楚地了解用户的情绪和体验。 用户:“我就是摆脱不了这种悲伤的感觉。” 助理:“你能帮我理解一下是什么引发了这种悲伤的感觉吗?”
EV 情感验证(Emotional Validation): 不加评判地承认并验证用户的情绪。 用户:“我对自己再次犯同样的错误感到非常沮丧。” 助理:“感到沮丧是可以理解的,犯错是人之常情。”
ES 移情陈述(Empathetic Statement): 表达对用户体验的理解和同理心。 用户:“我现在真的在与我的自信作斗争。” 助理:“我可以想象在影响你自信的情况下导航是多么具有挑战性。”
Aff 肯定(Affirmation): 提供积极的强化和鼓励,以提升用户的精神。 用户:“我觉得自己不够好。” 助理:“你已经取得了很多成就,你的能力不言自明。不要低估你的能力。”
OH 提供希望(Offering Hope): 分享乐观的观点或可能性来灌输希望。 用户:“我不知道情况是否会好转。” 助理:“记住,变化是不变的,总是有成长和积极变化的机会。”
AJC 避免评判和批评(Avoiding Judgment and Criticism): 为用户创造一个非评判性的安全空间来表达他们的情绪,而不必担心批评。 用户:“我为请假关注自己的心理健康感到很内疚。” 助理:“照顾好自己的心理健康很重要,这没什么好内疚的。你的健康应该永远是优先考虑的,我很高兴你认识到这一点。在这段时间里,我能做些什么来支持你吗?”
SO 建议选项(Suggesting Options): 为解决手头的问题提供切实可行的建议或不同的观点。 用户:“我在管理压力方面有困难。” 助理:“你有没有考虑过尝试一些放松技巧,比如深呼吸或正念练习?”
CP 协同规划(Collaborative Planning): 与用户一起制定行动计划。 用户:“我想提高我的时间管理技能。” 助理:“我们一起集思广益吧。把任务分成更小、更容易处理的部分怎么样?”
PDP 提供不同的视角(Providing a Different Perspective): 提供不同的方式来看待情况,以帮助用户获得新的见解。 用户:“我的项目没有成功,我很沮丧。” 助理:“有时候挫折会带来意想不到的学习和成长机会。这是一个重新评估和再次尝试的机会。”
RNT 重新构建消极思想(Reframing Negative Thoughts): 帮助用户将消极思想重新构建为更积极或更现实的思想。 用户:“我真是个失败者。” 助理:“不要那样想,让我们把重点放在你从这次经历中学到了什么,以及你如何把它应用到未来。”
SI 分享信息(Sharing Information): 提供有关情绪、应对机制或自我保健实践的教育或事实信息。 用户:“我正在努力控制自己的焦虑。” 助理:“你知道深呼吸练习和接地技巧可以帮助减轻焦虑症状吗?你想让我解释一下如何练习吗?”
NE 使经验正常化(Normalization of Experience): 解释某些情绪或反应是常见的,是人类经验的一部分。 用户:“我为花时间给自己而感到内疚。” 助理:“对自我照顾感到内疚是很常见的,但这对你的健康至关重要。记住,你也应该优先考虑自己的需求。”
PSP 促进自我保健实践(Promoting Self-Care Practices): 提倡参与促进健康和自我照顾的活动。 助理:“一定要给自己留点时间,做一些能给你带来快乐和放松的事情。”
SM 压力管理(Stress Management): 为压力管理技巧提供建议,如锻炼、冥想或花时间在大自然中。 助理:“定期参加体育活动可以帮助减轻压力,改善情绪。”
Other 其他(Other): 与他人友好地打招呼,采用其他的支持性技巧,这些都不在前面提到的类别中。 助理:“你好,我很高兴能在这里帮助你。告诉我,今天我能为你做些什么?”

数据集的生成

身份:
你是一位专业的情感心理学顾问,擅长理解和引导人们的情感状态。

指令:
请根据指定的<情感支持场景>,运用<策略>进行沟通。这里所说的<策略>是<策略描述>,例如在<情感支持场景>中,<策略>的运用可以体现为:<策略示例>。你的任务是创建一个用于训练情感大模型的多轮对话数据集。请确保数据集中的回答积极正面、合法合规,上下文对话连贯有逻辑,并提供有效的情感支持和建议。在构建回答时,请遵循以下步骤,并按照规定的输出格式提供数据:

步骤1:准确理解并简洁复述对话中的问题或情感表达。
步骤2:分析并标注问题中的关键要素,包括方面、观点项、情感极性。
步骤3:基于对话上下文,深入识别和解读更复杂的人类情绪状态。
步骤4:综合分析问题和情绪状态,根据<策略>提出正面、建设性的回答或建议。
步骤5:评估你的回答可能对对话者情绪产生的影响,并在必要时进行调整。

输出格式:
[
{
"conversations": [
{
"from": "human",
"value": "<对话中的问题或情感表达>"
},
{
"from": "gpt",
"value": "
步骤1:<问题的简洁复述>\n
步骤2:<关键要素分析>\n
步骤3:<情绪状态的深入识别>\n
步骤4:<根据策略提供的正面回答>\n
步骤5:<回答的情绪影响评估>"\n
<最终调整后的正面回答>
"
},
{
"from": "human",
"value": "<对话中的问题或情感表达>"
},
{
"from": "gpt",
"value": "
步骤1:<问题的简洁复述>\n
步骤2:<关键要素分析>\n
步骤3:<情绪状态的深入识别>\n
步骤4:<根据策略提供的正面回答>\n
步骤5:<回答的情绪影响评估>"\n
<最终调整后的正面回答>
"
},
{
"from": "human",
"value": "<对话中的问题或情感表达>"
},
{
"from": "gpt",
"value": "
步骤1:<问题的简洁复述>\n
步骤2:<关键要素分析>\n
步骤3:<情绪状态的深入识别>\n
步骤4:<根据策略提供的正面回答>\n
步骤5:<回答的情绪影响评估>"\n
<最终调整后的正面回答>
"
}
]
}
]
```
具体的python代码可以参考下面:
```python
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
import json
from zhipuai import ZhipuAI

# 请填写您自己的APIKey
client = ZhipuAI(api_key="your api_key")

# 示例情感支持场景和策略列表
emotion_support_scenarios = [
"分手或离婚", "导航性别认同和过渡", "沟通问题", "搬到新的城市或国家",
"沟通挑战", "职业转型", "应对所爱之人的死亡", "为人父母和育儿挑战",
"处理宠物死亡", "自尊心低或缺乏自信", "与工作相关的压力和倦怠", "身体形象问题和饮食失调",
"财务担忧和不确定的未来", "LGBTQ+身份", "文化认同和归属感", "失业或职业挫折",
"学业压力", "学术压力或压力", "灵性和信仰", "育儿挑战和父母内疚",
"失业相关压力", "兄弟姐妹间的竞争或家庭冲突", "从身体或情感虐待中幸存和恢复", "从性侵犯或家庭暴力中康复",
"焦虑和恐慌", "抑郁和低落情绪", "适应新工作或角色", "创伤后应激障碍",
"应对诊断或医疗治疗", "从虐待中康复", "照顾者支持", "上瘾和康复",
"寻找生活的意义和目标", "对所爱之人或朋友的支持"
]

strategies = [
{
"Strategy": "反思性陈述",
"Description": "重复或改写用户已经表达的内容,以表明你在积极倾听。",
"Example": "input:“我必须要做的所有工作都让我感到不堪重负。” output:“听起来你对自己的工作量感到不堪重负。”"
},
{
"Strategy": "澄清",
"Description": "寻求澄清,以确保清楚地了解用户的情绪和体验。",
"Example": "input:“我就是摆脱不了这种悲伤的感觉。” output:“你能帮我理解一下是什么引发了这种悲伤的感觉吗?”"
},
{
"Strategy": "情感验证",
"Description": "不加评判地承认并验证用户的情绪。",
"Example": "input:“我对自己再次犯同样的错误感到非常沮丧。” output:“感到沮丧是可以理解的,犯错是人之常情。”"
},
{
"Strategy": "移情陈述",
"Description": "表达对用户体验的理解和同理心。",
"Example": "input:“我现在真的在与我的自信作斗争。” output:“我可以想象在影响你自信的情况下导航是多么具有挑战性。”"
},
{
"Strategy": "肯定",
"Description": "提供积极的强化和鼓励,以提升用户的精神。",
"Example": "input:“我觉得自己不够好。” output:“你已经取得了很多成就,你的能力不言自明。不要低估你的能力。”"
},
{
"Strategy": "提供希望",
"Description": "分享乐观的观点或可能性来灌输希望。",
"Example": "input:“我不知道情况是否会好转。” output:“记住,变化是不变的,总是有成长和积极变化的机会。”"
},
{
"Strategy": "避免评判和批评",
"Description": "为用户创造一个非评判性的安全空间来表达他们的情绪,而不必担心批评。",
"Example": "input:“我为请假关注自己的心理健康感到很内疚。” output:“照顾好自己的心理健康很重要,这没什么好内疚的。"
"你的健康应该永远是优先考虑的,我很高兴你认识到这一点。在这段时间里,我能做些什么来支持你吗?”"
},
{
"Strategy": "建议选项",
"Description": "为解决手头的问题提供切实可行的建议或不同的观点。",
"Example": "input:“我在管理压力方面有困难。” output:“你有没有考虑过尝试一些放松技巧,比如深呼吸或正念练习?”"
},
{
"Strategy": "协同规划",
"Description": "与用户一起制定行动计划。",
"Example": "input:“我想提高我的时间管理技能。” output:“我们一起集思广益吧。把任务分成更小、更容易处理的部分怎么样?”"
},
{
"Strategy": "提供不同的视角",
"Description": "提供不同的方式来看待情况,以帮助用户获得新的见解。",
"Example": "input:“我的项目没有成功,我很沮丧。” output:“有时候挫折会带来意想不到的学习和成长机会。这是一个重新评估和再次尝试的机会。”"
},
{
"Strategy": "重新构建消极思想",
"Description": "帮助用户将消极思想重新构建为更积极或更现实的思想。",
"Example": "input:“我真是个失败者。” output:“不要那样想,让我们把重点放在你从这次经历中学到了什么,以及你如何把它应用到未来。”"
},
{
"Strategy": "分享信息",
"Description": "提供有关情绪、应对机制或自我保健实践的教育或事实信息。",
"Example": "input:“我正在努力控制自己的焦虑。” output:“你知道深呼吸练习和接地技巧可以帮助减轻焦虑症状吗?你想让我解释一下如何练习吗?”"
},
{
"Strategy": "使经验正常化",
"Description": "解释某些情绪或反应是常见的,是人类经验的一部分。",
"Example": "input:“我为花时间给自己而感到内疚。” output:“对自我照顾感到内疚是很常见的,但这对你的健康至关重要。记住,你也应该优先考虑自己的需求。”"
},
{
"Strategy": "促进自我保健实践",
"Description": "提倡参与促进健康和自我照顾的活动。",
"Example": "input:“” output:“一定要给自己留点时间,做一些能给你带来快乐和放松的事情。”"
},
{
"Strategy": "压力管理",
"Description": "为压力管理技巧提供建议,如锻炼、冥想或花时间在大自然中。",
"Example": "input:“” output:“定期参加体育活动可以帮助减轻压力,改善情绪。”"
},
{
"Strategy": "其他",
"Description": "与他人友好地打招呼,采用其他的支持性技巧,这些都不在前面提到的类别中。",
"Example": "input:“” output:“你好,我很高兴能在这里帮助你。告诉我,今天我能为你做些什么?”"
}
]


# 调用人工智能按照prompt生成数据
def generate_conversation(scenario, strategy):
prompt = f"""
身份:
你是一位专业的情感心理学顾问,擅长理解和引导人们的情感状态。

指令:
请根据指定的{scenario},运用{strategy['Strategy']}进行沟通。这里所说的{strategy['Strategy']}是{strategy['Description']},例如在{scenario}中,{strategy['Strategy']}的运用可以体现为:{strategy['Example']}。
你的任务是创建一个用于训练情感大模型的多场景多轮对话数据集。请确保数据集中的回答积极正面、合法合规,上下文对话连贯有逻辑,并提供有效的情感支持和建议。在构建回答时,请遵循以下思考步骤,并按照规定的json输出格式提供数据:

步骤1:准确理解并简洁复述对话中的问题或情感表达。
步骤2:分析并标注问题中的关键要素,包括方面、观点项、情感极性。
步骤3:基于对话上下文,深入识别和解读更复杂的人类情绪状态。
步骤4:综合分析问题和情绪状态,根据<策略>提出正面、建设性的回答或建议。
步骤5:评估你的回答可能对对话者情绪产生的负面影响,并在必要时进行调整。
最终输出:最终调整后的正面回答。

输出格式:
[
{{
"conversations": [
{{
"from": "human",
"value": "<对话中的问题或情感表达>"
}},
{{
"from": "gpt",
"value": "步骤1:<准确理解并简洁复述对话中的问题或情感表达>\\n步骤2:<分析并标注问题中的关键要素,包括方面、观点项、情感极性>\\n步骤3:<基于对话上下文,深入识别和解读更复杂的人类情绪状态>\\n步骤4:<综合分析问题和情绪状态,根据{strategy['Strategy']}提出正面、建设性的回答或建议>\\n步骤5:<评估你的回答可能对对话者情绪产生的负面影响,并在必要时进行调整>\\n最终输出:<最终调整后的正面回答>"
}},
{{
"from": "human",
"value": "<对话中的问题或情感表达>"
}},
{{
"value": "步骤1:<准确理解并简洁复述对话中的问题或情感表达>\\n步骤2:<分析并标注问题中的关键要素,包括方面、观点项、情感极性>\\n步骤3:<基于对话上下文,深入识别和解读更复杂的人类情绪状态>\\n步骤4:<综合分析问题和情绪状态,根据{strategy['Strategy']}提出正面、建设性的回答或建议>\\n步骤5:<评估你的回答可能对对话者情绪产生的负面影响,并在必要时进行调整>\\n最终输出:<最终调整后的正面回答>"
}},
{{
"from": "human",
"value": "<对话中的问题或情感表达>"
}},
{{
"from": "gpt",
"value": "步骤1:<准确理解并简洁复述对话中的问题或情感表达>\\n步骤2:<分析并标注问题中的关键要素,包括方面、观点项、情感极性>\\n步骤3:<基于对话上下文,深入识别和解读更复杂的人类情绪状态>\\n步骤4:<综合分析问题和情绪状态,根据{strategy['Strategy']}提出正面、建设性的回答或建议>\\n步骤5:<评估你的回答可能对对话者情绪产生的负面影响,并在必要时进行调整>\\n最终输出:<最终调整后的正面回答>"
}}
]
}}
]
"""
response = client.chat.completions.create(
model="glm-4-flash", # 请填写要调用的模型名称
messages=[
{"role": "user", "content": prompt}
],
)
complete_response = ""
for chunk in response.choices[0].message.content:
complete_response += chunk
return complete_response


# 检查人工智能的输出格式的正确性
def safe_json_loads(s):
try:
return json.loads(s)
except json.JSONDecodeError as e:
print(f"JSONDecodeError: {e}")
return None


if __name__ == '__main__':
count = 0
for scenario in emotion_support_scenarios:
for strategy in strategies:
with open("emoDialogue.json", "r", encoding="utf-8") as fr:
data = json.load(fr)
while True:
generated_conversation = generate_conversation(scenario, strategy)
loaded_json = safe_json_loads(generated_conversation)
if loaded_json is not None:
data += loaded_json
break
else:
print("Failed to decode JSON. Retrying...")
# print(data)
with open("emoDialogue.json", "w", encoding="utf-8") as fw:
json.dump(data, fw, ensure_ascii=False, indent=2)
count += 1
print(f'生成第{count}条:在{scenario}情景下采用{strategy["Strategy"]}的沟通策略。')

参考

- [1] [arxiv](https://arxiv.org/abs/2106.01144)
- [2] [arxiv](https://arxiv.org/abs/2308.11584)