大数跨境
0
0

Spring AI + Ollama 实现 DeepSeek 模型调用

Spring AI + Ollama 实现 DeepSeek 模型调用 Spring全家桶实战案例
2025-02-17
0
导读:Spring AI + Ollama 实现 DeepSeek模型调用
Spring Boot 3实战案例合集》现已囊括超过90篇精选实战文章,并且此合集承诺将永久持续更新,为您带来最新的技术与实战案例。订阅用户将特别获赠文末中所有MD文档(详尽学习笔记),以及完整的项目源码,助您在学习道路上畅通无阻。

Spring Boot 3实战案例锦集》PDF电子书现已出炉!

🎉🎉我们精心打造的《Spring Boot 3实战案例锦集》PDF电子书现已正式完成,目前已经有96个案例,后续还将继续更新。文末有电子书目录。

💪💪永久更新承诺

我们郑重承诺,所有订阅合集的粉丝都将享受永久免费的后续更新服务。随着Spring相关技术的更新升级,我们的电子书也将持续更新,确保您始终掌握最前沿、最实用的技术知识。

💌💌如何获取
订阅我们的合集点我订阅,并通过私信联系我们,我们将第一时间将电子书发送给您。

现在就订阅合集




环境:SpringBoot3.4.0



1. 简介

什么是Ollama?
Ollama是一个专为大型语言模型设计的开源框架,旨在简化这些模型在本地机器上的部署和运行。它提供了轻量级与可扩展的架构,使得研究人员、开发人员能够更加方便地在本地环境中运行和定制这些模型。Ollama支持多种模型架构,并提供了与OpenAI兼容的API接口,适合快速搭建私有化AI服务。此外,它还支持跨平台运行,无论是Windows、Linux还是macOS系统,用户都可以轻松安装和使用。
什么是Spring AI?
Spring AI 是一个针对人工智能(AI)工程的应用框架。其目标是将诸如可移植性和模块化设计等Spring生态系统设计原则应用于AI领域,并推动将普通旧式Java对象(POJOs)作为应用程序的构建块引入到AI领域。
支持所有主要的AI模型提供商,如Anthropic、OpenAI、Microsoft、Amazon、Google和Ollama等。支持的模型类型包括:
  • Chat Completion(聊天补全)
  • Embedding(嵌入)
  • Text to Image(文本转图像)
  • Audio Transcription(音频转录)
  • Text to Speech(文本转语音)
  • Moderation(内容审核)
     
什么是DeepSeek
DeepSeek近期备受瞩目,其热度之高已无需我们再多做介绍。

本篇文章我们将通过Spring AI + Ollama 实现 DeepSeek-r1模型的调用。

2. 实战案例

2.1 Ollama安装

访问如下的网站进行下载安装:

https://ollama.com/

根据自己的环境下载安装,我这里下载的是windows版本。

下载完成后进行安装,安装完成后,我们需要配置OLLAMA_HOST环境变量,进行修改默认绑定的地址及端口。如下:

通过http://localhost:11111测试服务是否正常

接下来就可以在命令行中运行下面的命令了:

由于机器的限制,我们这里只能安装deepseek-r1:1.5b的模型,运行如下的命令:

ollama run deepseek-r1:1.5b

等待下载完成后,我们就进入到下面的界面:

这里随便输入你想问的内容即可,如下:

以上我们就正确的安装ollama并且下载了deepseek-r1模型,下面我们就可以在程序中对接了。

2.2 对接Ollama

首先,引入如下依赖

<properties>  <spring.ai.version>1.0.0-M6</spring.ai.version></properties><dependency>  <groupId>org.springframework.boot</groupId>  <artifactId>spring-boot-starter-webflux</artifactId></dependency><dependency>  <groupId>org.springframework.ai</groupId>  <artifactId>spring-ai-ollama-spring-boot-starter</artifactId>  <version>${spring.ai.version}</version></dependency>

接着,在application.yml中进行如下的配置

