一:2026 年了,Java 程序员还不会 AI Agent?从原理到实战,用 LangChain4j 构建企业级智能体

Java后端开发者的个人AI Agent集群构建方案 本方案基于Dify平台构建一个由四个专业化Agent组成的集群,每个Agent负责特定领域的任务,并通过中央协调器实现Agent间的协作。整个系统将与Java后端应用无缝集成,为开发者提供全方位的智能辅助。代码开发助手:专注于代码质量提升、设计模式应用和接口规范优化知识库管理器:负责个人知识的组织、检索和关联学习助手:辅助技术资料整理、学习进度跟踪和知识点提炼AI研究跟踪器:关注AI和大模型领域的最新发展。 阅读详情

2026 年了,Java 程序员还不会 AI Agent?从原理到实战,用 LangChain4j 构建企业级智能体

前言

2025 年被称为 “AI Agent 元年”,2026 年 Agent 已经从概念验证走向了生产落地。然而笔者在技术社区观察到,大量 Java 开发者对 Agent 的理解仍停留在 “调用大模型 API 聊天” 的阶段。本文将从 底层原理 出发,层层递进,带你用 LangChain4j + Spring Boot 构建一个具备 工具调用、RAG 知识检索、记忆管理 能力的完整 AI Agent。


一、从 ChatBot 到 Agent:一次认知升级

1.1 为什么我们需要 Agent?

回顾大模型应用的演进路径,我们可以清晰地看到三个阶段:

第一阶段:Prompt → Response(纯问答)

这是最简单的形态。用户输入一段文字,大模型返回一段回答。整个过程是 无状态的——模型不记得你上一句说了什么,也无法与外部世界交互。这本质上是一个"文本接龙"游戏。

第二阶段:ChatBot(带上下文的多轮对话)

通过将历史对话拼接进 Prompt,模型获得了"记忆"。但它的本质能力没有变——仍然只是文本生成。它无法查询数据库、无法调用 API、无法帮你执行任何实际操作。

第三阶段:AI Agent(自主决策的智能体)

Agent 的核心突破在于:大模型不再只是"回答问题",而是成为"大脑"——它理解你的意图,规划执行步骤,调用外部工具,并根据结果动态调整策略。

一个直观的类比:ChatBot 像一个只会纸上谈兵的顾问,而 Agent 像一个有手有脚、能干活的员工。

1.2 Agent 的核心架构

一个完整的 Agent 由四个核心组件构成:

┌─────────────────────────────────────────────┐
│                  AI Agent                   │
│                                             │
│  ┌─────────┐  ┌───────┐  ┌──────────────┐  │
│  │  LLM    │  │ Tools │  │   Memory     │  │
│  │ (大脑)  │  │ (手脚) │  │  (记忆系统)  │  │
│  └────┬────┘  └───┬───┘  └──────┬───────┘  │
│       │           │             │           │
│       └───────────┼─────────────┘           │
│                   │                         │
│           ┌───────┴───────┐                 │
│           │  Planner      │                 │
│           │  (规划引擎)   │                 │
│           └───────────────┘                 │
└─────────────────────────────────────────────┘
  • LLM(大脑):负责理解用户意图、推理决策。它是 Agent 的"思考中枢"。
  • Tools(工具集):Agent 与外部世界交互的手段。可以是数据库查询、API 调用、文件操作等。
  • Memory(记忆):让 Agent 在多轮对话中保持连贯性,包括短期记忆(当前对话)和长期记忆(跨会话的知识积累)。
  • Planner(规划器):决定 Agent 的执行策略——先做什么、后做什么、是否需要重新规划。

1.3 Agent 的推理模式:ReAct 循环

目前最主流的 Agent 推理模式叫做 ReAct(Reasoning + Acting),其核心思想是:想一步,做一步,观察结果,再决定下一步。

一个 ReAct 循环的完整过程如下:

用户输入: "A栋办公楼今天能耗异常吗?如果异常就通知张工"

[Thought 1] 用户想了解A栋的能耗情况,我需要先查询今天的实时数据
[Action 1]  调用工具 → queryRealtimeEnergy("A栋办公楼")
[Observe 1] 返回结果: 3856.2 kWh

[Thought 2] 3856 kWh 看起来比较高,我需要对比历史趋势来判断是否异常
[Action 2]  调用工具 → queryEnergyTrend("A栋办公楼", 7)
[Observe 2] 返回结果: "过去7天平均能耗 2100 kWh,今日明显偏高"

[Thought 3] 确认异常,用户要求通知张工
[Action 3]  调用工具 → sendAlert("张工", "A栋今日能耗3856kWh,超出均值84%")
[Observe 3] 返回结果: "通知发送成功"

[Thought 4] 所有步骤已完成,可以总结回复用户
[Final]     A栋办公楼今日能耗 3856.2 kWh,超出近7天均值84%,已通知张工处理。

这就是 Agent 和普通 ChatBot 的根本区别:Agent 具备自主推理和链式行动的能力。理解了这个原理,后面的代码实现就不再神秘了。


二、技术选型深度对比

2.1 Java 生态 AI 框架横评

在动手之前,我们有必要理清 Java 生态中几个主流 AI 框架的定位和差异:

维度Spring AILangChain4jSemantic Kernel
背景Spring 官方社区驱动(LangChain Java 移植)微软
Agent 能力基础 Function Calling完整 ReAct Agent + AiServices有但更新慢
RAG 支持基础完善(多种 Splitter/Retriever)基础
模型适配主流模型20+ 模型供应商主要 Azure
学习曲线低(Spring 用户友好)中高
社区活跃度高非常高低

