🌐 LangChain4j AI Agent 开发实战指南(Java 工程师专属 · 从零到生产)

文档定位:面向有 Java 基础的开发者,聚焦 AI Agent 核心开发流程,拒绝“玩具级 demo”,提供可落地的工程化方案
技术栈:LangChain4j 0.28.0 + Spring Boot 3.2 + OpenAI API(兼容国产模型)
核心理念:Agent = Tools(工具) + Reasoning(推理) + Memory(记忆) + Action(执行)


📌 一、为什么选择 LangChain4j?(vs Python 版)

维度 LangChain4j (Java) LangChain (Python) Java 工程师优势
工程化 ✅ 强类型、编译检查、IDE 深度支持 ⚠️ 动态类型、运行时错误多 重构安全、大型项目可控
生态整合 ✅ 无缝对接 Spring Boot/Cloud ⚠️ 需额外胶水代码 企业级微服务天然适配
部署运维 ✅ JVM 生态(监控/链路追踪) ⚠️ 需容器化隔离 与现有 Java 系统零摩擦
性能 ✅ 异步非阻塞(Project Reactor) ⚠️ GIL 限制 高并发场景优势显著

💡 关键认知
LangChain4j 不是 LangChain 的简单移植,而是为 JVM 生态深度重构的 AI 应用框架


🛠️ 二、环境准备(5 分钟快速启动)

