用Java实现人工智能的网络聊天


这篇文章逐步展示了如何用Java实现网络聊天机器人。下面是你要开发的应用程序的截图。

创建一个新项目

首先生成一个新的Maven项目。

  1. 转到 https://start.vaadin.com
  2. 删除所有默认视图( Dashboard Master-Detail )。
  3. 通过点击 图标添加一个新视图,并选择
  4. 将名称改为 聊天 ,路线改为 聊天
  5. 可选。使用页面右侧的选项对主题进行调整。
  6. 点击 下载应用程序 ,并设置 项目名称 Java组ID ,和 Vaadin版本 (本文使用14 LTS)。
  7. 点击 下载 ,解压生成的文件,并将Maven项目导入你喜欢的IDE(见 IntelliJ IDEA Eclipse NetBeans 的说明)。
  8. 删除 backend   子包及其内容。

添加所需的依赖项

你需要一个 AIML库 和Artur Signell的 avataaar组件 。要添加它们。

  1. 在你的IDE中打开 pom.xml   文件。
  2. <repositories>   节中添加以下内容。

      JCenter  
       https://jcenter.bintray.com   


  1. <dependencies>   节中添加以下内容。


	  org.goldrenard  
	  ab  
	  1.0.7  


      org.vaadin.artur  
      avataaar  
      1.0.0  


实现机器人逻辑

机器人逻辑是用 人工智能标记语言 (AIML)定义的。 org.alicebot.ab.Bot   类允许你生成看起来很聪明的答案。你只需要添加AIML文件并定义一个Spring管理的Bean来访问机器人逻辑。

添加现成的AIML文件

构成聊天机器人使用的人工智能的一组规则是在AIML文件中定义的。你可以创建自己的或下载现成的文件。本文使用了 Richard Wallace 的免费A.L.I.C.E. AIML 文件。

要将A.L.I.C.E.AIML添加到你的项目中。

  1. 转到 https://github.com/drwallace/aiml-en-us-foundation-alice
  2. 将版本库下载为一个zip文件。
  3. 解压缩文件,将内容(只有 .aiml   个文件)复制到Maven项目中的一个新的 src/resources/bots/alice/aiml/   目录中(必须创建 bots/alice/aiml/   子目录)。

这是一张带有AIML文件的项目结构截图。

定义访问机器人逻辑的豆

为了实现机器人逻辑。

  1. 在你的IDE中打开 Application   类。

  2. 添加以下方法。

   @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

为了给应用程序添加一个Web UI,你将实现一个UI组件来显示消息和一个视图。你还将添加CSS样式,使应用程序看起来像一个典型的在线聊天。

实现一个可滚动的消息列表

要在Java中实现一个可滚动的消息列表。

  1. 创建一个新的 MessageList   类。

  2. 实现该类,如下所示。

   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

实现一个聊天视图

要实现应用程序的聊天视图。

  1. 在你的IDE中打开 ChatView   类。
  2. 删除构造函数。
  3. 在该类中添加以下成员。
   private final UI ui;
private final MessageList messageList = new MessageList();
private final TextField message = new TextField();
private final Chat chatSession;
private final ScheduledExecutorService executorService;    


  1. 给该类添加以下构造函数。

   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();
}    


  1. 在该类中添加以下方法。

   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样式。

  1. 在你的IDE中打开 chat-view.css   文件。
  2. 添加以下选择器和规则。
   .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代码