选择 LangChain4j 的核心理由:

  1. Agent 抽象最优雅:通过 @Tool 注解 + AiServices 代理模式,开发者只需定义接口,框架自动处理 Tool Calling 的序列化/反序列化、ReAct 循环、错误重试等复杂逻辑。
  2. RAG 开箱即用:内置 10+ 文档切分策略、支持多种向量数据库,RAG 集成只需几行代码。
  3. 模型无关:OpenAI、Anthropic、Ollama、国产大模型(通义、文心、智谱)都能无缝切换。

2.2 Maven 依赖配置

<dependencies>
    <!-- LangChain4j 核心:Agent、Tool、Memory 等基础能力 -->
    <dependency>
        <groupId>dev.langchain4j</groupId>
        <artifactId>langchain4j</artifactId>
        <version>1.0.0-beta3</version>
    </dependency>

    <!-- 大模型适配层:封装了与 OpenAI 兼容 API 的通信逻辑 -->
    <dependency>
        <groupId>dev.langchain4j</groupId>
        <artifactId>langchain4j-open-ai</artifactId>
        <version>1.0.0-beta3</version>
    </dependency>

    <!-- Spring Boot Starter:自动配置 Bean,简化集成 -->
    <dependency>
        <groupId>dev.langchain4j</groupId>
        <artifactId>langchain4j-spring-boot-starter</artifactId>
        <version>1.0.0-beta3</version>
    </dependency>

    <!-- 内嵌向量存储:基于内存实现,适合开发测试阶段 -->
    <dependency>
        <groupId>dev.langchain4j</groupId>
        <artifactId>langchain4j-embedding-store-inmemory</artifactId>
        <version>1.0.0-beta3</version>
    </dependency>
</dependencies>

三、Tool Calling 深度解析:让大模型长出"手脚"

3.1 Tool Calling 的底层原理

很多人好奇:大模型是一段文本生成模型,它怎么"调用"Java 方法的?

其实原理并不复杂,核心是一个 协议约定 + 循环调度 的机制:

第一步:工具描述注入 System Prompt

当你用 @Tool 标注一个方法后,框架会自动将方法的 名称、描述、参数类型 转换成 JSON Schema 格式,注入到发送给大模型的 Prompt 中。大模型看到的并不是 Java 代码,而是类似这样的描述:

{
  "name": "queryRealtimeEnergyConsumption",
  "description": "查询指定区域的实时能耗数据,返回单位为 kWh",
  "parameters": {
    "type": "object",
    "properties": {
      "areaName": {
        "type": "string",
        "description": "areaName"
      }
    },
    "required": ["areaName"]
  }
}

第二步:大模型返回"调用意图"而非普通文本

当大模型判断需要调用某个工具时,它返回的不是普通文本,而是一个结构化的 Tool Call 请求:

{
  "tool_calls": [{
    "function": {
      "name": "queryRealtimeEnergyConsumption",
      "arguments": "{\"areaName\": \"A栋办公楼\"}"
    }
  }]
}

第三步:框架执行实际方法,结果回传大模型

LangChain4j 框架拦截到这个 Tool Call 请求后:

  1. 通过反射找到对应的 Java 方法
  2. 反序列化参数,执行方法
  3. 将执行结果作为新消息追加到对话历史中
  4. 再次调用大模型,让它根据工具返回的结果继续推理

这个"请求-执行-回传"的循环就是 ReAct 的核心。 大模型可能需要多轮 Tool Call 才能完成一个复杂任务,框架会自动管理这个循环,直到大模型认为任务完成、返回最终文本。

3.2 定义工具:用注解描述能力

理解了原理后,代码实现就很直观了。@Tool 注解中的描述文字 至关重要——它是大模型理解工具用途的唯一依据。描述越精确,大模型的调用决策就越准确。

@Component
public class EnergyQueryTools {

    @Tool("查询指定区域的实时能耗数据,返回数值单位为 kWh。" +
          "当用户询问某个区域'当前能耗'、'今天用了多少电'等问题时调用此工具。")
    public double queryRealtimeEnergyConsumption(String areaName) {
        // 实际项目中调用数据库或第三方能耗采集 API
        Map<String, Double> mockData = Map.of(
            "A栋办公楼", 1523.5,
            "B栋研发中心", 2891.2,
            "C栋数据中心", 8734.6
        );
        return mockData.getOrDefault(areaName, 0.0);
    }

    @Tool("查询指定区域过去 N 天的能耗趋势分析,返回趋势描述文本。" +
          "当用户想了解'能耗趋势'、'最近用电变化'等问题时调用。")
    public String queryEnergyTrend(String areaName, int days) {
        return String.format("%s 过去 %d 天平均能耗呈%s趋势",
            areaName, days, days > 7 ? "上升" : "平稳");
    }

    @Tool("向指定负责人发送能耗预警通知,返回发送结果。" +
          "仅在能耗确实异常且用户明确要求通知时调用。")
    public String sendAlertNotification(String recipient, String message) {
        System.out.printf("[ALERT] To: %s, Message: %s%n", recipient, message);
        return "通知发送成功";
    }
}

关于 @Tool 描述的三条经验法则:

  1. 说清楚"什么时候该用":不要只写"查询能耗",要写"当用户询问当前能耗、用电量等问题时调用"。
  2. 说清楚"返回什么":明确告诉模型返回值是数值、文本还是布尔值,以及单位是什么。
  3. 说清楚"什么时候不该用":对于高危操作(如删除数据),明确标注使用条件。

3.3 构建 Agent:AiServices 代理模式

LangChain4j 最精妙的设计之一是 AiServices——它采用类似 MyBatis Mapper 的代理模式:你定义一个 Java 接口,框架在运行时动态生成实现类,自动处理 Tool Calling 循环。

