Alpha 是一个机器人,或者更确切地说是构建您自己的基于网络的聊天机器人的基础。我们启动这个项目是因为我们认为聊天机器人非常有帮助并且非常有趣,但是目前的情况是大多数聊天机器人仅限于现有的消息传递平台,例如 Facebook,这很好,但是如果您希望您的机器人生活在其他地方怎么办?网络?
您可以构建自己的机器人并定义自己的视觉样式和规则,并对自定义和逻辑进行无限控制。已经存在各种解决方案,但它们可能具有局限性、成本高昂且难以实施。
这就是 Alpha 派上用场的地方。该库旨在让您以非常简单的方式构建自己的机器人。你只需要:
下载
插入您自己的问答树
插入您自己的颜色和图像
Alpha 负责整个 UI 渲染和应用程序状态的处理。您实际上不需要了解任何 React (或 Javascript)。但是,如果您了解 React 和 Redux,您可以进一步自定义机器人应用程序的渲染,甚至将其连接到您选择的任何后端或 AI 引擎。
安装
自定义对话
提出建议
自定义用户界面
自定义 React 应用程序
发送电子邮件(待定)
连接到任何后端(待定)
连接到 AI 引擎(待定)
Alpha 是为在Docker上运行而构建的。但是,只要您的系统中有NodeJS以及npm或YARN (首选!),您就可以在本地运行它。
要在计算机中安装并运行,只需在终端中运行以下命令。您需要安装 Docker(请参阅下面的说明,了解没有 docker 的情况):
克隆此存储库: git clone https://github.com/IcaliaLabs/alpha.git
导航到目录: cd alpha
安装依赖项: docker-compose run --rm alpha yarn install
然后就可以解除服务器了: docker-compose up alpha
就是这样!如果您在浏览器中打开localhost:3000 *,您应该会看到演示机器人在浏览器中启动并运行。
在开发模式下运行时的几个要点:
机器人应用程序将启用热重载,以便您体验 Webpack + React 的好处。
Redux DevTools默认启用,以便您可以实时检查应用程序的操作/状态变化。
每条机器人消息之间的时间设置为 0 。这是为了最大限度地减少开发人员在一次又一次地检查对话流程时的挫败感,但是如果您愿意,您可以在app/containers/BotContainer/sagas.js
中更改此行为。
Heroku:只需运行git push heroku master
。这个机器人已经为 Heroku 做好了准备!
使用 Docker 本地化:如果您可以编译映像以查看其在生产中的表现,我们也会将构建放在一起。只需运行:
docker-compose up release
它将构建映像并提升生产服务器。
如果您希望在不使用 Docker 的情况下安装和运行,则必须直接在目录中安装所有依赖项:
对于发展:
克隆此存储库: git clone https://github.com/IcaliaLabs/alpha.git
导航到目录: cd alpha
运行npm install
或yarn install
来安装依赖项
运行npm start
启动服务器
在浏览器中访问localhost:3000
对于生产:
这个 repo 已准备好 Heroku,只需执行git push heroku master
即可
如果由于某种原因您更改了package.json
的脚本,请务必在部署到生产服务器之前考虑这些步骤。
对于 AWS,您可以按照此处列出的相同步骤操作
对于 Azure/Softlayer/其他服务器,您必须 ssh 到服务器,拉取存储库,使用yarn
安装依赖项,然后执行npm run build
才能创建./build
文件夹。最后,您可以使用start:prod
启动服务器。或者,只需运行start:production
,它将按顺序一起运行这些步骤以及测试。
机器人所说内容背后的所有逻辑(包括问答逻辑)都位于BotMind内部,该 BotMind 位于app/BotMind/
。我们将每个单独的机器人或用户输入称为“气泡”,因为它们在聊天 UI 中如此呈现。
为了自定义对话,您只需要理解和编辑app/BotMind/_initialBubble.js和app/BotMind/BotMindFlows/index.js 。
BotMind 的主文件是BotMind.js ,但该文件仅充当_initialBubble.js 、 _nextBubble.js和_recommendationBubbles.js中函数的收集器和导出器。这三个文件依次根据app/BotMind/BotMindFlows/
内的问答树执行其逻辑。
您可以在此处设置机器人在初始化或用户选择重新启动对话时在对话树中的哪个点启动。
该文件包含机器人应根据来自机器人或用户的最后一条消息跳转到哪个气泡或对话的逻辑。您实际上并不需要更改此文件,除非您希望深入研究更精细的自定义。请自行承担风险。
当在对话气泡中传递shouldEstimateRecommendation: true
时,此文件执行选择路径的逻辑。该文件根据对话期间包系统累积的积分进行操作。您实际上并不需要更改此文件,除非您希望深入研究更精细的自定义。请自行承担风险。
BotMindFlows 位于app/BotMind/BotMindFlows/
。默认情况下,您只会找到一个index.js
文件,但如果您的对话树开始变得太大,您可以创建自己的文件并使用index.js
使用扩展运算符将它们组合起来,如下所示。
import greetings from './conversation1'; import designSprint from './conversation2'; import designSprintQuestions from './conversation3'; const questions = { ...conversation1, ...conversation2, ...conversation3, } export default questions;
每次 BotMind 分析去哪里(在_nextBubble.js
内)时,它都希望在app/BotMind/BotMindFlows/index.js
内找到问题的哈希值。问题由……你猜对了,单独的问题答案哈希组成。在这里您可以开始制定对话的逻辑和流程。例如,在我们的演示中,您会发现以下内容:
const questions = {start:{botPrompt: "你好人类,我的名字是 Alpha,我是一个很棒的 聊天机器人",answers: [{nextId: "myPurpose"}] },myPurpose:{botPrompt:“我的目标是成为一个简单的聊天机器人,引导用户并且能够做出决策并提出建议。”,answers: [{nextId: "yourName"}]},yourName:{botPrompt: "那么,你叫什么名字?",input: textField(),answers: [ {answer: common_greetings,nextId: "greetings_notAName", }, {answer : common_greetings_negative,catchName: true,nextId: "asYouCanSee", },],}, ...}导出默认问题;
每个问题哈希必须有它自己的唯一 ID 。我们建议您使这些 ID尽可能不言自明,即使这意味着要多写一点,因为随着机器人对话库的增长,记住哪个 ID 做什么可能会成为 A 中的一个痛苦。每个问题哈希都会占用以下选项:
botPrompt([String] 必需):来自机器人的消息
答案([Array] 必需):机器人可能根据用户回答的内容做出不同的响应。该数组由哈希值组成,每个哈希值代表一个可能的对话流结果。 [ answers ] 内的哈希值采用以下选项:
nextId([String] required) :确定如果满足此答案,机器人将导航到哪个对话 ID。在您的机器人发出最后一条消息时或在您跳转到估计推荐之前(见下文) ,您应该传递null
。
answer ([String | RegEx]) :将触发此哈希的用户答案。如果您使用selectField
或tagsField
为用户预定义答案,则可以使用字符串,否则您可能需要使用 RegEx(请参阅示例)。
sumToBags ([Array]) :在这里您可以开始向BagsSystem添加点,以便进行更高级的流程控制和/或发出建议(如果这是您的机器人的目的)。 sumToBags通常如下所示: sumToBags:[{name: "recommendation1", points: 1}, {name: "recommendation2", points: 3}]
catchName ([Boolean]) :将向 React 发出信号,将用户消息中的用户名存储到应用程序状态中。
catchCompanyName ([Boolean]) :与上面相同,但用于公司名称。
catchMail ([Boolean]) :与上面相同,但针对电子邮件地址。
catchPhone ([Boolean]) :与上面相同,但用于电话号码。
shouldEstimateRecommendation ([Boolean]) :将通知BotMind打破常规流程并分析推荐包,以推动对话(参见示例)。
finishConversation ([Boolean]) :将通知机器人完成下一个对话的对话。发生这种情况时,用户输入将被禁用,机器人将“离线”,直到用户选择“重新启动”。
注意 – 如果您的对话部分的 botPrompt 不期望产生后果,您可以像这样传递nextId
:
answers: [ { nextId: "hello" } ]
input ([Object]) :这确定在此botPrompt期间用户可以使用什么类型的输入(文本字段、标签、选择、禁用等)。默认情况下,输入是禁用的文本字段。我们建议您使用index.js
文件开头包含的StateFormatter帮助程序。
type ([String]) :机器人传输的消息类型(“text”、“media”、“link”或“transformedText”)。
varName ([String]) :如果您选择“transformedText”作为输入类型,则可以在botPrompt中写入@varName
,它将引用此选项。当机器人呈现消息时,它将查找存储在React 状态中的变量(见下文)并替换@varName
为该变量的值。
如上所述,您可以选择在 React 状态中存储一些值,然后根据这些值计算反应/流程/推荐。我们称之为袋子系统。
袋子系统的概念是我们预先定义一些“袋子”,随着对话的进行,我们可以用“点”来填充这些“袋子”。最后,当您决定对其中一个问题答案哈希值调用shouldEstimateRecommendation: true
时,将调用_recommendationBubbles.js来执行操作,根据每个包累积的积分来决定接下来要显示的内容。
第一步是在/app/BotMind/recommendationBags.js
定义您将使用的包。如果您没有定义这些包,机器人将会工作,但在您调用addToBags
或shouldEstimateRecommendation
时不知道要做什么。袋子看起来像这样:
const recommendationBags = [ { name: "redWine", defaultValue: 0, goToBubbleId: "redWine_start", }, { name: "whiteWine", defaultValue: 0, goToBubbleId: "whiteWine_start", }, { name: "roseWine", defaultValue: 0, goToBubbleId: "roseWine_start", }, ] export default recommendationBags;
之后,您可以在问答流程中使用addToBags
定义何时添加,例如:
question1:{ botPrompt: "Which of these are you having?", input: selectField(["Red Meat", "Sea Food", "Chicken", "Pasta"]), answers: [ ... { answer: "Red Meat", nextId: "question2", sumToBags:[{name: "redWine", points: 4}, {name: "roseWine", points: 1}] }, ... ] }
当你准备好后,只需调用shouldEstimateRecommendation
如下所示:
question2:{ botPrompt: "What will you serve for dessert?", input: selectField(["Chocolate", ...]), answers: [ ... { answer: "Chocolate", shouldEstimateRecommendation: true, nextId: null, sumToBags:[{name: "redWine", points: 3}, {name: "whiteWine", points: 1}, {name: "roseWine", points: 2}] }, ... ] },
在此示例中,将调用_recommendationBubbles.js
,因此下一个机器人气泡可能是redWine_start
处的气泡。
我们冒昧地预定义了一个 UI,以节省您的时间。
Bot 的绝大多数样式由单个文件/app/customization/styleVariables.js
控制,在这里您可以更改所有元素使用的几乎所有颜色以及 UI 的背景。
如果您希望对 UI 进行进一步更改,您可以直接深入研究样式表文件。 /app/global-styles.js
中有一个全局文件,某些组件或容器在其各自的文件夹中针对特定的模块化组件有自己的styledComponents.js
文件。这些文件使用Styled-Components ,这是一个非常棒的 React/ES6 库(官方认为它是最佳实践辅助工具)。这些文件使用 Javascript 的标记模板文字来用 CSS 插入 JS 变量,但不要惊慌,这些文件几乎可以被视为常规 CSS/SCSS。
注意 - 我们的目的是逐步迁移到 100% 独立、模块化样式的组件,例如/app/components/UserInput/styledComponents.js
中的组件,并删除/app/global-styles.js
中的几乎所有代码
如果仅仅通过摆弄组件的 CSS 不能满足您的定制愿望,您可以随意定制几乎所有其他内容,但除此之外,您将不得不处理应用程序的 React (+Redux) 端(见下文)。
Alpha 的整个 React 方面已经以这个很棒的存储库为基础进行了重构。利用 React 最完善的最佳实践,即使用:
终极版
不可变JS
重新选择
Redux-Saga
样式组件
如果你想摆弄 Alpha 的 React 方面,那么你最好先看看这些文档。
我们确信您希望向机器人的所有者和最终用户发送自动电子邮件,回顾他们的对话等,我们正在研究一种方法来提供最灵活且与后端无关的解决方案,将允许几乎“即插即用”。
现在,您最好的选择是将其连接到某些 Node 或 Express(或 Rails 5.1.x)服务器并利用他们自己的邮件程序解决方案。您可以查看文件/app/BotMind/BotMailer.js
,我们将其用于基于 Rails 的实现,但截至目前,我们已从/app/containers/BotContainer/sagas.js
,所以你必须编写自己的传奇。
该机器人仅基于 React + Webpack,这意味着您应该能够将其插入任何框架、后端等,只要它与 Webpack 配合使用即可。
目前,机器人可以与任何 API 无缝连接,但您必须写下自己的动作创建者和传奇故事才能获得您想要的行为。
当我们调整这个机器人以适应不同的实现时,我们将在此添加文档。
与上面相同,我们打算让这个机器人连接到其他人工智能引擎,例如 Api.ai 和 IBM 的 Watson,以增强交互。这是我们的首要任务之一。