Qwen3-VL-8B与Node.js全栈开发:构建实时多模态聊天应用
Qwen3-VL-8B与Node.js全栈开发构建实时多模态聊天应用最近在捣鼓一些AI应用发现很多开发者对如何把大模型能力真正“搬”到自己的项目里特别是做成实时交互的应用还挺头疼的。正好Qwen3-VL-8B这个模型在图文理解上表现不错而Node.js又是做实时应用的一把好手。我就琢磨着能不能把这两者结合起来搞一个能实时对话、还能看懂图片的Web应用。这个想法其实挺实用的。想象一下你有个电商网站用户上传一张商品图应用就能实时分析并给出描述或建议或者做个智能客服用户发张截图问问题系统能立刻看懂并回答。这比传统的纯文本聊天有意思多了。今天我就带你走一遍怎么用Node.js搭个后端用WebSocket实现实时通信然后接入Qwen3-VL-8B让前端能上传图片和文字后端实时把AI的“想法”推回来。整个过程我会尽量讲得直白代码也给全就算你Node.js刚入门跟着做也能跑起来。1. 项目蓝图与环境准备在动手写代码之前咱们先看看这个应用到底要干些什么以及需要准备哪些“家伙事儿”。1.1 应用要做什么简单说我们要做一个网页。用户在这个网页里可以在输入框里打字提问。上传一张图片比如商品图、风景照、图表都行。点击发送。然后网页不用刷新就能几乎实时地、一个字一个字地看到Qwen3-VL-8B模型对“图片问题”的分析和回答。整个过程是流式的就像你在和真人聊天对方一边思考一边把话打出来而不是等半天才蹦出一大段。1.2 需要准备什么后端 (Node.js 部分):Node.js 环境这是我们的基石。你需要确保电脑上安装了Node.js。版本建议用最新的LTS版比如18.x或20.x比较稳定。一个代码编辑器VS Code、WebStorm啥的都行。几个关键的Node.js包express: 用来快速搭建Web服务器。ws或socket.io: 实现WebSocket通信让数据能实时双向流动。我这里用ws因为它更轻量。multer: 帮我们处理前端上传的图片文件。axios或node-fetch: 用来向后端的Qwen3-VL-8B API发送请求。假设你已经有一个能提供API服务的Qwen3-VL-8B后端比如通过Xinference、vLLM等工具部署好的。前端 (网页部分):就是普通的HTML、CSS和JavaScript。我们会写一个简单的页面有聊天窗口、文件上传和输入框。前端也会用WebSocket和我们的Node.js服务器“握手”收发消息。AI模型服务:你需要有一个正在运行的Qwen3-VL-8B API服务。它应该提供一个HTTP接口接收图片和文本返回流式的文本响应。本文假设这个服务的地址是http://your-ai-model-server:port/v1/chat/completions类似OpenAI API格式。好了概念清楚了接下来就从最基础的——安装Node.js开始。1.3 Node.js安装及环境配置如果你还没装Node.js跟着下面几步走几分钟就好。第一步下载安装打开Node.js官网。首页通常会推荐你下载“LTS”版本这个版本长期支持更稳定适合我们做项目。直接点击下载安装程序。下载完成后运行安装程序。基本上一直点“Next”就行安装选项保持默认。它会同时安装Node.js和npmNode.js的包管理工具。第二步验证安装安装完成后打开你的命令行工具Windows上是CMD或PowerShellMac或Linux上是Terminal。 输入以下两个命令看看版本号node -v npm -v如果分别显示了像v18.17.1和9.6.7这样的版本号恭喜你安装成功第三步创建我们的项目目录找个你喜欢的地方新建一个文件夹比如就叫qwen-vl-chat。 打开命令行进入到这个文件夹cd /path/to/your/qwen-vl-chat第四步初始化项目并安装依赖在项目文件夹里运行以下命令来创建一个package.json文件它相当于我们项目的“说明书”npm init -y接着安装我们刚才提到的那些依赖包npm install express ws multer axiosexpress: Web框架。ws: WebSocket库。multer: 处理文件上传。axios: 用来发HTTP请求给AI模型API。还会安装一个叫nodemon的开发工具它能在我们修改代码后自动重启服务器非常方便npm install --save-dev nodemon安装完成后你的package.json文件里的dependencies和devDependencies部分应该能看到这些包。环境准备好了我们可以开始搭建项目的骨架了。2. 搭建Node.js后端服务器现在我们来构建应用的心脏——后端服务器。它会处理三件事提供网页、接收图片和消息、通过WebSocket实时通信。2.1 创建基础Express服务器在项目根目录下创建一个名为server.js的文件。这是我们后端的主文件。// server.js const express require(express); const http require(http); const WebSocket require(ws); const multer require(multer); const path require(path); const axios require(axios); // 初始化Express应用和HTTP服务器 const app express(); const server http.createServer(app); // 设置WebSocket服务器把它和我们HTTP服务器关联起来 const wss new WebSocket.Server({ server }); // 配置multer来处理内存中的文件上传图片 // 这里为了简单我们把图片暂存在内存中然后直接转成base64发给AI API const upload multer({ storage: multer.memoryStorage(), // 使用内存存储 limits: { fileSize: 5 * 1024 * 1024 // 限制文件大小为5MB } }); // 设置静态文件目录让前端能访问到HTML、CSS、JS文件 // 我们稍后会把前端文件放在一个叫 public 的文件夹里 app.use(express.static(path.join(__dirname, public))); // 提供一个简单的根路由返回我们的前端页面 app.get(/, (req, res) { res.sendFile(path.join(__dirname, public, index.html)); }); // 关键部分处理图片和文本消息的API接口 // 这个接口接收前端通过FormData发送的图片和文本 app.post(/api/chat, upload.single(image), async (req, res) { // 这个接口我们主要用来接收文件真正的流式响应通过WebSocket返回 // 所以这里我们只是快速确认收到并准备通过WebSocket发送数据 res.status(202).json({ message: Request received, processing via WebSocket. }); }); // WebSocket连接处理 wss.on(connection, (ws) { console.log(新的客户端连接成功); ws.on(message, async (message) { try { // 前端通过WebSocket发来的消息是字符串我们解析它 const data JSON.parse(message); // 假设消息格式为 { type: chat, imageBase64: ..., text: ... } if (data.type chat data.text) { // 调用处理函数将请求转发给AI模型并通过这个ws连接流式返回 await handleChatRequest(ws, data.imageBase64, data.text); } } catch (error) { console.error(处理WebSocket消息出错:, error); ws.send(JSON.stringify({ type: error, content: 处理消息时发生错误 })); } }); ws.on(close, () { console.log(客户端断开连接); }); }); // 处理聊天请求的核心函数 async function handleChatRequest(ws, imageBase64, userText) { // 这里是你的Qwen3-VL-8B API的地址 const AI_API_URL http://your-ai-model-server:port/v1/chat/completions; // 如果有API密钥在这里配置 const API_KEY process.env.AI_API_KEY || ; const messages []; // 构建符合Qwen-VL API格式的消息 if (imageBase64) { // 如果有图片构建一个包含图片内容的消息 messages.push({ role: user, content: [ { type: image_url, image_url: { url: data:image/jpeg;base64,${imageBase64} } }, { type: text, text: userText } ] }); } else { // 如果只有文本 messages.push({ role: user, content: userText }); } const requestBody { model: qwen-vl, // 根据你的模型名称调整 messages: messages, stream: true // 关键要求流式响应 }; const headers { Content-Type: application/json, }; if (API_KEY) { headers[Authorization] Bearer ${API_KEY}; } try { // 使用axios向AI API发送流式请求 const response await axios({ method: post, url: AI_API_URL, data: requestBody, headers: headers, responseType: stream // 指定响应类型为流 }); // 监听AI API返回的数据流 response.data.on(data, (chunk) { // 流式响应通常是多个SSEServer-Sent Events格式的数据块 // 我们需要解析这些块提取出文本内容 const lines chunk.toString().split(\n); for (const line of lines) { if (line.startsWith(data: ) !line.includes(data: [DONE])) { try { const parsed JSON.parse(line.substring(6)); // 去掉 data: 前缀 const content parsed.choices?.[0]?.delta?.content; if (content) { // 将AI返回的每一个内容片段通过WebSocket实时推送给前端 ws.send(JSON.stringify({ type: chunk, content: content })); } } catch (e) { // 忽略非JSON或解析错误的数据行 } } } }); response.data.on(end, () { // 流式响应结束发送一个完成信号给前端 ws.send(JSON.stringify({ type: done })); }); response.data.on(error, (err) { console.error(从AI API接收流时出错:, err); ws.send(JSON.stringify({ type: error, content: AI服务响应异常 })); }); } catch (error) { console.error(调用AI API失败:, error.response?.data || error.message); ws.send(JSON.stringify({ type: error, content: 请求AI模型失败: ${error.response?.status || 未知错误} })); } } // 启动服务器 const PORT process.env.PORT || 3000; server.listen(PORT, () { console.log(服务器已启动监听 http://localhost:${PORT}); console.log(WebSocket服务运行在 ws://localhost:${PORT}); });这个server.js文件做了很多事核心逻辑是创建了Express服务器和WebSocket服务器。设置了一个静态文件服务用来托管前端页面。定义了一个WebSocket连接处理器。当前端连接后一旦收到消息包含图片base64和文本就调用handleChatRequest函数。handleChatRequest函数负责把用户的请求包装成Qwen3-VL-8B API能理解的格式然后以流式方式请求AI服务。AI服务返回的流式数据被一点点读取每读到一段文本就立刻通过同一个WebSocket连接发回给前端实现“打字机”效果。后端骨架有了我们还需要一个简单的前端来配合。3. 构建实时交互前端页面前端的目标是做一个简洁的聊天界面。我们在项目根目录下创建一个public文件夹然后把前端文件都放进去。3.1 创建HTML结构 (public/index.html)!DOCTYPE html html langzh-CN head meta charsetUTF-8 meta nameviewport contentwidthdevice-width, initial-scale1.0 titleQwen3-VL 实时图文聊天/title style * { box-sizing: border-box; margin: 0; padding: 0; font-family: Segoe UI, system-ui, sans-serif; } body { background: #f0f2f5; color: #333; line-height: 1.6; padding: 20px; max-width: 900px; margin: 0 auto; } h1 { text-align: center; margin-bottom: 30px; color: #1a73e8; } .chat-container { background: white; border-radius: 12px; box-shadow: 0 4px 12px rgba(0,0,0,0.08); overflow: hidden; display: flex; flex-direction: column; height: 80vh; } #messageArea { flex: 1; padding: 20px; overflow-y: auto; display: flex; flex-direction: column; gap: 15px; } .message { max-width: 80%; padding: 12px 18px; border-radius: 18px; word-wrap: break-word; } .user-message { align-self: flex-end; background: #1a73e8; color: white; border-bottom-right-radius: 4px; } .ai-message { align-self: flex-start; background: #f1f3f4; color: #333; border-bottom-left-radius: 4px; } .ai-thinking { font-style: italic; color: #5f6368; } .input-area { border-top: 1px solid #dadce0; padding: 20px; background: #f8f9fa; display: flex; gap: 10px; align-items: flex-end; } #imagePreview { max-width: 100px; max-height: 100px; border-radius: 8px; border: 2px dashed #ccc; display: none; } #textInput { flex: 1; padding: 12px 16px; border: 1px solid #dadce0; border-radius: 24px; font-size: 16px; resize: none; min-height: 50px; max-height: 120px; } #textInput:focus { outline: none; border-color: #1a73e8; } button { padding: 12px 24px; background: #1a73e8; color: white; border: none; border-radius: 24px; font-size: 16px; font-weight: 600; cursor: pointer; transition: background 0.2s; } button:hover { background: #0d62c9; } button:disabled { background: #ccc; cursor: not-allowed; } .file-upload-label { display: inline-flex; align-items: center; padding: 10px 20px; background: #f1f3f4; border-radius: 20px; cursor: pointer; font-size: 14px; } .status { text-align: center; padding: 10px; color: #5f6368; font-size: 14px; } /style /head body h1 Qwen3-VL 实时图文聊天/h1 p classstatus idstatus正在连接服务器.../p div classchat-container div idmessageArea !-- 聊天消息会动态插入到这里 -- div classmessage ai-message你好我可以同时理解图片和文字。请上传一张图片并输入你的问题吧。/div /div div classinput-area div styledisplay: flex; flex-direction: column; gap: 8px; label classfile-upload-label 选择图片 input typefile idimageUpload acceptimage/* styledisplay: none; /label img idimagePreview alt图片预览 /div textarea idtextInput placeholder输入你的问题...可单独发送文字或结合上方图片 rows2/textarea button idsendButton onclicksendMessage()发送/button /div /div script src/client.js/script /body /html3.2 编写前端JavaScript逻辑 (public/client.js)这是前端的“大脑”负责处理用户交互、连接WebSocket、发送和接收消息。// public/client.js let socket null; let currentAIResponseDiv null; // 用来追踪当前AI正在“输入”的消息元素 // 页面加载完成后初始化 document.addEventListener(DOMContentLoaded, function() { connectWebSocket(); setupEventListeners(); }); // 建立WebSocket连接 function connectWebSocket() { const protocol window.location.protocol https: ? wss: : ws:; const wsUrl ${protocol}//${window.location.host}; socket new WebSocket(wsUrl); socket.onopen function() { console.log(WebSocket连接成功); updateStatus(连接成功可以开始聊天了, success); }; socket.onmessage function(event) { const data JSON.parse(event.data); handleServerMessage(data); }; socket.onerror function(error) { console.error(WebSocket错误:, error); updateStatus(连接出现错误请刷新页面重试, error); }; socket.onclose function() { console.log(WebSocket连接关闭); updateStatus(连接已断开, error); // 可以尝试重连 setTimeout(connectWebSocket, 3000); }; } // 设置事件监听器 function setupEventListeners() { const imageUpload document.getElementById(imageUpload); const textInput document.getElementById(textInput); const sendButton document.getElementById(sendButton); // 图片上传预览 imageUpload.addEventListener(change, function(e) { const file e.target.files[0]; if (file) { const reader new FileReader(); reader.onload function(e) { const preview document.getElementById(imagePreview); preview.src e.target.result; preview.style.display block; }; reader.readAsDataURL(file); } }); // 按Enter发送消息CtrlEnter换行 textInput.addEventListener(keydown, function(e) { if (e.key Enter !e.shiftKey !e.ctrlKey) { e.preventDefault(); sendMessage(); } }); // 发送按钮状态 textInput.addEventListener(input, function() { sendButton.disabled !this.value.trim(); }); } // 发送消息给服务器 async function sendMessage() { const textInput document.getElementById(textInput); const imageUpload document.getElementById(imageUpload); const userText textInput.value.trim(); const file imageUpload.files[0]; if (!userText !file) { alert(请输入文字或选择一张图片); return; } if (!socket || socket.readyState ! WebSocket.OPEN) { updateStatus(连接未就绪请稍后再试, error); return; } // 1. 在聊天区域显示用户的消息 displayMessage(userText || (图片), user); // 2. 准备发送给服务器的数据 const messageData { type: chat, text: userText || 请描述这张图片 }; // 如果有图片先转换成base64 if (file) { try { const imageBase64 await fileToBase64(file); messageData.imageBase64 imageBase64.split(,)[1]; // 去掉 data:image/... 前缀 } catch (error) { console.error(图片转换失败:, error); displayMessage(图片处理失败请重试。, ai); return; } } // 3. 显示一个“AI正在思考”的占位消息 currentAIResponseDiv displayMessage(思考中..., ai); currentAIResponseDiv.classList.add(ai-thinking); // 4. 通过WebSocket发送数据 socket.send(JSON.stringify(messageData)); // 5. 清空输入框和图片预览 textInput.value ; imageUpload.value ; document.getElementById(imagePreview).style.display none; document.getElementById(sendButton).disabled true; } // 处理从服务器通过WebSocket收到的消息 function handleServerMessage(data) { switch (data.type) { case chunk: // 收到AI回复的一个片段追加到当前AI消息后面 if (currentAIResponseDiv) { currentAIResponseDiv.classList.remove(ai-thinking); // 如果初始内容是“思考中...”则替换它 if (currentAIResponseDiv.textContent 思考中...) { currentAIResponseDiv.textContent data.content; } else { currentAIResponseDiv.textContent data.content; } // 自动滚动到底部 scrollToBottom(); } break; case done: // AI回复结束重置当前追踪的消息 currentAIResponseDiv null; break; case error: // 显示错误信息 if (currentAIResponseDiv) { currentAIResponseDiv.classList.remove(ai-thinking); currentAIResponseDiv.textContent 错误: ${data.content}; currentAIResponseDiv.style.color #d93025; } else { displayMessage(系统错误: ${data.content}, ai); } currentAIResponseDiv null; break; } } // 工具函数将文件转换为Base64字符串 function fileToBase64(file) { return new Promise((resolve, reject) { const reader new FileReader(); reader.readAsDataURL(file); reader.onload () resolve(reader.result); reader.onerror error reject(error); }); } // 工具函数在聊天区域显示一条消息 function displayMessage(content, sender) { const messageArea document.getElementById(messageArea); const messageDiv document.createElement(div); messageDiv.className message ${sender}-message; messageDiv.textContent content; messageArea.appendChild(messageDiv); scrollToBottom(); return messageDiv; // 返回这个元素方便后续更新 } // 工具函数滚动到聊天区域底部 function scrollToBottom() { const messageArea document.getElementById(messageArea); messageArea.scrollTop messageArea.scrollHeight; } // 工具函数更新顶部状态提示 function updateStatus(text, type) { const statusEl document.getElementById(status); statusEl.textContent text; statusEl.style.color type error ? #d93025 : type success ? #0d8041 : #5f6368; }前端代码主要逻辑是连接我们Node.js服务器提供的WebSocket。当用户点击发送时将文本和图片转成base64打包通过WebSocket发送给后端。同时在页面上显示用户的消息和一个“思考中”的AI占位消息。监听WebSocket一旦收到后端推送来的AI回复片段type: chunk就把它实时追加到那个“思考中”的消息后面形成打字效果。收到结束信号type: done或错误信号type: error时做相应处理。4. 运行与测试你的应用所有代码都准备好了让我们把它跑起来看看效果。4.1 启动后端服务器首先确保你在项目的根目录下有server.js和package.json的那个目录。 打开命令行运行npx nodemon server.js如果你没有全局安装nodemonnpx会帮你运行它。你应该能看到类似下面的输出[nodemon] starting node server.js 服务器已启动监听 http://localhost:3000 WebSocket服务运行在 ws://localhost:3000这说明你的Node.js后端服务器已经成功运行在3000端口了。4.2 访问前端页面打开你的浏览器访问http://localhost:3000。 你应该能看到我们刚刚写的聊天界面顶部状态提示应该会变成“连接成功可以开始聊天了”。4.3 进行测试现在可以开始玩了纯文本测试在下方输入框输入“你好介绍一下你自己”然后点击发送。你应该能立刻在聊天窗口看到你自己的消息然后很快取决于你的AI服务速度看到AI的流式回复一个字一个字地出现。图文混合测试点击“选择图片”上传一张图片比如一张猫的照片。在输入框输入“描述一下这张图片里有什么”。点击发送。观察聊天窗口你的图片和文字会作为一条消息发出然后等待AI的流式分析结果。如果一切顺利你就成功搭建了一个基于Qwen3-VL-8B和Node.js的实时多模态聊天应用4.4 可能遇到的问题与排查连接失败检查server.js中AI_API_URL是否填写正确并且你的AI模型服务确实在运行且可访问。图片上传失败检查multer的文件大小限制或者看看浏览器控制台有没有CORS错误我们这里因为前后端同源一般不会有。没有流式效果确保调用AI API时请求体里设置了stream: true并且AI服务本身支持流式返回。同时检查server.js中处理流数据的逻辑是否正确。前端样式错乱检查public文件夹路径是否正确以及CSS是否被正确加载。5. 总结与后续优化方向走完这一趟你应该已经掌握了用Node.js和WebSocket构建实时AI应用的基本流程。我们不仅把前端、后端、WebSocket、AI API串了起来还实现了核心的流式响应用户体验一下子就上去了。实际用下来这套方案作为原型或者中小型应用的核心是足够了的。当然真实的生产环境还需要考虑更多性能与扩展现在图片是转成base64在内存和网络间传递图片大了会影响性能。可以考虑先上传到对象存储如S3、OSS只把URL发给AI API和前端。身份认证与安全给WebSocket连接和API接口加上认证如JWT防止被滥用。错误处理与重试网络不稳定或AI服务暂时不可用时需要有更健全的重试和降级机制。历史记录与持久化把聊天记录存到数据库里方便用户下次查看。前端体验优化可以加入消息发送状态发送中、已送达、图片缩略图点击放大、支持更多文件类型等。这个项目就像一个乐高底座你已经搭好了主结构。接下来可以根据你的具体业务需求往上添加各种功能模块。比如把它集成到你的电商网站里做智能导购或者做成一个内部的内容审核辅助工具可能性非常多。希望这篇教程能帮你打开思路。动手做一遍遇到问题解决问题才是学习最快的方式。如果你在扩展功能时有了新的发现或有趣的实现也欢迎分享出来。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。