/**
 * 能源管理 Agent 接口
 * 
 * 工作原理:
 * 1. AiServices 在运行时为此接口生成动态代理
 * 2. 当调用 chat() 时,代理将用户消息 + 系统提示词 + 工具描述一起发送给大模型
 * 3. 如果大模型返回 Tool Call,代理自动执行对应方法并循环调用大模型
 * 4. 直到大模型返回最终文本,代理将其作为方法返回值
 */
public interface EnergyAgent {

    @SystemMessage("""
        你是一个智慧能源管理助手,负责帮助用户分析和管理能源消耗。
        
        你的能力:
        1. 查询任意区域的实时能耗数据
        2. 分析指定时间段的能耗趋势
        3. 在能耗异常时向负责人发送预警通知
        
        行为准则:
        - 先查数据,再下结论。不要凭猜测回答。
        - 数据回答必须带单位(kWh)。
        - 发送通知前,必须确认用户有此意图。
        """)
    String chat(@UserMessage String userMessage);
}

为什么用接口而非具体类? 这是典型的"控制反转"思想。你只声明"Agent 应该做什么"(通过注解),而"怎么做的"(ReAct 循环、工具调度、错误重试)全部交给框架。这与 Spring 的 DI 理念一脉相承。

3.4 组装与暴露

@Configuration
public class AgentConfig {

    @Bean
    public EnergyAgent energyAgent(EnergyQueryTools tools) {
        OpenAiChatModel model = OpenAiChatModel.builder()
            .apiKey(System.getenv("LLM_API_KEY"))
            .baseUrl(System.getenv("LLM_BASE_URL"))  // 支持国产模型代理
            .modelName("gpt-4o")
            .temperature(0.3)   // Agent 场景用低 temperature,减少"创意",增强"准确"
            .build();

        return AiServices.builder(EnergyAgent.class)
            .chatLanguageModel(model)
            .tools(tools)        // 注册工具集
            .chatMemory(MessageWindowChatMemory.withMaxMessages(20))
            .build();
    }
}

@RestController
@RequestMapping("/api/agent")
public class AgentController {

    @Autowired
    private EnergyAgent energyAgent;

    @PostMapping("/chat")
    public ResponseEntity<String> chat(@RequestBody ChatRequest request) {
        return ResponseEntity.ok(energyAgent.chat(request.getMessage()));
    }
}

四、RAG 原理与实现:让 Agent 拥有"私域知识"

4.1 为什么需要 RAG?

大模型的知识有两个致命缺陷:

  1. 知识截止日期:模型训练数据有时效性,无法知道最新的信息。
  2. 缺乏私域知识:你公司的《能源管理手册》、内部规章制度、设备参数——这些模型从未见过。

RAG(Retrieval-Augmented Generation,检索增强生成) 的核心思想非常朴素:在提问之前,先从知识库中检索出相关文档片段,把它和用户问题一起交给大模型,让模型"开卷考试"。

4.2 RAG 的完整链路

           【离线索引阶段】
           
企业文档 ──→ 文档切分 ──→ Embedding向量化 ──→ 存入向量数据库
 (PDF/Word)   (Chunking)    (文本→数值向量)      (Milvus等)


           【在线检索阶段】
           
用户提问 ──→ Query向量化 ──→ 向量相似度检索 ──→ Top-K相关片段
                                                     │
                                                     ▼
                              LLM ←── 相关片段 + 用户问题
                               │
                               ▼
                          带上下文的专业回答

4.3 关键技术点解析

文档切分(Chunking):为什么不能直接存整篇文档?

这是一个常见的初学者疑问。原因有三:

  1. Token 限制:大模型的上下文窗口有限(通常 4K~128K tokens),塞不下整篇文档。
  2. 检索精度:文档越长,包含的主题越杂。短片段能让检索更精准地命中相关内容。
  3. 噪声控制:只给模型最相关的片段,避免无关信息干扰模型的判断。

LangChain4j 提供了多种切分策略,最常用的是 递归切分:先尝试按段落分,段落太大再按句子分,句子太大再按字符分,直到每个片段控制在目标大小内。

// 目标: 每个片段约 500 token,相邻片段重叠 50 token
// 重叠的目的:防止一句话被从中间切断,导致上下文丢失
DocumentSplitter splitter = DocumentSplitters
    .recursive(500, 50);
Embedding 向量化:文本如何变成"可比较的数字"?

Embedding 是 RAG 最核心的技术。 它的本质是:将一段文本映射到高维向量空间中的一个点。语义相似的文本,在向量空间中的距离更近。

举例来说,“今天用电量很高” 和 “今日能耗偏大” 这两句话虽然用词不同,但语义相近,它们的向量余弦相似度可能达到 0.92(满分 1.0)。而 “今天用电量很高” 和 “明天天气不错” 的相似度可能只有 0.15。

这就是向量检索的数学基础:将"语义匹配"问题转化为"向量距离计算"问题。

EmbeddingModel embeddingModel = OpenAiEmbeddingModel.builder()
    .apiKey(System.getenv("LLM_API_KEY"))
    .modelName("text-embedding-3-small")  // 1536维向量,性价比最优
    .build();

// 将文本转换为向量
Embedding vector = embeddingModel.embed("今天A栋能耗偏高").content();
// vector → [0.023, -0.156, 0.892, ..., 0.041]  (1536个浮点数)
向量检索:在百万文档中毫秒级找到相关内容

向量数据库的作用类似于传统数据库的索引,但它是为高维向量相似度搜索而优化的。常用的向量数据库有 Milvus、Pinecone、Elasticsearch(8.x+ 支持向量检索)等。

开发阶段可以用内存实现,生产环境必须换成持久化方案:

