资讯动态

PsyQA中文心理健康问答数据集:援助策略标注与策略可控生成实战

发布时间:2026/10/4 1:29:22 来源:尧图企业网站定制
简介PsyQA是一份面向心理健康智能问答与咨询文本生成研究的中文数据集适合从事心理咨询NLP、对话系统开发的研究者与开发者使用用于训练能模拟咨询师援助策略的长文本生成模型。压缩包共3个文件包含json格式的问答样例数据、md说明文档与docx用户协议整体约241KB体积轻便便于快速上手与二次加工。数据集核心价值在于对情绪调节、认知重构、社交技能训练等援助策略进行了细致标注并覆盖常见心理问题与部分个案分析可支撑构建心理健康知识图谱、训练策略感知型生成模型也能为智能心理助手、在线咨询平台提供贴近真实咨询场景的语料素材。目前已有376人学习关注使用时需注意数据隐私与伦理合规避免敏感信息泄露。1. 拆开 PsyQA一个带援助策略标注的中文心理健康问答数据集做心理健康方向的对话系统最头疼的往往不是模型结构而是数据。通用中文问答数据集一抓一大把但真正带「援助策略」标注的极少。PsyQA 就是冲着这个缺口来的它是一份中文心理健康支持问答数据集核心价值在于每条回答都标注了援助策略类别可以用来训练模型生成有策略、有温度的长咨询文本而不是干巴巴地丢一句「建议你去看医生」。如果你在做心理疏导对话机器人、情感支持类智能体或者想研究可控文本生成这份资源值得拆开看。它适合有一定 NLP 基础、能跑通数据处理脚本的从业者新手照着步骤也能把数据读出来、把标注统计清楚。下面我从数据结构讲到怎么用、坑在哪。2. 数据结构与援助策略标注体系先搞懂字段再动手拿到一份数据集我习惯先不写模型先把文件结构和字段含义摸清楚。PsyQA 的价值密度全在标注上字段理解错了后面训练全白搭。2.1 文件组织与核心字段PsyQA 通常以 JSON 或 JSONL 形式组织一条样本对应一次「提问 回答」的咨询交互。常见字段包括问题文本、回答文本、以及回答对应的援助策略标签。援助策略是这份数据的灵魂它描述的是回答者在心理支持中采用的干预方式比如「提供信息」「情感反映」「重述」「建议」「共情」等类别。不同版本类别数量可能不同使用前务必先统计标签分布别默认类别数。我一般会先写一段脚本把数据加载进来打印字段名和前几条样本确认结构。这一步看着简单但能省掉后面大量返工。import json # 逐行读取 JSONL 格式的 PsyQA 数据 samples [] with open(PsyQA.jsonl, r, encodingutf-8) as f: for line in f: line line.strip() if not line: continue samples.append(json.loads(line)) print(样本总数:, len(samples)) print(字段列表:, list(samples[0].keys())) print(第一条样本预览:) print(json.dumps(samples[0], ensure_asciiFalse, indent2)[:800])这段代码做三件事按行解析、跳过空行、打印字段和首条样本。参数上encodingutf-8必须写中文数据用默认编码会乱码ensure_asciiFalse保证打印出来是可读中文而不是转义序列。如果文件是整体一个 JSON 数组而非 JSONL把读取逻辑换成json.load(f)即可。先跑通这一步你才知道手里的数据到底长什么样。2.2 援助策略标签的统计与清洗字段确认后下一步是统计标签分布。心理健康数据有个特点类别极不平衡「提供信息」这类策略往往占大头而「情感反映」等占比很小。不平衡会直接影响后续生成模型的偏向所以统计是必须的。from collections import Counter # 假设策略标签存在 strategy 字段可能是字符串或列表 strategy_counter Counter() for s in samples: strat s.get(strategy) or s.get(strategies) or [] if isinstance(strat, str): strat [strat] for item in strat: strategy_counter[item] 1 for name, cnt in strategy_counter.most_common(): print(f{name}: {cnt} ({cnt / len(samples) * 100:.2f}%))这里用Counter做频次统计兼容标签是单值或列表两种情况。参数说明most_common()不传参就按频次降序输出全部类别。跑完你会得到一张分布表据此决定是否要做重采样或加权。清洗方面常见问题是回答文本里混入 HTML 标签、多余空白、以及极短的无意义回答建议统一做正则替换和长度过滤把长度低于阈值比如 10 个字符的样本剔除。提示标签字段名在不同版本里可能叫strategy、strategies或label别硬编码先打印字段确认。3. 把标注转成训练样本构造策略可控的生成数据搞清楚结构后真正的活是把原始问答转成模型能吃的训练格式。PsyQA 的卖点是「生成富有援助策略的长咨询文本」所以构造样本时要把策略信息显式带进去让模型学会「按策略生成」。3.1 构造带策略前缀的指令样本现在主流的做法是把任务写成指令格式输入问题 目标策略输出对应回答。这样训练出来的模型在推理时可以通过指定策略来控制生成风格。下面是把 PsyQA 转成指令样本的脚本。def build_instruction_sample(sample): question sample.get(question, ).strip() answer sample.get(answer, ).strip() strat sample.get(strategy) or sample.get(strategies) or [] if isinstance(strat, list): strat_text 、.join(strat) else: strat_text str(strat) # 指令模板明确要求按指定援助策略作答 instruction ( f你是一名心理健康支持助手。请使用「{strat_text}」这一援助策略 f针对以下困扰给出一段有共情、有支持性的回复。\n f来访者{question} ) return {instruction: instruction, output: answer} converted [build_instruction_sample(s) for s in samples if s.get(answer)] print(转换后样本数:, len(converted)) print(converted[0][instruction][:200])逻辑说明把策略拼进指令等于给模型一个显式的条件信号推理时换策略词就能换风格。参数上strat_text用顿号连接多标签如果数据是单标签就直接用。注意过滤掉没有回答的样本否则会产出空输出。这个模板不是唯一解你也可以把策略单独作为一个字段传给模型但指令式最省事、兼容性最好。3.2 长文本生成的长度控制与截断PsyQA 强调「长咨询文本」但长有长的麻烦训练时序列太长显存吃不消太短又学不到完整策略表达。常见做法是设一个最大长度阈值比如 1024 或 2048 个 token超长的截断、过短的保留但标记。截断时优先保留回答的开头和结尾因为心理支持文本的共情往往在开头、建议往往在结尾。def truncate_middle(text, max_chars1500): if len(text) max_chars: return text head text[: max_chars // 2] tail text[-(max_chars // 2):] return head …… tail converted [ {instruction: c[instruction], output: truncate_middle(c[output])} for c in converted ]这里用字符数近似 token 数实际训练时建议换成 tokenizer 的truncation策略。参数max_chars按你的显存和模型上下文窗口调7B 级别模型配 2048 上下文时单条样本控制在 1500 字符左右比较稳。截断中间而不是尾部是为了保住首尾这两块信息密度最高的部分。注意别用简单切片直接砍尾心理支持文本的结尾常是安抚或建议砍掉会破坏策略完整性。4. 避坑与常见问题排查标注数据的四个血泪坑标注类数据集用起来翻车点不少下面四条是我实际处理时踩过的按「现象 → 原因 → 解决」写清楚。4.1 标签分布严重失衡导致生成偏向现象训练完模型不管输入什么输出都偏向「提供信息」这一种策略其他策略几乎不出现。原因原始数据里高频策略占比过高模型学会了偷懒总选概率最大的那类。解决先统计分布对低频策略做上采样或对高频策略做下采样训练时给不同策略加类别权重推理阶段用策略前缀强制约束而不是让模型自由发挥。4.2 中文编码不一致读出乱码现象脚本能跑但打印出来的问题和回答全是问号或方块。原因文件实际编码不是 UTF-8可能是 GBK 或带 BOM 的 UTF-8。解决读取时显式指定编码先试utf-8-sig能吃掉 BOM不行再试gbk写文件时统一用utf-8避免二次污染。4.3 多标签策略被当成单标签处理现象统计出来的策略类别数比预期少某些组合策略消失。原因部分样本的策略字段是列表代码里直接str()转换把列表变成了字符串字面量。解决判断类型列表就遍历展开字符串才直接计数参考 2.2 的兼容写法。4.4 问答错位或空回答混入现象训练后模型偶尔输出与问题无关的内容。原因原始数据存在问答对不齐、回答为空或极短的脏样本。解决转换前做校验问题或回答为空、长度过短的直接丢弃对问答做一次关键词重合度粗筛重合度过低的样本人工抽查。提示清洗规则宁可严一点脏数据进训练集模型学到的就是错的后悔药没得吃。5. 进阶玩法与验证用策略命中率检验生成质量数据用起来之后怎么知道模型真的学会了「按策略生成」光看 loss 不够得设计可量化的验证。我的习惯是做一个策略命中率测试准备一批测试问题对每个问题指定目标策略让模型生成再用一个分类器或规则判断生成文本是否符合该策略。具体做法分三步。第一步从数据里切出验证集保留问题和目标策略隐藏原回答。第二步用训练好的模型按指定策略生成回复。第三步用一个独立的策略分类器可以基于同一份数据微调一个小模型对生成文本打标签统计命中率。验证指标含义合格参考策略命中率生成文本被判定为目标策略的比例越高越好明显高于随机生成长度平均输出字符数接近训练集回答长度重复率生成文本中重复 n-gram 占比越低越好人工抽检共情与支持性主观评分抽样 50 条打分除了自动指标人工抽检不能省。心理支持文本的质量很微妙共情是否到位、建议是否得体机器指标测不出来。我一般抽 50 条按「是否共情、是否给出可执行建议、是否安全」三个维度打分低于阈值的策略类别回头补数据。进阶一点可以做策略插值推理时给多个策略标签观察模型能否融合出复合风格的回复。这一步能验证模型是否真正理解了策略语义而不是死记硬背模板。从那以后我每次处理这类标注数据集都强制先跑一遍标签分布统计和策略命中率验证再谈模型效果。希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