SmallRye大模型簡(jiǎn)介:使用Langchain4J輕松向應(yīng)用內(nèi)引入AI服務(wù) 原創(chuàng)
對(duì)于打算用Java構(gòu)建AI智能體或者對(duì)接各類大語言模型(LLM)的開發(fā)者,一定不會(huì)對(duì)Langchain4J感到陌生。
Langchain4J解決了哪些問題?
Langchain4J 本質(zhì)上是為 Java 開發(fā)者打造的工具箱,旨在簡(jiǎn)化向高級(jí)語言中集成 AI 功能(如聊天機(jī)器人或文本生成器)的過程,同時(shí)屏蔽底層復(fù)雜細(xì)節(jié)。
想象一下:我們想要構(gòu)建一個(gè)能回答問題、生成內(nèi)容或模擬人類對(duì)話的智能應(yīng)用。通常,與 AI 模型(如 ChatGPT 等)交互需要學(xué)習(xí)不同接口并處理大量技術(shù)細(xì)節(jié)。Langchain4J 通過提供現(xiàn)成的工具集和統(tǒng)一 API(支持多 AI 服務(wù)商),徹底簡(jiǎn)化了這一過程。
核心優(yōu)勢(shì)一覽:
- 統(tǒng)一接口:無需學(xué)習(xí)各 AI 服務(wù)商的獨(dú)特接口,Langchain4J 提供標(biāo)準(zhǔn)化交互方式。切換 AI 服務(wù)時(shí),代碼幾乎無需重寫。?
- 內(nèi)置工具鏈:自動(dòng)管理對(duì)話歷史(實(shí)現(xiàn)上下文記憶)、優(yōu)化提示詞格式、簡(jiǎn)化外部數(shù)據(jù)檢索與存儲(chǔ)。?
- 無縫集成:作為適配器將現(xiàn)代 AI 模型能力注入 Java 應(yīng)用,開發(fā)者無需關(guān)注底層實(shí)現(xiàn)。?
- 即用型示例:提供客服聊天機(jī)器人、教育工具、智能搜索引擎等場(chǎng)景的快速實(shí)現(xiàn)模板。?
Langchain4J的AI服務(wù)
Langchain4J 推出的AI服務(wù)通過高級(jí)API,自動(dòng)處理將大模型集成至Java應(yīng)用程序所帶來的復(fù)雜步驟。
無需手動(dòng)創(chuàng)建提示詞、處理上下文(或聊天記憶)、調(diào)整輸出格式或者管理工具及外部數(shù)據(jù)檢索,現(xiàn)在開發(fā)者只需定義一個(gè)代表所欲創(chuàng)建“服務(wù)”的常規(guī)Java接口,之后Langchain4J框架即可生成該接口的智能體實(shí)現(xiàn),自動(dòng)將方法調(diào)用轉(zhuǎn)換為與大模型通信所對(duì)應(yīng)的底層操作。
現(xiàn)在,我們可以將接口簡(jiǎn)化為如下形式:
interface Assistant {
@UserMessage("Answer this question: {{it}}")
String chat(String userMessage);
}
通過調(diào)用來自AI Services的構(gòu)建器方法,你將收到實(shí)現(xiàn)此接口的對(duì)象。在調(diào)用chat方法時(shí),此框架會(huì)自動(dòng):
- 將輸入字符串封裝為大模型兼容格式。?
- 附加預(yù)設(shè)的系統(tǒng)指令(通過@SystemMessage注解)。?
- 按需追加對(duì)話歷史(需配置聊天記憶)。?
- 將組合后的提示詞發(fā)送至大模型。?
- 解析響應(yīng)并轉(zhuǎn)換為 Java 類型(如示例中的 String)。?
企業(yè)級(jí)Java環(huán)境中的Langchain4J
對(duì)于企業(yè)Java開發(fā)人員來說,創(chuàng)建模塊化和松散耦合的應(yīng)用程序以及使用組件框架來注入基于業(yè)務(wù)需求的接口的基本思路,已經(jīng)讓Java能夠編寫出非常優(yōu)雅的企業(yè)級(jí)應(yīng)用程序。不少企業(yè)級(jí)Java框架都集成了Langchain4J,可以用最少的配置和樣板代碼來構(gòu)建AI驅(qū)動(dòng)的應(yīng)用程序(如聊天機(jī)器人和內(nèi)容摘要器)。
- Langchain4J Spring: 將Langchain4J框架與Spring生態(tài)相集成,多為Spring Boot。?
- Quarkus Langchain4J: 將Langchain4J與Quarkus框架相集成。?
上述框架通過抽象大模型交互的復(fù)雜性來利用各自的框架功能和優(yōu)勢(shì),確保開發(fā)人員編寫出健壯、干凈且模塊化的AI服務(wù)。
Langchain4J Microprofile與SmallRye-LLM
Langchain4J Microprofile (現(xiàn)名為SmallRye LLM,屬于Eclipse Microprofile項(xiàng)目) 是一套輕巧的Java庫,能夠?qū)angchain4J的AI服務(wù)功能引入Jakarta EE、Microprofile與Quarkarkus生態(tài),運(yùn)用大家熟悉的依賴項(xiàng)注入(CDI)配合MicroProfile Config及其他MicroProfile標(biāo)準(zhǔn)完成配置。
Langchain4J Microprofile的核心功能包括:
- 以CDI為核心構(gòu)建而成。通過在Lanchain4J AI服務(wù)界面上添加@registeraiservice注釋,AI服務(wù)智能體成為CDI可發(fā)現(xiàn)的bean以供注入。提供2個(gè)CDI服務(wù)擴(kuò)展名,開發(fā)者可借此實(shí)現(xiàn)AI服務(wù)CDI的可發(fā)現(xiàn)性:CDI Portable Extension或CDI Build Compatible Extension(在CDI 4.0及更高版本中引入)。?
- Langchain4J Microprofile配置: 開發(fā)人員可以從Microprofile Config功能中受益,構(gòu)建Langchain4J的基本元素,例如Chatlangugemodel,ChatMessage,ChatMessage,ChatMemory,Chatmemory,ContentReTriever,ToolProvider,ToolProvider,ToolProvider(模型上下文協(xié)議,簡(jiǎn)稱MCP),無需單獨(dú)編寫builder工具。?
- Langchain4J Microprofile容錯(cuò)能力: 充分利用現(xiàn)有的Lanchain4J AI服務(wù)(例如@retry, @timeout, @ratelimit,shoultback等)實(shí)現(xiàn)高容錯(cuò)。?
- Langchain4J MicroprofileTelemetry: 啟用時(shí),開發(fā)人員可以通過開放Telemetry觀察其大模型指標(biāo)(遵循GenAI Metrics的語義慣例)。?
Langchain4J Microprofile示例
以下示例旨在展示Langchain4J MicroproFile功能集。這些示例基于一款簡(jiǎn)化的汽車預(yù)訂應(yīng)用程序,靈感來自Lize Raes在Devoxx Belgium 2023上的Java Meets AI演講,以及Jean-Fran?oisJames的相關(guān)探索。初版演示來自Dmytro Liubarskyi。
這款示例程序運(yùn)行在以下環(huán)境之上:
- GlassFish?
- Payara?
- Helidon (搭配CDI Build Compatible Extension與CDI Portable Extension)?
- Open Liberty?
- Wildfly?
- Quarkus?
親手構(gòu)建Langchain4J AI服務(wù)
在此示例中,我們將使用Langchain4J MicroproFile構(gòu)建自己的Assistant AI服務(wù)(請(qǐng)參見上面的代碼)。大家可按需做相應(yīng)調(diào)整。
當(dāng)前版本(截至撰稿時(shí)為0.0.4)支持Langchain4J版本1.0.0-BETA2(截至撰稿時(shí)的最新版本)。
1. 將SmallRye-LLM Portable Extension導(dǎo)入你的項(xiàng)目,確??蓪I服務(wù)注冊(cè)至CDI注入。
<dependency>
<groupId>io.smallrye.llm</groupId>
<artifactId>smallrye-llm-langchain4j-portable-extension</artifactId>
<version>0.0.4</version>
</dependency>
2. 導(dǎo)入SmallRye-LLM Microprofile Config,這樣我們即可使用Microprofile Config規(guī)范創(chuàng)建Langchain4J功能:
<dependency>
<groupId>io.smallrye.llm</groupId>
<artifactId>smallrye-llm-langchain4j-config-mpconfig</artifactId>
<version>0.0.4</version>
</dependency>
3. 使用@registeraiservice注釋langchain4J AI服務(wù),并為chatlanguagemodel設(shè)定名稱(此名稱將供CDI容器使用,稍后將詳細(xì)介紹)。
@RegisterAIService(chatLanguageModelName = "chat-model-openai")
interface Assistant {
@UserMessage("Answer this question: {{it}}")
String chat(String userMessage);
}
在MicroproFile-config.properties中配置ChatLanguageModel對(duì)象(大多數(shù)應(yīng)用程序會(huì)在Resources \ Meta-Inf文件夾中提供此文件)。
在此示例中,我們將使用AzureopenaIchatModel。在配置這種模型時(shí),Langchain4J隨附一個(gè)builder,該builder允許你構(gòu)建ChatLanguageModel的參考,具體視選擇的大模型而定。
下面來看以編程方式創(chuàng)建ChatLanguageModel(在本示例中使用Olllama)的一種典型方法:
private static final String MODEL = "mistral";
private static final String BASE_URL = "http://localhost:11434";
ChatLanguageModel model = OllamaChatModel.builder()
.baseUrl(BASE_URL)
.modelName(MODEL)
.temperature(0.2)
.timeout(timeout)
.build();
任何功能的配置格式所依賴的對(duì)象都應(yīng)具有Langchain4J提供的builder;否則將會(huì)出錯(cuò)。
構(gòu)建該功能的配置格式如下:
smallrye.llm.plugin.<cdi-model-name>.config.<builder-property-method-name>=<value>
例如,要由CDI內(nèi)部使用其builder創(chuàng)建AzureopenaIchatModel,我們將其如下配置:
smallrye.llm.plugin.chat-model-openai.class=dev.langchain4j.model.azure.AzureOpenAiChatModel
smallrye.llm.plugin.chat-model-openai.config.api-key=${azure.openai.api.key}
smallrye.llm.plugin.chat-model-openai.config.endpoint=${azure.openai.endpoint}
smallrye.llm.plugin.chat-model-openai.config.service-version=2024-02-15-preview
smallrye.llm.plugin.chat-model-openai.config.deployment-name=${azure.openai.deployment.name}
smallrye.llm.plugin.chat-model-openai.config.temperature=0.1
smallrye.llm.plugin.chat-model-openai.config.topP=0.1
smallrye.llm.plugin.chat-model-openai.config.timeout=PT120S
smallrye.llm.plugin.chat-model-openai.config.max-retries=2
smallrye.llm.plugin.chat-model-openai.config.logRequestsAndResponses=true
配置必須以SmallRye.llm.plugin開頭,以便CDI擴(kuò)展名能夠檢測(cè)到Langchain4J配置。
接下來,我們?yōu)閏hatlanguagemodel指定一個(gè)CDI名稱。在本示例中名為Chat-Model-Openai。這是我們?cè)贎registeraiservice上提供的同一名稱,負(fù)責(zé)告知CDI必須找到Chat-ai-openai chatlangugemodeland并在構(gòu)建Assistant AI服務(wù)時(shí)將其注冊(cè)至Langchain4j。
Builder-Property-hethod-name具有名稱敏感性,必須與Builder.<builder-property-method-name>(<value>)上的名稱保持一致。
默認(rèn)情況下,除非另有說明,否則所有用Microprofile配置的對(duì)象均為@ApplicationsCop。
現(xiàn)在,我們可以輕松在企業(yè)服務(wù)中進(jìn)行@Inject。例如,對(duì)于ChatResource Restful服務(wù)(使用Jakarta Restful Web Service),我們可以將其作為常規(guī)Jakarta EE CDI服務(wù)注入至Assistant:
@Path("/chat")
public class ChatResource {
@Inject
private Assistant assistant;
@GET
@Operation(summary = "Chat to our friendly assistant.")
@Produces(MediaType.TEXT_PLAIN)
public String chat(@QueryParam("message") String message) {
return assistant.chat(message);
}
}
其他功能:如果大家想使用Microprofile Telemetry(運(yùn)行Open Telemetry)探索大模型指標(biāo),請(qǐng)將以下功能添加到Microprofile-config.properties中。
此示例使得CDI能夠發(fā)現(xiàn)所有Chatmodellistener并自動(dòng)執(zhí)行注入:
smallrye.llm.plugin.chat-model.config.listeners=@all
或者,我們也可以通過以下方式引入特定Chatmodellistener:
smallrye.llm.plugin.chat-model.config.listeners=io.smallrye.llm.langchain4j.telemetry.SpanChatModelListener,io.smallrye.llm.langchain4j.telemetry.MetricsChatModelListener
總結(jié)
SmallRye LLM簡(jiǎn)化了將Langchain4J AI服務(wù)功能集成至Microprofile應(yīng)用程序中的過程。憑借與Microprofile及統(tǒng)一API的緊密集成,SmallRye LLM對(duì)于Jakarta EE與Microprofile開發(fā)者極具吸引力,可幫助他們?cè)诨乇軓?fù)雜性與大量樣板的情況下添加AI功能。如此一來,你可以節(jié)省下時(shí)間與精力,專注運(yùn)用生成式AI為業(yè)務(wù)邏輯創(chuàng)造實(shí)際價(jià)值。
原文標(biāo)題:??Introducing SmallRye LLM: Injecting Langchain4J AI Services?,作者:BUHAKE SINDI