// 开发阶段:内存向量存储(重启丢失数据)
EmbeddingStore<TextSegment> store = new InMemoryEmbeddingStore<>();

// 生产阶段:持久化向量存储
// EmbeddingStore<TextSegment> store = MilvusEmbeddingStore.builder()
//     .uri("http://milvus:19530")
//     .collectionName("energy_docs")
//     .build();

4.4 完整 RAG 服务实现

@Service
public class RagService {

    private final EmbeddingStore<TextSegment> embeddingStore;
    private final EmbeddingModel embeddingModel;

    public RagService() {
        this.embeddingStore = new InMemoryEmbeddingStore<>();
        this.embeddingModel = OpenAiEmbeddingModel.builder()
            .apiKey(System.getenv("LLM_API_KEY"))
            .modelName("text-embedding-3-small")
            .build();
    }

    /**
     * 离线索引:将企业文档加载到向量库
     * 
     * 处理流程:
     * 1. 解析 PDF/Word 为纯文本
     * 2. 按语义边界切分成片段(避免断句)
     * 3. 每个片段生成 Embedding 向量
     * 4. 向量 + 原文一起存入向量数据库
     */
    @PostConstruct
    public void loadDocuments() {
        // 从 PDF 加载文档
        Document document = FileSystemDocumentLoader.loadDocument(
            Path.of("docs/energy-management-handbook.pdf"),
            new ApachePdfBoxDocumentParser()
        );

        // 递归切分:500 token / 片段,50 token 重叠
        DocumentSplitter splitter = DocumentSplitters.recursive(500, 50);
        List<TextSegment> segments = splitter.split(document);

        // 批量向量化(比逐条调用快 10~50 倍)
        List<Embedding> embeddings = embeddingModel.embedAll(segments).content();

        // 存入向量库
        embeddingStore.addAll(embeddings, segments);
        
        log.info("文档索引完成,共 {} 个片段", segments.size());
    }

    /**
     * 在线检索:根据用户问题检索相关文档片段
     * 
     * @param query      用户问题
     * @param maxResults 返回的最大片段数(通常 3~5 个)
     * @return 相关文档片段列表
     */
    public List<TextSegment> search(String query, int maxResults) {
        Embedding queryEmbedding = embeddingModel.embed(query).content();

        // 相似度阈值 0.7:低于此值的片段被视为不相关
        // 阈值设置过低 → 引入噪声;过高 → 可能漏掉有用信息
        List<EmbeddingSearchResult<TextSegment>> results = 
            embeddingStore.findRelevant(queryEmbedding, maxResults, 0.7);

        return results.stream()
            .map(EmbeddingSearchResult::embeddedObject)
            .toList();
    }

    // getter 供 Agent 配置使用
    public EmbeddingStore<TextSegment> getEmbeddingStore() { return embeddingStore; }
    public EmbeddingModel getEmbeddingModel() { return embeddingModel; }
}

4.5 将 RAG 挂载到 Agent

这一步非常简洁。LangChain4j 的 ContentRetriever 机制会在每次对话前 自动执行 RAG 检索,将相关文档片段注入到 Prompt 中:

// 构建内容检索器
ContentRetriever retriever = EmbeddingStoreContentRetriever.builder()
    .embeddingStore(ragService.getEmbeddingStore())
    .embeddingModel(ragService.getEmbeddingModel())
    .maxResults(3)       // 每次最多检索 3 个片段
    .minScore(0.7)       // 最低相似度阈值
    .build();

// 挂载到 Agent
EnergyAgent agent = AiServices.builder(EnergyAgent.class)
    .chatLanguageModel(model)
    .tools(tools)
    .contentRetriever(retriever)   // ← 这一行就是 RAG 集成的全部
    .chatMemory(MessageWindowChatMemory.withMaxMessages(20))
    .build();

背后的执行流程:每次用户提问时,Agent 会先调用 retriever 检索相关文档,将检索结果和用户问题一起拼接成增强 Prompt 发送给大模型。大模型就能基于你的私域知识来回答了。


五、记忆系统:让 Agent 真正"认识"用户

5.1 为什么记忆如此重要?

没有记忆的 Agent,每次对话都像第一次见面。用户说"它太高了",Agent 不知道"它"指的是什么。用户上午说了"我在关注 B 栋",下午再问"B 栋怎么样了",Agent 已经忘了这回事。

记忆系统从层次上分为两类:

  • 短期记忆(Working Memory):当前对话会话内的历史消息。类似于人的"工作记忆",容量有限但存取极快。
  • 长期记忆(Long-term Memory):跨会话持久化的用户偏好、历史总结。类似于人的"长期记忆",容量大但需要显式检索。

5.2 短期记忆的窗口策略

最直接的做法是维护一个"消息窗口"。常见策略有两种:

策略一:消息数窗口 — 简单粗暴,保留最近 N 条消息。优点是实现简单,缺点是不同消息的 Token 长度差异很大,可能导致实际上下文忽大忽小。

ChatMemory memory = MessageWindowChatMemory.withMaxMessages(20);

策略二:Token 窗口 — 按 Token 总数限制,更精确地控制发送给模型的数据量。适合对成本敏感的生产环境。

ChatMemory memory = TokenWindowChatMemory.builder()
    .maxTokens(4000)
    .tokenizer(new OpenAiTokenizer())
    .build();

5.3 持久化记忆:重启不丢失

在生产环境中,用户的对话历史必须持久化。否则服务一重启,所有上下文全部丢失。LangChain4j 通过 ChatMemoryStore 接口提供了持久化的扩展点:

/**
 * 数据库持久化记忆存储
 * 
 * 设计思路:
 * - 每个会话(sessionId)对应一组消息
 * - 每次 updateMessages 时,全量替换该会话的消息列表
 * - 消息序列化后存储为 JSON 文本
 */
