当前位置: 首页 > news >正文

LangChain4j 开发Java Agent智能体- 工具调用(Function Calling)

大家好,我是Java1234_小锋老师,最近更新《2027版本 LangChain4j 开发Java Agent 智能体 视频教程》专辑,感谢大家支持。

本课程主要介绍和讲解 LangChain4j 简介,阿里云百炼大模型 平台接入,Ollama简介以及安装和使用,HelloWorld 实现,日志配置,集成SpringBoot,Ai Service 使用,对话与提示词工程(Prompt),结构化输出,会话记忆,工具调用(Function Calling),嵌入模型 与向量数据库,RAG(检索增强生成),MCP(模型上下文协议),多模态支持

视频教程+课件+源码打包下载:

链接:https://pan.baidu.com/s/1o-zRfndo1HHrS_uFroOiCw?pwd=1234
提取码:0000

LangChain4j 开发Java Agent智能体- 工具调用(Function Calling)

大模型本身只会「说话」。但有些任务它并不擅长——比如精确算术、查实时天气、查你自己的业务数据库。这时候就需要工具调用(也叫Function Calling)。

需要特别强调的是:LLM 本身并不能真正执行函数,它只是在响应中表达调用特定工具的意图(包括要调用哪个工具、传入什么参数),真正的执行由开发者完成,然后将结果返回给 LLM 继续生成回答。

例如,当用户问"475695037565 的平方根是多少?"时,LLM 本身的计算并不精确。但如果为它提供了squareRoot工具,它会返回一个调用请求squareRoot(475695037565),框架执行后得到结果689706.486532,LLM 再基于此给出精确答案。

我们来看一个具体示例,调用天气预报的工具类,因为大模型是不知道某个城市今天的天气信息的,所以我们可以定义一个工具类,模拟来返回某个城市今天的天气信息。

首先第一步:定义Tool工具类,WeatherTool