相关新闻

突破硬件限制:OpenCore Legacy Patcher让旧设备焕发新生的完整方案

突破硬件限制:OpenCore Legacy Patcher让旧设备焕发新生的完整方案

突破硬件限制:OpenCore Legacy Patcher让旧设备焕发新生的完整方案 【免费下载链接】OpenCore-Legacy-Patcher 体验与之前一样的macOS 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher OpenCore Legacy Patcher作为一款革新性的开…

2026/7/3 9:00:54 阅读更多 →
突破网盘限速壁垒:Online-disk-direct-link-download-assistant重构下载体验

突破网盘限速壁垒:Online-disk-direct-link-download-assistant重构下载体验

突破网盘限速壁垒:Online-disk-direct-link-download-assistant重构下载体验 【免费下载链接】Online-disk-direct-link-download-assistant 可以获取网盘文件真实下载地址。基于【网盘直链下载助手】修改(改自6.1.4版本) ,自用&a…

2026/5/17 10:51:41 阅读更多 →
Ostrakon-VL-8B多模态推理加速:TensorRT-LLM编译vLLM后吞吐提升2.8倍

Ostrakon-VL-8B多模态推理加速:TensorRT-LLM编译vLLM后吞吐提升2.8倍

Ostrakon-VL-8B多模态推理加速:TensorRT-LLM编译vLLM后吞吐提升2.8倍 你有没有遇到过这样的场景?部署了一个功能强大的多模态大模型,比如能看懂店铺图片、识别商品、分析合规性的那种,但每次问它问题,都要等上好几秒才…