public class DatabaseChatMemoryStore implements ChatMemoryStore {

    @Autowired
    private ChatMemoryRepository repository;

    @Override
    public List<ChatMessage> getMessages(Object memoryId) {
        return repository.findBySessionId(memoryId.toString())
            .stream()
            .map(this::deserialize)
            .toList();
    }

    @Override
    public void updateMessages(Object memoryId, List<ChatMessage> messages) {
        // 先删后插:简单可靠的全量替换策略
        repository.deleteBySessionId(memoryId.toString());
        messages.forEach(msg -> repository.save(
            new ChatMemoryEntity(memoryId.toString(), serialize(msg))
        ));
    }

    @Override
    public void deleteMessages(Object memoryId) {
        repository.deleteBySessionId(memoryId.toString());
    }
    
    private String serialize(ChatMessage message) {
        return JsonUtils.toJson(message);
    }
    
    private ChatMessage deserialize(ChatMemoryEntity entity) {
        return JsonUtils.fromJson(entity.getContent(), ChatMessage.class);
    }
}

使用持久化记忆:

ChatMemory persistentMemory = MessageWindowChatMemory.builder()
    .id("user-12345-session")   // 会话唯一标识
    .maxMessages(50)
    .chatMemoryStore(new DatabaseChatMemoryStore())
    .build();

六、生产环境的工程化考量

6.1 超时与容错

大模型 API 的响应时间波动很大(从 1 秒到 30 秒不等),生产环境必须做好容错:

OpenAiChatModel model = OpenAiChatModel.builder()
    .apiKey(System.getenv("LLM_API_KEY"))
    .modelName("gpt-4o")
    .timeout(Duration.ofSeconds(60))   // 单次请求超时
    .maxRetries(3)                      // 自动重试(含指数退避)
    .logRequests(true)                  // 开发调试利器
    .logResponses(true)
    .build();

6.2 成本控制:Token 用量监控

大模型 API 按 Token 计费。在 Agent 场景下,一次用户对话可能触发多轮 Tool Calling,实际消耗的 Token 远超表面看到的问答。因此必须做好监控:

Response<AiMessage> response = model.generate(messages);
TokenUsage usage = response.tokenUsage();

log.info("[Token统计] Prompt: {}, Completion: {}, Total: {}",
    usage.inputTokenCount(),
    usage.outputTokenCount(),
    usage.totalTokenCount());

// 生产环境建议:将 Token 用量上报到监控系统(如 Prometheus)
// metricsService.recordTokenUsage("energy-agent", usage.totalTokenCount());

6.3 安全红线:工具权限分级

Tool Calling 赋予了大模型调用系统接口的能力,这也带来了安全风险。建议对工具进行权限分级:

// 只读工具:所有用户可用
@Tool("查询指定区域的实时能耗数据")
public double queryRealtimeEnergy(String areaName) { ... }

// 写入工具:需要操作权限
@Tool("调整指定区域的能耗告警阈值(需要管理员权限)")
public String updateAlertThreshold(String areaName, double threshold) {
    SecurityUtils.checkRole("ADMIN");  // 权限校验
    ...
}

// 危险工具:需要二次确认
@Tool("删除指定区域的历史能耗数据(不可逆操作)")
public String deleteHistoricalData(String areaName, String dateRange) {
    // 高危操作必须有人工确认环节
    ...
}

6.4 性能优化:流式输出

Agent 推理过程可能耗时较长(5~15 秒),为了不让用户"干等",可以采用流式输出,让回答逐字呈现:

public interface StreamingEnergyAgent {

    @SystemMessage("你是智慧能源管理助手...")
    TokenStream chat(@UserMessage String userMessage);
}

// Controller 中使用 SSE 推送
@GetMapping(value = "/chat/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public SseEmitter chatStream(@RequestParam String message) {
    SseEmitter emitter = new SseEmitter();
    
    TokenStream tokenStream = streamingAgent.chat(message);
    tokenStream.onNext(token -> {
        try { emitter.send(token); } catch (IOException e) { /* ... */ }
    });
    tokenStream.onComplete(response -> emitter.complete());
    tokenStream.onError(emitter::completeWithError);
    
    return emitter;
}

七、架构全景图

将以上所有组件组合在一起,最终的系统架构如下:

                        ┌──────────────────────────────────┐
                        │           Spring Boot App         │
                        │                                   │
                        │  ┌─────────────┐                  │
  用户 ──── HTTP ─────→ │  │ REST API    │                  │
                        │  └──────┬──────┘                  │
                        │         │                         │
                        │  ┌──────▼──────┐                  │
                        │  │ Energy Agent│ (AiServices代理) │
                        │  └──┬───┬───┬──┘                  │
                        │     │   │   │                     │
                        │     │   │   └──→ Memory Store     │
                        │     │   │        (数据库持久化)    │
                        │     │   │                         │
                        │     │   └────→ Content Retriever  │
                        │     │         ┌──────────────┐    │
                        │     │         │ 向量数据库    │    │
                        │     │         │ (RAG知识检索) │    │
                        │     │         └──────────────┘    │
                        │     │                             │
                        │     └────→ Tool Execution         │
                        │           ┌──────────────┐        │
                        │           │ 能耗查询工具  │        │
                        │           │ 趋势分析工具  │        │
                        │           │ 通知发送工具  │        │
                        │           └──────┬───────┘        │
                        │                  │                │
                        └──────────────────┼────────────────┘
                                           │
                            ┌──────────────▼──────────────┐
                            │     外部系统                  │
                            │  ┌──────┐ ┌──────┐ ┌─────┐  │
                            │  │ DM DB│ │  MQ  │ │ SMS │  │
                            │  └──────┘ └──────┘ └─────┘  │
                            └─────────────────────────────┘

