1. 概述

本文将介绍如何使用 LangChain 框架开发基于大语言模型(LLMs)的应用程序。我们将重点使用 langchain4j——一个简化LangChain集成的Java框架,帮助开发者将LLMs无缝集成到应用中。

该框架特别适合构建 检索增强生成(RAG) 应用。本文将解析这些核心概念,并展示如何结合Quarkus快速实现此类应用。

2. 大语言模型(LLMs)

大语言模型是经过海量数据训练的AI系统,旨在生成类人文本输出。OpenAI的GPT-4是目前最知名的LLM之一。这类模型不仅能回答问题,还能执行各种自然语言处理任务。

这些模型是智能聊天机器人、内容生成、文档分析、视频/图像生成等应用的核心支撑

2.1. LangChain

LangChain是流行的开源框架,帮助开发者构建LLM驱动的应用。最初为Python设计,它简化了创建多步骤LLM工作流的过程,主要特性包括:

  • 多LLM集成:提供统一接口对接GPT-4、Llama-3等不同模型
  • 外部工具集成:支持向量数据库、Web浏览器、API等关键工具
  • 记忆管理:通过上下文持久化实现对话历史记忆

LangChain是Python开发者构建AI应用的首选框架,而Java开发者则可通过LangChain4j获得类似能力。

2.2. LangChain4j

LangChain4j是受LangChain启发的Java库,专为构建LLM驱动的AI应用设计。其目标是填补Java框架与Python/JavaScript AI生态之间的鸿沟。

LangChain4j为Java开发者提供了与Python版LangChain同等的工具和灵活性,支持快速开发聊天机器人、摘要引擎或智能搜索系统

结合Quarkus等框架,可高效构建强大的AI应用。

2.3. Quarkus

Quarkus是专为云原生应用设计的Java框架,其低内存占用和快速启动特性使其成为微服务、无服务器架构和Kubernetes环境的理想选择。

将Quarkus集成到AI应用中,可确保系统具备企业级可扩展性和效率。更重要的是,Quarkus提供了极简的LangChain4j集成方式

3. 聊天机器人应用

为展示Quarkus与LangChain4j的集成威力,我们将构建一个回答Quarkus相关问题的聊天机器人。使用GPT-4作为基础模型(无需自行训练),应用将:

  • 仅回答Quarkus相关问题
  • 记住特定聊天会话的历史记录

3.1. 依赖配置

首先创建Quarkus应用(包含REST和Redis支持),添加以下依赖:

<dependency>
    <groupId>io.quarkiverse.langchain4j</groupId>
    <artifactId>quarkus-langchain4j-openai</artifactId>
    <version>0.18.0.CR1</version>
</dependency>

<dependency>
    <groupId>io.quarkiverse.langchain4j</groupId>
    <artifactId>quarkus-langchain4j-memory-store-redis</artifactId>
    <version>0.18.0.CR1</version>
</dependency>

第一个依赖引入与Quarkus兼容的LangChain4j版本,并提供开箱即用的OpenAI集成组件。默认使用GPT-4o-mini模型(需在OpenAI创建API密钥)。第二个依赖用于Redis记忆存储(后文详述)。

3.2. 环境配置

application.properties中添加基础配置:

quarkus.langchain4j.openai.api-key=${OPEN_AI_KEY}
quarkus.langchain4j.openai.organization-id=${OPEN_AI_ORG}

quarkus.redis.hosts=${REDIS_HOST}

也可通过环境变量配置(推荐生产环境使用):

QUARKUS_REDIS_HOSTS: redis://localhost:6379
QUARKUS_LANGCHAIN4J_OPENAI_API_KEY: sk-xxxxxxxxxxxxxxxx
QUARKUS_LANGCHAIN4J_OPENAI_ORGANIZATION_ID: org-xxxxxxxx

3.3. 核心组件

创建聊天机器人接口:

@Singleton
@RegisterAiService
public interface ChatBot {

    @SystemMessage("""
    在整个对话中,请扮演Quarkus专家角色,仅回答与Quarkus直接相关的问题,
    包括其文档、特性和组件。拒绝回答任何与Quarkus无关的内容。
    """)
    @UserMessage("""
    请基于以下权威来源回答关于Quarkus的问题:
    - https://docs.quarkiverse.io/
    - https://quarkus.io/
    
    及其子页面。问题如下:
    
    ---
    {question}
    ---
    """)
    String chat(@MemoryId UUID memoryId, String question);
}

通过@RegisterAiService注解,Quarkus自动处理LangChain4j与GPT-4的集成细节。我们使用提示工程(Prompt Engineering) 技术定义机器人行为:

  • @SystemMessage:隐藏的系统级指令,影响模型响应逻辑
  • @UserMessage:用户消息模板,支持动态参数注入

3.4. 记忆机制

LLMs本身无法维护对话上下文,因此需要外部记忆支持。LangChain4j提供:

  • ChatMemoryStore:抽象存储接口
  • ChatMemory:消息管理抽象
  • @MemoryId:标记会话ID的注解

Quarkus通过Redis依赖提供了开箱即用的聊天记忆实现,这就是我们添加第二个依赖的原因。

3.5. API接口

创建REST接口供用户交互:

@Path("/chat")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public class ChatAPI {
    
    private final ChatBot chatBot;

    public ChatAPI(ChatBot chatBot) {
        this.chatBot = chatBot;
    }

    @POST
    public Answer message(@QueryParam("q") String question, @QueryParam("id") UUID chatId) {

        chatId = chatId == null ? UUID.randomUUID() : chatId;

        String response = chatBot.chat(chatId, question);

        return new Answer(response, chatId);
    }
}

API支持两种模式: ✅ 新建对话:不提供id参数时自动生成 ✅ 继续对话:提供已有id保持上下文

测试首次提问(Quarkus是否支持Redis):

curl --location --request POST 'http://localhost:8080/chat?q=Does%20quarkus%20support%20redis%3F'

响应示例:

{
    "message": "是的,Quarkus通过Redis客户端扩展提供完整支持...",
    "chatId": "d3414b32-454e-4577-af81-8fb7460f13cd"
}

使用返回的chatId继续对话:

curl --location --request POST 'http://localhost:8080/chat?q=What%20was%20my%20last%20Quarkus%20question%3F&id=d3414b32-454e-4577-af81-8fb7460f13cd'

机器人正确记住上下文:

{
    "message": "您上一个问题是询问Quarkus是否支持Redis",
    "chatId": "d3414b32-454e-4577-af81-8fb7460f13cd"
}

4. 总结

Quarkus与LangChain4j的组合极大简化了构建具备对话记忆的AI聊天机器人的过程。这种强大组合使开发者能够:

  • 以最小开销构建企业级AI应用
  • 保留丰富的扩展能力(如RAG、工具集成等)
  • 充分利用Java生态优势

从本文基础出发,可通过添加领域知识库、优化提示工程等方式持续增强机器人能力。所有示例代码可在GitHub仓库获取。


原始标题:Leveraging Quarkus and LangChain4j | Baeldung