2026/7/3 22:38:34 阅读更多 →

最新新闻

5分钟掌握CSS变体管理神器:CVA终极指南

5分钟掌握CSS变体管理神器:CVA终极指南

5分钟掌握CSS变体管理神器:CVA终极指南 【免费下载链接】cva Class Variance Authority 项目地址: https://gitcode.com/gh_mirrors/cv/cva 你是否曾为UI组件的CSS类名管理而头疼?😫 面对不同尺寸、颜色、状态的按钮变体,手…

2026/7/4 8:05:14 阅读更多 →
wiliwili:专为手柄用户打造的跨平台B站客户端完全指南

wiliwili:专为手柄用户打造的跨平台B站客户端完全指南

wiliwili:专为手柄用户打造的跨平台B站客户端完全指南 【免费下载链接】wiliwili 第三方B站客户端,目前可以运行在PC全平台、PSVita、PS4 、Xbox 和 Nintendo Switch上 项目地址: https://gitcode.com/GitHub_Trending/wi/wiliwili 你是否厌倦了在…

2026/7/4 8:05:14 阅读更多 →
豆包与元宝深度对比:AI工具背后的生态能力拆解

豆包与元宝深度对比:AI工具背后的生态能力拆解

1. 这不是“选APP”,而是一场生态级能力的现场拆解你刷到这条内容时,大概率正躺在沙发上,左手握着手机,右手刚点开豆包准备扒拉一段抖音口播文案;或者刚在视频号看完一篇深度长文,顺手把链接甩进元宝&#…