八、总结与展望

本文我们从原理到代码,完整构建了一个企业级 AI Agent 系统。核心要点回顾:

模块核心原理关键 API
Tool Calling工具描述注入 Prompt + 循环调度@Tool + AiServices
RAG向量相似度检索 + 上下文增强ContentRetriever + EmbeddingStore
记忆管理消息窗口 + 持久化存储ChatMemory + ChatMemoryStore
工程化超时重试、成本监控、权限分级timeout/maxRetries/TokenUsage

2026 年下半年值得关注的 Agent 技术趋势:

  1. Multi-Agent 协作:多个专业 Agent 通过"编排器"协同完成复杂任务。LangGraph4j 已经提供了图状态机来实现 Agent 间的协作与分支。
  2. MCP 协议标准化:Model Context Protocol 正在成为工具调用的统一标准,让 Agent 可以即插即用地接入各种工具服务。
  3. 端侧小模型 Agent:Qwen2.5-7B、Llama 3.1-8B 等小模型已具备可靠的 Tool Calling 能力,可在端侧部署,大幅降低延迟和成本。
  4. Agent 可观测性:OpenTelemetry for LLM 规范逐渐成熟,可以完整追踪 Agent 的推理链路、工具调用耗时、Token 消耗等指标。

AI Agent 实战:用 Java 构建能自主决策的智能体 这篇文章介绍了一个用纯Java实现的AI Agent系统,主要包含以下内容: AI Agent的四大核心组件:LLM(大脑)、工具(四肢)、记忆(上下文)和规划(决策力) 系统设计的关键接口: AiAgent接口定义执行任务的方法 AgentTool接口定义工具的基本功能 详细定义了执行结果和步骤的数据结构 具体工具实现示例: 搜索工具(SearchTool):实现网络搜索功能,包含参数验证和结果处理 计算器工具(CalculatorTool):实现数学运算,包含表达式安全验证 系统特点: 纯Java实现, 阅读详情

相关推荐

Java生态AI应用开发:SpringAI与Langchain4j构建RAG与Agent实战

在大模型应用加速落地的今天,Java开发者正迎来全新的AI工程化机遇。Spring Boot作为企业级服务治理的成熟底座,正通过SpringAI与Langchain4j这类框架,将大模型接入从繁琐的HTTP调用与JSON拼接,抽象为可注入的Bean与声明式接口。工具调用(Tool Calling)让模型能够触达实时业务数据,检索增强生成(RAG)则解决了私有知识库动态更新的引用溯源难题,而Agent编排则将两者协同调度,形成完整决策链路。以航空客服智能体为例,从航班状态查询、行李异常处理到退改签政策问答,清

weixin_32466193的博客 339

构建基于Java技术栈的AI Agent系统

本文介绍了使用Java技术栈构建AI Agent系统的完整方案。系统采用分层架构设计,包含Web层、应用层和基础设施层,核心模块包括Agent引擎、知识库和任务编排器。关键技术选型涵盖Spring AI框架、PostgreSQL数据库、Redis缓存、RabbitMQ消息队列和Pinecone向量数据库等组件。系统配置通过Spring Boot实现,包括AI模型参数、数据源连接和监控设置。该方案充分利用了Java生态系统的成熟度,结合Spring Cloud微服务架构,为企业级AI应用提供了高性能、可扩展的

lenyan~的博客 1709

Java 2026:Spring AI与LangChain4j驱动的AI工程化实战

Java作为企业级高可靠系统的基石语言,其核心价值正从语法实现转向AI能力集成与智能工作流编排。依托JVM的稳定性、Spring生态的成熟度及JDK 23虚拟线程的并发优化,Java成为构建RAG、Agent和模型治理平台的理想底座。Spring AI提供标准化模型接入抽象,LangChain4j支撑复杂AI逻辑编排,二者协同实现检索增强生成、工具调用、上下文管理等关键能力。在金融、医保、知识产权等强合规、高一致性场景中,Java开发者需掌握AI服务熔断、审计溯源、混合检索调优等工程实践。本文聚焦Sprin

weixin_33970449的博客 254

我开源了一套Java生态AIGC知识库、Agent多模态平台应用

LangChat发布了第二个版本 0.2.0,完善了知识库、Agent、多渠道应用能力,支持了更多新特性,完成了项目整体架构的变更。开源地址:https://github.com/TyCoding/langchat产品官网:http://langchat.cn功能更新:集成国内外数十家AI大模型、知识库检索、Agent、FunctionCall、WebSearch、高级RAG,快速构建企业机器人支持WebSDK、API多渠道接入支持OSS多存储方案支持动态配置模型,无感刷新模型配置。

m0_59235245的博客 2155

Java AI应用开发实战:Langchain4j + DeepSeek + RAG + Agent全栈指南

随着大模型能力的普及,AI应用开发已不再局限于Python生态,越来越多的Java后端工程师开始探索如何将智能能力融入现有业务系统。大模型应用的核心原理包括对话生成、检索增强与智能体编排,而这一系列能力在Java领域正通过Spring Boot生态快速落地。Langchain4j作为参考LangChain设计的Java框架,提供了从模型接入、工具调用到RAG知识库构建的完整组件,DeepSeek则以其高性价比和OpenAI兼容接口成为热门选择。无论是面向私有知识库的智能问答,还是需要多步自主决策的Agent

weixin_34226706的博客 537

使用RPA通过GPT大模型AI Agent自动执行业务流程任务企业级应用开发实战:10. 部署AI Agent到生产环境

