✅ LangChain4j AI Services 核心实战代码(2大高频场景)

基于官方文档「AI Services」,为你提供 结构化输出+JSON模式配置Spring Boot多AI Service协作 两套可直接复制运行的完整代码,包含✅依赖配置、✅核心代码、✅调用示例、✅关键注解解释、✅避坑要点,完美贴合生产级开发规范。

📌 环境前置约束(必满足):JDK 17+、Spring Boot 3.x、LangChain4j 0.26.0(版本统一)


🎯 场景一:结构化输出 + JSON模式配置(核心高频)

✅ 核心价值

解决LLM返回「非结构化文本」的痛点,让大模型严格返回指定Java POJO格式数据,无需手动解析JSON字符串;开启JSON模式后,LLM输出100%符合格式要求,彻底避免解析异常,是生产环境必备配置。

✅ 步骤1:完整Maven依赖(直接复制到pom.xml)

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.2.1</version>
        <relativePath/>
    </parent>
    
    <groupId>com.example</groupId>
    <artifactId>langchain4j-ai-service</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    
    <properties>
        <java.version>17</java.version>
        <langchain4j.version>0.26.0</langchain4j.version>
    </properties>

    <dependencies>
        <!-- Spring Web 基础依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        
        <!-- LangChain4j Spring核心启动器 -->
        <dependency>
            <groupId>dev.langchain4j</groupId>
            <artifactId>langchain4j-spring-boot-starter</artifactId>
            <version>${langchain4j.version}</version>
        </dependency>
        
        <!-- OpenAI适配器(含JSON模式支持,可替换为Ollama/通义千问) -->
        <dependency>
            <groupId>dev.langchain4j</groupId>
            <artifactId>langchain4j-open-ai-spring-boot-starter</artifactId>
            <version>${langchain4j.version}</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

✅ 步骤2:application.yml配置(开启JSON模式+密钥配置)

# 核心:开启JSON模式 + 模型参数优化,保证结构化输出准确性
langchain4j:
  open-ai:
    api-key: sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # 替换为你的真实密钥
    chat-model:
      model-name: gpt-3.5-turbo # 推荐3.5/4o,均完美支持JSON模式
      temperature: 0.0 # 结构化输出建议0,保证结果稳定无随机性
      timeout: 60s
      # ✅ 关键配置:开启JSON模式(强制LLM输出标准JSON)
      response-format: json_object

✅ 步骤3:定义结构化返回的POJO实体(核心)

根据业务需求定义任意Java实体类,支持嵌套对象、枚举、基础类型,LangChain4j会自动完成LLM输出 → POJO的映射。

package com.example.entity;

import lombok.Data;
import java.util.List;

/**
 * 示例:商品信息结构化实体(可根据业务自定义)
 */
@Data // Lombok简化get/set,无Lombok可手动编写
public class ProductInfo {
    // 基础字段
    private String productName; // 商品名称
    private Double price;       // 商品价格
    private Integer stock;      // 库存数量
    // 嵌套集合字段
    private List<String> tags;  // 商品标签(如:热销、新品)
    // 嵌套对象字段
    private Merchant merchant;  // 商家信息

    /**
     * 嵌套实体类
     */
    @Data
    public static class Merchant {
        private String merchantName; // 商家名称
        private String contactPhone; // 联系电话
    }
}

✅ 步骤4:编写AI Service接口(声明式,无实现类)

核心特点:返回值直接指定POJO类型,框架自动完成「LLM JSON输出 → Java对象」的转换,零解析代码。

package com.example.service;

import com.example.entity.ProductInfo;
import dev.langchain4j.service.SystemMessage;
import dev.langchain4j.service.UserMessage;
import dev.langchain4j.service.spring.AiService;

/**
 * 结构化输出AI服务接口(核心)
 */
@AiService // ✅ 标记为AI服务,框架自动生成代理实现
public interface ProductAnalysisService {

    /**
     * 从用户输入中提取商品信息,返回结构化POJO
     * @param userDesc 用户输入的商品描述文本
     * @return 结构化的商品信息实体
     */
    @SystemMessage({
            "你是一个专业的信息提取专家,严格按照要求提取数据并返回JSON格式",
            "必须完全匹配指定的字段名,字段类型严格对应(价格为Double、库存为Integer)",
            "无数据的字段填充null,禁止新增未定义的字段"
    })
    @UserMessage("从以下文本中提取商品信息:{{userDesc}}")
    ProductInfo extractProductInfo(@UserMessage String userDesc);
}

✅ 步骤5:调用测试(Controller+单元测试双版本)

✅ 方式1:Controller接口调用(Web测试)
package com.example.controller;

