Skip to content

输入关键词开始搜索

CRBot 项目复现:基于双 Agent 的认知重构聊天机器人

CRBot 是我在阅读 AI 心理治疗相关综述和实证论文后,完成的一个认知重构聊天机器人复现项目。

它不是一个普通的闲聊机器人,而是围绕认知行为疗法(Cognitive Behavioral Therapy,CBT)中的认知重构流程设计的研究原型。

项目希望解决的问题是:

如何让大语言模型按照相对稳定的心理干预流程工作
既能判断当前应该做什么
又能生成自然、具有引导性的对话
同时保留安全检查、状态记录和人工审查能力

为了实现这个目标,我复现了论文中的双 Agent 架构,并增加了命令行与 Web 两种交互方式。

当前系统的完整流程可以概括为:

用户输入
安全检查
Coordinator 判断阶段与策略
Facilitator 生成引导式回复
更新认知重构阶段
保存会话日志
等待下一轮输入

我对 CRBot 的定位是:

一个基于提示工程和双 Agent 协作机制实现的认知重构研究原型,用于验证结构化心理对话流程的工程可行性。

需要说明的是,CRBot 目前只适合作为科研、教学和原型验证工具,不能替代心理咨询师,也不能用于医学诊断或紧急情况处置。


在阅读 AI 心理治疗领域的研究后,我发现当前工作大致存在两条技术路线。

第一条路线关注 AI 如何进入认知行为疗法的各个环节,例如:

心理状态评估
干预内容生成
治疗过程跟踪
疗效评估
长期随访

第二条路线则更关注大语言模型带来的变化:

规则式对话
预设脚本
上下文理解
动态语言生成
多 Agent 临床流程协作

大语言模型提升了对话系统的自然度,但也带来了新的问题:

  1. 模型可能跳过必要步骤,直接给出结论。
  2. 对话容易偏离既定心理干预流程。
  3. 生成内容可能出现空泛安慰或过度肯定。
  4. 单个模型同时承担决策和表达任务时,输出不够稳定。
  5. 心理场景涉及敏感信息,必须增加明确的安全边界。

CRBot 的价值在于,它没有把心理对话完全交给一个大模型自由发挥,而是将任务拆成“判断”和“表达”两个部分。

因此,我选择它作为复现对象,希望验证三个问题:

双 Agent 分工能否提高流程稳定性
纯提示工程能否完成三阶段认知重构
论文方案能否被改造成可交互的 Web 原型

认知重构是 CBT 中常见的一类干预方法。

它关注的不是直接否定用户的情绪,而是帮助用户观察:

发生了什么事情
我产生了什么自动化想法
这个想法带来了什么情绪
其中是否存在片面或极端的认知方式
有哪些证据支持或反对这个想法
能否形成更加平衡的新认知

在 CRBot 中,这个过程被拆成三个阶段:

阶段目标系统主要任务
Stage 1:识别明确场景、情绪、自动化想法和可能的认知扭曲引导用户把模糊感受表达得更具体
Stage 2:辩驳寻找支持与反对原有想法的证据使用苏格拉底式提问促进自主思考
Stage 3:重构建立更加客观、平衡的新认知总结前面的证据并形成替代性想法

这三个阶段不能简单合并。

如果没有完成识别,后面的辩驳可能针对错误的问题;如果没有充分辩驳,所谓“重构”就容易变成直接灌输积极结论。

因此,CRBot 不是让模型尽快给出答案,而是让模型按照阶段逐步推进。


CRBot 项目总览

项目主要包含三部分能力:

核心认知重构逻辑
多端交互界面
日志与安全机制

系统复现了以下逻辑:

识别 → 辩驳 → 重构

每轮对话都会根据历史上下文判断当前所处阶段,并决定:

继续追问
确认认知扭曲
进入证据分析
引导形成新认知
结束本轮认知重构

系统使用两个串行工作的角色:

Coordinator
负责判断
Facilitator
负责表达

两者通过标准化判定结果连接,而不是分别与用户自由对话。

项目同时支持:

CLI 命令行模式
Gradio Web 可视化模式

CLI 适合开发调试,Web 界面适合演示、观察状态和进行普通交互。

项目主要使用:

Python
Gradio
python-dotenv
OpenAI 兼容 API
Qwen3.7-Max
JSON 会话日志

系统没有进行模型微调,主要依靠提示词、状态机和程序逻辑约束模型行为。


