基于Spring AI与Ollama构建本地DeepSeek对话机器人
1、安装ollama:
-  
打开Ollama下载官网,根据自己的操作系统下载相应版本的安装文件。
 -  
由于Ollama默认安装在C盘,而Ollama和模型文件都非常大,如果安装在C盘非常占用系统空间,可以使用下面的方法将Ollama安装到指定为止
 -  
打开下载Ollama的文件夹位置,并在地址栏中输入cmd,打开命令行窗口
 -  
在命令行中输入
OllamaSetup.exe /DIR="D:\ollama",将Ollama安装到D盘Ollama文件夹 -  
安装完成后,在命令行窗口中输入
ollama -h若出现如下图所示则说明Ollama安装成功。

2、修改Ollama模型下载位置
在我的电脑上点击鼠标右键,选择“属性”,在打开的设置窗口中找到“系统”—“高级系统设置”,如下图所示
在打开的系统属性窗口中点击“环境变量”,在环境变量对话框中点击“系统变量”中的新建按钮,弹出新建环境变量窗口,如系统所示。在新建系统变量中输入变量名:OLLAMA_MODELS,变量值:D:\ollama\models,完成后点击确定

3、下载DeepSeek,在ollama官网的Models菜单下,找到deepseek-r1,点击打开

4、选择deepseek不同参数的模型,可以看到后面的ollama指令跟着变化,我用的是笔记本,太大的模型跑不起来,选择的是1.5b参数的模型,复制后面的ollama run deepseek-r1:1.5b,然后再命令行中粘贴这行指令,然后回车,即可下载该模型

5、下载完成后就可以在命令行窗口中输入问题来与deepseek进行交互了。 
6、打开IDEA,点击NewProject,创建新工程,在新工程窗口中选择SpringBoot工程,项目名称填写ai-chart-robot,选择项目存放位置,语言选择Java,类型选择Maven,JDK版本选择17,其他选择默认,点击Next
 
 7、在依赖中勾选Web—Spring Web;AI–Ollama;完成后点击Create
 
 8、修改配置文件后缀为yaml
 
 9、配置模型信息,在application.yaml中配置ollama相关信息
spring:
  application:
    name: ai-chart-robot
  ai:
    ollama:
      base-url: http://localhost:11434
      chat:
        model: deepseek-r1:1.5b
 
10、在com.ray.ai包下新建config包,并新建CommonConfiguration,作为配置类,在该类上添加@Configuration注解,并新建一个ChatClient,
@Configuration
public class CommonConfiguration {
    @Bean
    public ChatClient chatClient(OllamaChatModel model){
        return ChatClient
                .builder(model)
                .build();
    }
}
 
11、引入lombok依赖
 在pom.xml文件中引入lombok依赖
<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<version>1.18.34</version>
</dependency>
 
12、在com.ray.ai包下新建controller包,并新建ChatController控制器类
13、在ChatController控制器类上添加RestController注解,添加@RequestMapping注解和equiredArgsConstructor注解;引入ChatClient,并新建一个Chat接口,代码如下
@RequiredArgsConstructor
@RestController
@RequestMapping("/ai")
public class ChatController {
    private final ChatClient chatClient;
    @RequestMapping("/chat")
    public String chat(String prompt){
        return chatClient.prompt()
                .user(prompt) 
                .call()
                .content();
    }
}
 
14、运行项目,在浏览器中调用localhost://8080/ai/chat?prmpot=你是谁,可以看到如下回答
 
 15、修改为流式输出,上面的call方法是阻塞式调用,我们在新建一个接口,使用流式调用
 @RequestMapping("/chatStream")
    public Flux<String> chatStream(String prompt){
        return chatClient.prompt()
                .user(prompt) 
                .stream()
                .content(); 
    }
 
16、重新运行代码后,在浏览器输入chatStream接口并调用,发现显示的是乱码,这是因为流式输出默认采样的是Event事件流的方式,默认情况下,Event事件流是没有编码的
 
 17、在@RequestMapping中添加以下代码 produces = "text/html;charset=utf-8",完整代码如下
@RequestMapping(value = "/chatStream", produces = "text/html;charset=utf-8")
    public Flux<String> chatStream(String prompt){
        return chatClient.prompt()
                .user(prompt) // 用户提示词
                .stream() // 流式调用
                .content(); // 获取响应结果
    }
 
18、再次刷新浏览器,
 
 至此,一个简单的AI聊天机器人就已经初具雏形了。
 后续有时间再开发一个前端聊天界面,并实现对话记忆和历史对话功能。
