SpringAI ollama + deepseek-r1模型整合案例(含代码)

devtools/2025/2/13 23:22:56/

本节讲述os7系统中安装ollama模型、及与springAI进行前后端整合的案例。代码已提交到gitcode上,大家可以下载并自己练习。

ollama官网:https://ollama.com/download/linux

ps:其他模型:https://huggingface.co/models

一、os7 下载

第一步:安装环境脚本

这条命令会从Ollama的官方网站下载安装脚本,并直接在当前shell环境中执行该脚本,从而完成Ollama的安装过程。(下载过程会比较慢,网速不好的可以打几把王者)

curl -fsSL https://ollama.com/install.sh | sh

第二步:安装运行 Llama 3

此步会进行安装,llama3有:8B(4.7GB个参数)和70B(40GB个参数) ,默认8B,我这里用的也是8B,内存太小没办法,有兴趣也可以看下参数对比

llama3 api文档

详看官网博客(https://ollama.com/blog/llama3)

ollama run llama3

下载完后就可以畅所欲言的聊天了

二、SpringAI 集成

打开idea,新建项目。注意:因为阿里云的不支持springAI,所以切换spring 的服务器URL。

(https://start.aliyun.com 切换 https://start.spring.io)

点击创建后等待maven包下载。

1. 在application.properties中添加模型的支持

 参数可在spring官网ollama栏中找

https://docs.spring.io/spring-ai/reference/api/chat/ollama-chat.html

spring.ai.ollama.base-url=http://localhost:11434
spring.ai.ollama.chat.model=deepseek-r1:14b

端口:11434

https://github.com/ollama/ollama

2.新建controller

看官网示例:

3.运行

第一个连接请求地址看下

第二个连接的请求,会是一串json,这个是请求模型的信息。这里我们修改下

@GetMapping(value = "/ai/generateStream", produces = "text/event-stream;charset=UTF-8")public Flux<String> generateStream(@RequestParam(value = "message", defaultValue = "讲个笑话") String message) {return this.chatModel.stream(message);}

浏览器的原因,不用管,下面建个前端项目

三、建立前端项目

在当前项目新建立文件夹如:app,我这里用的是vue+js

1.输入命令,并回车

// 创建脚手架
npm create vite

2. 会出现“ ok to proceed? (y) 意思是:是否继续,输入y ,继续

3.接着会再次出现让选择,此时按上下键,选择VUE,按回车,继续选择:javascript。

4. 进入刚生产的文件夹中

5.安装必要的依赖


 

// 下载markdown配合展示
npm install marked// 用于发送请求
npm install axios // 下载markdown样式
npm install github-markdown-css// highlight.js 用于代码高亮:
npm install highlight.js

6. 创建 Vue 组件

在 src/components 目录下创建一个新的组件 deepseekR1.vue,并编写以下代码:

<template><div class="chat-container"><div class="chat-history"><div v-for="(message, index) in messages" :key="index" :class="['message', message.role]"><div class="message-content" v-html="renderMarkdown(message.content)"></div></div></div><div class="chat-input"><input v-model="userInput" @keyup.enter="sendMessage" placeholder="Type your message..." /><button @click="sendMessage">Send</button></div></div>
</template><script>
import { marked } from 'marked';
import hljs from 'highlight.js';
import 'highlight.js/styles/github.css';export default {data() {return {userInput: '',messages: [],};},methods: {sendMessage() {if (!this.userInput.trim()) return;const userMessage = {role: 'user', content: this.userInput};this.messages.push(userMessage);const aiMessage = {role: 'assistant', content: ''};this.messages.push(aiMessage);this.userInput = '';// 使用 EventSource 接收 SSE 流const eventSource = new EventSource(`http://localhost:8080/deepseek/ai/generateStream?message=${encodeURIComponent(userMessage.content)}`);eventSource.onmessage = (event) => {aiMessage.content += event.data; // 追加流式数据this.$forceUpdate(); // 强制更新视图};eventSource.onerror = () => {eventSource.close(); // 关闭连接aiMessage.content += '\n\n[Stream ended]'; // 标记流结束this.$forceUpdate();};},renderMarkdown(content) {marked.setOptions({highlight: function (code, lang) {const language = hljs.getLanguage(lang) ? lang : 'plaintext';return hljs.highlight(code, {language}).value;},});return marked(content);},},
};
</script><style>
/* 样式保持不变 */
.chat-container {max-width: 800px;margin: 0 auto;padding: 20px;font-family: Arial, sans-serif;
}.chat-history {border: 1px solid #ccc;padding: 10px;height: 500px;overflow-y: auto;margin-bottom: 10px;
}.message {margin-bottom: 10px;
}.message.user {text-align: right;
}.message.assistant {text-align: left;
}.message-content {display: inline-block;padding: 8px 12px;border-radius: 4px;background-color: #f1f1f1;
}.chat-input {display: flex;
}.chat-input input {flex: 1;padding: 8px;border: 1px solid #ccc;border-radius: 4px;
}.chat-input button {margin-left: 10px;padding: 8px 16px;background-color: #007bff;color: white;border: none;border-radius: 4px;cursor: pointer;
}.chat-input button:hover {background-color: #0056b3;
}
</style>

使用组件

在 src/App.vue 中使用刚刚创建的 deepseekR1组件:

<template><div id="app"><deepseekR1 /></div>
</template><script>
import deepseekR1 from './components/deepseekR1.vue';export default {components: {deepseekR1,},
};
</script><style>
#app {text-align: center;
}
</style>

运行项目

最后,运行项目并查看效果:

npm run dev

四、代码

代码放到了gitcode上了

https://gitcode.com/gaohuiming/spring-ai-deepseek-r1-demo


http://www.ppmy.cn/devtools/158618.html

相关文章

Django中select_related 的作用

Django中这句代码Dynamic.objects.select_related(song)是什么意思&#xff1f; 在 Django 中&#xff0c;这句代码&#xff1a; Dynamic.objects.select_related(song) 的作用是 在查询 Dynamic 模型的同时&#xff0c;预加载 song 关联的外键对象&#xff0c;从而减少数据…

Baumer集成一体式相机堡盟一体式相机相机如何通过NeoAPI SDK使用自动对焦功能和可分区光源控制功能(C#)

Baumer集成一体式相机堡盟一体式相机相机如何通过NeoAPI SDK使用自动对焦功能和可分区光源控制功能&#xff08;C#&#xff09; Baumer工业相机Baumer集成一体式相机具备自动对焦和光源控制功能的技术背景Baumer工业相机通过NeoAPI SDK使用自动对焦功能和可分区光源控制功能1.引…

深度探索未来的搜索引擎 —— DeepSeek

随着信息时代的进步&#xff0c;我们每天都在生成、分享和消费大量的数据&#xff0c;如何从海量的内容中迅速找到有价值的信息&#xff0c;成为了现代社会的重要课题。传统的搜索引擎虽然在很长时间内引领了互联网的发展&#xff0c;但随着技术的进步和用户需求的变化&#xf…

从 0 开始本地部署 DeepSeek:详细步骤 + 避坑指南 + 构建可视化(安装在D盘)

个人主页&#xff1a;chian-ocean 前言&#xff1a; 随着人工智能技术的迅速发展&#xff0c;大语言模型在各个行业中得到了广泛应用。DeepSeek 作为一个新兴的 AI 公司&#xff0c;凭借其高效的 AI 模型和开源的优势&#xff0c;吸引了越来越多的开发者和企业关注。为了更好地…

天神之眼vs华为智驾

“天神之眼”和“华为智驾”分别是比亚迪和华为在智能驾驶领域推出的技术方案&#xff0c;两者均代表了国内顶尖的自动驾驶技术水平&#xff0c;但在技术路线、功能侧重和生态布局上存在差异。以下是两者的对比分析&#xff1a; 1. 技术路线 比亚迪天神之眼&#xff1a; 基于自…

HTML 入门基础

1.排版标签 1. h1 最好写一个&#xff0c; h2~h6 能适当多写。 2. h1~h6 不能互相嵌套&#xff0c;例如&#xff1a; h1 标签中最好不要写 h2 标签了。 3. p 标签很特殊&#xff01;p标签不能写块级元素(独占一行的叫块级元素) 4. 块级元素可以写行内元素和块级元…

VSCode中出现“#include错误,请更新includePath“问题,解决方法

1、出现的问题 在编写C程序时&#xff0c;想引用头文件但是出现如下提示&#xff1a; &#xff08;1&#xff09;首先检查要引用的头文件是否存在&#xff0c;位于哪里。 &#xff08;2&#xff09;如果头文件存在&#xff0c;在编译时提醒VSCode终端中"#include错误&am…

南大通用数仓-GCDW-学习-05-外部表

目录 一、环境信息 二、概念 三、注意点 四、支持数据源和数据格式 五、实操 1、创建外部表 &#xff08;1&#xff09;语法树 &#xff08;2&#xff09;示例 2、查看外部表 &#xff08;1&#xff09;语法树 &#xff08;2&#xff09;示例 3、查看外部表详细 &a…