译者 | 核子可乐
审校 | 重楼
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