简介

在 LangChain4j 中,Tool(工具调用)是一个非常核心的能力,它让大模型不再只是“聊天”,而是可以:

  • 查数据库
  • 调用 HTTP 接口
  • 执行业务计算
  • 查询缓存/ES
  • 触发内部系统能力

一句话总结:

Tool = 让 LLM 具备“调用你后端能力”的函数接口机制

在企业落地中,这一步通常是从 Demo → 可用系统的分水岭

Tool 的核心原理

LangChain4j 的 Tool 调用本质是:

1. 函数声明(Function Schema)

你在 Java 中定义一个方法:

@Tool("查询用户余额")
public String getBalance(String userId) {
    return "用户余额:100元";
}

框架会把它转成类似 OpenAI function calling 的 JSON Schema:

{
  "name": "getBalance",
  "description": "查询用户余额",
  "parameters": {
    "type": "object",
    "properties": {
      "userId": {
        "type": "string"
      }
    }
  }
}

注意:模型会根据工具的名称选择,因此工具的名称务必见名知意,起名很重要

2. Prompt + Tool 一起发给模型

模型收到:

  • system prompt
  • user question
  • tools list

然后判断:

👉 要不要调用 tool?


3. 模型返回 tool call

例如:

{
  "tool_calls": [
    {
      "name": "getBalance",
      "arguments": {
        "userId": "123"
      }
    }
  ]
}

4. Java 执行 Tool → 回填结果

最终再把结果喂回模型生成最终回答。


三、基础依赖(你 0.35.0 正确方式)

踩坑过一次,这里给你正确组合:

        <dependency>
            <groupId>dev.langchain4j</groupId>
            <artifactId>langchain4j-open-ai</artifactId>
            <version>0.35.0</version>
            <exclusions>
                <exclusion>
                    <artifactId>jackson-databind</artifactId>
                    <groupId>com.fasterxml.jackson.core</groupId>
                </exclusion>
            </exclusions>
        </dependency>

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

AiServices 在这个包里:

import dev.langchain4j.service.AiServices;

四、最小可运行 Demo(重点)

1. 定义 Tool(核心)

import dev.langchain4j.agent.tool.Tool;

public class UserTools {

    @Tool("根据用户ID查询余额")
    public String queryBalance(String userId) {
        if ("1001".equals(userId)) {
            return "余额:500元";
        }
        return "余额:0元";
    }

    @Tool("根据用户ID查询积分")
    public String queryPoints(String userId) {
        return "积分:1200";
    }
}

2. 定义 AI Service

import dev.langchain4j.service.SystemMessage;

public interface Assistant {

    @SystemMessage("你是一个客服助手,根据用户问题调用工具获取信息")
    String chat(String question);
}

3. 绑定 Tool + Model(关键)

import dev.langchain4j.model.openai.OpenAiChatModel;
import dev.langchain4j.service.AiServices;

public class Main {

    public static void main(String[] args) {

        OpenAiChatModel model = OpenAiChatModel.builder()
                .apiKey("sk-xxx")
                .baseUrl("https://api.openai.com/v1")
                .modelName("gpt-4o-mini")
                .build();

        Assistant assistant = AiServices.builder(Assistant.class)
                .chatLanguageModel(model)
                .tools(new UserTools())
                .build();

        String result = assistant.chat("帮我查一下用户1001的余额和积分");
        System.out.println(result);
    }
}

五、Tool 进阶用法(企业必备)

1. 多 Tool 自动选择

.tools(new UserTools(), new OrderTools(), new ESQueryTools())

模型会自动判断调用哪个。


2. Tool 支持复杂对象

public class OrderTool {

    @Tool("查询订单信息")
    public Order getOrder(String orderId) {
        return new Order(orderId, "PAID", 99.0);
    }
}

3. Tool + Prompt 控制策略

@SystemMessage("""
你是数据查询助手:
1. 必须优先使用工具获取数据
2. 不允许编造数据
3. 工具没有结果才可以说不知道
""")

4. 工具增强(强烈建议)

可以做一个“统一工具层”:

public class DataPlatformTools {

    @Tool("查询Hive表信息")
    public String queryHiveTable(String tableName) { }

    @Tool("查询ES索引数据")
    public String queryEs(String query) { }

    @Tool("查询Flink任务状态")
    public String queryFlinkJob(String jobId) { }
}
Logo

欢迎加入 MCP 技术社区!与志同道合者携手前行,一同解锁 MCP 技术的无限可能!

更多推荐