【异地访问本地DeepSeek】Flask+内网穿透,轻松实现本地DeepSeek的远程访问

写在前面:本博客仅作记录学习之用,部分图片来自网络,如需引用请注明出处,同时如有侵犯您的权益,请联系删除!


文章目录

  • 前言
  • 依赖
  • Flask构建本地网页访问
    • LM Studio 开启网址访问
    • DeepSeek 调用模板
    • Flask 访问本地网址
    • HTML内容
    • 本地推理
  • 内网穿透访问
  • 总结
  • 互动
  • 致谢
  • 参考


前言

在人工智能技术日新月异的今天,DeepSeek作为一款强大的大语言模型,已经在众多领域中展现出其巨大的应用潜力。然而,对于许多用户而言,在本地服务器或者电脑部署DeepSeek,异地如何访问本地资源,成为了一个值得思考的问题。

在这里插入图片描述

本文以内网穿透技术实现公网访问,以期为相关从业者或爱好者提供有价值的参考。本地部署DeepSeek,意味着用户可以在自己的服务器上运行这一大语言模型,从而在一定程度上掌控数据的隐私性和安全性。与此同时,通过内网穿透技术,用户还能将本地部署的DeepSeek实例暴露到公网上,实现远程访问和交互。不仅提高了模型的可用性,还为跨地域、跨团队的合作提供了极大的便利。

然而,本地部署和内网穿透并非没有挑战。硬件成本、维护成本、技术门槛以及安全风险等问题,都是用户在决策过程中需要考虑的关键因素。因此,本文旨在全面分析本地部署DeepSeek并通过内网穿透实现公网访问的必要性,帮助用户权衡利弊,做出最适合自己的选择。


依赖

本地部署: 【DeepSeek本地化部署保姆级教程 】

如果需要创建新环境:conda create -n deepseek python=3.7

  • Window 11
  • Flask
  • markdown2

安装: pip install Flaskpip install markdown2

Flask构建本地网页访问

LM Studio 开启网址访问

确保加载合适的模型(GGUF),然后在开发者选项中确保开启运行,并查看对应的IP和端口,此处http://127.0.0.1:1234,这个区别于OpenAI。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

DeepSeek 调用模板

DeepSeek 调用模板:首次调用 API

# Please install OpenAI SDK first: `pip3 install openai`from openai import OpenAIclient = OpenAI(api_key="<DeepSeek API Key>", base_url="https://api.deepseek.com")response = client.chat.completions.create(model="deepseek-chat",messages=[{"role": "system", "content": "You are a helpful assistant"},{"role": "user", "content": "Hello"},],stream=False
)print(response.choices[0].message.content)

此处提供了OpenAI的调用方式,由于需要api_key显得比较麻烦或者需要付费,因此直接和LM Studio 的本地网址进行访问。

Flask 访问本地网址

通过上述模板构建本地的API,将Flask构建的网页 的输入框的内容传入到messages中,随后将其传入到LM Studio进行推理,将返回的结果进一步展示到Flask构建的对话框中即可。下面是app.py的逻辑:

from flask import Flask, request, jsonify, render_template
import markdown2
import requestsAPI_URL = "http://localhost:1234/v1/chat/completions"headers = {"Content-Type": "application/json"
}app = Flask(__name__, template_folder='templates',)
app.static_folder = 'static'
@app.route('/')
def index():return render_template("index.html")@app.route('/process', methods=['POST'])
def process():data = request.get_json()user_input = data['input']# user_input = request.form['user_input']messages = [{"role": "system", "content": "你是一个优秀的人工智能助手"},{"role": "user", "content": f"{user_input}"},]data = {"model": "DeepSeek/7B/DeepSeek-R1-Distill-Qwen-7B-Q6_K.gguf",  # 你的 DeepSeek 模型名称"messages": messages,"stream": False  # 关闭流式输出}response = requests.post(API_URL, headers=headers, json=data)if response.status_code == 200:result = response.json()else:print("请求失败:", response.status_code, response.text)# 将用户输入和脚本输出以对话形式返回conversation = [{"user": user_input},{"script": result["choices"][0]["message"]["content"]}]markdown_text = conversation[1]["script"]html_content = markdown2.markdown(markdown_text)response_message = f"DeepSeek: {html_content}"return jsonify({'message': response_message})if __name__ == '__main__':app.run(debug=False)

