Java文档阅读笔记-AI LangChain4j - Agent Multiple Tools Calling Example

这个案例将说明,智能体将调用Tool获取数据,再调用另外一个Tool,格式化数据。

首先调用Tool获取当前时间,获取当前时间后,调用另外一个Tool转换为UTC格式时间。

例子

创建Tools

java 复制代码
import dev.langchain4j.agent.tool.Tool;
import java.time.Instant;

public class SystemTools {

    @Tool("Returns the current system time in milliseconds")
    public long systemMillis() {
        return System.currentTimeMillis();
    }

    @Tool("Converts epoch milliseconds to a UTC timestamp")
    public String formatMillis(long millis) {
        return Instant.ofEpochMilli(millis).toString();
    }
}

Multi-Tool Agent

java 复制代码
package com.logicbig.example;

import dev.langchain4j.agent.tool.ToolExecutionRequest;
import dev.langchain4j.agent.tool.ToolSpecification;
import dev.langchain4j.agent.tool.ToolSpecifications;
import dev.langchain4j.data.message.*;
import dev.langchain4j.model.chat.ChatModel;
import dev.langchain4j.model.chat.request.ChatRequest;
import dev.langchain4j.model.chat.response.ChatResponse;
import dev.langchain4j.model.ollama.OllamaChatModel;
import dev.langchain4j.service.tool.DefaultToolExecutor;
import dev.langchain4j.service.tool.ToolExecutor;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class AgentExample {

    private static final Map<String, ToolExecutor> executors = new HashMap<>();
    private static final List<ToolSpecification> specs = new ArrayList<>();

    static {
        SystemTools tools = new SystemTools();
        for (Method method : SystemTools.class.getDeclaredMethods()) {
            ToolSpecification spec = ToolSpecifications.toolSpecificationFrom(method);
            specs.add(spec);
            executors.put(spec.name(), new DefaultToolExecutor(tools, method));
        }
    }

    public static void main(String[] args) {
        ChatModel model = OllamaChatModel.builder()
                                         .baseUrl("http://localhost:11434")
                                         .modelName("llama3.2:latest")
                                         .temperature(0.0)
                                         .numCtx(4096)
                                         .build();

        List<ChatMessage> messages = new ArrayList<>();
        messages.add(SystemMessage.from(
                "You are a helpful assistant with access to tools. " +
                        "You may call multiple tools in sequence. " +
                        "Use tool outputs as inputs to subsequent tools when needed."
        ));

        sendUserMessageAndHandleToolCall(model, "What is the current system time?", messages);
        sendUserMessageAndHandleToolCall(model, "Now convert the system time into "
                + "a human-readable UTC format.", messages);

        //final message
        messages.add(model.chat(messages).aiMessage());

        for (ChatMessage chatMessage : messages) {
            System.out.println("-- %s --".formatted(chatMessage.type()));
            switch (chatMessage.type()) {
                case SYSTEM -> System.out.println(((SystemMessage) chatMessage).text());
                case USER -> System.out.println(((UserMessage) chatMessage).singleText());
                case TOOL_EXECUTION_RESULT ->
                        System.out.println(((ToolExecutionResultMessage) chatMessage).text());
                case AI -> {
                    AiMessage aiMessage = (AiMessage) chatMessage;
                    if(aiMessage.text()!=null){
                        System.out.println(aiMessage.text());
                    }
                    if(aiMessage.hasToolExecutionRequests()){
                        System.out.println(aiMessage.toolExecutionRequests());
                    }
                }
            }
        }
    }

    private static void sendUserMessageAndHandleToolCall(ChatModel chatModel,
                                                         String myMessage,
                                                         List<ChatMessage> messages) {
        messages.add(UserMessage.from(myMessage));

        ChatRequest request = ChatRequest.builder()
                                         .messages(messages)
                                         .toolSpecifications(specs)
                                         .build();

        ChatResponse response = chatModel.chat(request);
        AiMessage aiMessage = response.aiMessage();
        messages.add(aiMessage);
        if (aiMessage.hasToolExecutionRequests()) {
            for (ToolExecutionRequest r : aiMessage.toolExecutionRequests()) {
                String result = executors.get(r.name()).execute(r, r.id());
                messages.add(ToolExecutionResultMessage.from(r, result));
            }
        }
    }
}

输出:

bash 复制代码
-- SYSTEM --
You are a helpful assistant with access to tools. You may call multiple tools in sequence. Use tool outputs as inputs to subsequent tools when needed.
-- USER --
What is the current system time?
-- AI --
[ToolExecutionRequest { id = null, name = "systemMillis", arguments = "{}" }]
-- TOOL_EXECUTION_RESULT --
1769091187617
-- USER --
Now convert the system time into a human-readable UTC format.
-- AI --
[ToolExecutionRequest { id = null, name = "formatMillis", arguments = "{"arg0":1769091187617}" }]
-- TOOL_EXECUTION_RESULT --
2026-01-22T14:13:07.617Z
-- AI --
This is the current system time in a human-readable UTC format.

测试

上面的代码是基于JDK21的,修改成17的运行。

AgentExample2.java

