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