CRBot 最核心的设计,是将流程判断和自然语言生成解耦。

如果只使用一个大模型,它需要同时完成:

理解用户状态
判断认知扭曲
判断当前阶段
决定下一步策略
组织自然语言
维持共情语气
遵守安全规则

这些目标之间可能发生冲突。

例如,模型为了让回复显得自然,可能提前跳到建议阶段;也可能为了快速结束任务,直接替用户总结出一个“正确答案”。

双 Agent 架构将复杂任务拆成两个相对明确的子任务。

Coordinator 类似系统的“调度器”。

它负责:

读取对话历史
识别可能的认知扭曲
判断用户是否完成当前任务
决定继续当前阶段还是进入下一阶段
输出标准化判定结果

Coordinator 不负责直接面向用户生成长文本。

它的输出更接近:

继续澄清情境
确认认知扭曲
进入证据辩驳
继续寻找反例
进入平衡认知重构

Facilitator 类似系统的“执行器”。

它接收:

Coordinator 的判定结果
当前 Stage
对话历史
用户最新输入

然后生成符合当前任务的自然语言回复。

Facilitator 主要负责:

共情回应
澄清问题
苏格拉底式提问
总结用户提供的证据
引导用户形成新的平衡认知

这种分工让 Coordinator 关注流程正确性,让 Facilitator 关注表达自然度。


五、系统核心:cr_step 的完整生命周期

Section titled “五、系统核心:cr_step 的完整生命周期”

CRBot 核心架构与 cr_step 生命周期

我将单轮认知重构逻辑统一封装在 cr_step 中。

无论用户通过 CLI 还是 Web 界面输入内容,底层最终都会调用同一套核心逻辑。

一次 cr_step 大致经历五个步骤。

系统首先调用 safety_check 对输入进行前置检查。

用户输入
风险检测
安全:进入正常流程
风险命中:停止普通认知重构流程并显示安全提示

安全检查必须位于模型生成之前,不能只依靠对话模型在回复阶段自行判断。

安全检查通过后,Coordinator 会读取:

历史对话
当前阶段
用户最新输入
阶段规则
认知扭曲定义

然后输出当前轮次的标准化决策。

Facilitator 根据 Coordinator 的决策生成自然语言回复。

这样可以避免 Facilitator 自行决定流程,使其更专注于:

回复是否自然
问题是否清晰
语气是否尊重
是否给用户保留自主思考空间

系统根据 Coordinator 的判定更新全局阶段。

Stage 1
↓ 条件满足
Stage 2
↓ 条件满足
Stage 3
↓ 完成本轮任务
结束或新建会话

如果当前条件没有满足,系统会继续停留在原阶段,而不是强制推进。

最后,系统会将本轮信息写入 JSON 日志。

日志可以保存:

用户输入
Coordinator 判定
Facilitator 回复
当前 Stage
认知扭曲标签
风险状态
时间信息

这样后续可以回放对话、检查错误并分析模型行为。


CRBot 复现项目工作流程

整个系统采用串行闭环结构:

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 result

Coordinator 的提示词包含两类知识:

认知扭曲的定义与判断规则
三阶段认知重构的推进条件

模型需要将复杂的自然语言对话压缩成结构化结果。

例如:

{
"stage": 1,
"decision": "continue_clarification",
"distortion": "catastrophizing",
"risk": "normal"
}

结构化输出有几个好处:

  1. 便于程序解析。
  2. 便于记录日志。
  3. 便于限制模型输出范围。
  4. 便于判断阶段变化。
  5. 便于对错误分类进行单独测试。

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。

它真正的核心是:

将认知重构中的专业流程拆解为可以被大语言模型执行、被程序检查、被日志追踪的标准化任务。


心理健康对话具有较高的敏感性,因此系统不能只关注回复质量。

当前项目将安全检查放在核心流程之前:

用户输入
安全检查
普通情况:进入认知重构
高风险情况:中断普通流程,显示明确的安全提示

同时,系统还需要遵守几个边界:

  1. 不把模型输出包装成医学诊断。
  2. 不声称系统具有已经验证的临床疗效。
  3. 不鼓励用户依赖机器人替代专业帮助。
  4. 不在缺少人工监督时处理复杂或紧急情况。
  5. 不将敏感会话数据默认上传或公开。

日志虽然有利于调试,但也会带来隐私风险。

