当前位置:Java -> 使用Merlinite、Quarkus和Podman Desktop AI Lab在Java中进行GenAI

使用Merlinite、Quarkus和Podman Desktop AI Lab在Java中进行GenAI

GenAI如今随处可见,而我感到开发者在这个近乎无限的可能性中导航并跟上似乎笼罩着我们的所有学习是非常困难的。现在是时候我重新开始写作,确保在这种疯狂中没有人会感到被落下。

开发者使用GenAI的案例

作为开发者,我们基本上需要处理人工智能的两个主要方面。

第一个方面是如何使用现在可用的增强工具。有许多IDE插件、基于网络的工具和聊天机器人承诺帮助我们更高效地编码。不好的消息是,本文并没有涉及这方面的内容。你需要自己找出适合你的工具,并在最大程度上帮助你提高效率。个人建议可以关注一下Stephan Janssen的Devoxx Ginie Plug-In,也许能为你提供一些灵感。

另一方面,第二最重要的方面,正是我想在本文中写这部分内容。那就是如何将“智能”融入我们的应用程序,以及从哪里开始。如果你对这个话题完全陌生,并且在过去一年多的时间里没有跟进,那么这可能是特别具有挑战性的。

查找、调优和本地运行适合的模型

我不会给你关于什么是AI模型以及有哪些类型的模型的介绍。老实说,我已经一直在钻研基础知识相当一段时间了,不得不承认,这很快变得很数据科学化。特别是如果你更多地将自己看作是人工智能消费者的话,深入研究内部运作可能价值不是太大。以下是我对模型的非常扼要和主观的看法。如果你想了解所有基础知识,欢迎追求你的热情。

世界上已经存在不计其数的模型,它们都拥有一套特定的训练数据,从理论上讲,这使它们能够解决商业挑战。让模型达到这一点是基本步骤,并且被称为“训练”(也许是你整个职业生涯中最昂贵的事情之一)。我喜欢称最初训练过的模型达到的状态为“基石”。这些基石模型(例如GPT-n、BERT、LLAMA-n等)已经在广泛的数据集上进行了训练,使它们对几乎所有事情都是一种中等适合。它们也存在一些劣势。它们对你的特定问题知之甚少,它们可能不会透露用于训练它们的数据类型,它们可能只是杜撰出来的等其他劣势。你可能需要寻找更小、更合适的模型,你至少可以在一定程度上影响。与其说“影响”,我可能应该说是“注入”或者“调优”附加上下文。

“调优”模型有各种方式(请参看下面的图片),具体的方法取决于你的目标。

Common Tuning Techniques compared with cost and model impact

常见模型调优技术

在左侧最常见的是“提示工程”,这是一种“即兴”模型调优,而在右上角,你会看到完全的“对齐调优”。而对齐调优其实会改变模型权重和行为,而提示调优则不会。

你可能已经猜到,这些步骤中的每一个不仅有质量的差异,也有相应的成本差异。在本文中,我会主要谈论提示调优的一个版本,但也想让你对对齐调优感到兴奋。我将在文章中进一步使用Merlinite-7B 模型。主要原因是它是一个开源模型,有一个附加的社区,因此你可以帮助贡献知识并增加透明的训练数据。一定要去了解一下InstructLab,并深入了解一下LAB调优。

好了,现在我已经选定了一个模型,我们如何在本地运行它呢?(再一次)有很多选择和方法。当我试图去研究和理解各种格式和方法时,我很快就感到筋疲力尽。我的开发者思维希望能够像使用端点部署一样了解模型。幸运的是,这已经慢慢地变成现实。野生中有各种二进制模型格式,GGUF格式是去年由目前使用最广泛的端点API创建团队(llama.cpp)推出的。

当我谈论端点和API时,我至少应该介绍一下术语“推理”。这基本上是数据科学家称之为对模型的查询。它之所以被这样称呼,是因为推理是推理的步骤,从前提到结论。这基本上是解释AI模型工作原理的一个美妙方式。

回到llama.cpp,它是用C/C++编写的,并为本地和云端的各种型号格式提供推理引擎: llama.cpp web服务器提供OpenAI兼容的API,可用于为本地模型提供服务,并将其连接到客户端(感谢OpenAI团队为该API提供MIT许可!)稍后会进一步介绍API部分。让我们在本地启动这个东西。但等等,你说过C/C++吗?还有GGUF?我怎么办呢?没关系,只需要使用Podman Desktop AI lab。这是去年发布的桌面客户端的扩展,它可以让你在本地使用模型。如果你已经在运行Podman Desktop,只需一键安装,然后通过模型目录下载你需要的模型。

Podman桌面模型目录

