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>

运行截图:

相关推荐
rlpp1 小时前
spring.profiles.active和spring.profiles.include的使用及区别说明
java·后端·spring
Pluchon1 小时前
硅基计划4.0 算法 简单实现B树
java·数据结构·b树·算法·链表
whatever who cares2 小时前
Java Web 架构全组件详解
java·前端·架构
liuchangng2 小时前
OpenCode AI编程工具笔记_20260212115022
笔记·ai编程
好家伙VCC2 小时前
**标题:发散创新|用Python构建GAN图像生成器:从理论到实战全流程解析**---在深度学习飞速发展的今天,**生成对抗
java·python·深度学习·生成对抗网络
我命由我123452 小时前
Android Studio - 在 Android Studio 中直观查看 Git 代码的更改
android·java·开发语言·git·java-ee·android studio·android jetpack
苏荷水2 小时前
万字总结LeetCode100(持续更新...)
java·算法·leetcode·职场和发展
不光头强3 小时前
SpringBoot 开发第三天 学习内容
java·spring boot·学习
黎雁·泠崖3 小时前
【魔法森林冒险】12/14 场景系统:5大场景的任务串联
java·开发语言