ollama离线环境部署deepseek及对话网站开发
ollama离线环境部署deepseek及局域网对话网站开发
需要在离线环境下面部署deepseek大模型,而且局域网内用户能在浏览器直接对话,主机的操作系统是win10
经不断探索,找到一条能走通的路,大致流程和思路如下:
- 局域网服务器上下载安装ollama,ollama运行下载的离线模型
- 开放局域网服务器ollama的主机地址和端口
- 编写前端对话窗口,并设置反向代理处理跨域请求
一、ollama及离线模型下载
1. 下载模型
ollama下载下来后,正常安装即可
离线模型下载,需要下载guff文件,国内可以在huggingface镜像站或者魔塔社区下载,由于主机算力非常差,我下了个DeepSeek-R1-Distill-Qwen-1.5B-Q5_K_M.gguf模型,在魔塔社区下的
下载完成后,需要写模型文件,也就是Modelfile
新建一个Modelfile文件,不需要后缀名,文件写入以下内容:
FROM ./DeepSeek-R1-Distill-Qwen-1.5B-Q5_K_M.ggufSYSTEM """你是一个由 DeepSeek 提供支持的人工智能助手。"""TEMPLATE """{{- if .System }}{{ .System }}{{ end }}
{{- range .Messages }}
{{- if eq .Role "user" }}[INST] {{ .Content }} [/INST]
{{- else if eq .Role "assistant" }}{{ .Content }}
{{- end }}
{{- end }}"""PARAMETER stop "[INST]"
PARAMETER stop "[/INST]"
PARAMETER num_ctx 4096
PARAMETER temperature 0.7
PARAMETER top_p 0.9
如果熟悉的话,可以根据自己的需求自己写
2. 创建模型
将Modelfile和下载的guff文件放到同一个目录下,然后终端执行以下命令:
ollama create deepseek-qwen1.5b -f Modelfile
如果终端不报错,就表明离线模型部署成功了
然后执行ollama run deepseek-qwen1.5b可以在终端使用模型
二、主机开放IP
ollama在运行过程中,创建了一个后端服务,其运行在localhost:11434上,本机可以正常访问,但是局域网内不能访问,需要在本机的高级系统设置中新建两个环境变量,变量名和值如下:
- 变量名:OLLAMA_HOST,值:0.0.0.0,作用是开放本机IP
- 变量名:OLLAMA_ORIGINS,值:*,作用是运行局域网内所有用户访问,这一步忘了配置,导致卡了半天。。
三、编写前端页面
这里借助[Semi Design UI](Getting Started 快速开始 | semi-design-vue),因为它提供了快速使用的对话窗口,而且我个人觉得它的UI风格比ant design还要漂亮,但是它是基于JSX写的,用起来不是特别顺手
1. 对话组件
用的是上述UI框架中的Chat组件,全部代码如下:
<template><div class="container"><Chat:key="align + mode":align="align":mode="mode":style="commonOuterStyle":chats="message":roleConfig="roleInfo"@chatsChange="onChatsChange"@messageSend="onMessageSend"@messageReset="onMessageReset"class="chat"/><Spinv-show="loadingStatus"tip="loading..."size="large"class="loading"/></div>
</template><script setup>
import { ref, defineComponent } from "vue";
import { Chat, Spin } from "@kousum/semi-ui-vue";
import { getLargeModelAPI } from "@/apis/chat";const defaultMessage = [{role: "system",id: "1",createAt: new Date(),content: "您好,我是您的智能助理,您可以问我任何问题.",},
];const roleInfo = {user: {name: "用户",avatar: "/user.png",},assistant: {name: "系统",avatar: "/model.png",},system: {name: "系统",avatar: "/model.png",},
};const commonOuterStyle = {border: "1px solid var(--semi-color-border)",borderRadius: "16px",margin: "8px 16px",height: 550,
};let id = 0;
function getId() {return `id-${id++}`;
}// const uploadProps = { action: "https://api.semi.design/upload" };
// const uploadTipProps = { content: "自定义上传按钮提示信息" };const message = ref(defaultMessage);
const mode = ref("bubble");
const align = ref("leftRight");// 加载状态
const loadingStatus = ref(false);
const question = ref("");
const onMessageSend = async (content, attachment) => {question.value = content;loadingStatus.value = true;try {const res = await getLargeModelAPI(content);loadingStatus.value = false;const newAssistantMessage = {role: "assistant",id: getId(),createAt: Date.now(),content: res.choices[0].text.replace("]", ""),};setTimeout(() => {message.value = [...message.value, newAssistantMessage];}, 200);} catch (error) {loadingStatus.value = false;}
};const onChatsChange = (chats) => {message.value = chats;
};const onMessageReset = () => {setTimeout(async () => {const lastMessage = message.value[message.value.length - 1];loadingStatus.value = true;const res = await getLargeModelAPI({ prompt: question.value });loadingStatus.value = false;const newLastMessage = {...lastMessage,status: "complete",content: res.generated_text,};message.value = [...message.value.slice(0, -1), newLastMessage];}, 200);
};
</script><style lang="scss" scoped>
.container {position: relative;width: 100vh;height: 100vh;display: flex;justify-content: center;.chat {width: 100%;height: 100%;}.loading {position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%);}
}
</style>
关键逻辑是调用getLargeModelAPI方法,也就是ollama的调用接口,获取对话信息,并将消息堆入对话数组
2. getLargeModelAPI调用ollama接口
这里不再封装axios,直接使用axios,代码如下:
import axios from "axios";
import { Toast } from '@kousum/semi-ui-vue';export const getLargeModelAPI = async (prompt) => {try {// const url = "http://localhost:11434/v1/completions"const url = "/api/v1/completions"const headers = {"Content-Type": "application/json",}const request = {prompt,model: "deepseek-qwen1.5b",max_tokens: 1000,temperature: 0.7,top_p: 1,n: 1}const response = await axios.post(url, request, headers)return response.data} catch (error) {console.error(error);Toast.error("Failed to get large model API")}
}
值得关注的是,这里调用的地址并非直接是ollama的地址(http://localhost:11434/v1/completions),而是代理的地址,因为ollama的端口是11434,与页面地址的端口不一样,所以会出现跨域问题(实际上,本机上我直接调用http://localhost:11434/v1/completions也能得到数据,但是局域网内其他用户就不行了),所以还需要配置反向代理
3. 配置反向代理
在vite的配置文件中设置代理
import { fileURLToPath, URL } from "node:url";import { defineConfig } from "vite";
import vue from "@vitejs/plugin-vue";
import vueDevTools from "vite-plugin-vue-devtools";// https://vite.dev/config/
export default defineConfig({plugins: [vue(), vueDevTools()],resolve: {alias: {"@": fileURLToPath(new URL("./src", import.meta.url)),},},server: {proxy: {"/api": {// target: "http://localhost:11434",target: "http://192.168.xxx.xxx:11434",changeOrigin: true,rewrite: (path) => path.replace(/^\/api/, ""),},},},
});
代理地址替换成本机ip即可
至此,大功告成,前端访问页面如下:

相关文章:
ollama离线环境部署deepseek及对话网站开发
ollama离线环境部署deepseek及局域网对话网站开发 需要在离线环境下面部署deepseek大模型,而且局域网内用户能在浏览器直接对话,主机的操作系统是win10 经不断探索,找到一条能走通的路,大致流程和思路如下: 局域网服…...
【Unity】 HTFramework框架(六十)Assistant助手(在Unity中接入DeepSeek等AI语言大模型)
更新日期:2025年2月14日。 Github源码:[点我获取源码] Gitee源码:[点我获取源码] 索引 Assistant助手安装Ollama使用Assistant(在编辑器中)打开Assistant配置Assistant使用Assistant处理Assistant回复的内容使用推理大…...
Spring AI集成DeepSeek,实现流式输出
前面一篇文章我们实现了《Spring AI集成DeepSeek:三步搞定Java智能应用》,大模型的响应速度是很慢的,为了提升用户体验,我们通常会使用流式输出一点点将结果输出给用户。先看下效果: 在 SpringBoot 中实现流式输出可以…...
LeetCode 1299.将每个元素替换为右侧最大元素:倒序遍历,维护最大值,原地修改
【LetMeFly】1299.将每个元素替换为右侧最大元素:倒序遍历,维护最大值,原地修改 力扣题目链接:https://leetcode.cn/problems/replace-elements-with-greatest-element-on-right-side/ 给你一个数组 arr ,请你将每个…...
搭建一个经典的LeNet5神经网络
第一章:计算机视觉中图像的基础认知 第二章:计算机视觉:卷积神经网络(CNN)基本概念(一) 第三章:计算机视觉:卷积神经网络(CNN)基本概念(二) 第四章:搭建一个经典的LeNet5神经网络 一、LeNet-5背景 LeNet-…...
我用Ai学Android Jetpack Compose之CircularProgressIndicator
答案来自 通义千问 Q: 我想学习CircularProgressIndicator,麻烦你介绍一下 当然可以!CircularProgressIndicator 是 Jetpack Compose 中的一个组件,用于显示一个循环的圆形进度条。它非常适用于需要指示加载状态或进程完成度的场景。接下来…...
DeepSeek-R1:通过强化学习激励大型语言模型的推理能力
摘要 我们介绍了第一代推理模型DeepSeek-R1-Zero和DeepSeek-R1。DeepSeek-R1-Zero是一个通过大规模强化学习(RL)训练而成的模型,无需监督微调(SFT)作为初步步骤,展示了卓越的推理能力。通过RL,DeepSeek-R1-Zero自然涌现出许多强大而有趣的推理行为。然而,它也面临诸如…...
为什么要选择3D机器视觉检测
选择3D机器视觉检测的原因主要包括以下几点: 高精度测量 复杂几何形状:能够精确测量复杂的三维几何形状。 微小细节:可捕捉微小细节,适用于高精度要求的行业。全面数据获取 深度信息:提供深度信息,弥补2D视…...
Unity 编辑器热更C# FastScriptReload
工具源码:https://github.com/handzlikchris/FastScriptReload 介绍 用于运行时修改C#后能快速重新编译C#并生效,避免每次改C#,unity全部代码重新编译,耗时旧且需要重启游戏。 使用 需要手动调整AssetPipeline自动刷新模式&…...
DeepSeek在linux下的安装部署与应用测试
结合上一篇文章,本篇文章主要讲述在Redhat linux环境下如何部署和使用DeepSeek大模型,主要包括ollama的安装配置、大模型的加载和应用测试。关于Open WebUI在docker的安装部署,Open WebUI官网也提供了完整的docker部署说明,大家可…...
VNC远程控制Mac
前言 macOS系统自带有VNC远程桌面,我们可以在控制端上安装配置VNC客户端,以此来实现远程控制macOS。但通常需要在不同网络下进行远程控制,为此,我们可以在macOS被控端上使用cpolar做内网穿透,映射VNC默认端口5…...
Next.js国际化:next-i18next
引言 next-i18next 是专门为 Next.js 项目量身定制的国际化解决方案,它基于强大的 i18next 库,能帮助开发者轻松地为 Next.js 应用添加多语言支持 next-i18next 初相识 项目简介 next-i18next 是一个专为 Next.js 应用程序打造的国际化解决方案&#…...
计算机视觉:卷积神经网络(CNN)基本概念(一)
第一章:计算机视觉中图像的基础认知 第二章:计算机视觉:卷积神经网络(CNN)基本概念(一) 第三章:计算机视觉:卷积神经网络(CNN)基本概念(二) 第四章:搭建一个经典的LeNet5神经网络 一、引言 卷积神经网络&…...
Python的那些事第二十三篇:Express(Node.js)与 Python:一场跨语言的浪漫邂逅
摘要 在当今的编程世界里,Node.js 和 Python 像是两个性格迥异的超级英雄,一个以速度和灵活性著称,另一个则以强大和优雅闻名。本文将探讨如何通过 Express 框架将 Node.js 和 Python 结合起来,打造出一个高效、有趣的 Web 应用。我们将通过一系列幽默风趣的实例和表格,展…...
核货宝外贸订货系统:批发贸易企业出海的强劲东风
在全球贸易一体化的汹涌浪潮中,批发贸易企业正积极探寻海外市场的广阔天地,试图开辟新的增长版图。然而,出海之路绝非坦途,众多难题如暗礁般潜藏在前行的航道上。从复杂繁琐的跨境交易流程、变幻莫测的国际市场需求,到…...
最新智能优化算法: 阿尔法进化(Alpha Evolution,AE)算法求解23个经典函数测试集,MATLAB代码
一、阿尔法进化算法 阿尔法进化(Alpha Evolution,AE)算法是2024年提出的一种新型进化算法,其核心在于通过自适应基向量和随机步长的设计来更新解,从而提高算法的性能。以下是AE算法的主要步骤和特点: 主…...
数据结构与算法面试专题——堆排序
完全二叉树 完全二叉树中如果每棵子树的最大值都在顶部就是大根堆 完全二叉树中如果每棵子树的最小值都在顶部就是小根堆 设计目标:完全二叉树的设计目标是高效地利用存储空间,同时便于进行层次遍历和数组存储。它的结构使得每个节点的子节点都可以通过简…...
MongoDB索引介绍
索引简述 索引是什么 索引在数据库技术体系中占据了非常重要的位置,其主要表现为一种目录式的数据结构,用来实现快速的数据查询。通常在实现上,索引是对数据库表(集合)中的某些字段进行抽取、排列之后,形成的一种非常易于遍历读取…...
【一文读懂】WebRTC协议
WebRTC(Web Real-Time Communication)协议 WebRTC(Web Real-Time Communication)是一种支持浏览器和移动应用程序之间进行 实时音频、视频和数据通信 的协议。它使得开发者能够在浏览器中实现高质量的 P2P(点对点&…...
【弹性计算】容器、裸金属
容器、裸金属 1.容器和云原生1.1 容器服务1.2 弹性容器实例1.3 函数计算 2.裸金属2.1 弹性裸金属服务器2.2 超级计算集群 1.容器和云原生 容器技术 起源于虚拟化技术,Docker 和虚拟机和谐共存,用户也找到了适合两者的应用场景,二者对比如下图…...
【个人开发】deepspeed+Llama-factory 本地数据多卡Lora微调
文章目录 1.背景2.微调方式2.1 关键环境版本信息2.2 步骤2.2.1 下载llama-factory2.2.2 准备数据集2.2.3 微调模式2.2.3.1 zero-3微调2.2.3.2 zero-2微调2.2.3.3 单卡Lora微调 2.3 踩坑经验2.3.1 问题一:ValueError: Undefined dataset xxxx in dataset_info.json.2…...
两步在 Vite 中配置 Tailwindcss
第一步:安装依赖 npm i -D tailwindcss tailwindcss/vite第二步:引入 tailwindcss 更改配置 // src/main.js import tailwindcss/index// vite.config.js import vue from vitejs/plugin-vue import tailwindcss from tailwindcss/viteexport default …...
使用 HTML CSS 和 JAVASCRIPT 的黑洞动画
使用 HTML CSS 和 JAVASCRIPT 的黑洞动画 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Black Ho…...
计算机视觉-尺度不变区域
一、尺度不变性 1.1 尺度不变性 找到一个函数,实现尺度的选择特性。 1.2 高斯偏导模版求边缘 1.3 高斯二阶导 用二阶过零点检测边缘 高斯二阶导有两个参数:方差和窗宽(给定方差可以算出窗宽) 当图像与二阶导高斯滤波核能匹配…...
SNARKs 和 UTXO链的未来
1. 引言 SNARKs 经常被视为“解决”扩容问题的灵丹妙药。虽然 SNARKs 可以提供令人难以置信的好处,但也需要承认其局限性——SNARKs 无法解决区块链目前面临的现有带宽限制。 本文旨在通过对 SNARKs 对比特币能做什么和不能做什么进行(相对)…...
DeepSeek 通过 API 对接第三方客户端 告别“服务器繁忙”
本文首发于只抄博客,欢迎点击原文链接了解更多内容。 前言 上一期分享了如何在本地部署 DeepSeek R1 模型,但通过命令行运行的本地模型,问答的交互也要使用命令行,体验并不是很好。这期分享几个第三方客户端,涵盖了桌…...
性格测评小程序07用户登录
目录 1 创建登录页2 在首页检查登录状态3 搭建登录功能最终效果总结 小程序注册功能开发好了之后,就需要考虑登录的问题。首先要考虑谁作为首页,如果把登录页作为首页,比较简单,每次访问的时候都需要登录。 如果把功能页作为首页&…...
红队视角出发的k8s敏感信息收集——日志与监控系统
针对 Kubernetes 日志与监控系统 的详细攻击视角分析,聚焦 集群审计日志 和 Prometheus/Grafana 暴露 的潜在风险及利用方法 攻击链示例 1. 攻击者通过容器逃逸进入 Pod → 2. 发现未认证的 Prometheus 服务 → 3. 查询环境变量标签获取数据库密码 → 4. 通过审…...
deepseek多列数据对比,联想到excel的高级筛选功能
目录 1 业务背景 2 deepseek提示词输入 3 联想分析 4 EXCEL高级搜索 1 业务背景 系统上线的时候经常会遇到一个问题,系统导入的数据和线下的EXCEL数据是否一致,如果不一致,如何快速找到差异值,原来脑海第一反应就是使用公…...
国产编辑器EverEdit - “切换文件类型”的使用场景
1 “切换文件类型”的使用场景 1.1 应用背景 一般的编辑器都是通过扩展名映射到对应的语法高亮规则的,比如:文件test.xml中的扩展名“xml"对应XML的语法高亮,在编辑器中打开test.xml就会给不同标识符显示不同的颜色。 但有时一些应用程…...