因此,真正部署时还需要进一步增加:

日志脱敏
本地加密
访问控制
数据保留期限
用户删除机制
模型供应商的数据策略说明

CRBot CLI 与 Web 界面对比

项目提供两种交互入口。

CLI 适合:

快速启动
Prompt 调试
查看原始输出
批量测试
自动化脚本集成

示意命令:

Terminal window
python crbot_cli.py --mode debug

调试模式可以输出更多中间信息,例如:

当前 Stage
Coordinator 原始判定
识别出的认知扭曲
风险状态
Facilitator 最终回复

CLI 的优势是结构简单,不需要前端渲染,便于定位问题究竟出现在模型调用、格式解析还是阶段更新。

Web 界面更适合日常体验和项目展示。

界面可以展示:

对话区域
当前认知重构阶段
识别出的认知扭曲标签
风险等级
模型处理状态
新建会话按钮

相较于纯文本终端,Web 界面让系统内部状态更加直观。

这对 CRBot 尤其重要,因为用户不仅需要看到“模型说了什么”,还需要知道:

系统目前正在完成什么任务
为什么仍然停留在当前阶段
是否已经进入下一阶段

十二、Stage 1:识别情境与自动化想法

Section titled “十二、Stage 1:识别情境与自动化想法”

CRBot Stage 1 效果展示

Stage 1 的目标是建立认知重构所需的基本信息。

系统会逐步确认:

发生了什么
用户当时产生了什么想法
这个想法对应什么情绪
想法中是否存在明显的认知偏差

这一阶段最容易出现的问题,是用户只表达笼统感受,例如:

我感觉很糟
我什么都做不好
最近所有事情都不顺利

这些表达包含重要情绪,但还不足以直接进入证据分析。

因此,Facilitator 需要继续澄清具体事件和核心想法,让后续辩驳围绕一个明确命题展开。


十三、Stage 2:寻找支持与反对证据

Section titled “十三、Stage 2:寻找支持与反对证据”

CRBot Stage 2 效果展示

Stage 2 是认知重构的核心阶段。

系统不会直接告诉用户“你的想法是错误的”,而是通过问题引导用户检查证据。

这一阶段通常关注:

支持原想法的事实
不支持原想法的事实
被忽略的例外
其他可能解释
绝对化表达是否成立

这里需要避免对话权力失衡。

如果模型不断使用带有预设答案的问题,用户可能只是在配合模型,而不是真正完成自主思考。

因此,Facilitator 应尽量保持开放性,让用户自己发现原有结论中的片面部分。


十四、Stage 3:形成平衡的新认知

Section titled “十四、Stage 3:形成平衡的新认知”

CRBot Stage 3 效果展示

Stage 3 的目标不是把负面想法改成完全相反的积极想法。

更合理的重构结果应该满足:

能够承认现实困难
能够纳入前面找到的反例
减少绝对化和灾难化表达
具有一定可信度
能够由用户本人接受

例如,系统不应该简单生成:

我一定会成功,一切都会变好。

而应该帮助用户形成更加平衡的表达:

这次结果没有达到预期,但它不能证明我永远做不好。
我仍然可以分析原因,并通过下一次行动验证自己的能力。

重构的重点不是“更积极”,而是“更完整、更符合证据”。


CRBot 与原论文的对齐和偏离

为了保证复现具有参考价值,我将实现分成“严格对齐”和“工程适配”两部分。

项目保留了论文中的核心逻辑:

Coordinator 与 Facilitator 双 Agent 串行协作
认知重构三阶段自动流转
Coordinator 使用标准化输出
安全风险前置检测
根据论文附录复用核心英文 Prompt

这些内容决定了 CRBot 的基本实验假设,因此不应随意修改。

受实际开发环境限制,项目进行了两项主要调整。

原论文使用 GPT-4,本项目使用 Qwen3.7-Max 进行实现。

因此,本项目验证的是:

双 Agent 与 Prompt 结构能否在替代模型上运行

而不是证明不同模型具有完全一致的心理对话表现。

原论文重点讨论系统设计与实证评估,本项目额外增加了 Gradio Web 界面。

Web 界面没有改变认知重构核心逻辑,只是增加了:

状态可视化
风险提示
阶段标签
会话重置
更友好的交互入口

这种做法保留了论文的核心机制,同时让项目更适合实际演示和后续测试。


十六、专家评审揭示的四类风险

