基于OpenAI GPT构建轻量级垃圾信息检测器:从原型到安全部署

news2026/5/8 18:15:23
1. 项目概述一个基于AI的轻量级垃圾信息检测器最近在做一个需要处理用户生成内容的小项目其中一个绕不开的痛点就是垃圾信息的过滤。手动写规则吧太死板稍微变个花样就失效了用传统的机器学习模型吧从数据收集、清洗、标注到训练部署链路又太长。正好看到社区里有人用OpenAI的API快速搭建原型我就想能不能也搞一个极简的、前端直连的垃圾信息检测工具用来快速验证想法或者处理小批量数据于是就有了这个项目bighatpoland/spam-detector。它的核心思路非常直接——利用OpenAI GPT模型强大的语义理解能力来判断一段文本是否是垃圾信息。整个应用就是一个纯粹的静态网页HTML/CSS/JS你只需要一个浏览器和一个OpenAI的API密钥就能跑起来。这对于想快速体验AI能力如何应用于内容审核、或者需要一个小工具来辅助人工审核的场景来说非常合适。我把它部署在了Vercel上并且用到了vercel-ai-sdk来简化API调用。整个开发过程我主要使用了Cursor IDE它对于快速迭代这种前后端逻辑混杂的小项目特别友好。下面我就把这个从零搭建、并最终部署上线的全过程包括我踩过的坑和总结的经验详细拆解一遍。2. 核心思路与技术选型解析2.1 为什么选择GPT模型而非传统方法在开始动手之前我们先聊聊为什么选GPT。传统的垃圾信息过滤无外乎几种路子基于规则Rule-based比如匹配“免费”、“赢取”、“点击链接”等关键词。优点是快零成本缺点是维护成本高误杀率高且极易被绕过。基于传统机器学习ML如使用朴素贝叶斯、SVM等算法需要大量已标注的“垃圾”和“非垃圾”文本数据来训练。效果比规则好但特征工程复杂且模型性能严重依赖标注数据的质量和数量。基于深度学习DL如RNN、LSTM、BERT等。效果通常最好但需要更强的算力、更多的数据和更专业的模型调优知识。而这个项目选择GPT特别是gpt-3.5-turbo是基于以下几个考量零样本/少样本学习能力我们不需要准备成千上万的训练数据。只需要在请求中给模型一个清晰的指令Prompt它就能基于在海量数据上学到的通用知识进行判断。这极大地降低了启动门槛。强大的语义理解GPT能理解上下文、意图和细微的差别。比如“恭喜你中奖了”在抽奖活动邮件里是正常的在陌生短信里就很可疑。传统方法很难处理这种语境依赖。开发速度极快省去了数据收集、模型训练、评估、部署的漫长周期。API调用几行代码就能出结果非常适合原型验证和轻量级应用。当然缺点也很明显依赖外部API、有使用成本、存在延迟。但对于一个旨在快速验证概念或处理非实时、小批量数据的工具来说这些缺点是可以接受的。2.2 项目架构为什么是纯前端项目结构非常简单spam-detector/ ├── index.html # 应用主界面 ├── styles.css # 样式表 ├── app.js # 核心业务逻辑 ├── config.js # 配置文件存放API密钥 └── README.md # 说明文档选择纯前端客户端实现主要基于以下原因极致简单易于理解与传播任何有一点前端基础的人都能看懂代码结构。用户下载后双击index.html就能运行没有任何环境依赖传播成本极低。快速原型验证我们的首要目标是验证“用GPT做垃圾信息检测”这个想法是否可行、效果如何。一个前端页面是最快的验证方式。学习与演示价值对于初学者而言这是一个理解如何调用AI API的绝佳示例没有后端复杂度干扰。重要警告这里隐藏着一个巨大的安全隐患也是这个项目作为“原型”而非“产品”的关键标志。我们将OpenAI API密钥直接写在了前端的config.js文件里。这意味着任何使用你网页的人只要打开浏览器开发者工具都能看到并盗用你的密钥。这会导致严重的经济损失和安全风险。因此这个项目绝对禁止用于任何公开的生产环境。在后面的章节我会详细讲解如何将其改造为安全的、带有后端的生产级应用。2.3 工具链选择Cursor IDE VercelCursor IDE这是我近期的主力代码编辑器。对于这个项目它的优势在于AI辅助编程当我在app.js中编写调用OpenAI API的代码时Cursor能基于上下文给出准确的代码补全和建议甚至能帮我生成一部分重复性的代码结构加快了开发速度。代码库感知它能理解整个项目的结构当我需要修改config.js或styles.css时能提供更精准的辅助。内置终端与Git集成方便我一边写代码一边运行本地服务器测试并提交更改。Vercel选择它来部署理由如下对静态网站的无缝支持关联Git仓库后每次git pushVercel会自动构建并部署提供全球CDN加速的链接。极简的Serverless函数支持当我们需要从“不安全的前端原型”升级到“安全的后端代理”时Vercel的Serverless Functions或Next.js API Routes是完美的下一步无需管理服务器。与vercel-ai-sdk完美集成这个SDK极大地简化了与OpenAI等AI提供商的交互提供了流式响应、统一接口等便利功能让代码更简洁。3. 核心代码实现与逐行解析接下来我们深入到代码层面看看这个检测器是如何工作的。我会以app.js和config.js为核心进行讲解。3.1 配置管理安全意识的起点 (config.js)// config.js const CONFIG { OPENAI_API_KEY: sk-your-actual-api-key-here // 替换为你的真实密钥 };这个文件只有一个作用存储配置。将API密钥单独放在一个配置文件里是一种良好的实践便于管理和区分开发/生产环境。但如前所述前端存储密钥是极不安全的。这里的config.js更像是一个“配置模板”或“开发时的临时存储”。实操心得如何管理多环境配置在实际项目中我通常会创建一个config.example.js文件里面是空密钥或假数据然后将其加入.gitignore。真正的config.js由每个开发人员在本地创建。这样既避免了密钥被意外提交到代码库也提供了清晰的配置说明。3.2 应用逻辑与AI对话的核心 (app.js)app.js是这个应用的大脑它主要做四件事获取用户输入、调用AI API、处理响应、显示结果。// app.js document.addEventListener(DOMContentLoaded, function() { const textInput document.getElementById(textInput); const detectBtn document.getElementById(detectBtn); const resultDiv document.getElementById(result); const loadingDiv document.getElementById(loading); detectBtn.addEventListener(click, async function() { const text textInput.value.trim(); if (!text) { alert(Please enter some text to analyze.); return; } // 1. 显示加载状态清空旧结果 loadingDiv.style.display block; resultDiv.textContent ; resultDiv.className result; try { // 2. 调用检测函数 const isSpam await detectSpamWithAI(text); // 3. 根据结果更新UI loadingDiv.style.display none; if (isSpam) { resultDiv.textContent This is spam; resultDiv.classList.add(spam); } else { resultDiv.textContent ✅ This is not spam; resultDiv.classList.add(not-spam); } } catch (error) { // 4. 错误处理 loadingDiv.style.display none; console.error(Detection failed:, error); resultDiv.textContent Error: ${error.message}; resultDiv.classList.add(error); } }); });UI交互逻辑很清晰点击按钮 - 校验输入 - 显示加载 - 调用AI - 处理结果/错误。关键点在于detectSpamWithAI函数它负责与OpenAI通信// app.js (续) async function detectSpamWithAI(text) { // 这是不安全的客户端直接调用方式仅用于演示 const apiKey CONFIG.OPENAI_API_KEY; const apiUrl https://api.openai.com/v1/chat/completions; // 精心设计的Prompt是指令成败的关键 const prompt You are a spam detection assistant. Analyze the following text and determine if it is spam. Spam typically includes unsolicited commercial content, phishing attempts, scams, or misleading claims designed to deceive the recipient. Respond with ONLY a single word: spam or not_spam. Text to analyze: ${text}; const response await fetch(apiUrl, { method: POST, headers: { Content-Type: application/json, Authorization: Bearer ${apiKey} }, body: JSON.stringify({ model: gpt-3.5-turbo, // 选用性价比高的模型 messages: [ { role: system, content: You are a precise spam classification system. }, { role: user, content: prompt } ], temperature: 0.1, // 温度设低让输出更确定、更一致 max_tokens: 10 // 我们只需要一个单词限制token数以节省成本 }) }); if (!response.ok) { const errorData await response.json(); throw new Error(API Error: ${errorData.error?.message || response.status}); } const data await response.json(); const aiResponse data.choices[0]?.message?.content?.trim().toLowerCase(); // 解析AI的回复 if (aiResponse spam) { return true; } else if (aiResponse not_spam) { return false; } else { // 如果AI没有按指令回复抛出错误 throw new Error(Unexpected AI response: ${aiResponse}); } }逐行解析与设计考量API端点与密钥直接调用OpenAI官方的Chat Completions端点。密钥从CONFIG对象中读取不安全根源。Prompt工程这是整个项目的灵魂。我设计的Prompt包含角色设定You are a spam detection assistant.让AI进入角色。任务定义Analyze the following text and determine if it is spam.清晰说明任务。标准解释简单定义了什么是垃圾信息商业推广、钓鱼、诈骗、误导性声明给AI一个判断依据。输出格式强制约束Respond with ONLY a single word: spam or not_spam.这是关键强制AI输出标准化结果便于程序后续处理。没有这个约束AI可能会输出一段话导致解析失败。待分析文本用引号包裹清晰分隔指令和内容。请求参数model: gpt-3.5-turbo在效果和成本间取得平衡对于文本分类任务它的能力绰绰有余。temperature: 0.1温度参数控制输出的随机性。设为接近0的值能让AI的输出更确定、更可预测对于分类任务非常合适。max_tokens: 10我们只期望一个单词限制最大token数可以防止AI“说废话”同时也能稍微降低一点成本。响应处理提取AI回复转换为小写然后严格匹配spam或not_spam。任何其他回复都被视为异常。注意事项Prompt的稳定性在实际测试中我发现即使有严格的输出格式指令GPT偶尔概率很低还是会输出一些额外说明比如“spam. This text appears to be a promotional scam.”。为了增强鲁棒性在生产代码中解析逻辑可以更灵活一些例如使用aiResponse.includes(spam)作为判断条件但要注意避免误判比如not_spam里也包含spam这个词。更好的办法是在Prompt里进行更严格的约束或使用后处理正则表达式。4. 从危险原型到安全应用添加后端代理如前所述前端存储API密钥是致命的。要将这个原型变成一个可安全分享甚至商用的工具我们必须引入后端。这里我演示如何用Node.js Express快速搭建一个安全的代理API并部署到Vercel。4.1 创建后端项目结构我们新建一个项目或者在本项目根目录下创建api/文件夹Vercel的Serverless Functions约定。spam-detector-secure/ ├── api/ │ └── detect.js # Vercel Serverless Function ├── public/ # 前端静态文件 │ ├── index.html │ ├── styles.css │ └── app.js # 修改后的前端逻辑 ├── .env # 环境变量文件本地开发 ├── .gitignore # 忽略node_modules和.env └── vercel.json # Vercel配置4.2 实现安全的Serverless Function (api/detect.js)// api/detect.js import { OpenAI } from openai; // 使用官方Node.js SDK // 从环境变量读取API密钥这是安全的关键 // Vercel上需要在项目设置中配置OPENAI_API_KEY环境变量 const openai new OpenAI({ apiKey: process.env.OPENAI_API_KEY, }); export default async function handler(request, response) { // 1. 只允许POST请求 if (request.method ! POST) { return response.status(405).json({ error: Method not allowed }); } try { // 2. 获取前端发送的文本 const { text } await request.json(); if (!text || typeof text ! string) { return response.status(400).json({ error: Invalid input: text is required }); } // 3. 可选添加速率限制逻辑防止滥用 // 这里可以检查IP或API令牌简单示例省略 // 4. 调用OpenAI API const completion await openai.chat.completions.create({ model: gpt-3.5-turbo, messages: [ { role: system, content: You are a precise spam classification system. Respond with ONLY a single word: spam or not_spam., }, { role: user, content: Is the following text spam? Answer only spam or not_spam.\n\nText: ${text}, }, ], temperature: 0.1, max_tokens: 10, }); const aiResponse completion.choices[0]?.message?.content?.trim().toLowerCase(); // 5. 解析并返回结果 let isSpam false; if (aiResponse spam) { isSpam true; } else if (aiResponse ! not_spam) { // 如果响应不符合预期记录并返回错误 console.warn(Unexpected AI response for text: ${text} - ${aiResponse}); // 可以根据业务逻辑决定是抛出错误还是按非垃圾处理 // 这里选择按非垃圾处理但记录日志 } // 6. 返回标准化JSON响应 return response.status(200).json({ isSpam: isSpam, rawResponse: aiResponse, // 可选用于调试 }); } catch (error) { // 7. 错误处理 console.error(OpenAI API error:, error); // 注意不要将详细的OpenAI错误信息直接返回给客户端可能暴露敏感信息 return response.status(500).json({ error: Failed to process your request due to an internal server error. }); } }安全升级要点密钥安全API密钥现在存储在process.env.OPENAI_API_KEY中。在本地开发时使用.env文件在Vercel上通过网页控制台或CLI设置环境变量。密钥永远不会暴露给客户端。请求方法限制只响应POST请求防止不必要的访问。输入验证检查请求体中是否有有效的text字段防止无效请求消耗API额度。速率限制建议在生产环境中务必添加速率限制例如使用express-rate-limit中间件或Vercel的类似功能防止恶意用户刷你的API导致巨额账单。错误处理捕获所有可能的异常并返回通用的错误信息避免泄露后端堆栈或OpenAI的错误详情。日志记录将意外的AI响应记录下来便于后续分析和优化Prompt。4.3 修改前端逻辑调用代理API前端的app.js需要做相应修改不再直接调用OpenAI而是调用我们自己的后端接口。// public/app.js (修改后的detectSpamWithAI函数) async function detectSpamWithAI(text) { // 指向我们自己的后端API端点 const backendApiUrl /api/detect; // 如果前后端同域可以用相对路径 const response await fetch(backendApiUrl, { method: POST, headers: { Content-Type: application/json, // 不再需要Authorization头 }, body: JSON.stringify({ text: text // 发送待检测的文本 }) }); if (!response.ok) { const errorData await response.json(); throw new Error(Server Error: ${errorData.error || response.status}); } const data await response.json(); // 直接使用后端返回的标准化结果 return data.isSpam; }看前端代码变得异常简洁和安全完全不需要关心API密钥。4.4 部署到Vercel初始化项目在项目根目录运行npm init -y然后安装依赖npm install openai。配置Vercel在项目根目录创建vercel.json指定输出目录。{ version: 2, builds: [ { src: api/*.js, use: vercel/node }, { src: public/**, use: vercel/static } ], routes: [ { src: /api/(.*), dest: /api/$1 }, { src: /(.*), dest: /public/$1 } ] }设置环境变量在Vercel项目控制台的Settings-Environment Variables中添加OPENAI_API_KEY值为你的真实密钥。本地开发时在项目根目录创建.env文件内容为OPENAI_API_KEYsk-your-key-here并使用dotenv等库加载上述Serverless Function代码在Vercel环境中会自动读取。部署通过Vercel CLI (vercel) 或关联Git仓库进行自动部署。完成以上步骤后你就拥有了一个安全、可扩展、具备生产基础的AI垃圾信息检测服务。5. 效果评估、优化与成本控制5.1 测试与效果评估部署完成后需要用各种案例测试。除了项目自带的例子我还建议测试一些“边界案例”模糊的营销邮件“Hi [Name], we haven‘t heard from you in a while. Our team has prepared a special offer just for you. Click here to learn more.” (这可能是合法的再营销也可能是垃圾邮件)包含链接的普通消息“Check out this cool article I found: [https://example.com/blog]” (正常分享 vs. 引流垃圾)短文本“Free money” (明显垃圾) vs. “Call me” (可能正常)我的实测发现gpt-3.5-turbo对于典型、明显的垃圾信息识别率很高。但对于边界案例其判断会依赖于Prompt中给出的定义并且可能存在不一致。这时就需要优化Prompt提供更详细、更具体的垃圾信息定义和例子。引入Few-shot Learning在Prompt中直接给几个例子。Example 1: Text: WIN A FREE IPHONE! CLICK NOW! Classification: spam Example 2: Text: Your invoice #INV-123 is ready for download. Classification: not_spam Now classify this new text: “[用户输入]”后处理结合一些简单的规则如包含大量大写字母、感叹号、可疑链接等来提高准确率或作为快速过滤。5.2 成本分析与控制使用OpenAI API会产生费用。gpt-3.5-turbo的成本大约是每1000个tokens $0.0005 (输入) 和 $0.0015 (输出)。我们的应用每次请求的token数很少Prompt 用户文本 几个token的输出单次成本极低远低于0.1美分。但是无限制的访问是危险的必须实施成本控制在Vercel后端设置用量限制这是最重要的。可以在Serverless Function开头检查按IP限流防止单个用户疯狂刷接口。API密钥认证如果面向多用户可以为每个用户生成一个令牌并设置每日调用次数上限。请求频率限制使用express-rate-limit等中间件。在OpenAI平台设置预算和用量警报在OpenAI的Dashboard中可以设置每月硬性预算上限和用量警报这是最后一道防线。缓存结果对于完全相同的文本可以缓存AI的判断结果一段时间例如1小时避免重复调用节省成本。5.3 性能优化考虑响应速度AI API调用通常有几百毫秒到几秒的延迟。前端需要做好加载状态提示。对于批量检测需求可以考虑异步任务队列。模型选择如果对延迟和成本极度敏感可以评估更小的专用模型如通过OpenAI Fine-tuning得到的定制小模型但开发成本会上升。前端体验在等待结果时可以显示动画或骨架屏避免用户以为页面卡死。6. 常见问题与故障排除实录在实际开发和测试中我遇到了不少问题这里总结一下6.1 API调用失败问题前端直接调用时报错401或403。排查检查API密钥首先确认config.js中的密钥是否正确、是否完整以sk-开头。检查账户余额登录OpenAI平台查看账户是否有可用额度。新注册账户通常有免费额度但可能已用完或过期。检查网络确保网络环境可以访问api.openai.com。某些网络环境下可能需要配置代理注意此处仅讨论技术可能性具体实施需符合当地法律法规。解决更新有效密钥、充值账户或检查网络配置。6.2 AI响应不符合预期问题AI返回了长文本而不是spam或not_spam导致前端解析失败。排查检查浏览器控制台F12的Network标签查看API返回的原始数据。解决强化Prompt在Prompt中更加强调输出格式例如使用“你必须只回复一个单词spam 或 not_spam。”。改进前端解析逻辑像之前提到的使用更灵活的匹配方式例如const aiResponse data.choices[0]?.message?.content?.trim().toLowerCase(); const isSpam aiResponse.includes(spam) !aiResponse.includes(not_spam); // 注意此逻辑不完美仅作示例6.3 部署到Vercel后后端API报错问题本地运行正常部署到Vercel后调用/api/detect返回500错误。排查查看Vercel Logs在Vercel项目的Functions标签下找到对应的函数日志查看详细错误信息。最常见的原因是环境变量未正确设置。检查依赖确保package.json中正确声明了openai等依赖并且部署成功。检查函数路径和格式确保api/detect.js文件使用ES Module语法import/export并且默认导出一个函数。解决根据日志修正环境变量配置、依赖或代码格式。6.4 前端跨域问题如果前后端分离部署问题如果前端例如https://myapp.vercel.app和后端APIhttps://api.myapp.com域名不同浏览器会因同源策略阻止请求。解决在后端API的响应头中添加CORS跨源资源共享支持。在api/detect.js的开头添加// 简单的CORS处理生产环境应限制Origin response.setHeader(Access-Control-Allow-Origin, *); // 或指定前端域名 response.setHeader(Access-Control-Allow-Methods, POST, OPTIONS); response.setHeader(Access-Control-Allow-Headers, Content-Type); // 处理预检请求 if (request.method OPTIONS) { return response.status(200).end(); }更安全的方式是使用corsnpm包进行配置。7. 项目扩展方向与实用建议这个基础项目可以沿多个方向扩展成为一个更强大的工具批量检测与文件上传修改前端支持上传.txt或.csv文件后端逐行或批量调用API注意OpenAI的并发和速率限制并提供结果下载。置信度评分让AI不仅判断“是/否”还输出一个置信度分数例如0-1帮助人工复核时确定优先级。这可以通过修改Prompt实现例如“Respond in JSON format: {isSpam: true/false, confidence: 0.95}”。分类细化不止于“垃圾/非垃圾”可以细分为“推广营销”、“金融诈骗”、“钓鱼链接”、“色情内容”等提供更详细的分类报告。集成到工作流将后端API封装成Webhook或服务集成到你的内容管理系统CMS、论坛或邮件服务器中实现自动化过滤。混合模型结合基于规则的快速过滤先过滤掉最明显的垃圾再将可疑内容交给AI判断可以大幅降低API调用成本。最后分享一个我个人的深刻体会AI API的强大之处在于它能让你在几小时内就搭建起一个可用原型验证想法的可行性。这个垃圾信息检测器项目就是一个完美的例子。但是从原型到产品最大的鸿沟往往不是功能而是安全、成本、可靠性和规模化。本项目从最初的“危险原型”到“安全后端代理”的改造过程恰恰是每一个AI应用开发者都必须认真对待的一课。先让想法跑起来再扎扎实实地为它构筑安全的围墙和高效的道路这才是正确的开发节奏。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2595464.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;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…