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仓库获取。