Podman桌面AI实验室 - 模型目录

完成后,我们需要创建一个模型服务并运行它。

创建模型服务

Podman桌面AI实验室: 创建模型服务

我已经选择了您之前了解过的酿晶岩实验室模型。点击“创建服务”为您创建基于llama.ccp的推断服务器,并将一切打包到容器中供本地使用。转到“服务详细信息”,您将获得一个UI,其中提供了模型的API端点以及一些可在各种语言和工具中使用的预生成客户端代码。

Podman桌面AI实验室 - 服务详细信息

Podman桌面AI实验室: 酿晶岩服务详细信息

通过curl进行互动,并使用playground从Podman桌面直接与模型开始聊天。但在这篇博客文章中,我们将深入探讨如何将您刚刚容器化并启动的模型集成到您的应用程序中。

Quarkus和LangChain4j

将模型在容器中本地运行已经很酷了,但我们真正想要的是从我们的Java应用程序中使用它 - 最好是从Quarkus,当然理想情况下。我已经提到了上面的OpenAI API,但我们真的不再想自己处理直接的API调用了。这就是LangChain4j出现的地方。它提供了统一的抽象和各种工具,以将闪亮的GenAI世界集成到您的Java应用程序中。此外,Quarkus通过提供一个LangChain4j扩展使其更加简单,该扩展为您执行所有配置和大部分工作。

让我们开始我们植入AI的Quarkus应用程序。我假设您拥有以下内容:

  • 大约15分钟的时间
  • 一个IDE
  • 已正确配置的JDK 17+
  • Apache Maven 3.9.6

进入您的项目文件夹或其他地方,使用以下Maven命令启动一个简单的Quarkus项目:

mvn io.quarkus.platform:quarkus-maven-plugin:3.10.1:create \
    -DprojectGroupId=org.acme \
    -DprojectArtifactId=get-ai-started \
  	-Dextensions='rest,quarkus-langchain4j-openai'


这将创建一个名为“get-ai-started”的文件夹,您需要进入该文件夹。用您喜欢的编辑器打开项目,并删除src/main/test文件夹中的所有内容。是的,我知道,但我真的希望这是一个极其简单的开始。接下来,在/src/main/java/org.acme/中创建一个名为Bot.java的文件,并添加以下内容:

package org.acme;

import dev.langchain4j.service.SystemMessage;
import dev.langchain4j.service.UserMessage;
import io.quarkiverse.langchain4j.RegisterAiService;
import jakarta.enterprise.context.SessionScoped;

@RegisterAiService()
@SessionScoped
public interface Bot {

    String chat(@UserMessage String question);
}


保存并打开src/main/resources/application.properties文件。只需添加以下两行:

quarkus.langchain4j.openai.base-url=<MODEL_URL_FROM_PODMAN_SERVICE>
quarkus.langchain4j.openai.timeout=120s


确保更改为您的Podman桌面AI实验室在“服务详细信息”下显示的端点。在上面的示例中,它是http://localhost:64752/v1。现在打开GreetingResource.java并更改为以下内容:

package org.acme;

import io.quarkiverse.langchain4j.RegisterAiService;
import jakarta.enterprise.context.SessionScoped;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.MediaType;

@Path("/hello")
@RegisterAiService()
@SessionScoped
public class GreetingResource {

    private final Bot bot;
    
    public GreetingResource(Bot bot){
        this.bot = bot;
    }

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String hello() {
        return bot.chat("What model are you?");
    }
}


现在您基本上已经添加了对模型的调用,/hello资源应该会回复针对硬编码问题“您是什么模型?”的答案。

在终端上以开发模式启动您的应用程序:

mvn quarkus:dev


并在您选择的浏览器中导航到http://localhost:8080/hello。假设您的模型容器仍在Podman桌面上运行,您将在几秒内在浏览器中看到答案:

“我是一个基于文本的AI语言模型,由OpenAI训练。我旨在协助用户完成各种任务,并根据我的截止日期为2021年9月的知识提供信息。”

Quarkus 使与底层LLM的交互变得非常简单。如果您导航到http://localhost:8080/q/dev-ui/io.quarkiverse.langchain4j.quarkus-langchain4j-core/chat,您可以访问 Quarkus LangChain4J集成 的内置聊天功能。

Quarkus Dev UI - Chat Integration

Quarkus Dev UI Screenshot: Chat Integration

总结

就是这样:简单而直接,就像你能想象的那样。随时随地玩得更多,并在评论中告诉我您想进一步了解什么。

推荐阅读: 百度面经(19)

本文链接: 使用Merlinite、Quarkus和Podman Desktop AI Lab在Java中进行GenAI