请你结合spring ai,ollama,qwen2.5:7b,编写一个tool calling结合业务的完整示例,示例需要包含相关依赖自己每个类导入的包情况
时间: 2025-06-02 19:26:42 浏览: 14
<think>好的,我现在需要帮用户解决一个关于结合Spring AI、Ollama和Qwen2.5-7B模型来编写一个工具调用(tool calling)结合业务的完整示例的问题。首先,我需要理清楚用户的需求到底是什么。
用户提到要结合这三个技术,所以首先我需要确认这三个部分各自的角色。Spring AI是Spring框架中用于集成AI功能的模块,Ollama是一个本地运行大模型的工具,而Qwen2.5-7B是通义千问的一个7B参数的模型版本。用户需要一个示例,展示如何用这些技术实现工具调用,并结合实际业务场景。
首先,我得考虑如何将这些技术整合在一起。可能需要使用Spring AI来创建AI相关的服务,Ollama作为模型的后端服务来运行Qwen2.5模型,然后通过工具调用来实现具体的业务功能。例如,用户可能想要让模型处理自然语言请求,然后调用某些工具(比如查询天气、计算等)来完成业务逻辑。
接下来,我需要考虑项目的依赖。Spring AI可能需要的依赖包括spring-boot-starter-web、spring-ai-ollama,可能还有spring-ai-openai-spring-boot-starter,因为工具调用的功能可能在OpenAI模块中有实现。不过需要注意,Ollama是否支持工具调用,或者是否需要其他配置。另外,Qwen2.5模型是否支持工具调用的格式,比如OpenAI的function calling或者类似的机制。可能需要查阅相关文档确认。
然后,代码结构方面,可能需要定义工具(Tool)的接口或类,配置Ollama的连接,创建Controller来处理请求,以及Service层来调用模型和工具。可能还需要自定义一个工具调用器(ToolCaller),用于根据模型的响应来执行具体的工具方法。
用户可能需要详细的依赖列表,包括pom.xml或build.gradle中的依赖项。比如,Spring Boot的版本,Spring AI的版本,Ollama的客户端依赖等。需要确保这些依赖版本兼容。
另外,工具调用的实现可能需要实现Spring AI中的Tool接口,并注册为Bean,这样模型在生成响应时可以识别可用的工具。例如,定义一个天气查询工具或者计算器工具,然后在调用模型时指定这些工具,模型会返回工具调用的参数,进而执行相应的业务逻辑。
接下来,我需要考虑示例的业务场景。比如,用户输入“查询北京的天气”,模型识别出需要调用天气查询工具,并提取参数location为“北京”,然后服务层调用天气API获取结果,再返回给用户。这个流程需要代码示例来展示如何配置和实现。
可能还需要处理模型的响应格式,比如Ollama返回的响应是否兼容Spring AI的ToolCall结构,或者是否需要自定义解析。如果Ollama的响应格式与OpenAI不同,可能需要编写适配器代码来转换。
另外,需要配置Ollama的base URL,确保Spring AI可以连接到本地运行的Ollama服务,并且已经正确下载并运行了Qwen2.5-7B模型。这部分可能需要用户在本地启动Ollama并加载模型,所以在示例中可能需要给出相应的步骤说明。
可能的代码结构包括:
1. 配置类:配置Ollama的连接参数,注册工具Bean。
2. 工具类:实现具体的业务工具,如WeatherService。
3. Controller:接收用户请求,调用AI服务处理。
4. Service层:处理AI模型的调用,解析工具调用,执行工具方法,并生成最终响应。
需要确保每个类的导入包正确,比如Spring的注解、Spring AI的相关类、Ollama的配置类等。
可能遇到的挑战包括Ollama对工具调用的支持程度,以及Qwen2.5模型是否能够正确生成工具调用所需的参数。如果模型不支持,可能需要微调或使用特定的提示词来引导模型生成正确的格式。此外,Spring AI对Ollama的支持可能还在早期阶段,需要确认相关文档和示例是否存在,或者是否需要自定义实现。
最后,需要测试整个流程,确保模型能够正确识别工具调用的需求,并触发相应的业务逻辑。如果存在问题,可能需要调整提示词或检查模型输出是否正确解析。
总结来说,步骤大致是:配置依赖,设置Ollama连接,定义业务工具,配置Spring AI使用这些工具,创建服务调用模型并处理工具调用,最后通过Controller暴露API。需要确保每个部分代码正确,并处理可能的兼容性问题。以下</think>是一个结合Spring AI、Ollama和Qwen2.5-7B实现工具调用的完整示例,包含电商场景的订单查询业务:
```xml
<!-- pom.xml 依赖 -->
<dependencies>
<!-- Spring Boot基础依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>3.2.0</version>
</dependency>
<!-- Spring AI Ollama -->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-ollama-spring-boot-starter</artifactId>
<version>0.8.1</version>
</dependency>
<!-- 工具调用支持 -->
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-openai-spring-boot-starter</artifactId>
<version>0.8.1</version>
</dependency>
</dependencies>
```
```java
// src/main/java/com/example/demo/config/OllamaConfig.java
package com.example.demo.config;
import org.springframework.ai.ollama.api.OllamaApi;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class OllamaConfig {
@Bean
public OllamaApi ollamaApi() {
return new OllamaApi("http://localhost:11434");
}
}
```
```java
// src/main/java/com/example/service/OrderService.java
package com.example.demo.service;
import org.springframework.stereotype.Service;
import java.util.Map;
@Service
public class OrderService {
// 模拟订单数据库
private static final Map<String, String> ORDERS = Map.of(
"ORDER123", "已发货 - 物流单号:SF123456789",
"ORDER456", "生产中 - 预计3天后发货",
"ORDER789", "待付款 - 金额:¥899.00"
);
public String queryOrderStatus(String orderId) {
return ORDERS.getOrDefault(orderId.toUpperCase(), "订单不存在");
}
}
```
```java
// src/main/java/com/example/demo/ai/tools/OrderQueryTool.java
package com.example.demo.ai.tools;
import com.example.demo.service.OrderService;
import org.springframework.ai.model.function.FunctionCallback;
import org.springframework.ai.model.function.FunctionCallingOptions;
import org.springframework.ai.ollama.api.OllamaOptions;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.List;
@Configuration
public class OrderQueryTool {
@Bean
public FunctionCallback orderQueryFunction(OrderService orderService) {
return FunctionCallback.builder()
.withName("queryOrderStatus")
.withDescription("根据订单ID查询订单状态")
.withInputType(OrderQueryRequest.class)
.withResponseConverter(response -> response)
.withFunction(orderService::queryOrderStatus)
.build();
}
@Bean
public FunctionCallingOptions ollamaFunctionCallingOptions() {
return OllamaOptions.create()
.withModel("qwen2.5:7b")
.withTemperature(0.5f)
.withFunctionCallbacks(List.of("queryOrderStatus"));
}
public record OrderQueryRequest(String orderId) {}
}
```
```java
// src/main/java/com/example/demo/controller/OrderController.java
package com.example.demo.controller;
import org.springframework.ai.client.AiClient;
import org.springframework.ai.prompt.Prompt;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class OrderController {
private final AiClient aiClient;
@Autowired
public OrderController(AiClient aiClient) {
this.aiClient = aiClient;
}
@PostMapping("/query")
public String handleOrderQuery(@RequestBody String userQuery) {
Prompt prompt = new Prompt(userQuery);
return aiClient.generate(prompt).getGeneration().getContent();
}
}
```
```java
// src/main/java/com/example/demo/DemoApplication.java
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
```
使用说明:
1. 确保本地已安装并运行Ollama,且已下载qwen2.5:7b模型:
```bash
ollama pull qwen2.5:7b
ollama serve
```
2. 启动Spring Boot应用后,发送POST请求:
```bash
curl -X POST -H "Content-Type: text/plain" -d "请帮我查一下订单ORDER123的状态" http://localhost:8080/query
```
3. 预期响应:
```
订单ORDER123的状态是:已发货 - 物流单号:SF123456789
```
实现特点:
1. 自定义订单查询工具函数,通过FunctionCallback集成业务服务
2. 使用Qwen2.5-7B模型进行自然语言理解
3. 自动将用户查询转换为工具调用
4. 真实业务数据与AI模型的无缝集成
关键点说明:
- FunctionCallingOptions 配置模型参数和可用工具
- OrderService 封装真实的业务逻辑
- FunctionCallback 实现模型与业务服务的桥接
- OllamaApi 配置确保正确连接到本地服务
此示例展示了如何将大语言模型与业务系统深度集成,实现自然语言到业务操作的智能转换。
阅读全文
相关推荐


















