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 集成。我们发现:

  1. 在 Micronaut 中实现 LLM 功能非常简单
  2. 对 AI 服务的控制力强,可轻松扩展复杂行为
  3. 系统边界明确,能有效防止信息越界

这种组合为构建企业级 AI 应用提供了坚实基础,尤其适合需要严格数据管控的场景。


原始标题:Using LangChain4j With Micronaut | Baeldung