在Java中使用AI使用Spring Boot和LangChain构建ChatGPT克隆程序

使用Spring Boot和LangChain在Java开发ChatGPT克隆程序,融入AI技术

许多用于AI应用开发的库主要是用Python或JavaScript编写的。好消息是,其中几个库也具有Java API。在本教程中,我将向您展示如何使用Spring Boot,LangChain和Hilla构建ChatGPT克隆。

本教程将涵盖简单同步聊天补全和更高级的流式补全,以提供更好的用户体验。

完成的源代码

您可以在我的GitHub存储库中找到示例的源代码。

要求

  • Java 17+
  • Node 18+
  • OPENAI_API_KEY环境变量中的OpenAI API密钥

创建Spring Boot和React项目,并添加LangChain

首先,使用Hilla CLI创建一个新的Hilla项目。这将创建一个带有React前端的Spring Boot项目。

在IDE中打开生成的项目。然后,在pom.xml文件中添加LangChain4j依赖项:

使用LangChain进行简单的带有内存的OpenAI聊天补全

我们将从一个简单的同步聊天补全开始探索LangChain4j。在这种情况下,我们想要调用OpenAI聊天补全API并获取单个响应。我们还想跟踪最多1000个令牌的聊天历史。

com.example.application.service包中,创建一个名为ChatService.java的类,并添加以下内容:

  • @BrowserCallable使类可供前端使用。
  • @AnonymousAllowed允许匿名用户调用这些方法。
  • @ValueOPENAI_API_KEY环境变量中注入OpenAI API密钥。
  • Assistant是我们将用于调用聊天API的接口。
  • init()使用1000个令牌的内存和gpt-3.5-turbo模型初始化助手。
  • chat()是我们将从前端调用的方法。

通过在IDE中运行Application.java或使用默认的Maven目标来启动应用程序:

这将为前端生成TypeScript类型和服务方法。

接下来,打开frontend文件夹中的App.tsx文件,并更新为以下内容:

  • 我们使用Hilla UI组件库中的MessageListMessageInput组件。
  • sendMessage()将消息添加到消息列表,并在ChatService类上调用chat()方法。收到响应后,将其添加到消息列表中。

现在,您已经拥有一个使用OpenAI聊天API并跟踪聊天历史的工作聊天应用程序。对于短消息来说效果很好,但对于长答案来说速度较慢。为了改善用户体验,我们可以改用流式补全,即在收到响应时显示响应。

使用LangChain进行流式的OpenAI聊天补全带有内存

让我们更新ChatService类,改用流式补全:

代码基本与之前相同,但有一些重要的区别:

  • Assistant 现在返回一个 TokenStream 而不是一个 String
  • init() 使用 streamingChatLanguageModel() 而不是 chatLanguageModel()
  • chatStream() 返回一个 Flux<String> 而不是一个 String

用以下内容更新 App.tsx

模板与之前相同,但处理响应的方式不同。我们不再等待响应接收完成,而是开始监听响应的分块。当接收到第一个分块时,我们将其作为新消息添加。当接收到后续的分块时,我们将它们追加到最后一条消息后面。

重新运行应用程序,您将看到响应在接收到时显示出来。

结论

正如您所见,LangChain 让在 Java 和 Spring Boot 中构建 LLM 驱动的 AI 应用变得容易。

有了基本的设置,您可以通过链接到此文章中早期提到的 LangChain4j GitHub 页面上的示例,链式操作,添加外部工具等扩展功能。在 Hilla 文档 中了解有关 Hilla 的更多信息。