Janus-Pro-7B JavaScript调用全攻略:浏览器端与Node.js端集成

news2026/4/27 9:39:07
Janus-Pro-7B JavaScript调用全攻略浏览器端与Node.js端集成最近有不少朋友在问那个能看懂图片还能聊天的Janus-Pro-7B模型能不能用JavaScript来调用毕竟现在很多应用都是跑在浏览器或者Node.js环境里的。答案是肯定的而且比你想的要简单。我花了一些时间把几种常见的调用方式都试了一遍从最基础的浏览器Fetch请求到Node.js服务器端集成再到处理图片上传这种稍微复杂点的场景都走通了。今天就把这些经验整理出来希望能帮你快速上手。无论你是想在前端页面里加个智能对话功能还是想在Node.js后端服务里集成多模态推理能力这篇文章应该都能给你一些直接的参考。1. 准备工作理解Janus-Pro-7B的API在开始写代码之前咱们先花几分钟了解一下Janus-Pro-7B对外提供服务的接口是什么样的。这就像你要去别人家做客总得先知道门牌号和进门规矩吧。Janus-Pro-7B通常通过一个HTTP API来提供服务这个API支持文本和图片两种输入。你可以把它想象成一个特别聪明的客服既能看文字消息也能看图片然后给你回复。1.1 核心接口参数这个模型最主要的接口就是一个POST请求发送到模型的推理端点。请求里需要包含几个关键信息messages: 对话历史记录是个数组里面每条消息都有role角色和content内容两个字段max_tokens: 你希望模型最多生成多少字temperature: 控制回答的随机性数值越高回答越有创意数值越低回答越稳定如果是图片对话content字段就会复杂一点它不再是一个简单的字符串而是一个数组里面可以混合文字和图片信息。1.2 图片怎么传这是很多朋友最关心的问题。图片不是直接传文件而是需要先转换成Base64编码的字符串。简单说就是把图片文件变成一大串字符这样HTTP请求才能带着它走。Base64编码有个特点它会告诉你这是什么类型的图片。比如一张JPEG图片编码后开头会是data:image/jpeg;base64,然后才是真正的编码数据。PNG图片则是data:image/png;base64,开头。了解这些基本规则后咱们就可以开始动手写代码了。2. 浏览器端调用用Fetch API与模型对话现在很多应用都是网页应用用户在浏览器里操作所以咱们先看看怎么在浏览器里调用Janus-Pro-7B。我用的是现代浏览器都支持的Fetch API这个方法既简单又强大。2.1 基础文本对话咱们从一个最简单的例子开始只发送文字消息。假设你已经在某个地方部署好了Janus-Pro-7B服务它的API地址是http://localhost:8000/v1/chat/completions。async function sendTextMessage(userInput) { try { const response await fetch(http://localhost:8000/v1/chat/completions, { method: POST, headers: { Content-Type: application/json, }, body: JSON.stringify({ model: janus-pro-7b, messages: [ { role: user, content: userInput } ], max_tokens: 500, temperature: 0.7 }) }); if (!response.ok) { throw new Error(请求失败: ${response.status}); } const data await response.json(); return data.choices[0].message.content; } catch (error) { console.error(调用模型出错:, error); return 抱歉暂时无法处理您的请求。; } } // 使用示例 const userQuestion 请用简单的语言解释什么是人工智能; sendTextMessage(userQuestion).then(reply { console.log(模型回复:, reply); // 在实际应用中这里可以更新页面显示回复内容 });这段代码做了几件事首先定义了一个异步函数里面用Fetch发送POST请求请求体里包含了模型名称、对话消息、生成长度和温度参数收到响应后解析JSON数据提取出模型的回复内容。你可能会注意到我用了async/await语法这让异步代码读起来更像同步代码更容易理解。错误处理也很重要网络请求可能会失败模型服务可能暂时不可用所以要用try-catch包起来。2.2 处理多轮对话实际对话中模型需要知道之前的聊天历史才能做出连贯的回复。这就需要我们把整个对话历史都传给模型。class ChatSession { constructor() { this.messages []; } addUserMessage(content) { this.messages.push({ role: user, content }); } addAssistantMessage(content) { this.messages.push({ role: assistant, content }); } async sendToModel(apiUrl) { try { const response await fetch(apiUrl, { method: POST, headers: { Content-Type: application/json, }, body: JSON.stringify({ model: janus-pro-7b, messages: this.messages, max_tokens: 500, temperature: 0.7 }) }); if (!response.ok) { throw new Error(请求失败: ${response.status}); } const data await response.json(); const assistantReply data.choices[0].message.content; // 把模型的回复也加入到对话历史中 this.addAssistantMessage(assistantReply); return assistantReply; } catch (error) { console.error(调用模型出错:, error); return 抱歉暂时无法处理您的请求。; } } } // 使用示例 const chat new ChatSession(); // 第一轮对话 chat.addUserMessage(你好我是小明); const reply1 await chat.sendToModel(http://localhost:8000/v1/chat/completions); console.log(第一轮回复:, reply1); // 第二轮对话模型知道之前的上下文 chat.addUserMessage(我刚才说我叫什么名字); const reply2 await chat.sendToModel(http://localhost:8000/v1/chat/completions); console.log(第二轮回复:, reply2); // 模型应该记得你叫小明我在这里用了一个简单的类来管理对话状态。每轮对话后都把用户的消息和模型的回复保存起来下次请求时一起发送。这样模型就能记住之前的对话内容实现真正的多轮对话。3. 图片上传与处理让模型看懂你的图片Janus-Pro-7B的强大之处在于它能理解图片内容。要在浏览器里实现这个功能关键是把用户选择的图片文件转换成Base64格式。3.1 图片转Base64首先我们需要一个方法把图片文件转换成Base64字符串。HTML的File API可以帮我们做到这一点。function imageFileToBase64(file) { return new Promise((resolve, reject) { const reader new FileReader(); reader.onload (event) { // event.target.result 就是Base64编码的字符串 resolve(event.target.result); }; reader.onerror (error) { reject(new Error(图片读取失败: error)); }; // 开始读取文件 reader.readAsDataURL(file); }); } // 在网页中使用 document.getElementById(imageInput).addEventListener(change, async (event) { const file event.target.files[0]; if (!file) return; // 检查文件类型 if (!file.type.startsWith(image/)) { alert(请选择图片文件); return; } try { const base64Image await imageFileToBase64(file); console.log(Base64图片数据:, base64Image.substring(0, 100) ...); // 只打印前100字符 // 这里可以继续处理比如发送给模型 } catch (error) { console.error(图片转换失败:, error); } });FileReader对象是浏览器提供的工具它能把文件读取成各种格式readAsDataURL方法会直接把文件转换成Data URL格式这其实就是Base64编码。3.2 发送图片给模型有了Base64编码的图片我们就可以把它和文字一起发送给模型了。这时候content字段就不再是简单的字符串而是一个数组。async function sendImageWithQuestion(imageBase64, question) { try { const response await fetch(http://localhost:8000/v1/chat/completions, { method: POST, headers: { Content-Type: application/json, }, body: JSON.stringify({ model: janus-pro-7b, messages: [ { role: user, content: [ { type: text, text: question }, { type: image_url, image_url: { url: imageBase64 // 直接使用Base64字符串 } } ] } ], max_tokens: 500, temperature: 0.7 }) }); if (!response.ok) { throw new Error(请求失败: ${response.status}); } const data await response.json(); return data.choices[0].message.content; } catch (error) { console.error(调用模型出错:, error); return 抱歉暂时无法处理您的请求。; } } // 使用示例假设用户上传了一张猫的图片 const catImageBase64 data:image/jpeg;base64,/9j/4AAQSkZJRgABAQ...; // 这里是完整的Base64字符串 const question 图片里是什么动物; sendImageWithQuestion(catImageBase64, question).then(reply { console.log(模型回复:, reply); // 可能会回复这是一只猫 });注意看content字段的结构它是一个数组里面可以包含多个对象。文字部分用{ type: text, text: 你的问题 }图片部分用{ type: image_url, image_url: { url: base64字符串 } }。这种格式让模型能同时处理文字和图片信息。3.3 完整的前端示例咱们把这些功能组合起来做一个简单但完整的前端示例。这个例子包含文字输入、图片上传、发送按钮和结果显示。!DOCTYPE html html head titleJanus-Pro-7B 前端调用示例/title style .container { max-width: 800px; margin: 0 auto; padding: 20px; } .input-area { margin-bottom: 20px; } textarea, input { width: 100%; padding: 10px; margin: 5px 0; } button { padding: 10px 20px; background: #007bff; color: white; border: none; cursor: pointer; } button:hover { background: #0056b3; } .result { margin-top: 20px; padding: 15px; background: #f8f9fa; border-radius: 5px; } .image-preview { max-width: 200px; margin-top: 10px; } /style /head body div classcontainer h1与Janus-Pro-7B对话/h1 div classinput-area textarea idquestionInput rows3 placeholder输入你的问题.../textarea div input typefile idimageInput acceptimage/* div idimagePreview/div /div button idsendButton发送/button /div div classresult h3模型回复/h3 div idresponseArea等待回复.../div /div /div script let currentImageBase64 null; // 图片预览功能 document.getElementById(imageInput).addEventListener(change, async (event) { const file event.target.files[0]; const preview document.getElementById(imagePreview); if (!file) { preview.innerHTML ; currentImageBase64 null; return; } if (!file.type.startsWith(image/)) { alert(请选择图片文件); return; } // 显示预览 const objectURL URL.createObjectURL(file); preview.innerHTML img src${objectURL} classimage-preview; // 转换为Base64 currentImageBase64 await new Promise((resolve) { const reader new FileReader(); reader.onload (e) resolve(e.target.result); reader.readAsDataURL(file); }); }); // 发送消息 document.getElementById(sendButton).addEventListener(click, async () { const question document.getElementById(questionInput).value.trim(); const responseArea document.getElementById(responseArea); if (!question !currentImageBase64) { alert(请输入问题或选择图片); return; } responseArea.textContent 正在思考...; try { const apiUrl http://localhost:8000/v1/chat/completions; const messages []; // 构建消息内容 const content []; if (question) { content.push({ type: text, text: question }); } if (currentImageBase64) { content.push({ type: image_url, image_url: { url: currentImageBase64 } }); } messages.push({ role: user, content }); const response await fetch(apiUrl, { method: POST, headers: { Content-Type: application/json }, body: JSON.stringify({ model: janus-pro-7b, messages, max_tokens: 500, temperature: 0.7 }) }); if (!response.ok) { throw new Error(请求失败: ${response.status}); } const data await response.json(); responseArea.textContent data.choices[0].message.content; } catch (error) { console.error(错误:, error); responseArea.textContent 请求失败请检查网络连接和模型服务。; } }); /script /body /html这个示例可以直接保存为HTML文件在浏览器中打开。它包含了完整的交互逻辑用户输入文字、选择图片、预览图片、发送请求、显示结果。你可以根据自己的需求修改样式和功能。4. Node.js服务器端集成有时候你可能需要在服务器端调用Janus-Pro-7B比如处理批量任务、构建自动化流程或者在前端不方便直接连接模型服务的情况下。Node.js环境下调用其实也很简单。4.1 使用原生HTTP模块Node.js内置了http和https模块我们可以直接用它们来发送请求。const https require(https); async function callJanusModel(messages) { return new Promise((resolve, reject) { const requestData JSON.stringify({ model: janus-pro-7b, messages: messages, max_tokens: 500, temperature: 0.7 }); const options { hostname: localhost, port: 8000, path: /v1/chat/completions, method: POST, headers: { Content-Type: application/json, Content-Length: Buffer.byteLength(requestData) } }; const req https.request(options, (res) { let responseData ; res.on(data, (chunk) { responseData chunk; }); res.on(end, () { try { const parsedData JSON.parse(responseData); resolve(parsedData.choices[0].message.content); } catch (error) { reject(new Error(响应解析失败: error.message)); } }); }); req.on(error, (error) { reject(new Error(请求失败: error.message)); }); req.write(requestData); req.end(); }); } // 使用示例 async function main() { const messages [ { role: user, content: 用JavaScript写一个简单的Hello World程序 } ]; try { const reply await callJanusModel(messages); console.log(模型回复:, reply); } catch (error) { console.error(调用失败:, error); } } main();这种方法比较底层需要自己处理很多细节比如设置请求头、拼接响应数据、错误处理等。它的优点是无需安装额外依赖适合简单的场景。4.2 使用Axios库推荐在实际项目中我更喜欢用Axios。它是一个基于Promise的HTTP客户端用起来更简洁功能也更强大。首先需要安装Axiosnpm install axios然后就可以在代码中使用了const axios require(axios); class JanusClient { constructor(baseURL http://localhost:8000) { this.client axios.create({ baseURL, timeout: 30000, // 30秒超时 headers: { Content-Type: application/json } }); } async chat(messages, options {}) { const defaultOptions { max_tokens: 500, temperature: 0.7, ...options }; try { const response await this.client.post(/v1/chat/completions, { model: janus-pro-7b, messages, ...defaultOptions }); return response.data.choices[0].message.content; } catch (error) { if (error.response) { // 服务器返回了错误状态码 console.error(请求错误:, error.response.status, error.response.data); throw new Error(模型服务错误: ${error.response.status}); } else if (error.request) { // 请求发送了但没有收到响应 console.error(网络错误:, error.message); throw new Error(网络连接失败请检查模型服务是否运行); } else { // 其他错误 console.error(其他错误:, error.message); throw error; } } } async chatWithText(text) { const messages [ { role: user, content: text } ]; return this.chat(messages); } async chatWithImage(imageBase64, question) { const messages [ { role: user, content: [ { type: text, text: question }, { type: image_url, image_url: { url: imageBase64 } } ] } ]; return this.chat(messages); } } // 使用示例 async function exampleUsage() { const client new JanusClient(); // 文本对话 const textReply await client.chatWithText(什么是异步编程); console.log(文本回复:, textReply); // 图片对话需要先读取图片为Base64 const fs require(fs).promises; const path require(path); try { // 读取图片文件 const imagePath path.join(__dirname, example.jpg); const imageBuffer await fs.readFile(imagePath); const imageBase64 data:image/jpeg;base64,${imageBuffer.toString(base64)}; const imageReply await client.chatWithImage(imageBase64, 描述这张图片); console.log(图片回复:, imageReply); } catch (error) { console.error(读取图片失败:, error); } } exampleUsage();Axios的优点是错误处理更完善支持超时设置还有拦截器、取消请求等高级功能。我在这里封装了一个简单的客户端类把常用的操作都包装成了方法用起来更方便。4.3 在Express服务器中集成如果你正在用Express构建Web应用把Janus-Pro-7B集成进去也很简单。下面是一个完整的Express服务器示例它提供了API接口前端可以通过这个接口间接调用模型。const express require(express); const axios require(axios); const multer require(multer); const path require(path); const fs require(fs).promises; const app express(); const upload multer({ dest: uploads/ }); // 临时上传目录 const port 3000; // 中间件 app.use(express.json()); app.use(express.static(public)); // 静态文件服务 // Janus-Pro-7B客户端 class JanusClient { constructor() { this.client axios.create({ baseURL: http://localhost:8000, timeout: 30000 }); } async chat(messages) { try { const response await this.client.post(/v1/chat/completions, { model: janus-pro-7b, messages, max_tokens: 500, temperature: 0.7 }); return response.data; } catch (error) { console.error(调用模型失败:, error.message); throw error; } } } const janusClient new JanusClient(); // API路由 app.post(/api/chat, async (req, res) { try { const { messages } req.body; if (!messages || !Array.isArray(messages)) { return res.status(400).json({ error: messages字段必须是数组 }); } const result await janusClient.chat(messages); res.json(result); } catch (error) { console.error(处理请求失败:, error); res.status(500).json({ error: 服务器内部错误 }); } }); app.post(/api/chat-with-image, upload.single(image), async (req, res) { try { const { question } req.body; const imageFile req.file; if (!question !imageFile) { return res.status(400).json({ error: 需要提供问题或图片 }); } // 读取图片并转换为Base64 let imageBase64 null; if (imageFile) { const imageBuffer await fs.readFile(imageFile.path); imageBase64 data:${imageFile.mimetype};base64,${imageBuffer.toString(base64)}; // 清理临时文件 await fs.unlink(imageFile.path); } // 构建消息 const content []; if (question) { content.push({ type: text, text: question }); } if (imageBase64) { content.push({ type: image_url, image_url: { url: imageBase64 } }); } const messages [{ role: user, content }]; const result await janusClient.chat(messages); res.json(result); } catch (error) { console.error(处理图片请求失败:, error); res.status(500).json({ error: 服务器内部错误 }); } finally { // 确保清理临时文件 if (req.file) { try { await fs.unlink(req.file.path); } catch (cleanupError) { console.error(清理临时文件失败:, cleanupError); } } } }); // 健康检查 app.get(/health, (req, res) { res.json({ status: ok, timestamp: new Date().toISOString() }); }); // 启动服务器 app.listen(port, () { console.log(服务器运行在 http://localhost:${port}); console.log(API接口:); console.log( POST /api/chat - 文本对话); console.log( POST /api/chat-with-image - 带图片的对话); console.log( GET /health - 健康检查); });这个Express服务器提供了三个主要接口纯文本对话、带图片的对话还有一个健康检查接口。前端应用可以通过这些接口与Janus-Pro-7B交互而不需要直接连接模型服务。5. 实际应用中的注意事项在实际项目中使用这些代码时有几个地方需要特别注意。这些经验都是我在实际项目中踩过坑后总结出来的。5.1 错误处理要全面网络请求可能失败的原因有很多模型服务没启动、网络断开、请求超时、服务器错误等等。好的错误处理能让你的应用更稳定。async function robustModelCall(apiUrl, requestData) { // 设置重试机制 const maxRetries 3; let lastError; for (let attempt 1; attempt maxRetries; attempt) { try { const controller new AbortController(); const timeoutId setTimeout(() controller.abort(), 30000); const response await fetch(apiUrl, { method: POST, headers: { Content-Type: application/json }, body: JSON.stringify(requestData), signal: controller.signal }); clearTimeout(timeoutId); if (!response.ok) { // 根据状态码决定是否重试 if (response.status 500 response.status 600) { // 服务器错误可以重试 throw new Error(服务器错误: ${response.status}); } else { // 客户端错误不需要重试 const errorData await response.json().catch(() ({})); throw new Error(请求失败: ${response.status} - ${errorData.error || 未知错误}); } } const data await response.json(); return data; } catch (error) { lastError error; console.warn(第${attempt}次尝试失败:, error.message); if (attempt maxRetries) { // 等待一段时间后重试指数退避 const delay Math.min(1000 * Math.pow(2, attempt - 1), 10000); console.log(等待${delay}ms后重试...); await new Promise(resolve setTimeout(resolve, delay)); } } } throw new Error(所有重试均失败最后错误: ${lastError.message}); }这段代码实现了带重试的请求逻辑还加了超时控制。对于服务器错误5xx状态码会自动重试对于客户端错误4xx状态码则直接失败。指数退避策略可以避免在服务器暂时不可用时频繁重试。5.2 图片大小要控制Base64编码会让图片体积增大约33%如果用户上传高清大图请求数据会非常大。这可能导致请求超时或者给服务器带来压力。function compressImageIfNeeded(base64String, maxSizeKB 500) { return new Promise((resolve) { const img new Image(); img.onload () { // 计算当前图片大小大约 const base64Length base64String.length; const sizeKB (base64Length * 3) / 4 / 1024; // Base64大小转二进制大小 if (sizeKB maxSizeKB) { resolve(base64String); // 图片足够小直接返回 return; } // 需要压缩 const canvas document.createElement(canvas); const ctx canvas.getContext(2d); // 计算压缩比例 const scale Math.sqrt(maxSizeKB / sizeKB); const newWidth Math.floor(img.width * scale); const newHeight Math.floor(img.height * scale); canvas.width newWidth; canvas.height newHeight; // 绘制压缩后的图片 ctx.drawImage(img, 0, 0, newWidth, newHeight); // 获取压缩后的Base64 const compressedBase64 canvas.toDataURL(image/jpeg, 0.8); resolve(compressedBase64); }; img.onerror () { // 如果图片加载失败返回原始字符串 console.warn(图片加载失败使用原始数据); resolve(base64String); }; img.src base64String; }); } // 在发送前压缩图片 async function sendCompressedImage(imageBase64, question) { const compressedImage await compressImageIfNeeded(imageBase64, 500); // 压缩到500KB以下 return sendImageWithQuestion(compressedImage, question); }这个压缩函数在前端执行不会增加服务器负担。它通过调整图片尺寸和质量来减小文件大小同时尽量保持可识别性。对于图片识别任务来说适当压缩通常不会影响模型效果。5.3 流式响应处理如果模型生成的内容很长或者你想实现类似打字机效果可以考虑使用流式响应。不过Janus-Pro-7B的API可能不支持流式输出这里我先给出一个通用的流式处理模式你可以根据实际API支持情况调整。async function streamModelResponse(apiUrl, messages, onChunk) { try { const response await fetch(apiUrl, { method: POST, headers: { Content-Type: application/json }, body: JSON.stringify({ model: janus-pro-7b, messages, max_tokens: 500, temperature: 0.7, stream: true // 如果API支持流式输出 }) }); if (!response.ok) { throw new Error(请求失败: ${response.status}); } const reader response.body.getReader(); const decoder new TextDecoder(); let buffer ; while (true) { const { done, value } await reader.read(); if (done) break; buffer decoder.decode(value, { stream: true }); // 处理缓冲区中的完整行 const lines buffer.split(\n); buffer lines.pop(); // 最后一行可能不完整留到下次处理 for (const line of lines) { if (line.trim() ) continue; if (line.startsWith(data: )) { const data line.slice(6); // 去掉data: 前缀 if (data [DONE]) { return; } try { const parsed JSON.parse(data); const chunk parsed.choices[0]?.delta?.content || ; if (chunk onChunk) { onChunk(chunk); } } catch (e) { console.warn(解析流数据失败:, e); } } } } } catch (error) { console.error(流式请求失败:, error); throw error; } } // 使用示例 const messages [{ role: user, content: 讲一个关于AI的故事 }]; let fullResponse ; await streamModelResponse(http://localhost:8000/v1/chat/completions, messages, (chunk) { fullResponse chunk; // 实时更新UI document.getElementById(response).textContent fullResponse; }); console.log(完整回复:, fullResponse);流式处理能让用户更快看到回复的开头部分体验更好。不过要注意不是所有模型API都支持流式输出你需要查看Janus-Pro-7B的具体文档。6. 总结走完这一趟你应该对如何在JavaScript环境里调用Janus-Pro-7B有了比较全面的了解。从前端的直接调用到后端的服务集成再到实际应用中的各种细节处理我都尽量把关键点和容易踩坑的地方讲清楚了。实际用下来我觉得最方便的还是用Axios在Node.js里封装一个客户端这样前后端都能用错误处理也统一。前端的图片上传和Base64转换其实也不复杂主要是要注意图片大小控制别让请求数据太大。如果你在用的过程中遇到什么问题或者有更好的实现方法欢迎一起交流。技术这东西本来就是越讨论越明白的。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…