在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项目。
- 在一份新的AI论文中,卡内基梅隆大学和谷歌研究员重新定义了语言模型的输出:如何通过使用暂停标记来延迟回答,从而提升问答和推理任务的性能
- 你的数据集有缺失值?不要做任何处理!
- 使用冻结的大型语言模型进行视觉问答
在IDE中打开生成的项目。然后,在pom.xml
文件中添加LangChain4j依赖项:
使用LangChain进行简单的带有内存的OpenAI聊天补全
我们将从一个简单的同步聊天补全开始探索LangChain4j。在这种情况下,我们想要调用OpenAI聊天补全API并获取单个响应。我们还想跟踪最多1000个令牌的聊天历史。
在com.example.application.service
包中,创建一个名为ChatService.java
的类,并添加以下内容:
@BrowserCallable
使类可供前端使用。@AnonymousAllowed
允许匿名用户调用这些方法。@Value
从OPENAI_API_KEY
环境变量中注入OpenAI API密钥。Assistant
是我们将用于调用聊天API的接口。init()
使用1000个令牌的内存和gpt-3.5-turbo
模型初始化助手。chat()
是我们将从前端调用的方法。
通过在IDE中运行Application.java
或使用默认的Maven目标来启动应用程序:
这将为前端生成TypeScript类型和服务方法。
接下来,打开frontend
文件夹中的App.tsx
文件,并更新为以下内容:
- 我们使用Hilla UI组件库中的
MessageList
和MessageInput
组件。 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 的更多信息。