java 复制代码
import dev.langchain4j.agent.tool.ToolExecutionRequest;
import dev.langchain4j.agent.tool.ToolSpecification;
import dev.langchain4j.agent.tool.ToolSpecifications;
import dev.langchain4j.data.message.*;
import dev.langchain4j.model.chat.ChatModel;
import dev.langchain4j.model.chat.request.ChatRequest;
import dev.langchain4j.model.chat.response.ChatResponse;
import dev.langchain4j.model.ollama.OllamaChatModel;
import dev.langchain4j.service.tool.DefaultToolExecutor;
import dev.langchain4j.service.tool.ToolExecutor;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class AgentExample2 {

    private static final Map<String, ToolExecutor> executors = new HashMap<>();
    private static final List<ToolSpecification> specs = new ArrayList<>();

    static {
        SystemTools tools = new SystemTools();
        for (Method method : SystemTools.class.getDeclaredMethods()) {
            ToolSpecification spec = ToolSpecifications.toolSpecificationFrom(method);
            specs.add(spec);
            executors.put(spec.name(), new DefaultToolExecutor(tools, method));
        }
    }

    public static void main(String[] args) {
        ChatModel model = OllamaChatModel.builder()
                .baseUrl("http://localhost:11434")
                .modelName("llama3.2:latest")
                .temperature(0.0)
                .numCtx(4096)
                .build();

        List<ChatMessage> messages = new ArrayList<>();
        messages.add(SystemMessage.from(
                "You are a helpful assistant with access to tools. " +
                        "You may call multiple tools in sequence. " +
                        "Use tool outputs as inputs to subsequent tools when needed."
        ));

        sendUserMessageAndHandleToolCall(model, "What is the current system time?", messages);
        sendUserMessageAndHandleToolCall(model, "Now convert the system time into "
                + "a human-readable UTC format.", messages);

        //final message
        messages.add(model.chat(messages).aiMessage());

        for (ChatMessage chatMessage : messages) {
            System.out.println(chatMessage);
        }
    }

    private static void sendUserMessageAndHandleToolCall(ChatModel chatModel,
                                                         String myMessage,
                                                         List<ChatMessage> messages) {
        messages.add(UserMessage.from(myMessage));

        ChatRequest request = ChatRequest.builder()
                .messages(messages)
                .toolSpecifications(specs)
                .build();

        ChatResponse response = chatModel.chat(request);
        AiMessage aiMessage = response.aiMessage();
        messages.add(aiMessage);
        if (aiMessage.hasToolExecutionRequests()) {
            for (ToolExecutionRequest r : aiMessage.toolExecutionRequests()) {
                String result = executors.get(r.name()).execute(r, r.id());
                messages.add(ToolExecutionResultMessage.from(r, result));
            }
        }
    }
}

SystemTools.java

java 复制代码
import dev.langchain4j.agent.tool.Tool;
import java.time.Instant;

public class SystemTools {

    @Tool("Returns the current system time in milliseconds")
    public long systemMillis() {
        return System.currentTimeMillis();
    }

    @Tool("Converts epoch milliseconds to a UTC timestamp")
    public String formatMillis(long millis) {
        return Instant.ofEpochMilli(millis).toString();
    }
}

pom.xml

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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>dev.langchain4j</groupId>
    <artifactId>ollama-examples</artifactId>
    <version>1.10.0</version>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>

        <!-- Source: https://mvnrepository.com/artifact/dev.langchain4j/langchain4j-open-ai -->
        <dependency>
            <groupId>dev.langchain4j</groupId>
            <artifactId>langchain4j-open-ai</artifactId>
            <version>1.10.0</version>
            <scope>compile</scope>
        </dependency>

        <dependency>
            <groupId>dev.langchain4j</groupId>
            <artifactId>langchain4j</artifactId>
            <version>1.10.0</version>
        </dependency>

        <dependency>
            <groupId>dev.langchain4j</groupId>
            <artifactId>langchain4j-ollama</artifactId>
            <version>1.10.0</version>
        </dependency>

    </dependencies>

</project>

运行截图:

相关推荐
majingming1235 小时前
FUNCTION
java·前端·javascript
zopple5 小时前
常见的 Spring 项目目录结构
java·后端·spring
xuxie997 小时前
N11 ARM-irq
java·开发语言
cjy0001117 小时前
springboot的 nacos 配置获取不到导致启动失败及日志不输出问题
java·spring boot·后端
程序员夏末7 小时前
【LeetCode | 第七篇】算法笔记
笔记·算法·leetcode
wefly20178 小时前
从使用到原理,深度解析m3u8live.cn—— 基于 HLS.js 的 M3U8 在线播放器实现
java·开发语言·前端·javascript·ecmascript·php·m3u8
zhenxin01228 小时前
Spring Boot实现定时任务
java
小江的记录本8 小时前
【事务】Spring Framework核心——事务管理:ACID特性、隔离级别、传播行为、@Transactional底层原理、失效场景
java·数据库·分布式·后端·sql·spring·面试
sheji34168 小时前
【开题答辩全过程】以 基于springboot的校园失物招领系统为例,包含答辩的问题和答案
java·spring boot·后端
寂静or沉默8 小时前
2026最新Java岗位从P5-P7的成长面试进阶资源分享!
java·开发语言·面试