系列文章目录
第一章 「Java AI实战」LangChain4J接入Xinference本地大模型
文章目录
前言
本文将聚焦于 LangChain4J 提供的 Chat API ,结合本地模型(通过 Xinference 部署的deepseek-chat 模型,通过maxkb创建应用,这两块的文档见往期文章)进行调用演示,帮助快速理解其核心机制,完成从模型接入到对话响应的 Java 化实现。
一、Chat API 概览
LangChain4J 借鉴了 LangChain 的架构设计理念,提供了 两层抽象(2 levels of abstraction),以满足从低层模型调用到高层链式编排的不同开发需求。
🔹 1. Low Level(底层抽象)
开发者拥有最完全的控制权和灵活性,是面向开发者提供最原始的构件,可以手动控制消息流程、向量存储、嵌入生成等细节。需要开发者来组织模型调用流程。
✅ 典型组件:
-
ChatLanguageModel
-
UserMessage / AiMessage
-
EmbeddingStore
-
Embedding
-
PromptTemplate
-
Chain
✅ 示例用法:
ChatLanguageModel model = OpenAIChatModel.withApiKey("your-key");
List<Message> messages = List.of(
new UserMessage("Tell me a joke.")
);
AiMessage response = model.generate(messages);
✅ 适合场景:
-
框架内部集成开发
-
需要高度自定义对话流程、提示词结构
-
构建“可组合型”LLM服务组件
🔹 2. High Level(高层抽象)
以“声明式”的方式使用 LLM,屏蔽底层复杂度,借助 @AIServices 注解快速创建接口,自动注入模型能力,无需关心提示词模板、消息对象等底层细节,更贴近传统Java 服务开发体验。
✅ 典型特性:
-
@AIServices 接口定义
-
声明式语义 + 自动 Prompt 编排
-
易于集成进业务系统
✅ 示例用法:
@AiService
public interface Assistant {
String chat(String input);
}
Assistant assistant = AiServices.create(Assistant.class, model);
assistant.chat("How are you?");
✅ 适合场景:
-
快速构建 LLM 应用原型
-
面向业务开发者开放能力
-
集成到 Spring Boot 服务中作为组件调用
🔚 总结对比:
抽象层级 | 控制力 | 易用性 | 推荐使用者 |
---|---|---|---|
Low Level | 💯 极高 | ❌ 需要写大量代码 | 框架作者、需要深度定制者 |
High Level | ✅ 足够 | ✅ 非常高 | 应用开发者、快速交付团队 |
二、项目初始化与依赖引入
2.1. Maven 依赖配置
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--langchain4j-open-ai + langchain4j-->
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j-open-ai</artifactId>
</dependency>
<dependency>
<groupId>dev.langchain4j</groupId>
<artifactId>langchain4j</artifactId>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
2.2. 应用配置说明
properties配置文件中,只需配置服务端口和服务名称即可,模型相关配置可以注册OpenAiChatModel时指定。
server.port=9002
spring.application.name=langchain4j-02chatapi
三、集成本地模型服务(基于 Xinference)
3.1. 启动 Xinference 部署模型
此次使用的模型是deepseek-chat,相关配置如下:
3.2. 应用Chat 模型注册与 API 调用地址说明
本次选用maxkb进行模型应用的创建(主要用于获取调用模型的base_url和API key)
创建简单应用,绑定模型后,base_url和API key的获取如下:
四、Chat API 编程实战
4.1. Java 模型注册
import com.zzyy.study.service.ChatAssistant;
import dev.langchain4j.model.chat.ChatLanguageModel;
import dev.langchain4j.model.openai.OpenAiChatModel;
import dev.langchain4j.service.AiServices;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration(proxyBeanMethods = false)
public class ChatLanguageModelConfig {
@Bean
public ChatLanguageModel chatLanguageModel() {
return
OpenAiChatModel.builder()
.apiKey("application-a4ffba29842a4b3373c2e3f72f03e755")
.modelName("deepseek-chat")
.baseUrl("http://localhost:8080/api/application/53453c68-2687-11f0-b5ed-0242ac110002")
.build();
}
@Bean
public ChatAssistant chatAssistant(ChatLanguageModel chatLanguageModel) {
return AiServices.create(ChatAssistant.class, chatLanguageModel);
}
}
4.2. 高层抽象生成的 AI 服务接口
import dev.langchain4j.service.SystemMessage;
import dev.langchain4j.service.UserMessage;
import dev.langchain4j.service.V;
public interface ChatAssistant {
String chat(String prompt);
@SystemMessage("你是一位专业的中国医生,只回答医学相关的问题。输出限制:对于其他领域的问题禁止回答," +
"直接返回'抱歉,我只能回答中国医学相关的问题。'")
@UserMessage("请回答以下医学问题:{{question}}")
String chat2(@V("question") String question);
}
4.3. 模型基础测试接口
@RestController
@Slf4j
public class ChatLanguageModelController {
@Resource
private ChatLanguageModel chatLanguageModel;
@Resource
private ChatAssistant chatAssistant;
/**
* 使用基础 ChatLanguageModel 接口,输入 prompt,返回模型响应(单轮调用)
*/
@GetMapping(value = "/chatlanguagemodel/hello")
public String hello(@RequestParam(value = "prompt", defaultValue = "你是谁") String prompt) {
String result = chatLanguageModel.generate(prompt);
System.out.println("通过langchain4j调用deepseek-chat模型返回结果:" + result);
return result;
}
/**
* 使用 UserMessage 包装用户输入,发送给模型,获得结构化响应
*/
@GetMapping(value = "/chatlanguagemodel/usermessage")
public String userMessage(@RequestParam(value = "prompt", defaultValue = "你是谁") String prompt) {
UserMessage userMessage = UserMessage.from(prompt);
Response<AiMessage> messageResponse = chatLanguageModel.generate(userMessage);
System.out.println("通过langchain4j调用模型返回结果:" + messageResponse);
return messageResponse.toString();
}
/**
* 调用 @AiService 高层接口,简洁获取模型响应(高阶封装)
*/
@GetMapping(value = "/chatlanguagemodel/assistant")
public String assistant(@RequestParam(value = "prompt", defaultValue = "你是谁") String prompt) {
String chat = chatAssistant.chat(prompt);
System.out.println("通过langchain4j调用模型返回结果:" + chat);
return chat;
}
}
4.4. ChatAPI 样例接口
@RestController
@Slf4j
public class ChatApiController {
@Resource
private ChatLanguageModel chatLanguageModel;
@Resource
private ChatAssistant chatAssistant;
/**
* Low Level API 示例:使用 UserMessage 构造对话输入
*/
@GetMapping(value = "/chatapi/lowapi")
public String lowApi(@RequestParam("prompt") String prompt) {
Response<AiMessage> aiMessageResponse = chatLanguageModel.generate(UserMessage.from(prompt));
return aiMessageResponse.content().text(); // 提取生成的文本内容
}
/**
* Low Level API 示例2:组合多个消息(系统 + 用户),自定义对话场景
*/
@GetMapping(value = "/chatapi/lowapi2")
public String lowApi2(@RequestParam("prompt") String prompt) {
List<ChatMessage> messages = List.of(
SystemMessage.systemMessage("假如你是一个医生,只回答医学问题,其它不回答"),
UserMessage.userMessage(prompt)
);
Response<AiMessage> aiMessageResponse = chatLanguageModel.generate(messages);
return aiMessageResponse.content().text();
}
/**
* High Level API 示例:调用 @AiService 封装的 chat 方法
*/
@GetMapping(value = "/chatapi/highapi")
public String highApi(@RequestParam("prompt") String prompt) {
return chatAssistant.chat(prompt);
}
}
五、常用配置
Java 注册模型时常用的配置如下:
-
日志记录
-
监控(监听器)
-
重试次数
-
超时时间
@Configuration
public class ChatLanguageModelConfig{
@Bean
public ChatLanguageModel chatLanguageModel(){
return OpenAiChatModel.builder()
.apiKey("application-a4ffba29842a4b3373c2e3f72f03e755")
.modelName("deepseek-chat")
.baseUrl("http://localhost:8080/api/application/53453c68-2687-11f0-b5ed-0242ac110002")
.logRequests(true) // 日志界别设置为debug才有效
.logResponses(true)// 日志界别设置为debug才有效
.listeners(List.of(new TestChatModelListener())) //监听器
.maxRetries(1)// 重试机制
.timeout(Duration.ofSeconds(10)) // 设置10秒超时
.build();
}
@Bean
public ChatAssistant chatAssistant(ChatLanguageModel chatLanguageModel){
return AiServices.create(ChatAssistant.class, chatLanguageModel);
}
}
为了使日志生效,properties文件需要调整日志级别为debug
server.port=9003
spring.application.name=langchain4j-03chatapi-config
# 只有日志级别调整为debug级别,同时配置以上 langchain 日志输出开关才有效
logging.level.root=debug
六、总结
本文简单的介绍了 LangChain4J 中 Chat API 的基本原理和使用方式,成功实现了与本地大模型的对话集成。从接口初始化、模型配置到实际交互逻辑的编写,LangChain4J 为 Java 开发者提供了清晰一致的调用路径,使得构建具备自然语言处理能力的 Java 应用变得更为轻松。
在传统上,Java 在 AI 领域的工具链相对薄弱,而 LangChain4J 正逐步填补这一空白,尤其是在对话模型(Chat Language Models)的支持上,已经可以胜任多数业务场景中的问答和多轮对话需求。
接下来,将进一步探索: LangChain4J 中多模态之视觉理解相关的内容。