LangChain4j -- 如何使用自定义的tool增强模型能力
·
简介
在 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) { }
}
更多推荐

所有评论(0)