LangChain4j 与 Spring Boot集成指南
🚀 LangChain4j 与 Spring Boot集成指南
让大模型无缝融入你的 Spring Boot 应用!
📖 集成方式概览
LangChain4j 提供了两种集成方式,满足不同场景需求:

| 方式 | 适用场景 | 特点 |
|---|---|---|
| ChatModel | 简单对话、快速集成 | 直接调用,灵活可控 |
| AI Service | 复杂业务、需要提示词管理 | 声明式编程,更优雅 |
💻 方式一:ChatModel 集成
1️⃣ 创建项目模块

2️⃣ Maven 依赖
<project>
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.whc</groupId>
<artifactId>langChain4j-whc</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>langchain4j-whc-boot-integration</artifactId>
<packaging>jar</packaging>
<name>langchain4j-whc-boot-integration</name>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- Spring Boot Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- ChatModel 方式所需 -->
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-open-ai-spring-boot-starter</artifactId>
</dependency>
<!-- AI Service 方式所需 -->
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-spring-boot-starter</artifactId>
</dependency>
<!-- Lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
💡 关键点:
langchain4j-open-ai-spring-boot-starter— 用于 ChatModel 方式langchain4j-spring-boot-starter— 用于 AI Service 方式- 版本号由父 POM 中的
langchain4j-bom统一管理
3️⃣ 配置文件
server:
port: 9002
spring:
application:
name: langChain_whc_boot_integration
langchain4j:
open-ai:
chat-model:
api-key: ${AI_DEEPSEEK_API_KEY}
model-name: ${AI_DEEPSEEK_MODEL_NAME}
base-url: ${AI_DEEPSEEK_BASE_URL}
log-requests: true
📌 注意:这里使用的是
langchain4j前缀(而非ai),这是 Spring Boot集成方式的标准配置。
4️⃣ Controller 接口
@RestController
@RequiredArgsConstructor
public class ChatController {
private final ChatModel chatModel;
@GetMapping("popular/chat")
public String model(@RequestParam(value = "message", defaultValue = "Hello") String message) {
return chatModel.chat(message);
}
}
5️⃣ 测试效果
问题:佛山有哪些脱口秀的地方?

🎉 ChatModel 方式集成成功!代码简洁,调用直接。
🤖 方式二:AI Service 集成
AI Service 是更优雅的集成方式,通过声明式接口定义,让代码更具可读性。
1️⃣ 定义 Service 接口
@AiService
public interface Assistant {
@SystemMessage("You are a polite assistant")
String chat(String userMessage);
}
💡 核心注解:
@AiService— 标记为 AI 服务接口,LangChain4j 会自动生成实现@SystemMessage— 定义系统提示词,塑造 AI 的角色和行为
2️⃣ Controller 接口
@RestController
class AssistantController {
@Resource
Assistant assistant;
@GetMapping("assist/chat")
public String chat(String message) {
return assistant.chat(message);
}
}
3️⃣ 测试效果
问题:打工牛马何以解忧

🔥 AI Service 方式让提示词管理和业务逻辑完全解耦,更适合复杂场景!
⚙️ 模型参数详解
LangChain4j 支持丰富的模型参数配置,满足不同业务需求:
/**
* ChatModelProperties 类用于配置 OpenAI 聊天模型的各种参数
*/
public class ChatModelProperties {
/** API 基础 URL 地址 */
private String baseUrl;
/** API 密钥 */
private String apiKey;
/** 模型名称,如 gpt-3.5-turbo、qwen-plus 等 */
private String modelName;
/** 采样温度,控制生成文本的随机性,范围 0-2 */
private Double temperature;
/** 核采样参数,控制生成文本的多样性 */
private Double topP;
/** 停止序列,当生成的文本包含这些字符串时停止 */
private List<String> stop;
/** 每次响应的最大标记数 */
private Integer maxTokens;
/** 存在惩罚,增加或减少重复主题的可能性 */
private Double presencePenalty;
/** 频率惩罚,减少重复词语的出现频率 */
private Double frequencyPenalty;
/** 随机种子,控制生成结果的可重现性 */
private Integer seed;
/** 是否记录请求日志 */
private Boolean logRequests;
/** 是否记录响应日志 */
private Boolean logResponses;
/** 请求超时时间 */
private Duration timeout;
/** 最大重试次数 */
private Integer maxRetries;
// ... 更多参数
}
📌 常用参数速查:
temperature— 值越高越有创意(0-2),值越低越稳定maxTokens— 限制输出长度seed— 固定种子可复现结果logRequests/logResponses— 调试时开启,生产环境建议关闭
📝 添加输入输出日志
实际开发中,我们经常需要查看 AI 的输入输出,方便调试和优化提示词。
1️⃣ 修改接口 — 自定义 SystemMessage
@AiService
public interface Assistant {
@SystemMessage("做个团结友爱的 Robot 吧!")
String chat(String userMessage);
}
AssistantController 保持不变。

