1.添加新模块

添加新的模块,然后选择maven点击创建就行。

之后进行导入Maven坐标,我这里使用的是ollama链接的本地大模型,因为这是是微服务项目,所以其他依赖可以直接导入Common微服务。

<dependencies>
        <dependency>
            <groupId>com.buka</groupId>
            <artifactId>common</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-webflux</artifactId>
        </dependency>
    </dependencies>

修改启动类:AiServiceApplication.java

package com.buka;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;

/**
 * @ClassName AiServiceApplication
 * @Description TODO
 * @Author cgx
 * @Date 2025/9/2 下午11:30
 * @Version 1.0
 **/
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class AiServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(AiServiceApplication.class, args);
    }
}

2.连接大模型

(1)配置文件application.yml

server:
  port: 9005

#spring:
#  application:
#    name: ai-service
#  cloud:
#    nacos:
#      discovery:
#        server-addr: 192.168.40.133:8848
spring:
  ai:
    ollama:
      base-url: http://localhost:11434  # Ollama默认API地址
      default-model: deepseek-r1:8b   # 默认使用的模型

由于我们这里目前阶段是只进行了连接大模型,所以可以只添加ai微服务的端口以及ollama的配置。当然要想写这样配置还需要有一个OllamaProperties.java的文件。(如果在创建新的项目时可以选择SpringAI框架,就不需要这个文件了)

package com.buka.config;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

/**
 * @ClassName OllamaProperties
 * @Description TODO
 * @Author cgx
 * @Date 2025/9/2 上午1:44
 * @Version 1.0
 **/
@Component
@ConfigurationProperties(prefix = "spring.ai.ollama")
public class OllamaProperties {
    private String baseUrl;
    private String defaultModel;

    public String getBaseUrl() {
        return baseUrl;
    }

    public void setBaseUrl(String baseUrl) {
        this.baseUrl = baseUrl;
    }

    public String getDefaultModel() {
        return defaultModel;
    }

    public void setDefaultModel(String defaultModel) {
        this.defaultModel = defaultModel;
    }

}

(2)定义Ollama专用的请求/响应实体

首先是请求OllamaReques.java

package com.buka.request;

import lombok.Data;

/**
 * @ClassName OllamaRequest
 * @Description TODO
 * @Author cgx
 * @Date 2025/9/2 下午2:30
 * @Version 1.0
 **/
@Data
public class OllamaRequest {
    //模型名称
    private String model;
    //提示词
    private String prompt;
    //关闭流式返回
    private boolean stream = false;

    public OllamaRequest(String model, String prompt) {
        this.model = model;
        this.prompt = prompt;
    }
}

响应OllamaResponse.java

package com.buka.response;

import lombok.Data;

/**
 * @ClassName OllamaResponse
 * @Description TODO
 * @Author cgx
 * @Date 2025/9/3 上午12:10
 * @Version 1.0
 **/
@Data
public class OllamaResponse {
    private String model;
    // 模型回答内容
    private String response;
    // Ollama返回的完成标识
    private boolean done;
}

(3)实现Ollama调用服务

package com.buka.service;

import com.buka.request.OllamaRequest;
import com.buka.response.OllamaResponse;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.reactive.function.client.WebClient;

/**
 * @ClassName OllamaAiService
 * @Description TODO
 * @Author cgx
 * @Date 2025/9/2 下午2:36
 * @Version 1.0
 **/
@Service
public class OllamaAiService {
    private final WebClient webClient;
    private final String defaultModel;

    public OllamaAiService(WebClient.Builder webClientBuilder,
                           @Value("${spring.ai.ollama.base-url}") String baseUrl,
                           @Value("${spring.ai.ollama.default-model}") String defaultModel) {
        this.webClient = webClientBuilder.baseUrl(baseUrl).build();
        this.defaultModel = defaultModel;
    }
    //调用Ollama生成文本
    public String generate(String prompt){
        return generate(prompt,defaultModel);
    }
    // 用指定的模型生成文本(可以手动指定其他模型,比如你以后可能加的其他模型)
    public String generate(String prompt, String model) {
        // 1. 构建请求参数:指定模型(比如deepseekr1:8b)和你的问题(prompt)
        OllamaRequest request = new OllamaRequest(model, prompt);

        // 2. 发送POST请求到Ollama的API接口(/api/generate)
        return webClient.post()
                // Ollama生成文本的固定接口路径
                .uri("/api/generate")
                // 发送上面构建的请求参数
                .bodyValue(request)
                .retrieve()            // 执行请求并获取响应
                // 将响应转换成Java对象(OllamaResponse)
                .bodyToMono(OllamaResponse.class)
                // 从响应中提取模型的回答内容
                .map(OllamaResponse::getResponse)
                .block();  // 同步等待结果(会阻塞当前线程,直到模型返回结果)
    }
}

(4)Controller层:

package com.buka.controller;

import com.buka.service.OllamaAiService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * @ClassName OllamaAiController
 * @Description TODO
 * @Author cgx
 * @Date 2025/9/2 下午3:01
 * @Version 1.0
 **/
@RestController
@RequestMapping("/ai/ollama")
public class OllamaAiController {
    @Autowired
    private OllamaAiService ollamaAiService;
    // 同步调用接口(指定提示词,使用默认模型)
    @PostMapping("/generate")
    public String generate(@RequestBody String prompt) {
        return ollamaAiService.generate(prompt);
    }

    // 同步调用接口(可指定模型)
    @PostMapping("/generate/{model}")
    public String generateWithModel(@PathVariable String model,
                                    @RequestBody String prompt) {
        return ollamaAiService.generate(prompt, model);
    }
}

3.进行测试

这里要说明,要先下载Ollama,直接在官网就能下载,然后下载想要的模型。

然后测试是使用的postman。

在Controller里我们看到了这是一个post请求,参数就是String类型,写入url就用body里面的test进行测试即可。可以看到下面已经是ai的回答了。

最后这是ai微服务的整个结构

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