import com.example.entity.ProductInfo;
import com.example.service.ProductAnalysisService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class StructOutputController {

    @Autowired
    private ProductAnalysisService productAnalysisService;

    // 测试地址:http://localhost:8080/extract?desc=苹果手机15Pro售价5999元,库存100台,标签有旗舰、5G,商家是苹果官方店,电话10086
    @GetMapping("/extract")
    public ProductInfo extract(@RequestParam String desc) {
        // ✅ 直接返回POJO,框架自动完成所有转换
        return productAnalysisService.extractProductInfo(desc);
    }
}
✅ 方式2:单元测试(更便捷,无需启动Web)
package com.example;

import com.example.entity.ProductInfo;
import com.example.service.ProductAnalysisService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class AiServiceApplicationTests {

    @Autowired
    private ProductAnalysisService productAnalysisService;

    @Test
    void testStructOutput() {
        String userDesc = "华为Mate70售价4999元,库存200台,标签有鸿蒙、拍照、续航,商家是华为旗舰店,电话10010";
        ProductInfo productInfo = productAnalysisService.extractProductInfo(userDesc);
        
        // 直接操作Java对象,无需解析JSON
        System.out.println("商品名称:" + productInfo.getProductName());
        System.out.println("商品价格:" + productInfo.getPrice());
        System.out.println("商家名称:" + productInfo.getMerchant().getMerchantName());
    }
}

✅ 结构化输出核心要点(避坑)

  1. response-format: json_object强制配置,缺失则LLM可能返回非JSON文本,导致转换失败;
  2. temperature: 0.0 建议配置,结构化输出追求「确定性」,该参数可避免LLM生成随机内容;
  3. ✅ 系统提示词中明确字段约束(类型、非空、字段名),可大幅提升映射准确率;
  4. ✅ 支持的返回类型:String/Boolean/Enum/任意POJO/List<POJO>,完全覆盖业务场景。

🎯 场景二:Spring Boot 多AI Service 协作(生产级必备)

✅ 核心价值

实际业务中,AI能力往往需要拆分、复用、组合(如:「意图识别」→「专业问答」→「结果格式化」),多AI Service协作可实现:
✅ 职责分离:不同Service负责不同AI能力,代码更整洁;
✅ 能力复用:单个Service可被多个业务模块调用;
✅ 灵活组合:结合Java原生逻辑(if/else/循环)实现复杂AI流程;
✅ 易测试:可单独Mock某个Service,不影响整体流程。

✅ 整体设计思路

本次实现3个AI Service协作完成「智能客服」流程

📌 流程链路:用户提问 → 「意图识别Service」判断问题类型 → 路由到「技术问答Service」/「闲聊Service」 → 返回最终结果

✅ 步骤1:编写3个职责分离的AI Service接口

✅ ① 意图识别Service(负责判断用户问题类型)
package com.example.service;

import dev.langchain4j.service.SystemMessage;
import dev.langchain4j.service.UserMessage;
import dev.langchain4j.service.spring.AiService;

/**
 * 职责1:意图识别(判断用户问题是技术问题/闲聊)
 */
@AiService
public interface IntentRecognitionService {

    @SystemMessage({
            "你是意图识别专家,仅返回以下2个结果中的一个,不返回任何额外内容:",
            "1. TECH_QUESTION(技术相关问题)",
            "2. CHAT(闲聊、问候等非技术问题)"
    })
    @UserMessage("判断问题类型:{{userQuestion}}")
    String recognizeIntent(@UserMessage String userQuestion);
}
✅ ② 技术问答Service(负责解答Java/Spring技术问题)
package com.example.service;

import dev.langchain4j.service.SystemMessage;
import dev.langchain4j.service.UserMessage;
import dev.langchain4j.service.spring.AiService;

/**
 * 职责2:专业技术问答(Java/Spring方向)
 */
@AiService
public interface TechQaService {

    @SystemMessage({
            "你是资深Java架构师,精通Spring Boot全家桶,回答简洁、准确、干货",
            "只回答技术问题,非技术问题直接回复「不支持该类型问题」"
    })
    @UserMessage("解答技术问题:{{question}}")
    String answerTechQuestion(@UserMessage String question);
}
✅ ③ 闲聊Service(负责处理问候、闲聊等非技术问题)
package com.example.service;

import dev.langchain4j.service.SystemMessage;
import dev.langchain4j.service.UserMessage;
import dev.langchain4j.service.spring.AiService;

/**
 * 职责3:闲聊互动(处理问候、日常对话)
 */
@AiService
public interface ChatService {

    @SystemMessage("你是一个友好的闲聊助手,语气亲切,回复简洁,仅处理非技术闲聊")
    @UserMessage("回复用户:{{message}}")
    String chat(@UserMessage String message);
}

✅ 步骤2:编写「协作调度器」(核心:组合多AI Service)

创建普通Spring服务,注入所有AI Service,结合Java原生逻辑实现路由、组合,这是多Service协作的核心入口。

package com.example.service;

import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

/**
 * 多AI Service协作调度器(核心)
 * 整合所有AI能力,对外提供统一入口
 */