2026/7/4 8:05:14 阅读更多 →
Optimus钩子(Hooks)机制详解:实现数据转换后处理的完整教程

Optimus钩子(Hooks)机制详解:实现数据转换后处理的完整教程

Optimus钩子(Hooks)机制详解:实现数据转换后处理的完整教程 【免费下载链接】optimus Optimus is an easy-to-use, reliable, and performant workflow orchestrator for data transformation, data modeling, pipelines, and data quality m…

2026/7/4 8:01:13 阅读更多 →
CANN/ge LLM集群连接API

CANN/ge LLM集群连接API

# link_clusters 【免费下载链接】ge GE(Graph Engine)是面向昇腾的图编译器和执行器,提供了计算图优化、多流并行、内存复用和模型下沉等技术手段,加速模型执行效率,减少模型内存占用。 GE 提供对 PyTorc…

2026/7/4 8:01:13 阅读更多 →
计算机毕业设计之springboot营养配餐管理系统

计算机毕业设计之springboot营养配餐管理系统

随着当今网络的发展,时代的进步,各行各业也在发生着变化,于是网络已经逐步进入人们的生活,给我们生活或者工作提供了新的方向新的可能。 本毕业设计的内容是设计实现一个基于springboot框架的营养配餐管理系统。它是以java语言&am…