1. Maven 依赖(pom.xml

<properties>
    <langchain4j.version>0.28.0</langchain4j.version>
    <spring.boot.version>3.2.5</spring.boot.version>
</properties>

<dependencies>
    <!-- 核心框架 -->
    <dependency>
        <groupId>dev.langchain4j</groupId>
        <artifactId>langchain4j</artifactId>
        <version>${langchain4j.version}</version>
    </dependency>
    
    <!-- OpenAI 模型(替换为国产模型见第7节) -->
    <dependency>
        <groupId>dev.langchain4j</groupId>
        <artifactId>langchain4j-open-ai</artifactId>
        <version>${langchain4j.version}</version>
    </dependency>
    
    <!-- Spring Boot 集成(生产必备) -->
    <dependency>
        <groupId>dev.langchain4j</groupId>
        <artifactId>langchain4j-spring-boot-starter</artifactId>
        <version>${langchain4j.version}</version>
    </dependency>
    
    <!-- 内存存储(生产替换为 Redis) -->
    <dependency>
        <groupId>dev.langchain4j</groupId>
        <artifactId>langchain4j-core</artifactId>
        <version>${langchain4j.version}</version>
    </dependency>
    
    <!-- 工具类:JSON 处理 -->
    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
    </dependency>
</dependencies>

2. 配置文件(application.yml

langchain4j:
  openai:
    api-key: ${OPENAI_API_KEY} # 环境变量注入(安全!)
    base-url: https://api.openai.com/v1
    chat-model:
      model-name: "gpt-4o-mini" # 生产建议:gpt-4o / 国产模型
      temperature: 0.3
      max-tokens: 1000
  # 内存对话存储(生产替换为 RedisStore)
  store:
    type: in-memory

🔒 安全提示

  • 严禁将 API Key 写入代码!使用环境变量/配置中心
  • 生产环境建议:API 网关限流 + 模型调用审计日志

🧠 三、核心概念速览(Agent 开发基石)

概念 LangChain4j 实现 作用 代码类比
Model ChatLanguageModel 大模型客户端 RestTemplate
Prompt PromptTemplate 指令模板 @Query 注解
Tool @Tool 注解方法 Agent 可调用能力 @Service 方法
Memory ChatMemory 对话历史管理 HttpSession
Agent AiService / AgentExecutor 智能体核心 @Controller
Chain Chain 接口 工作流编排 Stream 流水线

💡 四、实战 Demo:智能客服 Agent(完整可运行)

场景需求

开发一个电商客服 Agent,支持:
✅ 查询订单状态(调用内部 API)
✅ 计算优惠(数学工具)
✅ 记忆用户偏好(对话历史)
✅ 拒绝敏感问题(安全护栏)

步骤 1:定义 Tools(工具层)

import dev.langchain4j.service.tool.Tool;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.Map;

@Component
public class CustomerServiceTools {
    
    // 模拟订单数据库(生产替换为 FeignClient)
    private final Map<String, Map<String, Object>> orders = new HashMap<>() {{
        put("ORD1001", Map.of("status", "已发货", "amount", 299.0));
        put("ORD1002", Map.of("status", "待支付", "amount", 89.5));
    }};
    
    @Tool("查询订单状态,参数:订单号(如 ORD1001)")
    public String checkOrderStatus(String orderId) {
        if (!orders.containsKey(orderId)) {
            return "订单号不存在,请确认后重试";
        }
        Map<String, Object> order = orders.get(orderId);
        return String.format("订单 %s 状态:%s,金额:%.2f元", 
            orderId, order.get("status"), order.get("amount"));
    }
    
    @Tool("计算订单优惠后价格,参数:原价, 折扣率(0-1)")
    public String calculateDiscount(double originalPrice, double discountRate) {
        if (discountRate < 0 || discountRate > 1) {
            return "折扣率必须在0-1之间";
        }
        double finalPrice = originalPrice * discountRate;
        return String.format("原价 %.2f元,%.0f折后价格:%.2f元", 
            originalPrice, discountRate * 10, finalPrice);
    }
    
    @Tool("安全审核:检测用户问题是否含敏感词(政治/辱骂等)")
    public boolean isQuestionSafe(String question) {
        String[] sensitiveWords = {"政治", "骂人", "违法"};
        for (String word : sensitiveWords) {
            if (question.contains(word)) {
                return false;
            }
        }
        return true;
    }
}

步骤 2:构建 Agent(智能体层)

import dev.langchain4j.memory.chat.MessageWindowChatMemory;
import dev.langchain4j.model.chat.ChatLanguageModel;
import dev.langchain4j.service.AiServices;
import dev.langchain4j.service.SystemMessage;
import dev.langchain4j.service.UserMessage;
import dev.langchain4j.service.V;
import org.springframework.stereotype.Service;

@Service
public class CustomerServiceAgent {
    
    private final AiService agent;
    
    // 依赖注入(Spring 管理)
    public CustomerServiceAgent(
            ChatLanguageModel model,
            CustomerServiceTools tools) {
        
        // 创建带记忆的 Agent
        this.agent = AiServices.builder(AiService.class)
                .chatLanguageModel(model)
                .chatMemory(MessageWindowChatMemory.withMaxMessages(10)) // 保留最近10轮对话
                .tools(tools) // 注入工具
                .systemMessageProvider(userId -> 
                    "你是一名专业电商客服「小福」,语气亲切。" +
                    "规则:1. 仅回答电商相关问题 2. 拒绝敏感问题 3. 用中文简洁回复")
                .build();
    }
    
    // Agent 接口定义(声明式编程)
    public interface AiService {
        @UserMessage("用户问题:{{question}}")
        String chat(@V("question") String question);
    }
    
    // 对外服务方法
    public String handleQuery(String userId, String question) {
        // 安全前置检查(生产建议:独立 Filter)
        if (!new CustomerServiceTools().isQuestionSafe(question)) {
            return "您的问题涉及敏感内容,我无法回答。如有其他购物问题,我很乐意帮助您!";
        }
        return agent.chat(question);
    }
}

步骤 3:Controller 层(REST API)

import org.springframework.web.bind.annotation.*;
import jakarta.servlet.http.HttpSession;

@RestController
@RequestMapping("/api/agent")
public class AgentController {
    
    private final CustomerServiceAgent agent;
    
    public AgentController(CustomerServiceAgent agent) {
        this.agent = agent;
    }
    
    @PostMapping("/chat")
    public String chat(
            @RequestParam String question,
            HttpSession session) {
        
        // 从 Session 获取用户ID(生产替换为 JWT)
        String userId = session.getId();
        
        // 调用 Agent
        return agent.handleQuery(userId, question);
    }
}

步骤 4:启动类(Spring Boot)

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class AgentApplication {
    public static void main(String[] args) {
        SpringApplication.run(AgentApplication.class, args);
        System.out.println("✅ AI Agent 服务已启动!访问: http://localhost:8080/api/agent/chat?question=订单ORD1001状态");
    }
}

🌟 五、关键能力深度解析

1. Tool 定义最佳实践

@Tool("查询实时天气,参数:城市名(中文)")
public WeatherResponse getWeather(@ToolArgument("city") String city) {
    // 生产:调用天气 API(带熔断/重试)
    return weatherClient.query(city); 
}

// 复杂参数:使用 DTO(LangChain4j 自动 JSON 序列化)
@Tool("创建订单")
public OrderResponse createOrder(@ToolArgument("order") CreateOrderRequest request) {
    // request 包含:productId, quantity, address...
}

2. 记忆管理(生产级方案)

// 替换内存存储为 Redis(支持分布式)
@Bean
public ChatMemoryStore chatMemoryStore(RedisTemplate<String, Object> redis) {
    return new RedisChatMemoryStore(redis, "agent:memory:");
}

// 按用户隔离记忆
@Bean
public ChatMemory chatMemory(ChatMemoryStore store, @Value("#{userId}") String userId) {
    return MessageWindowChatMemory.builder()
            .id(userId) // 用户ID作为记忆Key
            .maxMessages(20)
            .chatMemoryStore(store)
            .build();
}

3. 安全与审计(企业必备)

// 自定义 Prompt 拦截器
@Component
public class SecurityPromptInterceptor implements PromptInterceptor {
    @Override
    public Prompt transform(Prompt prompt) {
        // 注入安全指令到系统消息
        String safeSystemMessage = prompt.systemMessage() + 
            "\n【安全规则】禁止生成违法/歧视/虚假信息,涉及医疗/金融需声明'请咨询专业人士'";
        return Prompt.from(safeSystemMessage, prompt.userMessage());
    }
}

// 调用审计日志
@Aspect
@Component
public class AgentAuditAspect {
    @AfterReturning(pointcut = "execution(* *.chat(..))", returning = "result")
    public void logAudit(JoinPoint jp, Object result) {
        String question = jp.getArgs()[0].toString();
        log.info("AUDIT|user:{}|question:{}|response:{}", 
            getUserId(), question, result);
    }
}

🌍 六、国产模型无缝替换(适配中国场景)

方案 1:通义千问(阿里云)

langchain4j:
  dashscope: # 通义实验室
    api-key: ${DASHSCOPE_API_KEY}
    chat-model:
      model-name: "qwen-max" # qwen-plus / qwen-turbo
// 无需改代码!仅替换配置
@Bean
public ChatLanguageModel chatModel() {
    return DashscopeChatModel.builder()
            .apiKey(apiKey)
            .modelName("qwen-max")
            .build();
}

方案 2:其他模型支持

模型厂商 依赖坐标 配置前缀
讯飞星火 langchain4j-spark spark
百度文心 langchain4j-ernie ernie
智谱 GLM langchain4j-zhipu-ai zhipu-ai
Ollama 本地 langchain4j-ollama ollama

💡 统一抽象:所有模型实现 ChatLanguageModel 接口,业务代码零修改切换模型


🚀 七、生产环境 Checklist

类别 关键项 工具/方案
安全 API Key 管理 配置中心(Apollo/Nacos)+ KMS
性能 模型调用限流 Resilience4j + Sentinel
可观测 调用链追踪 SkyWalking + MDC 日志
成本 Token 消耗监控 自定义 Metrics(Micrometer)
合规 敏感词过滤 腾讯云内容安全 API
灾备 模型降级策略 本地小模型(TinyLlama)兜底

💎 八、总结与进阶路线

核心心法

🔹 Agent 不是“调大模型”,而是“设计工具+约束推理”
🔹 80% 价值来自 Tools 设计,20% 来自 Prompt 优化
🔹 生产环境:安全 > 成本 > 效果

进阶学习路径

高阶

Agent 记忆优化

自主规划(ReAct)

Agent 评测体系

工程化

Spring Boot 集成

监控/审计/限流

国产模型适配

工具链

RAG:文档加载+向量检索

Function Calling:复杂参数

Multi-Agent:协作系统

基础

LangChain4j 核心概念

Tools + Prompt 编写

推荐资源


最后赠言(来自一线架构师):
“我曾用 3 天为物流系统开发 Agent:

  • Tools:对接 WMS(库存查询)、TMS(运单跟踪)
  • 效果:客服人力下降 40%,用户满意度↑25%
    关键不是技术多炫酷,而是精准解决业务痛点
    从今天起,用 LangChain4j 为你的系统装上‘智能大脑’!”

立即行动

git clone https://github.com/langchain4j/langchain4j-examples.git
cd spring-boot-example
mvn spring-boot:run
# 访问 http://localhost:8080/swagger-ui.html 测试你的第一个 Agent!

(注:本文档基于 LangChain4j 0.28.0 编写,API 可能随版本迭代调整,请以官方文档为准。生产环境务必进行安全与性能测试!)

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