1. 概述
LangChain4j 是一个基于 LangChain 的 Java 库,用于在 Java 应用中集成大语言模型(LLM)。
Micronaut 是一个现代的 JVM 框架,专为构建轻量级、模块化和高性能应用而设计。它特别适合开发微服务、无服务器应用和云原生解决方案,具有极低的启动时间和内存占用。 其强大的依赖注入和 AOT(Ahead-of-Time)编译能力确保了高性能和可扩展性。在 Micronaut 中,LangChain4j 提供了深度集成,让我们能在单个应用中同时发挥两个框架的优势。
本教程将学习如何使用 LangChain4j 和 Micronaut 构建 AI 驱动的应用。 我们会发现创建自动化任务工具的过程异常简单。
2. 移居顾问应用
我们将构建一个集成 LangChain4j 的 Micronaut 应用。该应用会创建一个简单的聊天机器人,提供关于潜在移居国家的建议。聊天机器人仅依赖指定的几个链接获取信息。
应用只会回答它已知国家的问题。
2.1. 依赖项
首先添加依赖。先加入 langchain4j-open-ai 依赖:
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-open-ai</artifactId>
<version>0.36.2</version>
</dependency>
然后添加 Micronaut 相关依赖:
<dependency>
<groupId>io.micronaut.langchain4j</groupId>
<artifactId>micronaut-langchain4j-core</artifactId>
<version>0.0.1</version>
</dependency>
<dependency>
<groupId>io.micronaut.langchain4j</groupId>
<artifactId>micronaut-langchain4j-openai</artifactId>
<version>0.0.1</version>
</dependency>
2.2. 配置
由于使用 OpenAI 的 LLM,在应用 YAML 文件中添加 API 密钥:
langchain4j:
open-ai:
api-key: ${OPENAI_API_KEY}
⚠️ 实际部署时,建议通过环境变量注入密钥,避免硬编码。
2.3. 移居顾问接口
创建聊天机器人接口:
public interface RelocationAdvisor {
@SystemMessage("""
你是移居顾问。请使用官方语气回答。
必须引用资源中的具体数据。
基于现有知识回答以下关于移居的问题。
仅允许从以下来源获取信息:
- https://www.numbeo.com/cost-of-living/country_result.jsp?country=Spain
- https://www.numbeo.com/cost-of-living/country_result.jsp?country=Romania
及其子页面。若信息不足,请回复“我没有关于{国家}的信息”
""")
String chat(@UserMessage String question);
}
在 RelocationAdvisor 接口中,chat() 方法处理用户消息并返回模型响应字符串。我们使用 @SystemMessage 注解定义聊天机器人的基础行为:要求它仅依赖指定链接获取国家信息,并采用官方语气。
2.4. 移居顾问工厂
创建 RelocationAdvisorFactory:
@Factory
public class RelocationAdvisorFactory {
@Value("${langchain4j.open-ai.api-key}")
private String apiKey;
@Singleton
public RelocationAdvisor advisor() {
ChatLanguageModel model = OpenAiChatModel.builder()
.apiKey(apiKey)
.modelName(OpenAiChatModelName.GPT_4_O_MINI)
.build();
return AiServices.create(RelocationAdvisor.class, model);
}
}
通过该工厂将 RelocationAdvisor 声明为 Bean。我们使用 OpenAiChatModel 构建器创建模型实例,再通过 AiServices 将接口与模型绑定生成聊天机器人实例。 这种方式简单粗暴,但高效可靠。
2.5. 已知信息测试用例
测试顾问对已知国家的响应:
@MicronautTest(rebuildContext = true)
public class RelocationAdvisorLiveTest {
Logger logger = LoggerFactory.getLogger(RelocationAdvisorLiveTest.class);
@Inject
RelocationAdvisor assistant;
@Test
void givenAdvisor_whenSendChatMessage_thenExpectedResponseShouldContainInformationAboutRomania() {
String response = assistant.chat("Tell me about Romania");
logger.info(response);
Assertions.assertTrue(response.contains("Romania"));
}
@Test
void givenAdvisor_whenSendChatMessage_thenExpectedResponseShouldContainInformationAboutSpain() {
String response = assistant.chat("Tell me about Spain");
logger.info(response);
Assertions.assertTrue(response.contains("Spain"));
}
}
在测试中注入 RelocationAdvisor 实例并查询国家信息。响应中确实包含了国家名称,符合预期。
模型响应日志示例:
15:43:47.334 [main] INFO c.b.m.l.RelocationAdvisorLiveTest - 西班牙的生活成本指数为58.54,相对中等。
市中心一居室公寓平均租金约€906.52,郊区约€662.68...
2.6. 未知信息测试用例
测试顾问对未知国家的响应:
@Test
void givenAdvisor_whenSendChatMessage_thenExpectedResponseShouldNotContainInformationAboutNorway() {
String response = assistant.chat("Tell me about Norway");
logger.info(response);
Assertions.assertTrue(response.contains("我没有关于挪威的信息"));
}
✅ 聊天机器人严格遵循指令,对未知国家返回预设消息,避免胡编乱造。
3. 结论
本文展示了如何将 LangChain4j 与 Micronaut 集成。我们发现:
- 在 Micronaut 中实现 LLM 功能非常简单
- 对 AI 服务的控制力强,可轻松扩展复杂行为
- 系统边界明确,能有效防止信息越界
这种组合为构建企业级 AI 应用提供了坚实基础,尤其适合需要严格数据管控的场景。