DeepQA
DeepQA 是一个基于 TensorFlow 开源实现的智能对话机器人项目,旨在复现谷歌著名的“神经对话模型”研究成果。它利用循环神经网络(RNN)中的序列到序列(seq2seq)架构,让机器能够理解上下文并生成自然流畅的回复,从而解决传统规则式聊天机器人回答生硬、缺乏灵活性的问题。
该项目支持多种高质量对话语料库,包括默认的康奈尔电影对白数据集,以及 OpenSubtitles、最高法院辩论记录和 Ubuntu 技术问答数据等,用户也可以轻松导入自定义数据进行训练。为了提升效率,DeepQA 还兼容预训练词向量,并提供了从命令行交互到 Django Web 界面的多种运行方式,甚至支持 Docker 一键部署。
DeepQA 特别适合人工智能开发者、深度学习研究人员以及希望探索自然语言处理(NLP)的学生使用。通过它,用户可以深入研究端到端的对话生成机制,快速搭建自己的聊天机器人原型,或对比不同语料对模型效果的影响。作为一个结构清晰的教育级项目,DeepQA 为理解现代神经对话系统提供了宝贵的实践入口。
使用场景
某初创团队希望为他们的在线电影社区快速构建一个能陪用户聊剧情、角色和经典台词的互动机器人,但缺乏大量标注数据和深厚的 NLP 算法积累。
没有 DeepQA 时
- 开发团队需从零搭建复杂的序列到序列(Seq2Seq)模型架构,耗费数周时间调试 TensorFlow 代码。
- 缺乏现成的高质量对话语料库支持,只能手动收集或清洗少量数据,导致机器人回答生硬且语境单一。
- 无法直观监控训练过程,难以判断模型是否收敛,经常需要盲目调整超参数,算力资源浪费严重。
- 部署交互界面门槛高,需额外开发前端和后端接口,迟迟无法让内部测试人员体验实际效果。
使用 DeepQA 后
- 直接复用基于 TensorFlow 复现的成熟 RNN 架构,只需运行
main.py即可启动训练,将研发周期从数周缩短至几天。 - 内置康奈尔电影对话语料库(Cornell Movie Dialogs),机器人天生具备丰富的影视知识,能自然讨论剧情与台词。
- 提供详细的训练进度条和中间结果预览功能,团队可实时观察模型“进化”过程,精准优化词汇过滤等参数。
- 自带基于 Django 的 Web 接口,配置 Redis 后即可立即在浏览器中与机器人进行交互式测试,快速验证想法。
DeepQA 通过提供开箱即用的深度学习对话框架和预置影视语料,让开发者无需重复造轮子,即可低成本构建具备特定领域知识的智能聊天机器人。
运行环境要求
- 未说明 (支持 Docker)
- 非必需,但推荐使用 NVIDIA GPU 加速训练
- 需安装 CUDA(README 未指定具体版本,测试环境为 TensorFlow 1.0)
未说明