@Service // 普通Spring服务,非AI Service
@RequiredArgsConstructor // Lombok注入所有依赖,替代@Autowired
public class AiAssistantDispatcher {

    // ✅ 注入3个AI Service
    private final IntentRecognitionService intentRecognitionService;
    private final TechQaService techQaService;
    private final ChatService chatService;

    /**
     * 对外统一入口:接收用户提问,自动路由到对应AI Service
     */
    public String handleUserQuestion(String userQuestion) {
        // 1. 第一步:调用意图识别Service,判断问题类型
        String intent = intentRecognitionService.recognizeIntent(userQuestion);
        
        // 2. 第二步:基于意图,路由到不同的AI Service(Java原生逻辑)
        return switch (intent) {
            case "TECH_QUESTION" -> techQaService.answerTechQuestion(userQuestion);
            case "CHAT" -> chatService.chat(userQuestion);
            default -> "暂无法识别你的问题类型,请重新提问";
        };
    }
}

✅ 步骤3:编写测试接口(统一调用)

package com.example.controller;

import com.example.service.AiAssistantDispatcher;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class AiDispatcherController {

    @Autowired
    private AiAssistantDispatcher aiAssistantDispatcher;

    // 统一测试入口:http://localhost:8080/ai/ask?question=Spring Bean生命周期是什么
    // 切换问题测试:http://localhost:8080/ai/ask?question=你好呀
    @GetMapping("/ai/ask")
    public String ask(@RequestParam String question) {
        // ✅ 统一调用调度器,无需关心内部多Service协作逻辑
        return aiAssistantDispatcher.handleUserQuestion(question);
    }
}

✅ 多AI Service协作核心技巧(生产级)

✅ 技巧1:Service拆分原则
  • 能力维度拆分:意图识别、问答、翻译、提取、格式化,各司其职;
  • 业务维度拆分:订单AI服务、商品AI服务、用户AI服务,贴合业务模块;
  • 模型维度拆分:轻量任务用GPT-3.5,复杂任务用GPT-4o,低成本+高性能兼顾。
✅ 技巧2:进阶协作方式(复杂场景)
  1. 链式调用:A→B→C,前一个Service的输出作为后一个的输入(如:文本提取→翻译→格式化);
  2. 分支调用:根据条件路由到不同Service(本次示例);
  3. 并行调用:多Service同时执行,汇总结果(如:同时调用「情感分析」+「关键词提取」);
  4. 嵌套调用:在一个Service中注入另一个Service(调度器模式)。
✅ 技巧3:优雅注入(替代@Autowired)
  • 推荐使用 构造器注入(Lombok @RequiredArgsConstructor),符合Spring最佳实践;
  • 所有AI Service均为单例Bean,可安全注入、重复调用,无性能问题。
✅ 技巧4:单元测试与Mock(关键)

多Service协作时,若需单独测试某个Service,可通过Mock屏蔽其他依赖:

@SpringBootTest
class TechQaServiceTest {
    // Mock意图识别Service,避免真实调用
    @MockBean
    private IntentRecognitionService intentRecognitionService;
    
    // 注入真实的技术问答Service
    @Autowired
    private TechQaService techQaService;

    @Test
    void testTechQa() {
        String result = techQaService.answerTechQuestion("Spring Boot自动装配原理");
        System.out.println(result);
    }
}

📌 补充:AI Services 核心注解速查表(官方全量)

整理官方文档中所有高频注解,开发时直接查阅,无需翻文档:

注解 核心作用
@AiService 标记接口为AI服务,框架自动生成代理实现类(核心注解)
@SystemMessage 定义系统提示词,约束AI角色/规则,支持静态文本/资源文件加载 fromResource
@UserMessage 定义用户输入模板,支持{{变量}}占位符,绑定方法参数
@AssistantMessage 定义AI历史回复,用于多轮对话上下文关联
@MemoryId 标记会话ID,实现多用户/多会话的独立记忆隔离(多轮对话必备)
@Tool 标记工具方法,让AI自动决定是否调用该方法完成任务(Function Calling)
@V("变量名") 显式绑定方法参数到模板变量,Spring环境中可省略,自动匹配

🎯 最终总结

  1. 结构化输出+JSON模式:是LangChain4j AI Services最核心的生产级能力,解决了LLM输出格式混乱的痛点,返回值直接用POJO接收,零解析成本;
  2. 多AI Service协作:通过「职责拆分+调度组合」,让AI能力复用性、可维护性翻倍,完全贴合Spring开发思想;
  3. 核心优势:声明式接口+自动代理,无冗余代码,开发者只需关注「业务逻辑」,无需关心LLM底层调用、格式转换、记忆管理;
  4. 版本兼容:上述代码完全适配LangChain4j 0.26.0最新版,与Spring Boot 3.x无缝集成。

✅ 如需扩展其他能力(如:多轮对话记忆@MemoryId、工具调用@Tool、RAG集成),可以随时告诉我,我会为你补充对应的完整代码示例~

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