「Java AI实战」LangChain4J - ChatAPI 及常用配置

系列文章目录

第一章 「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 中多模态之视觉理解相关的内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值