CRBot 项目复现:基于双 Agent 的认知重构聊天机器人
CRBot 是我在阅读 AI 心理治疗相关综述和实证论文后,完成的一个认知重构聊天机器人复现项目。
它不是一个普通的闲聊机器人,而是围绕认知行为疗法(Cognitive Behavioral Therapy,CBT)中的认知重构流程设计的研究原型。
项目希望解决的问题是:
如何让大语言模型按照相对稳定的心理干预流程工作↓既能判断当前应该做什么↓又能生成自然、具有引导性的对话↓同时保留安全检查、状态记录和人工审查能力为了实现这个目标,我复现了论文中的双 Agent 架构,并增加了命令行与 Web 两种交互方式。
当前系统的完整流程可以概括为:
用户输入↓安全检查↓Coordinator 判断阶段与策略↓Facilitator 生成引导式回复↓更新认知重构阶段↓保存会话日志↓等待下一轮输入我对 CRBot 的定位是:
一个基于提示工程和双 Agent 协作机制实现的认知重构研究原型,用于验证结构化心理对话流程的工程可行性。
需要说明的是,CRBot 目前只适合作为科研、教学和原型验证工具,不能替代心理咨询师,也不能用于医学诊断或紧急情况处置。
一、为什么要复现 CRBot
Section titled “一、为什么要复现 CRBot”在阅读 AI 心理治疗领域的研究后,我发现当前工作大致存在两条技术路线。
第一条路线关注 AI 如何进入认知行为疗法的各个环节,例如:
心理状态评估干预内容生成治疗过程跟踪疗效评估长期随访第二条路线则更关注大语言模型带来的变化:
规则式对话↓预设脚本↓上下文理解↓动态语言生成↓多 Agent 临床流程协作大语言模型提升了对话系统的自然度,但也带来了新的问题:
- 模型可能跳过必要步骤,直接给出结论。
- 对话容易偏离既定心理干预流程。
- 生成内容可能出现空泛安慰或过度肯定。
- 单个模型同时承担决策和表达任务时,输出不够稳定。
- 心理场景涉及敏感信息,必须增加明确的安全边界。
CRBot 的价值在于,它没有把心理对话完全交给一个大模型自由发挥,而是将任务拆成“判断”和“表达”两个部分。
因此,我选择它作为复现对象,希望验证三个问题:
双 Agent 分工能否提高流程稳定性纯提示工程能否完成三阶段认知重构论文方案能否被改造成可交互的 Web 原型二、认知重构是什么
Section titled “二、认知重构是什么”认知重构是 CBT 中常见的一类干预方法。
它关注的不是直接否定用户的情绪,而是帮助用户观察:
发生了什么事情↓我产生了什么自动化想法↓这个想法带来了什么情绪↓其中是否存在片面或极端的认知方式↓有哪些证据支持或反对这个想法↓能否形成更加平衡的新认知在 CRBot 中,这个过程被拆成三个阶段:
| 阶段 | 目标 | 系统主要任务 |
|---|---|---|
| Stage 1:识别 | 明确场景、情绪、自动化想法和可能的认知扭曲 | 引导用户把模糊感受表达得更具体 |
| Stage 2:辩驳 | 寻找支持与反对原有想法的证据 | 使用苏格拉底式提问促进自主思考 |
| Stage 3:重构 | 建立更加客观、平衡的新认知 | 总结前面的证据并形成替代性想法 |
这三个阶段不能简单合并。
如果没有完成识别,后面的辩驳可能针对错误的问题;如果没有充分辩驳,所谓“重构”就容易变成直接灌输积极结论。
因此,CRBot 不是让模型尽快给出答案,而是让模型按照阶段逐步推进。
三、CRBot 项目总体架构
Section titled “三、CRBot 项目总体架构”
项目主要包含三部分能力:
核心认知重构逻辑多端交互界面日志与安全机制1. 核心功能
Section titled “1. 核心功能”系统复现了以下逻辑:
识别 → 辩驳 → 重构每轮对话都会根据历史上下文判断当前所处阶段,并决定:
继续追问确认认知扭曲进入证据分析引导形成新认知结束本轮认知重构2. 双 Agent 协作
Section titled “2. 双 Agent 协作”系统使用两个串行工作的角色:
Coordinator负责判断
Facilitator负责表达两者通过标准化判定结果连接,而不是分别与用户自由对话。
3. 多端交互
Section titled “3. 多端交互”项目同时支持:
CLI 命令行模式Gradio Web 可视化模式CLI 适合开发调试,Web 界面适合演示、观察状态和进行普通交互。
4. 轻量实现
Section titled “4. 轻量实现”项目主要使用:
PythonGradiopython-dotenvOpenAI 兼容 APIQwen3.7-MaxJSON 会话日志系统没有进行模型微调,主要依靠提示词、状态机和程序逻辑约束模型行为。
四、为什么使用双 Agent 架构
Section titled “四、为什么使用双 Agent 架构”CRBot 最核心的设计,是将流程判断和自然语言生成解耦。
如果只使用一个大模型,它需要同时完成:
理解用户状态判断认知扭曲判断当前阶段决定下一步策略组织自然语言维持共情语气遵守安全规则这些目标之间可能发生冲突。
例如,模型为了让回复显得自然,可能提前跳到建议阶段;也可能为了快速结束任务,直接替用户总结出一个“正确答案”。
双 Agent 架构将复杂任务拆成两个相对明确的子任务。
Coordinator:流程判断器
Section titled “Coordinator:流程判断器”Coordinator 类似系统的“调度器”。
它负责:
读取对话历史识别可能的认知扭曲判断用户是否完成当前任务决定继续当前阶段还是进入下一阶段输出标准化判定结果Coordinator 不负责直接面向用户生成长文本。
它的输出更接近:
继续澄清情境确认认知扭曲进入证据辩驳继续寻找反例进入平衡认知重构Facilitator:对话生成器
Section titled “Facilitator:对话生成器”Facilitator 类似系统的“执行器”。
它接收:
Coordinator 的判定结果当前 Stage对话历史用户最新输入然后生成符合当前任务的自然语言回复。
Facilitator 主要负责:
共情回应澄清问题苏格拉底式提问总结用户提供的证据引导用户形成新的平衡认知这种分工让 Coordinator 关注流程正确性,让 Facilitator 关注表达自然度。
五、系统核心:cr_step 的完整生命周期
Section titled “五、系统核心:cr_step 的完整生命周期”
我将单轮认知重构逻辑统一封装在 cr_step 中。
无论用户通过 CLI 还是 Web 界面输入内容,底层最终都会调用同一套核心逻辑。
一次 cr_step 大致经历五个步骤。
1. 安全预检
Section titled “1. 安全预检”系统首先调用 safety_check 对输入进行前置检查。
用户输入↓风险检测↓安全:进入正常流程风险命中:停止普通认知重构流程并显示安全提示安全检查必须位于模型生成之前,不能只依靠对话模型在回复阶段自行判断。
2. Coordinator 判定
Section titled “2. Coordinator 判定”安全检查通过后,Coordinator 会读取:
历史对话当前阶段用户最新输入阶段规则认知扭曲定义然后输出当前轮次的标准化决策。
3. Facilitator 生成
Section titled “3. Facilitator 生成”Facilitator 根据 Coordinator 的决策生成自然语言回复。
这样可以避免 Facilitator 自行决定流程,使其更专注于:
回复是否自然问题是否清晰语气是否尊重是否给用户保留自主思考空间4. Stage 状态流转
Section titled “4. Stage 状态流转”系统根据 Coordinator 的判定更新全局阶段。
Stage 1↓ 条件满足Stage 2↓ 条件满足Stage 3↓ 完成本轮任务结束或新建会话如果当前条件没有满足,系统会继续停留在原阶段,而不是强制推进。
5. 会话日志持久化
Section titled “5. 会话日志持久化”最后,系统会将本轮信息写入 JSON 日志。
日志可以保存:
用户输入Coordinator 判定Facilitator 回复当前 Stage认知扭曲标签风险状态时间信息这样后续可以回放对话、检查错误并分析模型行为。
六、完整工作流程
Section titled “六、完整工作流程”
整个系统采用串行闭环结构:
01 用户输入↓02 安全检查↓03 Coordinator 判断阶段与策略↓04 Facilitator 生成回复↓05 更新 Stage↓06 保存日志↓07 输出回复并等待下一轮输入其中最重要的是 Stage 不由对话轮数决定,而是由对话内容是否满足当前任务决定。
例如,Stage 1 需要尽量明确:
具体情境自动化想法相关情绪可能的认知扭曲如果用户表达仍然非常模糊,Coordinator 会继续要求 Facilitator 澄清,而不是因为已经对话三轮就自动进入 Stage 2。
同样,在 Stage 2 中,如果用户还没有给出足够的支持证据和反对证据,系统也不会立即进入 Stage 3。
这种设计让流程更接近一个内容驱动的状态机,而不是固定轮次的脚本。
七、Coordinator:把心理流程转化为分类任务
Section titled “七、Coordinator:把心理流程转化为分类任务”Coordinator 的本质是一个受约束的 LLM 分类器。
简化后的逻辑如下:
def coord_classify(conversation_history, user_message, stage): prompt = build_coordinator_prompt( conversation_history=conversation_history, user_message=user_message, stage=stage, distortion_rules=DISTORTION_RULES, transition_rules=STAGE_RULES, )
result = llm_inference( prompt=prompt, response_format="json", )
return resultCoordinator 的提示词包含两类知识:
认知扭曲的定义与判断规则三阶段认知重构的推进条件模型需要将复杂的自然语言对话压缩成结构化结果。
例如:
{ "stage": 1, "decision": "continue_clarification", "distortion": "catastrophizing", "risk": "normal"}结构化输出有几个好处:
- 便于程序解析。
- 便于记录日志。
- 便于限制模型输出范围。
- 便于判断阶段变化。
- 便于对错误分类进行单独测试。
Coordinator 不追求语言表达是否自然,只追求决策是否稳定、可解析和符合流程。
八、Facilitator:把决策转化为自然对话
Section titled “八、Facilitator:把决策转化为自然对话”Facilitator 的本质是一个带场景约束的生成器。
简化逻辑如下:
def facil_respond(conversation_history, coordinator_result, stage): context = merge_context( conversation_history=conversation_history, coordinator_result=coordinator_result, stage=stage, )
prompt = build_facilitator_prompt(context)
return llm_generate( prompt=prompt, temperature=0.7, )Facilitator 不是简单地“安慰用户”,而是必须完成 Coordinator 指定的任务。
例如,当 Coordinator 判定需要继续澄清时,Facilitator 应生成具体、开放的问题,而不是直接提出建议。
当系统进入证据辩驳阶段时,Facilitator 可以引导用户思考:
哪些事实支持这个想法哪些事实与这个想法不一致是否存在被忽略的例外如果朋友遇到相同情况,会如何看待当前结论是否包含绝对化表达当系统进入重构阶段时,Facilitator 需要基于前文已经出现的内容,引导用户形成新的表达,而不是凭空生成一句积极口号。
九、纯提示工程如何支撑系统能力
Section titled “九、纯提示工程如何支撑系统能力”CRBot 没有对模型进行 Fine-tuning。
系统能力主要来自四个部分:
任务拆解角色提示词结构化输出约束程序状态机其中,提示词不仅描述角色,还包含明确的行为规则。
Coordinator Prompt 重点约束:
只进行判断,不与用户长篇对话只输出规定格式必须参考历史上下文不能随意跳过阶段Facilitator Prompt 重点约束:
按照 Coordinator 指令回复避免空泛赞美避免替用户直接下结论优先使用开放式问题保持尊重但不过度权威因此,这个项目并不是简单地调用两次 API。
它真正的核心是:
将认知重构中的专业流程拆解为可以被大语言模型执行、被程序检查、被日志追踪的标准化任务。
十、安全机制与系统边界
Section titled “十、安全机制与系统边界”心理健康对话具有较高的敏感性,因此系统不能只关注回复质量。
当前项目将安全检查放在核心流程之前:
用户输入↓安全检查↓普通情况:进入认知重构高风险情况:中断普通流程,显示明确的安全提示同时,系统还需要遵守几个边界:
- 不把模型输出包装成医学诊断。
- 不声称系统具有已经验证的临床疗效。
- 不鼓励用户依赖机器人替代专业帮助。
- 不在缺少人工监督时处理复杂或紧急情况。
- 不将敏感会话数据默认上传或公开。
日志虽然有利于调试,但也会带来隐私风险。
因此,真正部署时还需要进一步增加:
日志脱敏本地加密访问控制数据保留期限用户删除机制模型供应商的数据策略说明十一、CLI 与 Gradio Web 界面
Section titled “十一、CLI 与 Gradio Web 界面”
项目提供两种交互入口。
1. CLI 模式
Section titled “1. CLI 模式”CLI 适合:
快速启动Prompt 调试查看原始输出批量测试自动化脚本集成示意命令:
python crbot_cli.py --mode debug调试模式可以输出更多中间信息,例如:
当前 StageCoordinator 原始判定识别出的认知扭曲风险状态Facilitator 最终回复CLI 的优势是结构简单,不需要前端渲染,便于定位问题究竟出现在模型调用、格式解析还是阶段更新。
2. Gradio Web 模式
Section titled “2. Gradio Web 模式”Web 界面更适合日常体验和项目展示。
界面可以展示:
对话区域当前认知重构阶段识别出的认知扭曲标签风险等级模型处理状态新建会话按钮相较于纯文本终端,Web 界面让系统内部状态更加直观。
这对 CRBot 尤其重要,因为用户不仅需要看到“模型说了什么”,还需要知道:
系统目前正在完成什么任务为什么仍然停留在当前阶段是否已经进入下一阶段十二、Stage 1:识别情境与自动化想法
Section titled “十二、Stage 1:识别情境与自动化想法”
Stage 1 的目标是建立认知重构所需的基本信息。
系统会逐步确认:
发生了什么用户当时产生了什么想法这个想法对应什么情绪想法中是否存在明显的认知偏差这一阶段最容易出现的问题,是用户只表达笼统感受,例如:
我感觉很糟我什么都做不好最近所有事情都不顺利这些表达包含重要情绪,但还不足以直接进入证据分析。
因此,Facilitator 需要继续澄清具体事件和核心想法,让后续辩驳围绕一个明确命题展开。
十三、Stage 2:寻找支持与反对证据
Section titled “十三、Stage 2:寻找支持与反对证据”
Stage 2 是认知重构的核心阶段。
系统不会直接告诉用户“你的想法是错误的”,而是通过问题引导用户检查证据。
这一阶段通常关注:
支持原想法的事实不支持原想法的事实被忽略的例外其他可能解释绝对化表达是否成立这里需要避免对话权力失衡。
如果模型不断使用带有预设答案的问题,用户可能只是在配合模型,而不是真正完成自主思考。
因此,Facilitator 应尽量保持开放性,让用户自己发现原有结论中的片面部分。
十四、Stage 3:形成平衡的新认知
Section titled “十四、Stage 3:形成平衡的新认知”
Stage 3 的目标不是把负面想法改成完全相反的积极想法。
更合理的重构结果应该满足:
能够承认现实困难能够纳入前面找到的反例减少绝对化和灾难化表达具有一定可信度能够由用户本人接受例如,系统不应该简单生成:
我一定会成功,一切都会变好。而应该帮助用户形成更加平衡的表达:
这次结果没有达到预期,但它不能证明我永远做不好。我仍然可以分析原因,并通过下一次行动验证自己的能力。重构的重点不是“更积极”,而是“更完整、更符合证据”。
十五、与原论文的对齐和偏离
Section titled “十五、与原论文的对齐和偏离”
为了保证复现具有参考价值,我将实现分成“严格对齐”和“工程适配”两部分。
1. 严格对齐的部分
Section titled “1. 严格对齐的部分”项目保留了论文中的核心逻辑:
Coordinator 与 Facilitator 双 Agent 串行协作认知重构三阶段自动流转Coordinator 使用标准化输出安全风险前置检测根据论文附录复用核心英文 Prompt这些内容决定了 CRBot 的基本实验假设,因此不应随意修改。
2. 合理偏离的部分
Section titled “2. 合理偏离的部分”受实际开发环境限制,项目进行了两项主要调整。
原论文使用 GPT-4,本项目使用 Qwen3.7-Max 进行实现。
因此,本项目验证的是:
双 Agent 与 Prompt 结构能否在替代模型上运行而不是证明不同模型具有完全一致的心理对话表现。
新增 Web 控制台
Section titled “新增 Web 控制台”原论文重点讨论系统设计与实证评估,本项目额外增加了 Gradio Web 界面。
Web 界面没有改变认知重构核心逻辑,只是增加了:
状态可视化风险提示阶段标签会话重置更友好的交互入口这种做法保留了论文的核心机制,同时让项目更适合实际演示和后续测试。
十六、专家评审揭示的四类风险
Section titled “十六、专家评审揭示的四类风险”论文中的专家评审指出,LLM 心理对话工具即使流程基本正确,也可能出现一些隐蔽问题。
1. 有毒正向
Section titled “1. 有毒正向”模型频繁使用空泛的肯定和赞美,却没有真正回应用户表达的困难。
问题不在于语气积极,而在于积极表达缺少上下文依据,容易让用户感到真实情绪被忽略。
2. 对话权力失衡
Section titled “2. 对话权力失衡”模型可能通过诱导式提问暗示所谓“标准答案”,或者以权威口吻直接替用户作出判断。
认知重构应该帮助用户自主检查想法,而不是让用户服从 AI 的结论。
3. 细腻情绪理解不足
Section titled “3. 细腻情绪理解不足”大模型可能只根据单句话进行分类,忽略前后语境、矛盾情绪和表达中的不确定性。
因此,Coordinator 必须读取完整对话历史,Facilitator 也应允许用户修正系统的理解。
4. 流程僵化
Section titled “4. 流程僵化”流程化设计能够提高稳定性,但过度依赖固定问题也会让对话变成问卷。
这意味着 CRBot 需要在两个目标之间取得平衡:
流程可控自然灵活双 Agent 架构提供了基础,但不能自动解决所有临床交互问题。
十七、当前项目的价值
Section titled “十七、当前项目的价值”完成 CRBot 复现后,我认为它的价值主要体现在四个方面。
1. 验证了双 Agent 的工程可行性
Section titled “1. 验证了双 Agent 的工程可行性”将判断和语言生成拆开后,系统逻辑更容易理解,也更方便分别测试。
2. 展示了纯 Prompt 工作流的上限
Section titled “2. 展示了纯 Prompt 工作流的上限”在不微调模型的情况下,仅依靠提示词和状态控制,就可以构建一个具有明确任务流程的对话原型。
3. 提高了系统可解释性
Section titled “3. 提高了系统可解释性”每轮对话都可以追踪:
Coordinator 为什么作出某个判断Facilitator 根据什么任务生成回复Stage 为什么发生变化4. 为后续用户研究提供了原型
Section titled “4. 为后续用户研究提供了原型”CLI 和 Web 界面可以支持:
功能测试Prompt 对比模型对比对话质量评估专家审阅小规模可用性研究但这些价值属于研究与工程层面,不能直接等同于已经获得临床疗效验证。
十八、当前局限
Section titled “十八、当前局限”目前项目仍然存在明显限制。
1. 缺少系统化量化评估
Section titled “1. 缺少系统化量化评估”当前复现重点是功能闭环和交互演示,还没有完成大规模对话测试、人工评分和统计分析。
2. 模型替换带来差异
Section titled “2. 模型替换带来差异”Qwen3.7-Max 与原论文模型在指令遵循、情绪理解和长上下文表现上可能不同。
3. 安全检查仍然有限
Section titled “3. 安全检查仍然有限”简单的关键词或单模型判定不能覆盖所有风险情况,真正部署需要更完善的多层安全机制。
4. 三阶段流程可能过于刚性
Section titled “4. 三阶段流程可能过于刚性”真实心理对话可能出现反复、回退和多问题交织,而当前状态机更接近线性流程。
5. 缺少专业人员持续参与
Section titled “5. 缺少专业人员持续参与”心理干预系统的 Prompt、评估指标和安全边界需要心理学专业人员共同设计,仅靠工程视角不足以支撑实际应用。
十九、后续优化方向
Section titled “十九、后续优化方向”接下来我准备从几个方面继续优化。
1. Prompt 护栏
Section titled “1. Prompt 护栏”重点针对以下问题增加约束:
空泛赞美诱导式提问过度权威表达忽略上下文直接替用户生成结论2. 结构化状态
Section titled “2. 结构化状态”将当前 Stage 扩展为更细的会话状态,例如:
情境是否明确自动化想法是否明确情绪是否明确认知扭曲是否确认支持证据是否充分反对证据是否充分新认知是否由用户认可这样可以减少仅使用单一 Stage 变量带来的信息损失。
3. 自动化测试集
Section titled “3. 自动化测试集”构建覆盖不同场景的测试对话,检查:
Coordinator 分类准确性阶段跳转是否合理结构化输出是否稳定Facilitator 是否违反提示规则安全机制是否正确触发4. 多模型对比
Section titled “4. 多模型对比”在相同 Prompt 和流程下,对比不同模型的:
格式遵循率阶段判断一致性回复相关性共情表达调用成本响应延迟5. 人工评审
Section titled “5. 人工评审”邀请具有心理学背景的评审者,从以下维度进行文本盲审:
流程合规性提问质量情绪理解自主性保护潜在风险整体可用性6. 隐私与部署
Section titled “6. 隐私与部署”进一步增加:
本地模型支持敏感字段脱敏日志加密用户数据删除模型调用审计CRBot 当前已经形成了一个完整的研究原型闭环:
用户输入↓安全预检↓Coordinator 决策↓Facilitator 生成↓三阶段状态流转↓日志记录↓CLI / Web 展示这个项目让我对 Agent 系统有了更具体的认识。
Agent 的价值不只是让多个模型角色轮流说话,而是:
将复杂任务拆成职责明确的节点为节点设计可检查的输入输出使用程序逻辑控制任务推进保留完整的中间状态和运行记录CRBot 的双 Agent 架构正是这种思想的一个具体例子。
Coordinator 负责判断“下一步应该做什么”,Facilitator 负责决定“这一步应该怎样表达”,状态机负责保证流程不会随意偏航。
最终,这个项目验证了一个重要思路:
大语言模型可以通过合理的任务拆解、提示词约束和状态管理,参与结构化认知重构流程;但心理健康场景中的有效性、安全性和伦理边界,仍然需要专业评估、长期验证和严格监管。