packagecom.java1234.tool;importdev.langchain4j.agent.tool.P;importdev.langchain4j.agent.tool.Tool;importorg.springframework.stereotype.Component;@ComponentpublicclassWeatherTool{@Tool("根据城市名称查询当前天气,返回温度、天气现象、湿度、风力等")publicStringgetWeather(@P("中国城市名称,如:北京、上海、成都")Stringcity){System.out.println("正在查询:"+city);// 模拟逻辑if("北京".equals(city)){return"北京天气:温度25℃、天气晴转多云、湿度70%、风力3级";}elseif("上海".equals(city)){return"上海天气:温度28℃、天气晴转小雨、湿度60%、风力4级";}elseif("成都".equals(city)){return"成都天气:温度23℃、天气晴转小雨、湿度65%、风力3级";}return"暂不支持该城市查询天气";}}

再新建一个WeatherAssistantService, AI Service里tools属性指定工具weatherTool。

packagecom.java1234.service;importdev.langchain4j.service.SystemMessage;importdev.langchain4j.service.spring.AiService;importdev.langchain4j.service.spring.AiServiceWiringMode;@AiService(wiringMode=AiServiceWiringMode.EXPLICIT,// 手动指定接入模型 手动装配chatModel="openAiChatModel",// 指定模型tools={"weatherTool"}// 指定工具)publicinterfaceWeatherAssistantService{@SystemMessage(""" 你是天气助手。用户询问某地天气时,必须调用 getWeather 工具获取数据, 再基于工具返回结果用中文简洁回答;不要编造未在工具结果中出现的数值。 """)Stringchat(StringuserMessage);}

再新建一个MyWeatherController,注入weatherAssistantService,以及新建chat方法:

packagecom.java1234.controller;importcom.java1234.service.*;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RestController;@RestController@RequestMapping("/weather")publicclassMyWeatherController{@AutowiredprivateWeatherAssistantServiceweatherAssistantService;@RequestMapping("/chat")publicStringchat(Stringquestion){returnweatherAssistantService.chat(question);}}

我们来测试下,先问下 北京的天气。http://localhost:8080/weather/chat?question=北京今天天气如何?

控制台 输出的 日志:

2026-06-03T21:51:56.332+08:00 INFO 49784 --- [nio-8080-exec-4] d.l.http.client.log.LoggingHttpClient : HTTP request: - method: POST - url: https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions - headers: [Authorization: Beare...bd], [User-Agent: langchain4j-openai], [Content-Type: application/json] - body: { "model" : "qwen3.6-plus", "messages" : [ { "role" : "system", "content" : "你是天气助手。用户询问某地天气时,必须调用 getWeather 工具获取数据,\n再基于工具返回结果用中文简洁回答;不要编造未在工具结果中出现的数值。\n" }, { "role" : "user", "content" : "北京今天天气怎么样?" } ], "temperature" : 0.7, "stream" : false, "tools" : [ { "type" : "function", "function" : { "name" : "getWeather", "description" : "根据城市名称查询当前天气,返回温度、天气现象、湿度、风力等", "parameters" : { "type" : "object", "properties" : { "city" : { "type" : "string", "description" : "中国城市名称,如:北京、上海、成都" } }, "required" : [ "city" ] } } } ] } 2026-06-03T21:52:02.902+08:00 INFO 49784 --- [nio-8080-exec-4] d.l.http.client.log.LoggingHttpClient : HTTP response: - status code: 200 - headers: [x-request-id: 10db1b3a-3e0d-9a07-9a75-8a4af711ab00], [date: Wed, 03 Jun 2026 13:52:03 GMT], [x-dashscope-call-gateway: true], [server: istio-envoy], [x-envoy-upstream-service-time: 4231], [transfer-encoding: chunked], [vary: Origin,Access-Control-Request-Method,Access-Control-Request-Headers, Accept-Encoding], [content-type: application/json], [req-arrive-time: 1780494719522], [req-cost-time: 4238], [resp-start-time: 1780494723760] - body: {"choices":[{"message":{"content":"","reasoning_content":"Thinking Process:\n1. **Identify User Intent**: The user is asking for the current weather in Beijing (\"北京今天天气怎么样?\").\n2. **Identify Available Tools**: I have access to `getWeather(city)`.\n3. **Check Parameters**: The tool requires a `city` parameter. The user provided \"北京\".\n4. **Construct Tool Call**: Call `getWeather` with `city=\"北京\"`.\n5. **Formulate Response**: Once I get the result (simulated or actual), I will format it concisely in Chinese as requested by the system prompt.\n\n*Self-Correction/Safety Check*: The system prompt explicitly states: \"User asks for weather -> MUST call getWeather -> Answer in Chinese concisely -> DO NOT fabricate numbers.\"\n\nAction: Call `getWeather(city=\"北京\")`.","role":"assistant","tool_calls":[{"function":{"arguments":"{\"city\": \"北京\"}","name":"getWeather"},"id":"call_c5c9997f6e744444b03c3208","index":0,"type":"function"}]},"finish_reason":"tool_calls","index":0,"logprobs":null}],"object":"chat.completion","usage":{"prompt_tokens":342,"completion_tokens":212,"total_tokens":554,"completion_tokens_details":{"reasoning_tokens":182,"text_tokens":212},"prompt_tokens_details":{"text_tokens":342}},"created":1780494724,"system_fingerprint":null,"model":"qwen3.6-plus","id":"chatcmpl-10db1b3a-3e0d-9a07-9a75-8a4af711ab00"} 正在查询:北京 2026-06-03T21:52:02.928+08:00 INFO 49784 --- [nio-8080-exec-4] d.l.http.client.log.LoggingHttpClient : HTTP request: - method: POST - url: https://dashscope.aliyuncs.com/compatible-mode/v1/chat/completions - headers: [Authorization: Beare...bd], [User-Agent: langchain4j-openai], [Content-Type: application/json] - body: { "model" : "qwen3.6-plus", "messages" : [ { "role" : "system", "content" : "你是天气助手。用户询问某地天气时,必须调用 getWeather 工具获取数据,\n再基于工具返回结果用中文简洁回答;不要编造未在工具结果中出现的数值。\n" }, { "role" : "user", "content" : "北京今天天气怎么样?" }, { "role" : "assistant", "tool_calls" : [ { "id" : "call_c5c9997f6e744444b03c3208", "type" : "function", "function" : { "name" : "getWeather", "arguments" : "{\"city\": \"北京\"}" } } ] }, { "role" : "tool", "tool_call_id" : "call_c5c9997f6e744444b03c3208", "content" : "北京天气:温度25℃、天气晴转多云、湿度70%、风力3级" } ], "temperature" : 0.7, "stream" : false, "tools" : [ { "type" : "function", "function" : { "name" : "getWeather", "description" : "根据城市名称查询当前天气,返回温度、天气现象、湿度、风力等", "parameters" : { "type" : "object", "properties" : { "city" : { "type" : "string", "description" : "中国城市名称,如:北京、上海、成都" } }, "required" : [ "city" ] } } } ] } 2026-06-03T21:52:05.573+08:00 INFO 49784 --- [nio-8080-exec-4] d.l.http.client.log.LoggingHttpClient : HTTP response: - status code: 200 - headers: [x-request-id: b485a4e2-6fba-919d-98c3-ab94c9d89749], [date: Wed, 03 Jun 2026 13:52:06 GMT], [x-dashscope-call-gateway: true], [server: istio-envoy], [x-envoy-upstream-service-time: 2604], [transfer-encoding: chunked], [vary: Origin,Access-Control-Request-Method,Access-Control-Request-Headers, Accept-Encoding], [content-type: application/json], [req-arrive-time: 1780494723849], [req-cost-time: 2605], [resp-start-time: 1780494726455] - body: {"choices":[{"message":{"content":"北京今天天气晴转多云,温度25℃,湿度70%,风力3级。","reasoning_content":"用户询问北京天气,已调用getWeather工具获取数据。\n返回结果为:温度25℃、天气晴转多云、湿度70%、风力3级。\n根据指示,需要用中文简洁回答,不要编造数据。\n\n构建回答:\n北京今天天气晴转多云,温度25℃,湿度70%,风力3级。","role":"assistant"},"finish_reason":"stop","index":0,"logprobs":null}],"object":"chat.completion","usage":{"prompt_tokens":406,"completion_tokens":100,"total_tokens":506,"completion_tokens_details":{"reasoning_tokens":75,"text_tokens":100},"prompt_tokens_details":{"text_tokens":406}},"created":1780494726,"system_fingerprint":null,"model":"qwen3.6-plus","id":"chatcmpl-b485a4e2-6fba-919d-98c3-ab94c9d89749"}

我们可以看到第一次请求的时候,工具信息都一并作为提示词发送给大模型。

langchaing4j框架调用本地工具weather工具,得到 北京城市的天气信息后,也一并作为提示词,再次去请求大模型。

最终大模型第二次返回的结果才是到业务逻辑层,最终返回到前端页面。

下面是这个项目执行的具体原理图,非常重要,大家一起好好学习下。

我们还可以再测试下上海天气如何:http://localhost:8080/weather/chat?question=上海今天天气如何?

http://www.gsyq.cn/news/1483025.html

相关文章:

  • 2026年6月有实力的邢台大锅炖鱼饭店推荐榜,传统铁锅炖、秘制酱香炖、农家柴火炖选择指南 - 海棠依旧大
  • 2026年 厨房设备厂家:不锈钢商用厨具/中央厨房设备/酒店食堂抽油烟管等全套厨房设备品牌新选 - 品牌发掘
  • 直播间名家字画能入手吗?内行揭秘背后套路 - 深鉴新闻
  • 三步解锁微信聊天记录:本地解密工具的终极指南
  • HCCL 集合通信库架构剖析——昇腾 NPU 多机多卡训练的通信拓扑与协议栈
  • Onekey Steam清单下载工具:让游戏管理变得如此简单
  • Mac NTFS读写困境终结者:免费开源工具Nigate的完整解决方案
  • 2026年6月评价高的江苏工业用制氮机十大厂家哪家靠谱推荐榜,变压吸附/食品级/高纯制氮机生产厂家选择指南 - 海棠依旧大
  • 2026年浙江轴承生产厂家排行及选型参考指南:嘉兴氮化硅陶瓷轴承/嘉兴轴承厂家/嘉兴轴承生产厂家/嘉兴轴承销售厂家/选择指南 - 优质品牌商家
  • 分布式事务反直觉坑位与避坑实战指南
  • 2026年新乡老酒回收机构排行及选购参考指南:新乡茅台酒回收电话/新乡附近上门回收名酒/新乡五粮液回收/新乡新乡名酒回收电话/选择指南 - 优质品牌商家
  • LeetCode 300 674:最长递增子序列 vs 最长连续递增子序列
  • DisplayPort转VGA方案解析:ANX9832芯片设计与工程实践
  • 小米智能家居接入HomeAssistant的终极解决方案:Xiaomi Miot插件深度解析
  • CSDN AI数字营销失效应急手册:过期后7天内恢复卡片曝光的唯一合规路径(含工单模板)
  • Python Scrapy 爬虫实战进阶系列(一):轻量化数据存储 - 数据精准写入 SQLite 数据库
  • 2026年资质齐全的建筑工程管理公司推荐 - myqiye
  • 【分享】C4droid 安卓C++编译器 手机编程超便捷
  • 园林装饰施工公司口碑哪家好 - myqiye
  • 西门子S7-1500通过Profinet直连图尔克TBEN-S2 RFID读写头(含128字节通信工程与说明)
  • TOP5头部机构汇总:五大GEO优化服务商实力竞逐:选型参考与决策指南(2026年6月) - GEO优化
  • 【VibeCoding系列教程11】 AI智能体平台
  • Windows窗口切换效率低下?X-Mouse Controls帮你实现鼠标悬停即激活终极指南
  • 2026乐山本地正规婚介机构排行:眉山婚介公司联系电话/眉山婚姻咨询公司哪家靠谱/眉山婚姻咨询公司联系电话/眉山老年人婚介所推荐/选择指南 - 优质品牌商家
  • Python 爬虫高并发实战:多线程锁机制解决文件写入数据错乱问题
  • CANN ops-transformer 架构深度剖析——从 Host 端到 Device 端的命令流水线与内存管理最佳实践
  • 3分钟解锁B站大会员4K视频下载:开源神器bilibili-downloader完全指南
  • 2026年珠宝免费鉴定技术解析与合规机构指南:南昌铂金高价回收、南昌首饰高价回收、南昌黄金上门回收、南昌黄金即时结算选择指南 - 优质品牌商家
  • 全栈项目:论坛、抽奖、闪卡、家政、报表
  • SMUDebugTool深度解析:AMD Ryzen平台硬件调试与性能优化的技术实践