这篇文章逐步展示了如何用Java实现网络聊天机器人。下面是你要开发的应用程序的截图。
首先生成一个新的Maven项目。
backend
子包及其内容。 你需要一个 AIML库 和Artur Signell的 avataaar组件 。要添加它们。
pom.xml
文件。 <repositories>
节中添加以下内容。
JCenter
https://jcenter.bintray.com
在 <dependencies>
节中添加以下内容。
org.goldrenard
ab
1.0.7
org.vaadin.artur
avataaar
1.0.0
机器人逻辑是用 人工智能标记语言 (AIML)定义的。 org.alicebot.ab.Bot
类允许你生成看起来很聪明的答案。你只需要添加AIML文件并定义一个Spring管理的Bean来访问机器人逻辑。
构成聊天机器人使用的人工智能的一组规则是在AIML文件中定义的。你可以创建自己的或下载现成的文件。本文使用了 Richard Wallace 的免费A.L.I.C.E. AIML 文件。
要将A.L.I.C.E.AIML添加到你的项目中。
.aiml
个文件)复制到Maven项目中的一个新的 src/resources/bots/alice/aiml/
目录中(必须创建 bots/alice/aiml/
子目录)。 这是一张带有AIML文件的项目结构截图。
为了实现机器人逻辑。
在你的IDE中打开 Application
类。
添加以下方法。
@Bean
public Bot alice() {
return new Bot(BotConfiguration.builder()
.name("alice")
.path("src/main/resources")
.build()
);
}
@Bean
public ScheduledExecutorService executorService() {
return Executors.newScheduledThreadPool(2);
}
为了给应用程序添加一个Web UI,你将实现一个UI组件来显示消息和一个视图。你还将添加CSS样式,使应用程序看起来像一个典型的在线聊天。
要在Java中实现一个可滚动的消息列表。
创建一个新的 MessageList
类。
实现该类,如下所示。
public class MessageList extends Div {
public MessageList() {
setClassName(getClass().getSimpleName());
}
public void addMessage(String from, Avataaar avatar, String text, boolean isCurrentUser) {
Span fromContainer = new Span(new Text(from));
fromContainer.addClassName(getClass().getSimpleName() + "-name");
Div textContainer = new Div(new Text(text));
textContainer.addClassName(getClass().getSimpleName() + "-bubble");
Div avatarContainer = new Div(avatar, fromContainer);
avatarContainer.addClassName(getClass().getSimpleName() + "-avatar");
Div line = new Div(avatarContainer, textContainer);
line.addClassName(getClass().getSimpleName() + "-row");
add(line);
if (isCurrentUser) {
line.addClassName(getClass().getSimpleName() + "-row-currentUser");
textContainer.addClassName(getClass().getSimpleName() + "-bubble-currentUser");
}
line.getElement().callJsFunction("scrollIntoView");
}
}
要了解更多关于如何用Vaadin实现UI组件的信息,请看 https://vaadin.com/learn/tutorials/vaadin-key-concepts 。
要实现应用程序的聊天视图。
ChatView
类。 private final UI ui;
private final MessageList messageList = new MessageList();
private final TextField message = new TextField();
private final Chat chatSession;
private final ScheduledExecutorService executorService;
给该类添加以下构造函数。
public ChatView(Bot alice, ScheduledExecutorService executorService) {
this.executorService = executorService;
ui = UI.getCurrent();
chatSession = new Chat(alice);
message.setPlaceholder("Enter a message...");
message.setSizeFull();
Button send = new Button(VaadinIcon.ENTER.create(), event -> sendMessage());
send.addClickShortcut(Key.ENTER);
HorizontalLayout inputLayout = new HorizontalLayout(message, send);
inputLayout.addClassName("inputLayout");
add(messageList, inputLayout);
expand(messageList);
setSizeFull();
}
在该类中添加以下方法。
private void sendMessage() {
String text = message.getValue();
messageList.addMessage("You", new Avataaar("Name"), text, true);
message.clear();
executorService.schedule(() -> {
String answer = chatSession.multisentenceRespond(text);
ui.access(() -> messageList.addMessage(
"Alice", new Avataaar("Alice2"), answer, false));
},new Random().ints(1000, 3000).findFirst().getAsInt(),
TimeUnit.MILLISECONDS);
}
要给应用程序添加自定义CSS样式。
chat-view.css
文件。 .inputLayout {
width: 100%;
}
.MessageList {
overflow-y: scroll;
width: 100%;
height: 100%;
}
.MessageList-name {
font-weight: bold;
}
.MessageList-bubble {
margin: .5em;
padding: 1em;
border-radius: var(--lumo-border-radius-s);
background-color: var(--lumo-shade-20pct);
}
.MessageList-bubble-currentUser {
background-color: var(--lumo-primary-text-color);
color: var(--lumo-base-color);
}
.MessageList-avatar {
display: flex;
flex-direction: column;
align-items: center;
width: unset;
height: unset;
padding: 0;
}
.MessageList-row {
display: flex;
align-items: center;
}
.MessageList-row-currentUser {
flex-direction: row-reverse;
}
第一次构建应用程序时,会下载服务器端和客户端的依赖项。这可能需要一些时间。然而,后续的构建会快得多。
要构建和运行应用程序,在你的IDE中执行 Application::main(String[])
标准的Java应用程序入口点。或者,你也可以执行 java -jar target/vaadin-chat-1.0-SNAPSHOT.jar
或 mvn spring-boot:run
命令。
你可以在你的浏览器中请求该应用程序,网址是 http://localhost:8080 。
AIML格式非常灵活,允许你做很多事情。试着围绕商业或休闲主题创建你的AIML文件,或者探索网上有很多现成的AIML。比如说。
尝试让两个机器人互相交谈。你可以生成一个初始短语,看看机器人是如何自己继续对话的。
请记住,在生产环境中,你可能要把.aiml文件移到一个外部目录,类似于你对其他资源如数据库的处理方式。另外,如果是Vaadin应用,请使用生产型Maven配置文件,让应用为生产环境做好准备。
在移动设备上试用该应用程序。你编码的Vaadin应用程序包括 渐进式网络应用程序 (PWA)的功能,这意味着,例如,你可以把它安装到移动设备的主屏幕上。
检查 Vaadin ComponentFactory 中的 Chat 和 Avatar 组件。这些组件可以帮助你在实现这类应用时减少你必须自己编写的代码量。
参见GitHub上的 s ource代码 。