调试阶段可以使用app.run(debug=True),确定后改为False。

HTML内容

HTML可以使用大模型直接输出,下面是一个示范的提示词:

你的任务是使用python、Flask创建一个网页,具体要求如下:
1. 网页需包含两个文本框,一个用于获取用户输入,另一个用于显示Python脚本的返回内容。
2. 输入框需固定于网页中底部并居中,并长度仅为网页宽度50%,发送键位于输入框的右侧,发送键实现将输入框的文本发送给脚本
3. 输出框以对话的形式进行展示,同时位于位于输入框的上方并居中,并长度仅为网页宽度50%,展示用户的输入和脚本的返回内容
4. 网页需要有背景图
5. 只需要一个html和app.py

需要注意,如果无法加载图片,将其放在static文件夹中,配合app.static_folder = 'static'使用
下面是不断调整后的一个html文件的内容:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Flask DeepSeek</title><style>body {margin: 0;font-family: Arial, sans-serif;background-image: url("../static/back.jpg");background-size: cover;background-position: center;display: flex;flex-direction: column;align-items: center;justify-content: center;height: 100vh;}.container {width: 55%;/*text-align: center;*/background-color: rgba(255, 255, 255, 0.8);padding: 20px;border-radius: 10px;box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);}.chat-box {height: 400px;overflow-y: auto;border: 1px solid #ccc;padding: 10px;margin-bottom: 10px;}.input-group {display: flex;justify-content: space-between;align-items: center;width: 100%;}.input-group input {width: calc(90% - 10px);padding: 10px;border: 1px solid #ccc;border-radius: 5px;}.input-group button {width: calc(10% - 10px);padding: 10px;border: 1px solid #ccc;border-radius: 10px;background-color: #007bff;}.input-group button:hover {background-color: #0056b3;}</style>
</head>
<body><div class="container"><div class="chat-box" id="chat-box"><!-- 聊天内容将会通过JavaScript动态添加 --></div><div class="input-group"><input type="text" id="user-input" placeholder="输入你的消息..."><button onclick="sendMessage()">发送</button></div></div><script>function appendMessage(message, isUser) {const chatBox = document.getElementById('chat-box');const messageElement = document.createElement('div');messageElement.textContent = message;messageElement.style.color = isUser ? 'blue' : 'black';messageElement.style.padding = '5px';messageElement.style.borderBottom = '1px solid #ccc';chatBox.appendChild(messageElement);chatBox.scrollTop = chatBox.scrollHeight;}function sendMessage() {const userInput = '用户:' + document.getElementById('user-input').value;if (userInput.trim() !== '') {const xhr = new XMLHttpRequest();xhr.open('POST', '/process', true);xhr.setRequestHeader('Content-Type', 'application/json;charset=UTF-8');xhr.onreadystatechange = function () {if (xhr.readyState === 4 && xhr.status === 200) {const response = JSON.parse(xhr.responseText);appendMessage(userInput, true);appendMessage(response.message, false);document.getElementById('user-input').value = '';}};xhr.send(JSON.stringify({ input: userInput }));}}</script>
</body>
</html>

网页的结构如下:
在这里插入图片描述

本地推理

在输入框中输入问题后发送,获取7B模型的返回值,网址:http://127.0.0.1:5000,结果如下
在这里插入图片描述

LM Studio中的记录如下:

2025-02-28 23:04:32  [INFO] 
[LM STUDIO SERVER] Running chat completion on conversation with 2 messages.
2025-02-28 23:04:33  [INFO] 
[LM STUDIO SERVER] Accumulating tokens ... (stream = false)
2025-02-28 23:05:33  [INFO] 
[LM STUDIO SERVER] [7b] Generated prediction:  {"id": "chatcmpl-cc7tk9bfa4b9gb6mhlztg","object": "chat.completion","created": 1740755072,"model": "7b","choices": [{"index": 0,"logprobs": null,"finish_reason": "stop","message": {"role": "assistant","content": "<think>\n好,我现在要介绍重庆。首先,重庆是一个直辖市,在中国南方,连接长江和嘉陵江。地理位置优越,是长江经济带的重要城市。\n\n重庆有很多景点,比如洪崖洞、解放碑、长江索道等,这些都是游客必去的地方。还有火锅和川菜非常有名,尤其是磁器口古镇里的小吃,可以品尝到地道的重庆味道。\n\n重庆的地形多样,既有 flat 的地区,也有山和江。著名的龙舟峡和武隆喀斯特地貌吸引了不少游客。\n\n重庆是一个比较开放的城市,经济繁荣,而且语言相对通用,这对于国际交流很有帮助。\n\n交通方面,重庆有便捷的高铁、地铁和轻轨系统,方便游客出行。\n\n气候温暖湿润,四季分明,适合各种活动。\n\n最后,重庆不仅是一个旅游胜地,也是一座充满活力的城市,有很多现代化的设施和文化活动。总的来说,重庆是一个值得一游的地方。\n</think>\n\n当然!重庆是中国的一个直辖市,位于中国南方,具体位置是在重庆市,地处长江与嘉陵江之间。以下是关于重庆的一些详细介绍:\n\n### 1. **地理位置**\n   - 重庆是中国南方的交通枢纽之一,连接长江和嘉陵江。\n   - 地处长江经济带中心地带,具有重要的战略地位。\n\n### 2. **景点与文化**\n   - **洪崖洞**:以吊脚楼建筑和夜景闻名,是重庆的标志性景点。\n   - **解放碑**:重庆的商业中心之一,拥有众多店铺和商业娱乐设施。\n   - **长江索道**:横跨长江的空中交通工具,提供壮丽的景色观赏。\n   - **磁器口古镇**:以美食和传统手工艺品闻名,是品尝重庆火锅和了解当地文化的好去处。\n\n### 3. **美食**\n   - 重庆火锅是中国最著名的火锅之一,以其麻辣鲜香著称。\n   - 其他特色美食包括小面、酸辣粉、毛血旺等。\n\n### 4. **地形与气候**\n   - 重庆地形多样,既有平坦的地区,也有山脉和河流。武隆喀斯特地貌是世界自然遗产之一。\n   - 气候温暖湿润,四季分明,雨量充沛。\n\n### 5. **经济与开放**\n   - 作为直辖市,重庆在西南地区的经济发展中占有重要地位。\n   - 外贸中心之一,拥有较为自由的市场准入政策。\n\n### 6. **交通**\n   - 运输系统完善,包括高铁、地铁和轻轨,方便游客出行。\n   - 公共交通发达,覆盖范围广。\n\n### 7. **语言与文化**\n   - 汉语以外的主要少数民族有苗族、汉族、土家族等,多元文化交融显著。\n\n总的来说,重庆是一个历史悠久、风景优美且充满活力的城市。无论是自然风光、美食文化还是历史遗迹,都让人流连忘返。"}}],"usage": {"prompt_tokens": 15,"completion_tokens": 601,"total_tokens": 616},"stats": {},"system_fingerprint": "7b"
}

内网穿透访问

内网穿透工具较多,此处使用花生壳为例子。

  • 登录后,选择内网穿透
    在这里插入图片描述
  • 选择添加映射
    在这里插入图片描述
  • 填写映射信息

在这里插入图片描述

  • 查看公网网址
    在这里插入图片描述

  • 公网访问
    在这里插入图片描述

总结

总结: 为了方便本地化部署后,异地调用本地模型进行推理,可以按照以下步骤操作:

  1. 基础环境:在LM Studio官网下载并运行对应的GGUF模型,以及安装对应的python包。
  2. Flask构建网页:Flask结合LM Studio的端口和HTML构建网页,实现网页对话。
  3. 内网穿透:通过花生壳将Flask所开放的端口进行映射,实现异地访问本地的模型。

互动

  • 你觉得上述内容对你有帮助吗?`

欢迎在评论区解答上述问题,分享你的经验和疑问!

当然,也欢迎一键三连给我鼓励和支持:👍点赞 📁 关注 💬评论。


致谢

欲尽善本文,因所视短浅,怎奈所书皆是瞽言蒭议。行文至此,诚向予助与余者致以谢意。


参考

[1] DeepSeek API 文档

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/26128.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【AVL树】—— 我与C++的不解之缘(二十三)

什么是AVL树&#xff1f; AVL树发明者是G. M. Adelson-Velsky和E. M. Landis两个前苏联科学家&#xff0c;他们在1962年论文《An algorithm for the organization of information》中发表了AVL树。AVL树是最先发明的自平衡二叉搜索树&#xff0c;说白了就是能够自己控制平衡结构…

使用C#控制台调用本地部署的DeepSeek

1、背景 春节期间大火的deepseek&#xff0c;在医疗圈也是火的不要不要的。北京这边的医院也都在搞“deepseek竞赛”。友谊、北医三院等都已经上了&#xff0c;真是迅速啊&#xff01; C#也是可以进行对接&#xff0c;并且非常简单。 2、具体实现 1、使用Ollama部署DeepSeek…

Java AQS(AbstractQueuedSynchronizer):深入剖析

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…

蓝桥备赛(七)- 函数与递归(上)

一、函数是什么 数学中 &#xff0c; 我们其实就见过函数的概念 &#xff0c; 比如 : 一次函数 y kx b &#xff0c; k 和 b 都是常数 &#xff0c; 给一个任意的x 就得到一个 y 值。 其实C/C语言中就引入了函数(function&#xff09;的概念 &#xff0c; 有些翻译成&#…

【java】@Transactional导致@DS注解切换数据源失效

最近业务中出现了多商户多租户的逻辑&#xff0c;所以需要分库&#xff0c;项目框架使用了mybatisplus所以我们自然而然的选择了同是baomidou开发的dynamic.datasource来实现多数据源的切换。在使用初期程序运行都很好&#xff0c;但之后发现在调用com.baomidou.mybatisplus.ex…

DeepSeek 助力 Vue3 开发:打造丝滑的网格布局(Grid Layout)

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 Deep…

Ragflow与Dify之我见:AI应用开发领域的开源框架对比分析

本文详细介绍了两个在AI应用开发领域备受关注的开源框架&#xff1a;Ragflow和Dify。Ragflow专注于构建基于检索增强生成&#xff08;RAG&#xff09;的工作流&#xff0c;强调模块化和轻量化&#xff0c;适合处理复杂文档格式和需要高精度检索的场景。Dify则旨在降低大型语言模…

形式化数学编程在AI医疗中的探索路径分析

一、引言 1.1 研究背景与意义 在数字化时代,形式化数学编程和 AI 形式化医疗作为前沿领域,正逐渐改变着我们的生活和医疗模式。形式化数学编程是一种运用数学逻辑和严格的形式化语言来描述和验证程序的技术,它通过数学的精确性和逻辑性,确保程序的正确性和可靠性。在软件…

JVM线程分析详解

java线程状态&#xff1a; 初始(NEW)&#xff1a;新创建了一个线程对象&#xff0c;但还没有调用start()方法。运行(RUNNABLE)&#xff1a;Java线程中将就绪&#xff08;ready&#xff09;和运行中&#xff08;running&#xff09;两种状态笼统的称为“运行”。 线程对象创建…

deepseek+mermaid【自动生成流程图】

成果&#xff1a; 第一步打开deepseek官网(或百度版&#xff08;更快一点&#xff09;)&#xff1a; 百度AI搜索 - 办公学习一站解决 第二步&#xff0c;生成对应的Mermaid流程图&#xff1a; 丢给deepseek代码&#xff0c;或题目要求 生成mermaid代码 第三步将代码复制到me…

C大调中的A4=440Hz:音乐、物理与认知的交响

引言&#xff1a; 在音乐的世界里&#xff0c;每个音符都是一个独特的存在&#xff0c;它们按照特定的规则和比例相互交织&#xff0c;创造出和谐的旋律。在众多音符中&#xff0c;A4440Hz作为一个国际标准音高&#xff0c;它在C大调中扮演着“la”的角色。这一看似简单的对应关…

ASPNET Core笔试题 【面试宝典】

文章目录 一、如何在ASP.NET Core中激活Session功能&#xff1f;二、什么是中间件&#xff1f;三、ApplicationBuilder的Use和Run方法有什么区别&#xff1f;四、如何使TagHelper在元素这一层上失效&#xff1f;五、什么是ASP.NET Core&#xff1f;六、ASP.NET Core中AOP的支持…

使用DeepSeek实现自动化编程:类的自动生成

目录 简述 1. 通过注释生成C类 1.1 模糊生成 1.2 把控细节&#xff0c;让结果更精准 1.3 让DeepSeek自动生成代码 2. 验证DeepSeek自动生成的代码 2.1 安装SQLite命令行工具 2.2 验证DeepSeek代码 3. 测试代码下载 简述 在现代软件开发中&#xff0c;自动化编程工具如…

MapReduce编程模型

MapReduce编程模型 理解MapReduce编程模型独立完成一个MapReduce程序并运行成功了解MapReduce工程流程掌握并描述出shuffle全过程&#xff08;面试&#xff09;独立编写课堂及作业中的MR程序理解并解决数据倾斜 1. MapReduce编程模型 Hadoop架构图 Hadoop由HDFS分布式存储、M…

【实战 ES】实战 Elasticsearch:快速上手与深度实践-1.3.2Kibana可视化初探

&#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 文章大纲 10分钟快速部署Kibana可视化平台1. Kibana与Elasticsearch关系解析1.1 架构关系示意图1.2 核心功能矩阵 2. 系统环境预检2.1 硬件资源配置2.2 软件依赖清单 3. Docker快速部…

基于YOLO11深度学习的遥感视角农田检测与分割系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战、目标分割、人工智能

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…

Redis7——进阶篇(一)

前言&#xff1a;此篇文章系本人学习过程中记录下来的笔记&#xff0c;里面难免会有不少欠缺的地方&#xff0c;诚心期待大家多多给予指教。 基础篇&#xff1a; Redis&#xff08;一&#xff09;Redis&#xff08;二&#xff09;Redis&#xff08;三&#xff09;Redis&#x…

ST-LINK端口连接失败,启动GDB server失败的问题处理方法,有效

目录 1. 问题描述2. 解决办法2.1 后台关闭2.2 后台关闭无法找到ST进程或者关闭后未解决 1. 问题描述 报错&#xff1a; Failed to bind to port 61235, error code -1: No error Failure starting SWV server on TCP port: 61235 Failed to bind to port 61234, error code -1…

Helix——Figure 02发布的通用人形机器人控制VLA:不用微调即可做多个任务的快与慢双系统,让两个机器人协作干活(含清华HiRT详解)

前言 过去一周&#xff0c;我花了很大的心思、力气&#xff0c;把deepseek的GRPO、MLA算法的代码解析通透&#xff0c;比如GRPO与PPO的详细对比&#xff0c;再比如MLA中&#xff0c;图片 公式 代码的一一对应&#xff0c;详见此专栏《火爆全球的DeepSeek系列模型》 2.20日晚&…

性能测试测试策略制定|知名软件测评机构经验分享

随着互联网产品的普及&#xff0c;产品面对的用户量级也越来越大&#xff0c;能抗住指数级增长的瞬间访问量以及交易量是保障购物体验是否顺畅的至关重要的一环&#xff0c;而我们的性能测试恰恰也是为此而存在的。 性能测试是什么呢&#xff1f;性能测试要怎么测呢&#xff1f…