快速开始
深度问答
目录
简介
本项目旨在复现 A Neural Conversational Model(即谷歌聊天机器人)的研究成果。它使用 RNN(seq2seq 模型)进行句子预测,开发语言为 Python,框架为 TensorFlow。
程序中的语料加载部分受到 Torch 的 neuralconvo 项目的启发,该项目由 macournoyer 开发。
目前,DeepQA 支持以下对话语料库:
- 康奈尔电影对话数据集(默认)。克隆仓库时已包含。
- OpenSubtitles(感谢 Eschnou)。该语料库规模更大,但噪声也更多。要使用它,请按照 这些说明操作,并使用
--corpus opensubs标志。 - 美国最高法院对话数据集(感谢 julien-c)。可通过
--corpus scotus使用。安装说明请参见 这里。 - Ubuntu 对话数据集(感谢 julien-c)。可通过
--corpus ubuntu使用。安装说明请参见 这里。 - 自定义数据集(感谢 julien-c),只需采用简单的自定义对话格式即可(更多信息请参见 这里)。
为了加快训练速度,还可以使用预训练的词嵌入(感谢 Eschnou)。更多信息请参见 这里。
安装
该程序需要以下依赖项(可使用 pip 轻松安装:pip3 install -r requirements.txt):
- Python 3.5
- TensorFlow(已测试 v1.0)
- NumPy
- CUDA(用于 GPU 加速)
- NLTK(自然语言处理工具包,用于对句子进行分词)
- tqdm(用于显示漂亮的进度条)
此外,您可能还需要下载一些额外的数据以使 NLTK 正常工作。
python3 -m nltk.downloader punkt
康奈尔数据集已包含在内。对于其他数据集,请查看各自文件夹(位于 data/ 内)中的 README 文件。
Web 界面还需要一些额外的软件包:
- Django(已测试 1.10 版)
- Channels
- Redis(详情请参见 这里)
- asgi_redis(至少 1.0 版)
此外,还提供 Docker 安装方式。详细说明请参见 这里。
运行
聊天机器人
要训练模型,只需运行 main.py 即可。训练完成后,您可以使用 main.py --test 测试结果(生成的测试结果位于 save/model/samples_predictions.txt)或 main.py --test interactive(更有趣)。
以下是一些可能有用的标志。如需更多帮助和选项,请使用 python main.py -h:
--modelTag <name>:为当前模型命名,以便在测试和训练时区分不同模型。--keepAll:在训练时使用此标志,以便在测试时查看不同步骤的预测结果(例如,随着训练的进行,程序可能会逐渐调整其名称和年龄等信息)。注意:如果不增加--saveEvery选项,存储空间可能会迅速耗尽。--filterVocab 20或--vocabularySize 30000:限制词汇表大小,以优化性能和内存使用。将出现频率低于 20 次的单词替换为<unknown>标记,并设置最大词汇量。--verbose:在测试时,会打印出正在计算的句子。--playDataset:展示来自数据集的一些对话样本(如果这是您唯一想执行的操作,可以与--createDataset结合使用)。
要使用 TensorBoard 可视化计算图和损失函数,只需运行 tensorboard --logdir save/ 即可。
默认情况下,网络架构为标准的编码器/解码器结构,包含两层 LSTM(隐藏层大小为 256),词汇表嵌入维度为 32。网络使用 ADAM 优化器进行训练。最大句子长度设置为 10 个词,但可以增加。
Web 界面
训练完成后,您可以使用更友好的界面与其进行对话。服务器将读取复制到 save/model-server/model.ckpt 的模型文件。首次使用时,您需要先进行配置:
export CHATBOT_SECRET_KEY="my-secret-key"
cd chatbot_website/
python manage.py makemigrations
python manage.py migrate
然后,在本地启动服务器时,使用以下命令:
cd chatbot_website/
redis-server & # 在后台启动 Redis
python manage.py runserver
启动后,界面应可在 http://localhost:8000/ 访问。如果您想将程序部署到服务器上,请使用 python manage.py runserver 0.0.0.0 替代。更多信息请参见 这里。
结果
令人惊讶的是,仅经过1至2小时的训练(在GeForce GT 740M上),就能得到一些结果。方法是将输入序列大幅缩减至5个词、输出缩减至3个词(加上go和eos标记),并使用较小的嵌入维度(比如25)。此后我对代码进行了修改,现在要求输入和输出长度一致,但仍然可以通过这个版本复现最初的效果。
当然,生成的对话并不会特别流畅:
Q: 你好
A: 你好。
Q: 你叫什么名字?
A: 劳拉。
Q: 那是什么意思?
A: 我不知道。
Q: 你多大了?
A: 三十五岁。
Q: 谷歌会雇用我吗?
A: 不会。
Q: 给我说说字母表吧
A: 去你的。
Q: 这可不太礼貌
A: 是啊。
以下是一些它表现不佳的例子:
Q: 劳拉是谁?
A: 我的兄弟。
Q: 说声再见
A: 好吧。
Q: 在煮什么?
A: 一个频道。
Q: 你能说“不”吗?
A: 不。
Q: 二加二
A: 曼尼……
当句子变长时,网络的训练速度会显著降低。在maxLength=10、迭代次数达到25万次后,网络仍然主要给出回避性的回答(对大多数开放式问题都回答“我不知道”),不过似乎已经掌握了一些基本语义:
Q: 烟花什么时候放?
A: 明天。
Q: 什么颜色?
A: 灰色。
Q: 哪个苹果?
A: 那第一个。
Q: 现在几点了?
A: 十一点。
Q: 斯凯沃克是谁?
A: 她是一名自由职业的生物驱魔师。
Q: 约翰是谁?
A: 那位老人。
Q: 珍妮是谁?
A: 自杀的那个男人。
Q: 你什么时候出生的?
A: 很快。
从最后几个问题可以看出,网络在性别以及现在/未来的区分上仍存在混淆。我还尝试了一些更深层次的哲学问题,效果参差不齐:
Q: 拥有智慧的意义是什么?
A: 人类已经过时了。
Q: 什么是不道德的?
A: 真相。
Q: 什么是道德?
A: 最糟糕的。
Q: 存在的意义是什么?
A: 这是私人的。
Q: 如果机器能够思考,会发生什么?
A: 我想我只会和你一起躺着。
我训练的模型受限于所设置的嵌入维度、模型规模以及训练数据集的大小。它的“思维向量”可能也太小,难以应对如下类型的问题:
Q: 我叫大卫。我叫什么名字?
A: 黛比。
Q: 我叫约翰。我叫什么名字?
A: 卡尔·史密斯。
Q: 猫有几条腿?
A: 四条。
Q: 蜘蛛有几条腿?
A: 四条。
Q: 你更喜欢橄榄球还是足球?
A: 威士忌。
此外,模型似乎出现了过拟合现象,有时会直接输出与问题无关的训练集中句子。加入dropout层或许能缓解这一问题。
Q: 我打网球。我在打什么?
A: 我要搞到女人了。
Q: 天空是什么颜色?
A: 其中一名议员无处不在。
预训练模型(已失效)
注意:链接已无法访问。
你可以在这里找到一个基于默认语料库训练的预训练模型,使用方法如下:
- 将压缩包解压到
DeepQA/save/目录下。 - 将预处理后的数据集从
save/model-pretrainedv2/dataset-cornell-old-lenght10-filter0-vocabSize0.pkl复制到data/samples/目录。 - 运行
./main.py --modelTag pretrainedv2 --test interactive。
感谢Nicholas C.,这里(原始链接)提供了一些兼容TF 1.2的额外预训练模型,适用于多种数据集。该文件夹还包含Cornell、OpenSubtitles、Ubuntu和Scotus数据集的预处理版本(需移动至data/samples/目录)。如果你不想自行处理这些数据集,可以使用它们。
如果你拥有高端GPU,不妨尝试调整超参数或更换训练语料,以训练出更好的模型。根据我的实验,学习率和dropout率对最终效果的影响最大。另外,如果你愿意分享自己的模型,请随时联系我,我会在此处补充。
改进
除了尝试更大/更深的模型之外,还有很多小的改进可以尝试。如果你实现了其中任何一项,请随时提交拉取请求。以下是一些想法:
- 目前,预测是确定性的(网络只是选择概率最高的输出),因此在回答问题时,网络总是给出相同的答案。通过添加采样机制,网络可以生成更加多样化(或许也更有趣)的答案。最简单的方法是从 SoftMax 概率分布中采样下一个预测的词。结合
tf.nn.seq2seq.rnn_decoder的loop_function参数,实现起来应该不会太难。之后,还可以调整 SoftMax 的温度参数,以获得更保守或更具创意的预测。 - 添加注意力机制可能会提升预测效果,尤其是在处理较长句子时。只需在
model.py中将embedding_rnn_seq2seq替换为embedding_attention_seq2seq即可实现。 - 通常来说,数据越多越好。使用更大的语料库进行训练应该会带来益处。目前看来,Reddit 评论数据集 是最大的(但对当前程序来说又过于庞大)。另一种人为增加数据集大小的方法是在构建语料时拆分每个训练样本中的句子。例如,对于样本
Q:句子1. 句子2. => A:句子X. 句子Y.,我们可以生成三个新样本:Q:句子1. 句子2. => A:句子X.、Q:句子2. => A:句子X. 句子Y.和Q:句子2. => A:句子X.。注意:其他组合如Q:句子1. => A:句子X.则行不通,因为这会破坏连接问题与答案的过渡关系2 => X。 - 应该像我在另一个 音乐生成 项目中那样,认真监控测试曲线。这将有助于更好地观察 dropout 对过拟合的影响。目前,我们只是通过手动检查不同训练步骤下的测试预测结果来经验性地判断。
- 当前,各个问题之间是相互独立的。要将问题串联起来,一个简单的方法是在生成答案之前,将所有之前的提问和回答一并输入到编码器中。可以在最终的编码器状态上进行缓存,以避免每次都重新计算。为了提高准确性,网络应当基于完整的对话序列进行训练,而不仅仅是单独的问答对。此外,在将历史对话输入编码器时,可以加入特殊的标记
<Q>和<A>,以便编码器能够识别对话双方的切换。不过,我并不确定简单的 seq2seq 模型是否足以捕捉句子之间的长期依赖关系。引入分桶机制,将输入长度相近的数据归为一组,可以显著提升训练速度。
常见问题
相似工具推荐
openclaw
OpenClaw 是一款专为个人打造的本地化 AI 助手,旨在让你在自己的设备上拥有完全可控的智能伙伴。它打破了传统 AI 助手局限于特定网页或应用的束缚,能够直接接入你日常使用的各类通讯渠道,包括微信、WhatsApp、Telegram、Discord、iMessage 等数十种平台。无论你在哪个聊天软件中发送消息,OpenClaw 都能即时响应,甚至支持在 macOS、iOS 和 Android 设备上进行语音交互,并提供实时的画布渲染功能供你操控。 这款工具主要解决了用户对数据隐私、响应速度以及“始终在线”体验的需求。通过将 AI 部署在本地,用户无需依赖云端服务即可享受快速、私密的智能辅助,真正实现了“你的数据,你做主”。其独特的技术亮点在于强大的网关架构,将控制平面与核心助手分离,确保跨平台通信的流畅性与扩展性。 OpenClaw 非常适合希望构建个性化工作流的技术爱好者、开发者,以及注重隐私保护且不愿被单一生态绑定的普通用户。只要具备基础的终端操作能力(支持 macOS、Linux 及 Windows WSL2),即可通过简单的命令行引导完成部署。如果你渴望拥有一个懂你
stable-diffusion-webui
stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。
everything-claude-code
everything-claude-code 是一套专为 AI 编程助手(如 Claude Code、Codex、Cursor 等)打造的高性能优化系统。它不仅仅是一组配置文件,而是一个经过长期实战打磨的完整框架,旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。 通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能,everything-claude-code 能显著提升 AI 在复杂任务中的表现,帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略,使得模型响应更快、成本更低,同时有效防御潜在的攻击向量。 这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库,还是需要 AI 协助进行安全审计与自动化测试,everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目,它融合了多语言支持与丰富的实战钩子(hooks),让 AI 真正成长为懂上
ComfyUI
ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。
markitdown
MarkItDown 是一款由微软 AutoGen 团队打造的轻量级 Python 工具,专为将各类文件高效转换为 Markdown 格式而设计。它支持 PDF、Word、Excel、PPT、图片(含 OCR)、音频(含语音转录)、HTML 乃至 YouTube 链接等多种格式的解析,能够精准提取文档中的标题、列表、表格和链接等关键结构信息。 在人工智能应用日益普及的今天,大语言模型(LLM)虽擅长处理文本,却难以直接读取复杂的二进制办公文档。MarkItDown 恰好解决了这一痛点,它将非结构化或半结构化的文件转化为模型“原生理解”且 Token 效率极高的 Markdown 格式,成为连接本地文件与 AI 分析 pipeline 的理想桥梁。此外,它还提供了 MCP(模型上下文协议)服务器,可无缝集成到 Claude Desktop 等 LLM 应用中。 这款工具特别适合开发者、数据科学家及 AI 研究人员使用,尤其是那些需要构建文档检索增强生成(RAG)系统、进行批量文本分析或希望让 AI 助手直接“阅读”本地文件的用户。虽然生成的内容也具备一定可读性,但其核心优势在于为机器
LLMs-from-scratch
LLMs-from-scratch 是一个基于 PyTorch 的开源教育项目,旨在引导用户从零开始一步步构建一个类似 ChatGPT 的大型语言模型(LLM)。它不仅是同名技术著作的官方代码库,更提供了一套完整的实践方案,涵盖模型开发、预训练及微调的全过程。 该项目主要解决了大模型领域“黑盒化”的学习痛点。许多开发者虽能调用现成模型,却难以深入理解其内部架构与训练机制。通过亲手编写每一行核心代码,用户能够透彻掌握 Transformer 架构、注意力机制等关键原理,从而真正理解大模型是如何“思考”的。此外,项目还包含了加载大型预训练权重进行微调的代码,帮助用户将理论知识延伸至实际应用。 LLMs-from-scratch 特别适合希望深入底层原理的 AI 开发者、研究人员以及计算机专业的学生。对于不满足于仅使用 API,而是渴望探究模型构建细节的技术人员而言,这是极佳的学习资源。其独特的技术亮点在于“循序渐进”的教学设计:将复杂的系统工程拆解为清晰的步骤,配合详细的图表与示例,让构建一个虽小但功能完备的大模型变得触手可及。无论你是想夯实理论基础,还是为未来研发更大规模的模型做准备
