当前位置: 首页 > 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.jsqmd.com/news/971301/

相关文章:

  • 别再死磕公式了!用Python+NumPy从零实现TDOA定位(附完整代码与实测数据)
  • 2026年6月评价高的家庭养老防滑处理公司找哪家推荐榜,专业防滑地垫、防滑剂施工、防滑扶手公司选择指南 - 海棠依旧大
  • 3分钟解锁中兴光猫隐藏功能:zteOnu工具终极指南
  • 比利时银行业网络钓鱼欺诈赔偿规则与综合防御研究
  • 2026年6月有实力的苏州鱼粉厂家怎么选推荐榜,秘鲁蒸汽鱼粉、智利进口鱼粉、国产脱脂鱼粉厂家选择指南 - 海棠依旧大
  • YouTube推荐系统技术拆解:多目标优化与实时反馈闭环
  • 终极macOS清理指南:使用Pearcleaner彻底告别应用残留文件
  • 能让不同架构的gpu一起训练 跨芯片统一、异构混合训练、自动并行调优
  • 2026年6月口碑好的杭州盆景租摆公司怎么选推荐榜,办公室/酒店/园区/家居盆景租摆公司选择指南 - 海棠依旧大
  • 2026年Q2成都园区物业管理公司选型技术维度全解析:成都学校保洁公司/成都家庭保洁公司/成都开荒保洁公司/成都物业保洁服务/选择指南 - 优质品牌商家
  • 直播间名家字画能入手吗?内行揭秘背后套路 - 深鉴新闻
  • Zotero GPT插件:5步搭建你的AI学术研究助手
  • 2026年 厨房设备厂家:不锈钢商用厨具/中央厨房设备/酒店食堂抽油烟管等全套厨房设备品牌新选 - 品牌发掘
  • WinBtrfs终极指南:在Windows上无缝读写Btrfs文件系统的完整解决方案
  • PotPlayer字幕实时翻译:突破语言障碍的终极技术方案
  • 2026年6月有实力的邢台大锅炖鱼饭店推荐榜,传统铁锅炖、秘制酱香炖、农家柴火炖选择指南 - 海棠依旧大
  • 2026年沧州工商注册公司推荐,有注册会计师团队的有哪些? - mypinpai
  • 抖音视频下载神器:如何一键获取无水印高清内容
  • 三步解锁微信聊天记录:本地解密工具的终极指南
  • 如何快速跳过FF14副本动画:终极ACT插件配置指南
  • 数控系统软件的研究与开发(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码
  • Mac NTFS读写困境终结者:免费开源工具Nigate的完整解决方案
  • OpenCore Legacy Patcher深度解析:5个实战技巧让老旧Mac焕发新生
  • HCCL 集合通信库架构剖析——昇腾 NPU 多机多卡训练的通信拓扑与协议栈
  • 一站式游戏编辑器:Harepacker-resurrected完全指南
  • 2026年 名酒回收/老酒回收/白酒回收服务:茅台、五粮液、洋酒、虫草、片仔癀上门现金回收公司专业评估报告 - 品牌发掘
  • 2026年川渝滇二手设备回收服务商排行及联系指南:远珍二手电器经营部联系/宜宾二手空调回收/宜宾办公用品回收/宜宾办公设备回收/选择指南 - 优质品牌商家
  • Onekey Steam清单下载工具:让游戏管理变得如此简单
  • 零基础看懂字画真假!普通人也能学会肉眼鉴伪 - 深鉴新闻
  • LeetCode 188 123:股票买卖问题(限制交易次数)—— 联合题解