当前位置:

首页 > 编程开发 > SpringAI整合Ollama实现工具调用的实战全解

SpringAI整合Ollama实现工具调用的实战全解

Air Explorer Pro
Air Explorer Pro

Air Explorer Pro是一款跨平台多网盘管理工具,可实现一站式完成不同网盘间文件的互传、搜索和同步等操作。任务管理和过程控制会更完整,持续下载、批量同步或需要稳定传输流程的场景会更适合它。

立即下载
¥99
Windows/macOS 2026-08-22
正版软件 Windows macOS软件 Pro 文件搜索工具 Pro下载 Pro正版软件 Pro购买

基于SpringAI与Ollama实现本地大模型工具调用,通过@Tool注解定义工具方法并注册至ChatClient,模型自动决策调用外部工具获取实时信息或执行计算。需使用支持函数调用的模型如qwen2.5:7b,SpringAI自动生成JSONSchema,日志调试可观察调用过程。

本文目录

    场景

    在大模型应用开发中,工具调用(Tool Calling / Function Calling)算得上是让Agent真正“活”起来的关键能力。简单说,大模型能自己判断“什么时候该叫外援”,然后自主决定调用哪个外部工具——比如获取实时信息、执行计算,或者操作外部系统。

    Spring AI 作为 Ja va 生态中的 AI 集成框架,提供了一套相当优雅的 API 来定义和管理这些工具。而 Ollama 则让开发者能在本地跑起强大的开源大模型,不用每次都往云端走。本文就是基于这两者,从环境搭建到工具的定义、注册,再到完整项目实现和问题排查,把本地大模型的工具调用这件事系统地捋一遍。文末附带了可直接运行的完整代码,拿来就能用。

    工具调用的工作流程

    在 Ollama + Spring AI 的组合里,一次完整的工具调用大致走这么几步:

    定义工具:用 @Tool 注解或者编程式 API,把一个 Ja va 方法标记成可被调用的工具。

    注册工具:在构建 ChatClient 的时候把工具注入进去。Spring AI 会自动帮你生成一份符合 OpenAI 规范的 JSON Schema。

    模型决策:用户提问后,Ollama 模型会自己琢磨——这事儿要不要调用工具?如果要,就返回工具名称和所需的参数。

    执行与反馈:Spring AI 拿到指令后,自动调用对应的 Ja va 方法,然后把结果返回给模型。

    生成回答:模型根据工具执行的结果,生成最终的自然语言回答。整个流程行云流水。

    模型兼容性要求

    有一点必须说清楚:不是所有 Ollama 模型都支持工具调用。必须用原生支持 Function Calling 的模型,否则 LLM 会直接忽略你的工具列表,只给你返回一段纯文本——很尴尬。

    建议用 ollama list 看看本地有哪些模型,再用 oll pull <模型名> 下载支持的模型。个人比较推荐先试试 qwen2.5:7b-instruct、llama3.1:8b 或 mistral:7b,这几款对工具调用的支持相当成熟。

    两种工具定义方式

    Spring AI 给了两种定义工具的方式,按需选就行。

    使用 @Tool 注解(推荐)

    在 Spring 管理的 Bean 方法上直接加 @Tool 注解,Spring AI 会自动把它包装成 ToolCallback。这种方式最省事,代码也最清晰。

    编程式 API(无需注解)

    还有一种方式是用 MethodToolCallback 来构建工具回调,适合那种需要动态创建工具、或者不方便改已有代码的场景。

    import org.springframework.ai.tool.MethodToolCallback;
    import org.springframework.ai.tool.ToolCallback;
    
    public ToolCallback dynamicTool(Object target) {
        return MethodToolCallback.builder()
                .method("methodName", target)
                .description("工具描述")
                .build();
    }

    实现

    pom.xml 依赖配置

    先把依赖配好,这是基础。注意用稳定版的 Spring Boot 和 Spring AI,避免踩一些不必要的坑。

        
            org.springframework.boot
            spring-boot-starter-parent
            3.3.3
        
        com.example
        spring-ai-ollama-tool
        1.0
        
            17
            1.1.2
        
        
            
                org.springframework.boot
                spring-boot-starter-web
            
            
                org.springframework.ai
                spring-ai-starter-model-ollama
                ${spring-ai.version}
            
        
        
            
                spring-milestones
                https://repo.spring.io/milestone
                
                    false
                
            
        

    application.yml 配置

    配置文件里的参数其实不多,但有几个关键点得留意:模型名、temperature、还有上下文窗口大小。

    server:
      port: 886
    spring:
      ai:
        ollama:
          base-url: http://localhost:11434
          chat:
            model: qwen2.5:7b-instruct
            options:
              temperature: 0.7
              num-ctx: 4096
    logging:
      level:
        org.springframework.ai.chat.client: DEBUG

    工具服务类(含 @Tool 注解)

    这里定义几个实际可用的工具:获取时间、查天气、做计算。每个方法上都有清晰的描述,这样 LLM 才能明白“什么时候该用哪个工具”。

    package com.badao.ai.service;
    
    import org.springframework.ai.tool.annotation.Tool;
    import org.springframework.ai.tool.annotation.ToolParam;
    import org.springframework.stereotype.Service;
    import ja va.time.LocalDateTime;
    import ja va.time.format.DateTimeFormatter;
    
    @Service
    public class ToolService {
    
        @Tool(description = "获取当前系统的日期和时间,返回格式化后的时间字符串")
        public String getCurrentDateTime() {
            System.out.println("获取当前日期和时间工具被调用");
            return LocalDateTime.now()
                    .format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
        }
    
        @Tool(description = "查询指定城市的天气信息")
        public String getWeather(@ToolParam(description = "城市名称") String city) {
            System.out.println("查询指定城市的天气信息工具被调用");
            return String.format("城市:%s,天气:晴,温度:22°C ~ 28°C,湿度:45%%,风力:3级", city);
        }
    
        @Tool(description = "计算两个数字的和")
        public double add(@ToolParam(description = "第一个加数") double a,
                          @ToolParam(description = "第二个加数") double b) {
            System.out.println("计算两个数字的和工具被调用");
            return a + b;
        }
    }

    ChatClient 配置类

    这里有个点容易踩坑:在 Spring AI 1.1.2 中,单纯加 @Tool 注解并不会自动生成 ToolCallbackProvider Bean,得手动把工具服务类注入进去。下面的配置就是干这事的。

    package com.badao.ai.config;
    
    import com.badao.ai.service.ToolService;
    import org.springframework.ai.chat.client.ChatClient;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    public class ChatConfig {
    
        @Bean
        public ChatClient chatClient(ChatClient.Builder chatClientBuilder,
                                     ToolService toolService) {
            return chatClientBuilder
                    .defaultTools(toolService)
                    .build();
        }
    }

    控制器

    控制器这边提供了两种对话方式:普通对话和流式输出(打字机效果)。接口设计很简洁。

    package com.badao.ai.controller;
    
    import org.springframework.ai.chat.client.ChatClient;
    import org.springframework.web.bind.annotation.*;
    
    @RestController
    @RequestMapping("/api")
    public class ToolChatController {
    
        private final ChatClient chatClient;
    
        public ToolChatController(ChatClient chatClient) {
            this.chatClient = chatClient;
        }
    
        @PostMapping("/chat")
        public ChatResponse chat(@RequestBody ChatRequest request) {
            String result = chatClient.prompt()
                    .user(request.getMessage())
                    .call()
                    .content();
            return new ChatResponse(200, "success", result);
        }
    
        @GetMapping(value = "/stream", produces = org.springframework.http.MediaType.TEXT_EVENT_STREAM_VALUE)
        public reactor.core.publisher.Flux streamChat(@RequestParam String msg) {
            return chatClient.prompt()
                    .user(msg)
                    .stream()
                    .content();
        }
    
        public record ChatRequest(String message) {
            public String getMessage() {
                return message;
            }
        }
    
        public record ChatResponse(int code, String msg, String data) {}
    }

    测试验证

    跑一下测试,看看效果。先试试天气查询,再试试计算器。如果配置没问题,模型的响应应该是准确且及时的。

    SpringAI整合Ollama实现工具调用的实战全解

    SpringAI整合Ollama实现工具调用的实战全解

    常见问题与解决方案

    在实际操作中,有几个典型的坑需要注意。

    1、找不到 ToolCallbackProvider Bean

    报错信息:Could not autowire. No beans of 'ToolCallbackProvider' type found.

    原因很简单:只加 @Tool 注解是不够的,Spring AI 不会自动创建 ToolCallbackProvider Bean。解决方案就是手动注入 ToolService,并用 .defaultTools(toolService) 注册。

    2、找不到 spring-ai-starter-model-ollama 依赖

    报错信息:Could not find artifact org.springframework.ai:spring-ai-ollama-spring-boot-starter:pom:1.1.2

    原因:artifact ID 写错了。Spring AI 1.1.2 对应的正确依赖名是 spring-ai-starter-model-ollama,注意核对。

    3、模型从不调用工具,只返回文字回答

    这几乎是新手最容易碰见的问题。根本原因在于模型本身不支持 Function Calling,比如 llama2 或早期版本的 qwen。解决办法就是换模型,推荐 qwen2.5:7b、llama3.1:8b 或 mistral:7b。

    关键知识点总结

    到这儿,其实核心的要点已经都摆出来了。再总结几个必须记住的点:

    @Tool 注解:把方法标记为工具,description 字段是关键,它告诉 LLM 什么时候该调用这个工具。

    @ToolParam 注解:描述工具方法参数的含义,帮 LLM 准确把参数填对。

    ChatClient.defaultTools():把包含 @Tool 方法的类注入 ChatClient,工具调用能力就此激活。

    模型兼容性:一定要用原生支持 Function Calling 的模型,否则白忙活。

    JSON Schema 自动生成:Spring AI 会根据 Ja va 方法签名和注解自动生成符合 OpenAI 规范的 Schema,这活儿它替你干了。

    日志调试:把 org.springframework.ai.chat.client 的日志级别调到 DEBUG,能看到工具调用的完整过程,排查问题时会方便很多。

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发 AI
    相关文章 更多
    llama.cpp 后端更新:Adreno 分解注意力、CUDA 空分块修复与 SYCL 缓存
    llama.cpp 后端更新:Adreno 分解注意力、CUDA 空分块修复与 SYCL 缓存

    llama.cpp b12314为Adreno OpenCL加入分解Flash Attention,b12316修复CUDA MoE空分块路径读取,b12319源码标签改用SYCL线程本地设备ID缓存。三个后端、两种发布阶段需分别核对,不能合并成统一性能提升或全平台安全结论。

    LangChain JS 适配包更新:MCP与OpenAI提高Zod下限,连接器同步依赖
    LangChain JS 适配包更新:MCP与OpenAI提高Zod下限,连接器同步依赖

    LangChain JS的MCP、IBM、OpenAI及Tavily适配包要求安装Zod 4.6.6及以上,OpenRouter、Together AI、xAI和Neo4j同步相关依赖。本文区分直接安全约束与传递依赖更新,给出锁文件和schema兼容性核对方法。

    LangChain Core 1.8.0:最低 Python 升至3.11,加入决策模型能力
    LangChain Core 1.8.0:最低 Python 升至3.11,加入决策模型能力

    langchain-core 1.8.0结束Python 3.10支持,最低要求变为Python 3.11,并加入decision models。Python 3.10仍会解析到1.7.x;升级前应同时核对解释器、锁文件、CI镜像与部署运行时,不把TypeSafe包的迁移要求混同于全部LangChain包。

    GitHub Copilot CLI 1.0.110-2:压缩遵守会话额度,修复插件设置覆盖
    GitHub Copilot CLI 1.0.110-2:压缩遵守会话额度,修复插件设置覆盖

    GitHub Copilot CLI 1.0.110-2预发布补丁让/compact遵守会话AI credit限制,改进失败回复标记,并修复无效配置时插件操作覆盖其他设置的问题。会话清理会跳过其他进程正在使用的会话,适合核对多终端与插件工作流。

    Ducter 0.0.42:消息定向回复上线,串联密钥卡片与 Mac 手机操作
    Ducter 0.0.42:消息定向回复上线,串联密钥卡片与 Mac 手机操作

    Ducter 0.0.42加入对单条消息及选中文字回复;本轮0.0.39—0.0.41还调整主动提醒、密钥请求卡片及Mac上的手机和应用操作。更新涉及本地权限与远端执行边界,应按版本逐项确认,而非默认所有设备都能使用全部功能。

    Qwen Code 1.0.0-preview.1:修复订阅模型登录,支持 Qoder 并行工具调用
    Qwen Code 1.0.0-preview.1:修复订阅模型登录,支持 Qoder 并行工具调用

    Qwen Code 1.0.0-preview.1修复订阅账号登录后无法使用订阅模型的问题,模型目录随登录状态更新,并同步0.27.x模型目录与思考预算映射。Qoder模型支持并行工具调用;这是预览版补丁,需要单独验证配置兼容。

    Google 智能眼镜开放预订:Gemini 随身助手、售价与隐私边界详解
    Google 智能眼镜开放预订:Gemini 随身助手、售价与隐私边界详解

    Google与Gentle Monster、Warby Parker及Samsung合作的智能眼镜开放预订,计划12月10日开售。产品支持Gemini、语音导航与翻译;购买前应核对美国/韩国账号、18岁及兼容手机要求,并区分相机视觉与聊天历史的隐私设置。

    NVIDIA 宣布 CEO 交接:黄仁勋辞任,Colette Kress 出任临时 CEO
    NVIDIA 宣布 CEO 交接:黄仁勋辞任,Colette Kress 出任临时 CEO

    NVIDIA董事会宣布黄仁勋立即辞去总裁、CEO及董事职务,由CFO Colette Kress兼任临时CEO,Harvey C. Jones出任董事长。此次公告确认的是管理层交接,客户应持续核对正式产品与交付公告。

    OpenAI 登录、注册与部分功能故障已恢复:核对受影响时间与请求
    OpenAI 登录、注册与部分功能故障已恢复:核对受影响时间与请求

    OpenAI已于北京时间11月12日04:52:40确认登录、注册与部分ChatGPT功能事件恢复,调查范围也曾包括通过OpenAI API创建会话的错误率。该事件已恢复,用户应核对失败操作与实际结果,不能推断所有API都曾不可用。

    OpenCode PTY 0.5.2:发布 protocol 8 终端服务组件
    OpenCode PTY 0.5.2:发布 protocol 8 终端服务组件

    OpenCode发布opencode-pty 0.5.2终端服务组件,使用protocol 8并以@opencode/pty@0.5.2发布到npm。它面向集成终端子进程的开发者,采用MIT许可,仍被项目说明为实验性服务核心,不是OpenCode整款应用的版本号。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。

    即将离开本站
    您即将前往第三方网站,请确认是否继续?