1.背景介绍 随着人工智能的飞速发展,智能助手、机器学习和深度学习等技术被逐渐应用到我们的生活中,尤其是在工作流程、日常事务自动化、自动驾驶、智能城市建设、智能监控、智慧园区、智慧社区方面。智能营销、客服自动化、智能物流运输、智能预约定制、智能家居管理、智能花店管理、智能物联网、智能网关、机器人自动化等业务场景也开始受到重视。 为了提升企

AI架构师小马 753

AI实践指南:AGENT、RAG和MCP在Java中的简单实现

AGENT(AI Agent)就像是一个能够"思考"和"行动"的智能助手。与普通的AI模型不同,AGENT不仅能理解和生成内容,还能根据目标采取行动,比如调用API、使用工具或执行任务。想象一下,普通AI就像是一个只会回答问题的顾问,而AGEN则是一个既能回答问题,又能帮你完成工作的助手。RAG(Retrieval-Augmented Generation)是一种让AI回答更准确的技术。

qq_74042166的博客 1878

22版本Altium Designer导出生产文件的规范化操作指南

本文详细介绍了PCB设计中的Gerber文件导出流程及相关文件生成方法。主要内容包括:1)Gerber文件导出的5个关键设置步骤;2)NC钻孔文件的导出方法;3)坐标文件的生成方式;4)文件打包规范要求必须包含Gerber文件、NC钻孔文件和坐标文件;5)文件提交的两种方式(新手推荐提交原始工程文件,量产推荐仅提交Gerber文件包)。文章还特别强调了单位一致性、精度验证等注意事项,为PCB设计文件的规范输出提供了完整指导。

qq_56506325的博客 1055

LangChain4j 全解:核心能力、实战教程 & 与 Spring AI 深度对比

LangChain4j是Java生态中功能最全的企业级LLM应用开发框架,支持从基础对话到复杂Agent的全场景需求。它提供统一API适配多种大模型,覆盖RAG全链路、多轮对话记忆管理、工具调用和Agent智能体等核心功能。相比Python的LangChain,LangChain4j更贴合Java企业级技术栈,支持文档处理、向量检索、结构化输出等生产级特性。与Spring AI相比,LangChain4j在功能完整性和生产落地案例上更具优势,适合需要复杂AI能力的企业应用开发。

2301_80866689的博客 951

ANSYS Fluent 2023R2实战:用欧拉多相流模型搞定流化床模拟(附详细参数避坑)

本文详细解析了ANSYS Fluent 2023R2中欧拉多相流模型在流化床模拟中的应用,包括模型选择、材料属性设置、相间作用力配置及初始化技巧。特别针对高颗粒浓度工况提供参数优化方案,帮助工程师提升模拟精度与效率,适用于化工、能源等领域的流化床反应器设计。

weixin_30938149的博客 268

【STM32】STM32 CANFD外设的几种消息接收过滤模式

在控制器区域网络(CAN)系统中,正确配置消息过滤器对于有效管理网络通信至关重要。特别是在使用Flexible Data-rate Controller Area Network(FDCAN)时,选择合适的过滤器类型可以大大提高网络效率和消息处理速度。

林愿留的博客 6226

Spring AI 和 LangChain4j 怎么选?Java AI 开发框架与工作流设计器选型分析

Java 开发者进入 AI 应用开发时,经常会遇到一个选择题:Spring AI 和 LangChain4j 都是 Java 生态里很重要的 AI 开源框架,到底应该选哪个? 这个问题没有一个绝对答案。Spring AI 更像“Spring 生态里的 AI 工程框架”,LangChain4j 更像“JVM 上的 LLM 应用开发工具箱”。如果只看能不能调用大模型,两者都能做;真正决定选型的,是团队技术栈、项目阶段、工程治理要求,以及是否要进一步做 AI 工作流、Agent、RAG 和企业系统集成。

1347

ThingsBoard - 设备接入

设备接入笔记

qq_53839898的博客 1454

【Agent合集-01】《Java AI Agent实战:基于LangChain4j + GPT/DeepSeek构建智能体(工具/记忆/流式/多模态)》

涵盖:Agent 核心概念(LLM大脑 + 工具 + 记忆 + 规划器)→ 环境搭建(JDK21+Maven)→ 对话记忆 → @Tool 工具调用(计算器/天气/邮件)→ Redis/MySQL 持久化记忆 → 复合任务自动规划 → 流式响应(SSE)→ 多模态图像识别 → 2026 高级特性(Agent Skills / MCP / 多Agent协作)→ 生产避坑(API Key安全、Token控制、版本兼容)。 适合:想将 AI 能力嵌入 Java 后端,或构建下一代智能应用的开发者。

记录日常技术学习,分享后端学习笔记 660

Python爬虫实战:手把手教你如何抓取农作物品种名录,构建标准化种业索引数据库!

我长期专注 Python 爬虫工程化实战,主理专栏 《Python爬虫实战》:从采集策略到反爬对抗,从数据清洗到分布式调度,持续输出可复用的方法论与可落地案例。内容主打一个“能跑、能用、能扩展”,让数据价值真正做到——抓得到、洗得净、用得上。

喵手的博客 290

2、硬件工程师笔试面试汇总(2025版本)

本文摘要:文章系统梳理了硬件工程师笔试面试中的电子元器件知识要点,涵盖电阻、电容、电感、二极管、三极管、MOS管等器件的工作原理、选型要点和应用场景。详细解析了UART、I2C、SPI等通信协议的特点及实现方式,并探讨了电源管理、信号处理、PCB设计等核心问题。针对常见电路如放大电路、滤波电路、逻辑电路等提供了深入分析,同时介绍了示波器使用、单片机系统设计等实用技能。文章还包含器件封装、电平转换、时序分析等工程实践内容,并附有相关真题解析和仿真实验指导,为硬件工程师提供全面的技术参考。