2026/7/4 7:59:12 阅读更多 →

日新闻

Memcached 1.6.43 发布:关键安全修复版本,多项问题得到解决

Memcached 1.6.43 发布:关键安全修复版本,多项问题得到解决

Memcached 1.6.43 正式发布,这是一个关键的安全修复版本,修复了多个方面的问题,还对部分功能进行了优化。 安全修复亮点 此次发布在安全修复上表现突出。binprot 避免了项目引用计数溢出,mcmc 因安全问题提升了上游版本号&#xf…

2026/7/4 0:04:29 阅读更多 →
终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案

终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案

终极指南:使用HMCL启动器跨平台畅玩Minecraft的完整解决方案 【免费下载链接】HMCL A Minecraft Launcher which is multi-functional, cross-platform and popular 项目地址: https://gitcode.com/gh_mirrors/hm/HMCL HMCL(Hello Minecraft! Lau…

2026/7/4 0:06:29 阅读更多 →
KMX63与PIC18F66K40在嵌入式HMI中的硬件协同与低功耗设计

KMX63与PIC18F66K40在嵌入式HMI中的硬件协同与低功耗设计

1. KMX63与PIC18F66K40的硬件协同架构解析KMX63作为一款三轴加速度计和磁力计组合传感器,与PIC18F66K40微控制器的搭配堪称嵌入式HMI开发的黄金组合。这套硬件组合的核心优势在于KMX63提供的高精度运动感知能力与PIC18F66K40强大的信号处理能力形成了完美互补。KMX6…

2026/7/4 0:06:29 阅读更多 →

周新闻

月新闻