spring:  ai:    ollama:      # ollama地址      base-url: http://localhost:11111      chat:        enabled: true        options:          # 使用的模型          model: deepseek-r1:1.5b

以上就完成了所有的配置。

最后,我们还需要配置一个ChatClient

@Configurationpublic class AIConfig {  @Bean  ChatClient chatClient(ChatClient.Builder builder) {    return builder.build() ;  }}

完成以上的所有配置,我们就可以来写相应的接口进行测试了

定义Controller接口

@RestController@RequestMapping("/ai")public class AIController {  private final ChatClient chatClient;  AIController(ChatClient chatClient) {    this.chatClient = chatClient;  }  // 根据用户输入的内容输出结果,这里我们以Stream的方式输出  @GetMapping(value = "/chat", produces = "text/html;charset=utf-8")  public Flux<String> chat(String message) {    return chatClient.prompt()        .user(message)        .stream()        .content() ;  }}

访问如下地址:

http://localhost:8080/ai/chat?message=讲一个笑话,50字内

这里是以打字的效果进行输出。

2.3 通过SSE实现

首先,将接口修改如下:

@GetMapping(value = "/chat", produces = {  "text/html;charset=utf-8"  MediaType.TEXT_EVENT_STREAM_VALUE})public Flux<Stringchat(String message)

添加MediaType.TEXT_EVENT_STREAM_VALUE以支持事件流。

HTML页面如下:

<!DOCTYPE html><html lang="en"> <head>  <meta charset="UTF-8">  <title>Spring AI + Ollama + DeepSeek-r1:1.5b</title>  <script>    function submitText() {      let text = document.querySelector("#userText").value ;      let chat = document.querySelector('.chat-content') ;      chat.innerHTML = ''        let source = new EventSource(`http://localhost:8080/ai/chat?message=${text}`) ;      let count = 0 ;      let content = '' ;      source.onmessage = (e) => {        let data = e.data        if (data == '\n' || data == '') {          count ++ ;        }        if (count == 2) {          source.close() ;        }        if (data == '</think>') {          chat.appendChild(document.createElement("hr"))        }        if (data != '<think>' && data != '</think>') {          chat.appendChild(document.createTextNode(data)) ;        }      }    }  </script>  <style type="text/css">    .chat-content {      width600px;      height500px;      border1px solid #DDD;    }  </style> </head> <body>   <div class="chat-content"></div>   <input type="text" value="讲一个笑话, 50字内" id="userText"/>&nbsp;   <button type="button" onclick="submitText()">提交</button> </body></html>

以上代码是有问题的,想了很多办法结束流但是都有问题(不结束将一直请求)。

最终页面效果


以上是本篇文章的全部内容,如对你有帮助帮忙点赞+转发+收藏

推荐文章

实战技巧!Spring Boot 非常有用的5个开发技巧,请收藏

强大!基于Spring Boot自定义条件动态注册组件

中级开发!Spring Boot使用@Query + SpEL解决复杂动态查询

技术专家!Spring AOP + Nacos + Prometheus 实现动态限流及实时监控

性能优化!Spring大事务7条优化建议及示例

Spring Boot 一次性Token,此功能太实用了

强大!Spring Boot全新模块化管理方式

自己动手实现Agent统计API接口调用耗时

Jackson在Spring Boot高级应用技巧【Long精度丢失, @JsonValue, 数据脱敏】

Tika 与 Spring Boot 的完美结合:支持任意文档解析的神器

5种实现方式配置Spring Boot API接口超时时间

处理Null的神器Optional

避坑!为了性能Spring挖了一个大坑

【声明】内容源于网络
0
0
Spring全家桶实战案例
Java全栈开发,前端Vue2/3全家桶;Spring, SpringBoot 2/3, Spring Cloud各种实战案例及源码解读
内容 832
粉丝 0
Spring全家桶实战案例 Java全栈开发,前端Vue2/3全家桶;Spring, SpringBoot 2/3, Spring Cloud各种实战案例及源码解读
总阅读195
粉丝0
内容832