XU157303764的博客 9006

LangChain4j 完整学习路径:从入门到精通的40篇实战教程

LangChat Pro 是基于Java生态构建的企业级AIGC应用开发平台商业版,为企业提供完整的AI大模型集成解决方案。

pythonhy的博客 848

手把手教你玩转CPU微架构--​第三章:乱序执行的“魔法”——如何让指令“插队”提升效率​​3.4 动手实验:用Gem5模拟器分析乱序执行对IPC的提升(对比顺序执行)

摘要:本章通过Gem5模拟器对比乱序执行(O3CPU)和顺序执行的性能差异,实验采用SPECCPU2017和PARSEC3.0基准测试,配置7级流水线、4指令/周期发射宽度及多级缓存。结果显示,乱序执行平均提升IPC超过100%,关键因素包括动态指令调度、缓存命中率提升(L1达92%)和TAGE分支预测(准确率95%)。优化方向包括增大指令缓存和发射队列深度。实验验证了乱序执行在减少流水线停顿和提升吞吐量方面的显著优势。

MHD0815的博客 165

Java程序员2026破局指南:抓牢大模型风口,实现薪资与职级的双重飞跃!

2025年,技术浪潮的分水岭已清晰可见。当一部分Java开发者仍在“微服务”、“高并发”的内卷中竞争时,另一部分人已凭借 “Java + 大模型” 的复合技能,驶入了职业发展的快车道。数据显示,AI应用开发岗位需求正爆发式增长,其中大模型相关岗位的招聘薪资下限均值已达4.7万元/月,而掌握此项技能的Java高级开发,月薪范围普遍在30K至80K之间。

lyy2017175913的博客 1154

脑机接口中的视觉信号解码:原理、技术与应用

脑机接口中的视觉信号解码:原理、技术与应用​ ,人工智能,计算机视觉,大模型,AI,脑机接口(Brain - Computer Interface,BCI)作为一种革命性的技术,致力于搭建人脑与外部设备之间的直接通信桥梁,绕开传统的神经肌肉输出通路。其核心目标是解读大脑活动产生的信号,从而实现对外部设备的精准控制或信息交互。在众多脑机接口研究方向中,视觉信号解码因其独特的优势和广泛的应用前景,吸引了大量科研人员的关注。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 20万+

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

收藏!2026 Java开发者转大模型Agent开发:3个月落地计划,告别被AI替代焦虑

核心目标:掌握Agent系统的性能优化、安全合规要点与工程化部署流程,具备独立落地企业级Agent项目的全流程能力。

大模型教程的博客 1533

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Java后端集成AI大模型:Spring AI与LangChain4j实战指南

AI大模型集成已成为现代企业级应用开发的关键技术,其核心原理是通过API调用将自然语言处理能力嵌入业务系统。在Java生态中,Spring AI框架提供了标准化的模型接入抽象,而LangChain4j则擅长构建复杂的智能体工作流。这些技术的工程价值在于将AI能力无缝融入稳定的微服务架构,实现从基础对话到自动化决策的升级。典型的应用场景包括智能客服、数据分析助手和自动化报告生成。本文聚焦于Spring AI 2.0与LangChain4j的整合方案,通过一个完整的天气查询智能体案例,详解Java后端如何高效集

weixin_30219613的博客 296

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

2026年职场新风口!0基础也能拿5万+!AI Agent开发速成指南,手把手带你逆袭!

本文针对2026年职场AI Agent岗位高薪难求的现象,为非计算机专业人士提供0基础转行做Agent的可行路径。文章强调Agent开发更看重落地能力而非高深算法,并提供3个月速通计划,涵盖认知重塑、技能筑基、实战包装和求职收割四个阶段,辅以推荐工具和避坑指南,帮助读者抓住AI发展红利期。

m0_65555479的博客 1382

【程序员转行】15年Java老炮儿All in AI应用开发:2026年,会用AI的Java程序员才不会被淘汰

从2011年敲下第一行Java代码,到在微服务、高并发、分布式系统的战场里摸爬滚打整整15年,我曾笃定自己会沿着“稳扎稳打”的路线走到头——直到2025年底,我下定了一个绝不回头的决心:All in AI应用开发。

DEVELOPERAA的博客 534

五大Java AI框架对比:SpringAI vs LangChain4j等

本文对比了6大Java AI框架(SpringAI、LangChain4j、SpringAIAlibaba、SolonAI、JBoltAI、AgentScope-Java)的核心能力与技术特性。主要结论如下: 功能对比: SpringAI:Spring生态集成优,基础Chat/RAG强,但Agent/Skill支持弱 LangChain4j:功能最全(12k+Stars),框架中立,完整Skill/Agent支持 SpringAIAlibaba:多Agent工作流编排最强,深度集成阿里云 SolonAI:轻

xh2277659985的博客 555

2026年AI应用开发完整路线:Java后端+Python大模型,少走2年弯路

文章强调AI应用开发需Java后端与Python并重,78%企业招聘要求Java后端知识。提供三条学习路线:Java后端基础、Java AI进阶、Python大模型实战。针对不同人群给出精准建议,指出跳过后端直接学Python是最大误区。掌握Java+Python的复合型工程师薪资比纯Python高40%以上,企业需要能完成项目部署、接口对接的全栈人才。

python123456_的博客 1222
上一篇: 当算法成为武器:AI泛滥时代的多维危机透视与治理路径
下一篇: 二:Multi-Agent 协作架构与 MCP 协议实战:Java 企业级 AI 智能体进阶指南
yychen_java
博客等级 码龄8年 1451粉丝 77原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值