Section titled “十六、专家评审揭示的四类风险”

论文中的专家评审指出,LLM 心理对话工具即使流程基本正确,也可能出现一些隐蔽问题。

模型频繁使用空泛的肯定和赞美,却没有真正回应用户表达的困难。

问题不在于语气积极,而在于积极表达缺少上下文依据,容易让用户感到真实情绪被忽略。

模型可能通过诱导式提问暗示所谓“标准答案”,或者以权威口吻直接替用户作出判断。

认知重构应该帮助用户自主检查想法,而不是让用户服从 AI 的结论。

大模型可能只根据单句话进行分类,忽略前后语境、矛盾情绪和表达中的不确定性。

因此,Coordinator 必须读取完整对话历史,Facilitator 也应允许用户修正系统的理解。

流程化设计能够提高稳定性,但过度依赖固定问题也会让对话变成问卷。

这意味着 CRBot 需要在两个目标之间取得平衡:

流程可控
自然灵活

双 Agent 架构提供了基础,但不能自动解决所有临床交互问题。


完成 CRBot 复现后,我认为它的价值主要体现在四个方面。

将判断和语言生成拆开后,系统逻辑更容易理解,也更方便分别测试。

在不微调模型的情况下,仅依靠提示词和状态控制,就可以构建一个具有明确任务流程的对话原型。

每轮对话都可以追踪:

Coordinator 为什么作出某个判断
Facilitator 根据什么任务生成回复
Stage 为什么发生变化

CLI 和 Web 界面可以支持:

功能测试
Prompt 对比
模型对比
对话质量评估
专家审阅
小规模可用性研究

但这些价值属于研究与工程层面,不能直接等同于已经获得临床疗效验证。


目前项目仍然存在明显限制。

当前复现重点是功能闭环和交互演示,还没有完成大规模对话测试、人工评分和统计分析。

Qwen3.7-Max 与原论文模型在指令遵循、情绪理解和长上下文表现上可能不同。

简单的关键词或单模型判定不能覆盖所有风险情况,真正部署需要更完善的多层安全机制。

真实心理对话可能出现反复、回退和多问题交织,而当前状态机更接近线性流程。

心理干预系统的 Prompt、评估指标和安全边界需要心理学专业人员共同设计,仅靠工程视角不足以支撑实际应用。


接下来我准备从几个方面继续优化。

重点针对以下问题增加约束:

空泛赞美
诱导式提问
过度权威表达
忽略上下文
直接替用户生成结论

将当前 Stage 扩展为更细的会话状态,例如:

情境是否明确
自动化想法是否明确
情绪是否明确
认知扭曲是否确认
支持证据是否充分
反对证据是否充分
新认知是否由用户认可

这样可以减少仅使用单一 Stage 变量带来的信息损失。

构建覆盖不同场景的测试对话,检查:

Coordinator 分类准确性
阶段跳转是否合理
结构化输出是否稳定
Facilitator 是否违反提示规则
安全机制是否正确触发

在相同 Prompt 和流程下,对比不同模型的:

格式遵循率
阶段判断一致性
回复相关性
共情表达
调用成本
响应延迟

邀请具有心理学背景的评审者,从以下维度进行文本盲审:

流程合规性
提问质量
情绪理解
自主性保护
潜在风险
整体可用性

进一步增加:

本地模型支持
敏感字段脱敏
日志加密
用户数据删除
模型调用审计

CRBot 当前已经形成了一个完整的研究原型闭环:

用户输入
安全预检
Coordinator 决策
Facilitator 生成
三阶段状态流转
日志记录
CLI / Web 展示

这个项目让我对 Agent 系统有了更具体的认识。

Agent 的价值不只是让多个模型角色轮流说话,而是:

将复杂任务拆成职责明确的节点
为节点设计可检查的输入输出
使用程序逻辑控制任务推进
保留完整的中间状态和运行记录

CRBot 的双 Agent 架构正是这种思想的一个具体例子。

Coordinator 负责判断“下一步应该做什么”,Facilitator 负责决定“这一步应该怎样表达”,状态机负责保证流程不会随意偏航。

最终,这个项目验证了一个重要思路:

大语言模型可以通过合理的任务拆解、提示词约束和状态管理,参与结构化认知重构流程;但心理健康场景中的有效性、安全性和伦理边界,仍然需要专业评估、长期验证和严格监管。