当前位置: 首页 > news >正文

本地 Ollama 部署 Deepseek R1 并使用 Spring AI Alibaba 构建 Chat 应用示例

本地部署 Deepseek R1 并使用 Spring AI Alibaba 构建 Chat 应用示例

Ollama 部署 Deepseek R1

官网:https://www.deepseek.com/

Github:https://github.com/deepseek-ai

Ollama:https://ollama.com/

Docker Compose

部署一个 Ollama 和 open-webui 服务:

services:

   ollama:
     volumes:
       - ./models:/root/.ollama  # 将本地文件夹挂载到容器中的 /root/.ollama 目录 (模型下载位置)
     container_name: ollama
     pull_policy: always
     tty: true
     restart: unless-stopped
     image: ollama/ollama:latest
     ports:
       - 11434:11434  # Ollama API 端口

   open-webui:
     build:
       context: .
       args:
         OLLAMA_BASE_URL: '/ollama'
       dockerfile: Dockerfile
     image: ghcr.io/open-webui/open-webui:main
     container_name: open-webui
     volumes:
       - ./open-webui:/app/backend/data  # 前端页面数据挂载位置
     depends_on:
       - ollama
     ports:
       - ${OPEN_WEBUI_PORT-3005}:8080
     environment:
       - 'OLLAMA_BASE_URL=http://ollama:11434'
       - 'WEBUI_SECRET_KEY='
     extra_hosts:
       - host.docker.internal:host-gateway
     restart: unless-stopped

安装 DeepSeek-R1

进入 docker ollama 容器下载 deepseek-r1 模型

# 进入容器
$ docker exec -it ollama bash

# 查看 ollama 已有的模型(第一次下载没有正常)
$ root@c5e5ff20a533:/# ollama list

NAME            ID              SIZE    MODIFIED
llama3:latest   365c0bd3c000    4.7 GB  7 months ago
qwen:4b         d53d04290064    2.3 GB  7 months ago

# 选择下载 8b(可以根据机器环境选择不同的模型)
ollama run deepseek-r1:8b

# 下载成功如下所示

open-webui 使用

如果出现模型失败的错误,尝试更新先 ollama 版本之后重试!

在右上角选择模型:

在这里插入图片描述

使用演示:
在这里插入图片描述

看起来效果不错,歪瑞古德!

Spring AI Alibaba 调用

接下来演示如何 Spring AI Alibaba 完成一个简单的 Chat 应用。

pom.xml

因为我们使用 ollama 部署 deepseek r1,所以这里使用 ollama starter。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
		 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>indi.yuluo</groupId>
		<artifactId>examples</artifactId>
		<version>1.0-SNAPSHOT</version>
	</parent>

	<groupId>indi.yuluo.deepseek</groupId>
	<artifactId>deepseek-r1-saa</artifactId>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
			<version>3.3.4</version>
		</dependency>

		<dependency>
			<groupId>org.springframework.ai</groupId>
			<artifactId>spring-ai-ollama-spring-boot-starter</artifactId>
			<version>1.0.0-M6</version>
		</dependency>
	</dependencies>

	<repositories>
		<repository>
			<id>spring-milestones</id>
			<name>Spring Milestones</name>
			<url>https://repo.spring.io/milestone</url>
			<snapshots>
				<enabled>false</enabled>
			</snapshots>
		</repository>
	</repositories>

</project>
application.yml
server:
  port: 8080

spring:
  application:
    name: deepseek-r1-saa

  ai:
    ollama:
      base-url: http://localhost:11434
      chat:
        model: deepseek-r1:8b
启动类
package indi.yuluo.deepseek;

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

/**
 * @author yuluo
 * @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a>
 */

@SpringBootApplication
public class DeepSeekChatApplication {

    public static void main(String[] args) {

       SpringApplication.run(DeepSeekChatApplication.class, args);
    }

}
controller
package indi.yuluo.deepseek.controller;

import reactor.core.publisher.Flux;

import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.model.ChatResponse;
import org.springframework.ai.chat.prompt.Prompt;
import org.springframework.ai.ollama.OllamaChatModel;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author yuluo
 * @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a>
 */

@RestController
@RequestMapping("/deepseek/chat")
public class DeepSeekController {

    private final ChatClient chatClient;

    public DeepSeekController (OllamaChatModel chatModel) {

       this.chatClient = ChatClient.builder(chatModel).build();
    }

    @GetMapping("/{prompt}")
    public Flux<ChatResponse> chat(@PathVariable(value = "prompt") String prompt) {

       return this.chatClient.prompt(new Prompt(prompt)).stream().chatResponse();
    }

}
浏览器请求测试

在这里插入图片描述

相关文章:

  • K8s学习总结
  • Langchain对管道操作符|的重构实现链式流程
  • nodejs 038: Js Worker线程消息传递 Worker.postMessage() Worker.postMessage()
  • Django快速入门
  • 【论文投稿】Python 网络爬虫:探秘网页数据抓取的奇妙世界
  • 归并排序的应用—计算逆序对的个数
  • 使用 pgvector 实现 PostgreSQL 语义搜索和 RAG:完整指南
  • 长视频生成、尝试性检索、任务推理 | Big Model Weekly 第56期
  • 为AI聊天工具添加一个知识系统 之107 详细设计之48 理解和角色
  • 从零到上线:Node.js 项目的完整部署流程(包含 Docker 和 CICD)
  • Spring Boot 项目启动报错 “找不到或无法加载主类” 解决笔记
  • 【ISO 14229-1:2023 UDS诊断全量测试用例清单系列:第五节】
  • MySQL数据库三:操作数据库(二)
  • 【ISO 14229-1:2023 UDS诊断全量测试用例清单系列:第十节】
  • mac docker镜像加速正确配置方式
  • 【MySQL常见疑难杂症】常见文件及其所存储的信息
  • 尚硅谷爬虫note005
  • 基于Knative的无服务器引擎重构:实现毫秒级冷启动的云原生应用浪潮
  • 数据结构笔记之时间复杂度O(n)中的O是什么的缩写,为什么要用O这个字母?
  • 快速设置 Docker 网络代理配置
  • 新片|《我仍在此》定档5月,《新·驯龙高手》同步北美上映
  • 特朗普加征关税冲击波:美国零售、汽车、航空、科技企业纷纷预警业绩波动
  • 五一假期如何躺赚利息?来看国债逆回购操作攻略
  • 多家媒体及网红走进云南曲靖沾益:感受珠江源头
  • 万能险新规落地:保险期限不得低于五年,明确万能险销售“负面清单”
  • 珠海市香洲区原区长刘齐英落马,此前已被终止省人大代表资格