2️⃣ 开启日志配置
langchain4j:
open-ai:
chat-model:
api-key: ${AI_DASHSCOPE_API_KEY}
model-name: ${AI_DASHSCOPE_MODEL_NAME}
base-url: ${AI_DASHSCOPE_BASE_URL}
log-requests: true # 开启请求日志
log-responses: true # 开启响应日志
3️⃣ 日志打印效果
可以看到 SystemMessage 注解内容已成功发送到模型:

🔍 日志中清晰展示了请求的完整结构,包括 System Message、User Message 和模型参数。
👂 ChatModel 监听器(Listener)
监听器是 LangChain4j 提供的可观测性机制,可以拦截请求、响应和异常,实现日志记录、监控、调试等功能。
📖 官方示例
ChatModelListener listener = new ChatModelListener() {
@Override
public void onRequest(ChatModelRequestContext requestContext) {
ChatRequest chatRequest = requestContext.chatRequest();
// 获取消息列表
List<ChatMessage> messages = chatRequest.messages();
System.out.println(messages);
// 获取请求参数
ChatRequestParameters parameters = chatRequest.parameters();
System.out.println(parameters.modelName());
System.out.println(parameters.temperature());
System.out.println(parameters.topP());
System.out.println(parameters.maxOutputTokens());
// 存储自定义属性(可在 onResponse 中获取)
Map<Object, Object> attributes = requestContext.attributes();
attributes.put("my-attribute", "my-value");
}
@Override
public void onResponse(ChatModelResponseContext responseContext) {
ChatResponse chatResponse = responseContext.chatResponse();
// 获取 AI 回复
AiMessage aiMessage = chatResponse.aiMessage();
System.out.println(aiMessage);
// 获取响应元数据
ChatResponseMetadata metadata = chatResponse.metadata();
System.out.println(metadata.id());
System.out.println(metadata.modelName());
System.out.println(metadata.finishReason());
// 获取 Token 用量
TokenUsage tokenUsage = metadata.tokenUsage();
System.out.println(tokenUsage.inputTokenCount());
System.out.println(tokenUsage.outputTokenCount());
System.out.println(tokenUsage.totalTokenCount());
// 获取之前存储的自定义属性
Map<Object, Object> attributes = responseContext.attributes();
System.out.println(attributes.get("my-attribute"));
}
@Override
public void onError(ChatModelErrorContext errorContext) {
Throwable error = errorContext.error();
error.printStackTrace();
ChatRequest chatRequest = errorContext.chatRequest();
System.out.println(chatRequest);
}
};
// 注册监听器
ChatModel model = OpenAiChatModel.builder()
.apiKey(System.getenv("OPENAI_API_KEY"))
.modelName(GPT_4_O_MINI)
.listeners(List.of(listener))
.build();
model.chat("Tell me a joke about Java");
💡 监听器的三个核心方法:
onRequest— 请求发出前,可获取请求参数、存储上下文onResponse— 响应返回后,可获取回复内容、Token 用量onError— 发生异常时,可记录错误信息
🔧 Spring Boot集成方式
在 Spring Boot 中,只需声明一个 ChatModelListener Bean,会自动注入到所有 ChatModel 中:

@Configuration
public class SimpleChatModelListener {
@Bean
public ChatModelListener myChatModelListener() {
return new ChatModelListener() {
private static final Logger log = LoggerFactory.getLogger(ChatModelListener.class);
@Override
public void onRequest(ChatModelRequestContext requestContext) {
// 存储自定义属性(谜语)
requestContext.attributes().put("garlic", "弟兄七八个,围着柱子坐,大家一分手,衣服都扯破");
requestContext.attributes().put("umbrella", "独木造高楼,没瓦没砖头,人在水下走,水在人上流");
requestContext.attributes().put("sun", "画时圆,写时方,冬时短,夏时长");
log.info("onRequest(): {}", requestContext.chatRequest());
}
@Override
public void onResponse(ChatModelResponseContext responseContext) {
// 获取之前存储的属性
log.info(responseContext.attributes().get("garlic").toString());
log.info("onResponse(): {}", responseContext.chatResponse());
}
@Override
public void onError(ChatModelErrorContext errorContext) {
log.info("onError(): {}", errorContext.error().getMessage());
}
};
}
}
🧪 测试效果
请求时打印:

返回时打印:

🎯 可以看到:
- 请求日志中包含了完整的 ChatRequest 信息
- 响应日志中成功获取了之前存储的自定义属性(大蒜谜语)
- 监听器实现了请求和响应之间的上下文传递
📝 总结
| ✅ | 内容 |
|---|---|
| 1 | 掌握 ChatModel 集成方式 |
| 2 | 掌握 AI Service 集成方式 |
| 3 | 了解模型参数配置 |
| 4 | 实现输入输出日志 |
| 5 | 使用 ChatModelListener 实现可观测性 |
🚀 LangChain4j + Spring Boot 的组合,让 Java 开发者能以最优雅的方式集成大模型能力!
LangChain4j简述与示例
LangChain4j 与 Spring Boot集成指南
LangChain4j 流式模式实战指南
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)