如何制作一个聊天机器人？
泻药。笔者做过几年对话系统，最近在做新闻的ChatBot，这里给出一点点个人想法。 如果你对chatbot零基础，要用至少三天学完ChatBot基础。决定做什么以后，单独抽出一天确定业务方向，然后开始实现。 具体流程如下。 现在来看看题主的需求。 题主的业务是个很典型的Personalized ChatBot，所谓的“在聊天中教他说话”本质是训练一个Style Transfer Model，而且是在聊天的过程中做Incremental Learning。所以，你的对话机器人可以直接使用Pre-trained大语言模型（BERT/GPT-2量级），在ChatBot生成回复后过一遍风格转换。 如果不仅想要教Style，还想教知识，那渐进式教学太慢了，需要自己做个训练集Fine-tune，数据集格式见MultiWOZ；Fine-tune技巧搜文献，两个关键词一起搜：“Fine-tune”，“Q&A”，有大量文献。 闭源API不行。很简单的例子，现在有一个业务：同事给你发消息问你下午三点有没有空开会，你的ChatBot要从MySQL里面读数据。小微做不到，各种闭源API都做不到，且request的feature基本会被ignore。RASA开源，灵活度高很多。 七天学基础定方向。用RASA的工作量充其量五六周的Full-time。自己造轮子大约需要四五个月Full-time出prototype，模型调优估计需要追加一个月。客观地讲，如果做好文献调研，做做横向比较，提出几个novel的点，这会成为一篇非常优秀的顶会论文。 一篇ACL2020（NLP顶会）就做了一个新闻ChatBot，如果你用到了QA的DST，可以参考，文章解析如下。 如果想要更好地理解文章，可以先看一下会议Record：What’s The Latest? A Question-driven News Chatbot Paper地址：https://arxiv.org/pdf/2105.05392.pdf 这项工作描述了一个自动新闻聊天机器人，它从各种新闻文章中提取内容，并与用户就新闻创建对话。 该系统的关键组件包括将新闻文章自动组织到主题聊天室中，将自动生成的问题集成到对话中，以及一种用于选择提出哪些问题以避免重复建议的新方法。 我们描述了算法框架并展示了可用性研究的结果，该研究表明使用该系统的新闻读者成功地参与了有关特定新闻故事的Multi-turn对话。 聊天机器人提供了交互式信息访问的能力，这在新闻领域可能具有很大的价值。 当用户阅读新闻内容时，互动可以让他们提出明确的问题并深入了解选定的主题。 当前的新闻聊天机器人功能有限，内容由新闻机构成员手工制作，不能接受自由形式的问题。 为了满足这一需求，我们设计了一种与大型新闻集合交互的新方法。 我们设计、构建和评估了一个完全自动化的新闻聊天机器人，它的内容基于来自各种英语新闻来源的新闻文章流。 这本身就是一个新颖的贡献。 我们的第二个贡献是关于聊天机器人对话的范围。 该系统将新闻文章组织到聊天室中，每个聊天室都围绕一个故事展开，这是一组关于某个主题的自动分组的新闻文章（例如，与英国脱欧相关的文章）。 第三个贡献是跟踪对话状态以避免重复信息的方法。 对于每个新闻报道，我们首先生成一组基本问题，并将每个问题与回答它的内容联系起来。 我们的基本想法是：如果两个内容回答相同的问题，则它们是冗余的。 当用户阅读内容时，系统会跟踪哪些问题已经（直接或间接）用目前阅读的内容回答，哪些问题仍未回答。 我们通过可用性研究来评估系统。 系统demo：https://newslens.berkeley.edu/ （好像down了） 演示视频：https://www. youtube.com/watch?v=eze9hpEPUgo 本节介绍聊天机器人的组件：内容源、用户界面、支持的用户操作和计算的系统答案。 附录 A 列出了系统中使用的库和数据资源。 我们从一组新闻源中形成聊天机器人的内容。 从 2010 年开始，我们平均每天从 20 个国际新闻来源收集 2,000 篇新闻文章。新闻文章被聚集成故事：关于类似不断发展的主题的新闻文章组，每个故事都会自动命名（Laban 和 Hearst，2017 ）。 撰写本文时的一些热门故事如图 1(a) 所示。 聊天机器人支持信息搜索：用户在搜索信息，系统以新闻内容的形式传递信息。 主页（图 1（a））列出了最活跃的故事，用户可以选择一个故事进入其各自的聊天室（图 1（b））。 划分为特定故事的房间实现了两个目标：(1) 对用户的清晰度，因为聊天室允许用户退出和进入聊天室以返回对话，以及 (2) 限制每个对话的范围对双方都有帮助可用性和技术观点，因为它有助于减少歧义和搜索范围。 例如，回答这样的问题：“到目前为止，保险公司的总成本是多少？” 与所有新闻相比，知道范围是澳大利亚大火时更容易。 故事中的文章被分组为事件，对应于在特定时间和地点发生的动作。 对于每个事件，系统通过结合抽象摘要模型生成的事件的新闻文章标题来形成事件消息（Laban 等人，2020）。 图 1(b) 中的区域 2 给出了事件消息的示例。 事件消息形成故事中的时间线。 由于各自角色的不同，我们希望用户消息比系统响应短，我们的目标是在 30 个单词左右。 在对话期间，用户可以在不同种类的动作中进行选择。 探索事件时间线。聊天室对话从系统显示故事的两个最新事件消息开始（图 1(b)）。这些消息为用户提供了开始对话所需的最少上下文。当事件时间线包含两个以上的事件时，对话顶部会添加一个“查看以前的事件”按钮，允许用户进一步返回故事的事件时间线。 澄清一个概念。用户可以询问有关个人或组织（例如，丹尼斯·穆伦堡是谁？）、地点（例如，黎巴嫩在哪里？）或首字母缩略词（例如，北约代表什么？）的澄清问题。对于预定的问题列表，系统将查看是否存在适当的 Wikipedia 条目，并将以 Wikipedia 页面的前两段进行响应。对于地理实体，系统会在可能的情况下另外使用地理地图进行响应。 问一个开放式问题。文本框（图 1(b) 中的区域 4）可用于询问有关故事的任何自由形式的问题。第 3 节中描述的问答系统试图在故事的任何新闻文章的任何段落中找到答案。如果问答系统达到至少一个包含问题答案的段落的置信水平，则聊天机器人系统使用其中一个段落回答问题。在系统回复中，问答选择的答案以粗体显示。图 1(c) 显示了几个问答交流。 选择一个推荐的问题。在对话的底部（图 1(b) 中的区域 3）向用户建议由第 3 节中描述的算法生成的三个问题的列表。单击推荐的问题对应于以自由形式提出问题。但是，由于提前知道推荐的问题，我们会预先计算他们的答What’s The Latest? A Question-driven News Chatbot案，以最大限度地减少用户等待时间。 对话系统中的一个关键问题是跟踪传达的信息，并避免系统回复中的重复（参见图 2 中的示例）。 这个问题在新闻环境中被放大，不同的新闻机构冗余地覆盖内容。 我们提出了一个利用问答 (Q&A) 系统的解决方案。 如上所述，激励的想法是，如果两个内容回答相同的问题，则它们是多余的。 在图 2 的示例中，两个系统消息都回答了同一组问题，即：“火灾是什么时候开始的？”、“有多少人死亡？” 和“烧了多少公顷？”，因此可以认为是多余的。 我们跟踪新闻对话的知识状态的过程包括以下步骤：（1）生成涵盖故事中知识的候选问题，（2）构建连接段落与他们回答的问题的图表，（3）在对话期间， 使用图表来跟踪已经回答的问题，并避免使用不回答新问题的段落 问题候选生成。 我们使用 SQuAD 2.0 数据集（Rajpurkar 等人，2018 年）针对问题生成任务对 GPT2 语言模型（Radford 等人，2019 年）进行了微调。 在训练时，模型从训练集中读取一个段落，并学习生成与该段落相关的问题。 对于故事的每篇文章（段落集）中的每个段落，我们使用束搜索来生成 K 个候选问题。 根据我们的经验，使用大光束尺寸（K=20）很重要，因为一个段落可以产生几个有效的问题。 束搜索强制探索，束搜索的第一步通常包含几个疑问词（什么，哪里......）。 对于给定的段落，我们通过删除词法接近的问题（最多相差 2 个单词）和删除太长（>12 个单词）或太短（<5 个单词）的问题来减少问题集。 构建 P/Q 图。我们训练了一个标准问答模型，一个在 SQuAD 2.0 上微调的 Roberta 模型（Liu 等人，2019 年）（Rajpurkar 等人，2018 年），并使用该模型构建段落/问题二分图（P/Q 图）。在 P/Q 图中，如果 Q&A 模型确信段落 P 回答了问题 Q，我们将任何段落（P 节点）与问题（Q 节点）连接起来。获得的示例二分图如图 3 所示，其中左边的问题集，右边的段落集，它们之间的边缘表示模型对答案的信心。 因为我们在生成问题时使用了较大的光束大小，所以我们对问题集执行了修剪步骤。我们的剪枝过程基于这样一种认识，即如果两个问题连接到相同的段落子集（它们涵盖相同的内容），则它们是多余的。我们的目标是找到涵盖所有段落的最小问题集。这个问题可以表述为一个标准的图论问题，称为集合覆盖问题，我们使用标准的启发式算法（Caprara et al., 1999）。剪枝后，我们得到一个最终的 P/Q 图，它是原始的子图，仅由覆盖集问题组成。 P/Q 图体现了有趣的属性。首先，问题节点的程度衡量不同段落回答问题的频率，从而衡量问题对故事的重要性。段落节点的程度表明它回答了多少不同的问题，估计它与潜在读者的相关性。最后，该图可以用来衡量问题的相关性：如果两个问题有非空的相邻集（即，一些段落同时回答了两个问题），它们很可能是相关问题，这可以作为一种建议跟随的方式——提出问题。 使用 P/Q 图。在对话开始时，没有回答任何问题，因为没有向用户显示任何段落。因此，系统初始化一个空白的 P/Q 图（图 3 中的左图）。当系统显示对话中的段落时，它们在 P/Q 图表中被标记为已读（图 3 右侧图表中的蓝色阴影段落）。根据我们的问答模型，任何与阅读段落相关的问题都会得到回答，因此我们将阅读段落的所有邻居标记为已回答问题（图 3 右侧图表中的蓝色阴影问题）。在对话的任何阶段，如果一个段落仅与已回答的问题相关联，则它被认为是无信息的，因为它不会揭示新问题的答案。 随着对话的进行，阅读更多的段落，增加了回答问题的数量，这反过来又增加了无信息段落的数量。我们对系统进行编程，以优先考虑回答最多未回答问题的段落，并忽略无信息的段落。我们进一步使用 P/Q 图向用户推荐问题。我们选择未回答的问题并优先考虑与更多未读段落相关的问题，一次推荐三个问题。 我们进行了一项可用性研究，参与者被随机分配到三种配置中的一种： • TOPQR：根据第 3 节中的算法（N=18），推荐的问题信息量最大， • RANDQR：推荐的问题是从TOPQR 不会选择的问题中随机抽取的（但是，这组中会出现接近重复的问题）（N=16）， • NOQR：不推荐问题，问题推荐模块（图 1(b) 中的区域 3）被隐藏（N=22）。 将这些进行对比是为了测试 (a) 显示自动生成的问题是否对新闻读者有益，以及 (b) 针对没有对话状态的类似问题推荐方法评估问题跟踪算法。 我们使用 Amazon Mechanical Turk 招募参与者，将任务限制在以前完成 1500 项任务 (HIT) 且接受率至少为 97% 的英语国家的工人。每位参与者的固定费用为 2.50 美元，研究总共持续 15 分钟。在学习过程中，参与者首先通过系统介绍，然后阅读新闻 8 分钟，最后完成一个简短的调查。 在 8 分钟的新闻阅读过程中，参与者被要求从 20 个最近活跃的新闻故事列表中选择至少 2 个故事来阅读。1 参与者被提示选择他们感兴趣的故事。 调查由两个部分组成：满意度部分和一般自由形式反馈部分。使用标准的用户交互满意度问卷 (QUIS) (Norman et al., 1998) 调查参与者的满意度。 QUIS 是一系列关于系统可用性的问题（易用性、学习曲线、错误信息的清晰程度等），采用 7 点李克特量表回答。我们通过添加关于问答的两个问题来修改 QUIS：“建议的问题清楚吗？”和“问题的答案是否提供信息？”共有 56 名参与者完成了这项研究。我们报告系统的使用情况、QUIS 满意度结果和参与者的文字评论。 我们观察到启用 QR 的界面（TOPQR 和 RANDQR）的参与者比 NOQR 设置的对话时间更长，在 TOPQR 设置中平均聊天室对话长度为 24.9 条消息。尽管 TOPQR 设置的平均对话长度比 RANDQR 长，但这在统计上并不显着。 这种对话长度的增加主要是由于使用了推荐问题，方便点击。事实上，用户在 RANDQR 中平均点击了 8.2 个问题，在 TOPQR 中平均点击了 11.9 个问题。 NOQR 参与者平均自己写了 2.2 个问题，在统计上并不高于 TOPQR (1.5) 和 RANDQR (1.1)，这表明看到推荐的问题并不会阻止参与者提出自己的问题。 在测量系统回答参与者问题的延迟时，我们观察到 TOPQR（1.84 秒）和 RANDQR（1.88 秒）设置的平均等待时间明显低于 NOQR（4.51 秒）。这种加速是由于我们能够预先计算推荐问题的答案，这是 QR 图预先计算的另一个好处。 总体而言，启用问题推荐的系统（TOPQR 和 RANDQR）在大多数度量上获得了比 NOQR 设置更高的平均满意度。 也就是说，仅在 TOPQR 和 NOQR 之间的 4 个案例中观察到统计显着性，参与者认为 TOPQR 界面更刺激和更令人满意。 虽然没有统计学意义，但参与者对 TOPQR 的建议问题的评分几乎比 RANDQR 高 1 分，这提供了一些证据，表明将过去查看的信息纳入问题选择是有益的。 参与者认为答案在 TOPQR 设置中提供更多信息。 我们将此解释为 QR 模块有助于教用户系统可以回答哪些类型的问题的证据，使他们能够获得更好的答案。 几位 NOQR 参与者问“我能问什么？” 或同等学历。 56 名参与者中有 34 名选择通过开放式文本框提供一般性反馈。我们将回复标记为主要主题： 最常提到的限制是与问答相关的错误，随着自动化问答的继续进行，我们希望减轻这一限制。 新闻聊天机器人。几家新闻机构已经冒险进入对话界面领域，以吸引新的观众。聊天机器人通常是针对对话媒体进行手动策划的，而高级 NLP 机器（例如问答系统）并未整合到聊天机器人中。 在 BBC 的 Messenger chatbot2 上，用户可以输入搜索查询，例如“最新消息”或“英国脱欧新闻”，并获取符合搜索条件的最新 BBC 文章列表。在 Quartz3 制作的聊天机器人中，记者以预先写好的对话（又名选择你自己的冒险）的形式手工制作新闻故事。在每一轮，用户都可以从回复列表中进行选择，从而决定遵循对话文章的哪个轨道。 CNN4 还尝试了选择你自己的冒险文章，增加了闲聊的能力。 相关问答数据集。 NewsQA (Trischler et al., 2017) 通过让众包工作人员阅读新闻文章的摘要并提出后续问题来收集数据集。随后的群众工作者回答了这个问题或将其标记为不可回答。 NewsQA 的目标是收集数据集，我们专注于为带有 Q&A 组件的新闻构建一个可用的对话界面。 CoQA (Reddy et al., 2019) 和 Quac (Choi et al., 2018) 是为在对话上下文中回答问题而收集的两个数据集。对于这两个数据集，两个群众工作者（一个学生和一个老师）就一段文本（在 Quac 中对学生隐藏）进行对话。学生必须向老师提问，老师使用文件的摘录进行回答。在我们的系统中，用户提出的问题会被自动回答，从而引入潜在的错误，用户可以选择提问或不提问。 在这项工作中，重点不是收集自然出现的问题，而是将问答系统应用于新闻对话系统，并观察其使用程度。 问题生成 (QG) 已成为文本生成的活跃领域。一种常见的方法是使用序列到序列模型 (Du et al., 2017)，对段落（或上下文）、可选目标答案（answer-aware (Sun et al., 2018)）进行编码，并解码成对的问题。这种常见的方法侧重于从单个上下文（通常是段落）生成单个文章。我们认为，我们将 QG 问题构建为跨越多个（可能是冗余的）文档的一系列问题的生成是一项新颖的任务。 Krishna 和 Iyyer (2019) 构建了为单个文档生成的问题层次结构；然后将文档重组为“压缩”文档，其中段落和问题交错排列。因为我们的方法是基于使用多个文档作为源，将所有问题编译到一个文档中会很长，所以我们选择了聊天机器人。 在可用性研究期间，我们从用户那里获得了直接和间接的反馈，我们总结了系统中可以解决的限制。 无法处理闲聊。 4 名参与者试图与聊天机器人闲聊（例如，问“你好吗”）。 该系统通常反应不充分，称它不理解该请求。 未来的工作可能包括温和地将参与闲聊的用户引导到闲聊风格的界面。 问答系统不准确。 32% 的参与者提到答案通常偏离轨道或无关紧要。 这表明需要进一步改进问答系统。 处理错误。 在当前框架内，错误是必然会发生的，简化用户的恢复路径可以改善用户体验。 我们展示了一个完全自动化的新闻聊天机器人系统，该系统平均每天利用来自不同来源的 2,000 篇新闻文章来构建重要新闻故事的聊天室。 在每个房间中，系统都会记录已生成的已回答问题，以尽量减少对新闻阅读器的重复信息。 一项可用性研究表明，当聊天机器人推荐问题时，新闻阅读者往往会进行更长的对话，平均交换 24 条消息。 这些对话包括推荐的和用户创建的问题的组合。 所述系统中使用的库和数据源如下： Transformers library 用于训练基于 GPT2 的问题生成模型和基于 Roberta 的 Q&A 模型。 spaCy library 用于进行命名实体提取、短语和关键字提取。 Wikidata 用于实体链接和收集用于特殊情况问题的相关维基百科页面的文本内容。 MongoDB 和 Flask 用于存储内容并将其提供给用户。 SetCoverPy 用于在 Python 中实现标准集覆盖算法。 系统使用的数据集中存在的新闻来源列表，按字母顺序排列：Aa.com.tr、Afp.com、Aljazeera.com、Home、Apnews.com、Bbc.co.uk、Bloomberg.com、Chicagotribune .com、Redirecting ...、Cnet.com、Cnn.com、Foxnews.com、France24.com、Independent.co.uk、Indiatimes.com、Latimes.com、News from Latin America and Mercosur、Middleeasteye.net、Nytimes.com , Reuters.com, Rt.com, Yahoo, Telegraph.co.uk, Theguardian.com, Washingtonpost.com