基于React与Node.js的Gemini API现代化Web UI开发实践

news2026/5/3 10:22:27
1. 项目概述一个为Gemini API量身定制的现代化UI界面如果你最近在折腾AI应用开发尤其是想给Google的Gemini大模型套个壳做个自己的聊天机器人或者工具集那你很可能已经搜遍了GitHub。在众多项目中MarkShawn2020/gemiui这个名字可能会引起你的注意。这不仅仅是一个简单的API调用示例而是一个功能相对完整、设计现代的Web UI专门为Gemini API设计。它让你能像使用ChatGPT网页版那样通过一个漂亮的界面与Gemini Pro、Gemini Pro Vision等模型对话支持多轮聊天、图片上传、流式响应等核心功能。简单来说gemiui就是一个开箱即用的“前端壳子”。你只需要有一个Google AI Studio的API密钥把它部署起来就能立刻拥有一个私人的、可定制的Gemini对话平台。这对于想快速体验Gemini能力、进行原型验证、或者需要一个轻量级内部工具的开发者和爱好者来说非常有吸引力。它省去了从零搭建前端界面、处理复杂交互逻辑的麻烦让你能专注于Prompt工程、功能扩展或者业务集成。我自己在尝试将Gemini集成到一些自动化工作流中时就遇到了需要频繁调试Prompt和查看模型返回格式的问题。直接在代码里改来改去效率很低而官方的AI Studio虽然好用但更偏向于单次交互的Playground。gemiui恰好填补了这个空白——它提供了一个持续的、可保存的聊天环境并且部署在自己掌控的环境中数据隐私也更有保障。接下来我会带你深入拆解这个项目从技术选型到每一处细节实现分享如何把它跑起来并改造成更适合你自己的工具。2. 项目架构与技术栈深度解析2.1 前端技术选型React Vite Tailwind CSS的黄金组合gemiui的前端部分采用了目前前端生态中非常主流且高效的组合。使用React作为UI库是顺理成章的选择其组件化思想非常适合构建这种交互复杂的单页面应用。每一个聊天消息、侧边栏的会话列表、底部的输入框都可以被抽象成独立的、可复用的组件这使得代码结构清晰维护和扩展都很方便。项目构建工具选择了Vite而非传统的Create React App。这是一个关键且明智的决策。Vite在开发环境基于原生ES模块提供极速的热更新体验非常流畅在生产构建时它使用Rollup进行打包能生成优化过的静态资源。对于gemiui这类工具型应用快速的启动和构建体验能显著提升开发效率。你修改一个组件几乎在保存的瞬间就能在浏览器里看到变化这种即时反馈对前端开发至关重要。UI样式方面gemiui采用了Tailwind CSS这个实用优先的CSS框架。这也是当前很多现代项目的首选。它允许你通过直接在HTML/JSX中书写类名来应用样式避免了在CSS文件和组件文件之间来回切换也减少了自定义CSS的编写量。查看gemiui的组件代码你会看到大量像className“flex items-center justify-between p-4 border-b”这样的组合非常直观地描述了元素的布局、对齐和间距。这种写法虽然初看有些冗长但一旦熟悉开发速度极快且能保持样式的一致性。项目还使用了shadcn/ui这是一个基于Tailwind CSS构建的高质量组件库它提供了一些预制的、可访问性良好的组件如按钮、对话框、下拉菜单但又不是一个全量的npm包而是让你将需要的组件代码直接复制到项目中。这种方式既保证了UI的美观和交互质量又避免了引入过重的依赖保持了项目的轻量。2.2 后端与通信轻量级Node.js服务与SSE流式传输gemiui的后端相对轻量它本质上是一个Node.js服务器使用Express框架搭建。它的核心职责是作为前端和Google Gemini API之间的代理和安全层。为什么需要这个代理层主要原因有两个隐藏API密钥前端代码运行在用户的浏览器中如果直接包含API密钥是极度不安全的密钥会暴露给任何查看页面源代码的人。因此需要后端服务器来保管密钥前端将所有请求发送到自己的后端再由后端附加密钥后转发给Google的服务器。处理跨域问题在开发或特定部署场景下前端和后端可能位于不同的域名或端口直接从前端调用Gemini API会遇到跨域资源共享限制。通过自己的后端进行转发可以统一管理跨域策略。项目中一个值得称道的技术点是使用了Server-Sent Events来实现流式响应。当你向Gemini提出一个复杂问题时如果等到模型完全生成答案再一次性返回用户需要等待很长时间体验很差。SSE允许服务器将生成的内容分成多个小块持续地“推送”到前端。在gemiui中你输入问题点击发送后答案会一个字一个字地实时显示出来这就是SSE在起作用。后端从Gemini API接收到一个流然后将其拆分成一个个的data: {...}事件源源不断地发送给前端前端的EventSource监听器接收到这些事件后实时更新UI。这种技术比传统的轮询或长轮询更高效也比WebSocket更简单因为它是单向的服务器到客户端。2.3 状态管理与数据流Zustand的简洁哲学对于这样一个中等复杂度的应用状态管理是关键。gemiui选择了Zustand这个轻量级状态管理库而不是更庞大的Redux。这又是一个非常贴合项目需求的决策。Zustand的API极其简洁。你定义一个store里面包含状态和更新状态的方法。然后在任何组件中都可以通过hook直接获取需要的状态片段或方法。在gemiui中核心的状态包括当前会话列表、当前活跃的会话、会话中的所有消息、模型设置如温度、topP等、API密钥配置等。这些状态被集中管理在Zustand的store中。例如当用户发送一条新消息时流程是这样的前端组件调用sendMessage函数。这个函数来自Zustand store它内部会先更新本地状态在UI上立即显示用户的输入乐观更新。然后它通过fetch向后端发送请求。后端调用Gemini API并通过SSE流式返回响应。前端监听这个流每收到一个数据块就调用store中的updateMessage函数更新当前会话的最后一条消息即AI的回复的内容。整个UI随着store状态的更新而自动重新渲染。这套数据流清晰、响应迅速Zustand的轻量特性使得整个状态管理逻辑非常直观没有过多的模板代码让开发者能更专注于业务逻辑本身。3. 核心功能模块拆解与实现细节3.1 多会话聊天管理侧边栏与本地存储gemiui的核心交互模式围绕“会话”展开。左侧的侧边栏负责管理所有的聊天会话。你可以创建新会话、重命名现有会话、删除会话以及在不同会话之间切换。这个设计的用户体验对标了主流的聊天应用。其技术实现依赖于浏览器的localStorage。每次会话发生变更新增、删除、更新消息整个会话列表的状态都会被序列化为JSON字符串保存到localStorage中。这样即使你关闭浏览器标签页甚至重启电脑下次再打开gemiui所有的聊天记录都会完好无损地呈现。Zustand store在初始化时会尝试从localStorage中读取保存的数据来恢复状态。这里有一个实操心得直接存储原始消息对象可能在某些场景下会有问题。gemiui在存储前会对会话数据进行一次“脱水”处理只保存必要的信息如角色、内容、时间戳而忽略一些运行时才需要的临时状态或函数引用。这保证了序列化和反序列化的可靠性。同时为了避免localStorage存储空间限制通常5MB和性能问题项目可以考虑在会话数量非常多时加入警告或自动归档旧会话的逻辑。3.2 消息系统与流式渲染实现“打字机”效果消息系统是UI的核心。每条消息都是一个独立的组件区分用户消息和AI消息通常通过头像、背景色或布局位置来区分。用户消息是静态的发送后立即显示。AI消息则是动态的它最初可能是一个空容器或加载指示器随着SSE事件的到来其内容被逐步填充。实现流式渲染的关键在于前端如何处理SSE数据块。后端发送的每个数据块通常是一个JSON对象其中包含生成文本的一部分。前端需要将这些片段累积起来。gemiui的做法是在Zustand store中为当前AI回复的消息维护一个content字符串。每收到一个数据块就执行setMessageContent(currentContent newChunk)。React组件订阅了这个content状态因此每次追加都会触发重新渲染从而在屏幕上实现逐字打印的效果。注意处理流式响应时网络不稳定或中断是需要考虑的情况。一个健壮的实现应该包含错误处理和重连机制。gemiui的基础版本可能只处理了理想情况在实际部署中你可能需要增加UI提示如“连接中断正在重试…”并为EventSource设置onerror回调尝试重新建立连接。3.3 多模态输入支持图片上传与处理Gemini Pro Vision模型的核心能力之一是理解图像内容。gemiui通过一个图片上传按钮支持了多模态输入。用户可以从本地上传图片图片会以缩略图的形式显示在输入框上方然后随文本一起发送给后端。技术层面前端使用元素或文件拖放库来获取图片文件。获取到File对象后需要将其转换为Gemini API能接受的格式。Gemini API期望的图片数据是Base64编码的字符串并且需要携带MIME类型前缀如data:image/png;base64,。因此前端需要调用FileReader.readAsDataURL()方法来完成这个转换。转换后的Base64字符串会作为消息内容的一部分与文本一起构成一个多部分的消息体发送给后端。一个重要细节Base64编码会使图片数据体积增大约33%。如果上传高分辨率图片可能会导致请求体过大影响传输速度甚至触发服务器限制。因此一个更优的做法是在前端对图片进行预处理压缩和缩放。例如你可以使用canvas元素将图片的宽度限制在1024像素以内并适当降低JPEG质量。这能显著减少传输的数据量而Gemini模型对输入图像的分辨率本身也有优化过高的分辨率并不一定能带来更好的理解效果反而浪费了token影响成本。3.4 模型参数配置温度、Top-P与系统指令对于进阶用户直接调整模型参数是获得理想输出的关键。gemiui在界面中提供了模型配置面板通常可以通过一个设置图标打开。里面包含了几个核心参数模型选择在Gemini Pro和Gemini Pro Vision等可用模型间切换。温度控制输出的随机性。值越高如0.9输出越多样、有创意值越低如0.1输出越确定、保守。对于需要事实准确性的问答建议用低温0.1-0.3对于创意写作可以用高温0.7-0.9。Top-P核采样参数。与温度类似也控制随机性但方式不同。它设定一个概率累积阈值只从概率累积和达到此阈值的最小词集合中采样。通常温度或Top-P二选一调整即可不建议两者同时剧烈调整。系统指令这是一个非常重要的功能。它允许你为AI设定一个持久的角色或上下文。例如你可以设置“你是一位专业的代码助手回答请简洁优先提供代码示例。” 这个指令会在每次对话中作为背景信息发送给模型从而影响其所有回复的风格和内容。gemiui将这个指令保存在本地并应用于每个新会话直到你修改它。这些配置项同样通过Zustand store管理并保存在localStorage中。当发送消息时前端会将这些配置参数一并发送给后端后端再将其填入调用Gemini API的请求体中。4. 从零开始部署与深度定制指南4.1 环境准备与依赖安装要运行gemiui你需要准备以下环境Node.js环境确保你的系统安装了Node.js版本16或以上建议使用最新的LTS版本。你可以通过终端运行node -v和npm -v来检查。Git用于克隆项目代码。Google AI Studio API密钥访问Google AI Studio创建一个项目并生成一个API密钥。这个密钥是调用Gemini服务的通行证。接下来是获取代码git clone https://github.com/MarkShawn2020/gemiui.git cd gemiui项目根目录下会有两个主要文件夹client前端和server后端。你需要分别安装它们的依赖。常见的结构是前后端在一个仓库里但需要分别启动。# 安装后端依赖 cd server npm install # 安装前端依赖 cd ../client npm install4.2 配置详解与安全实践配置是让项目运行起来的关键主要涉及API密钥和环境变量。后端配置在server目录下你需要创建一个.env文件。项目通常会在server/.env.example中提供一个模板。PORT3001 # 后端服务运行的端口 CLIENT_URLhttp://localhost:5173 # 前端开发服务器的地址用于配置CORS GEMINI_API_KEYyour_actual_gemini_api_key_here # 你的Gemini API密钥将your_actual_gemini_api_key_here替换成你从Google AI Studio获取的真实密钥。CLIENT_URL是为了允许前端在开发时能跨域访问后端。在生产部署时这个值应该改为你前端实际部署的域名。前端配置前端需要知道后端服务器的地址。这个配置通常在client/.env.development或client/vite.config.ts中通过代理设置。在gemiui中很可能是在Vite配置里设置了代理将/api开头的请求转发到后端http://localhost:3001。这样前端代码中只需用相对路径/api/chat发送请求Vite开发服务器会自动处理转发。安全警告.env文件包含敏感信息绝对不能提交到Git仓库。请确保.env在.gitignore文件中。在部署到生产环境时如VPS、云服务器应通过服务器的环境变量管理功能来设置这些值而不是使用文件。4.3 开发与生产环境启动开发模式在开发时你需要同时启动前端和后端服务。在一个终端窗口启动后端cd server npm run dev这通常会启动一个监听在3001端口的Node.js服务器并支持代码热重载。在另一个终端窗口启动前端cd client npm run devVite会启动开发服务器通常运行在5173端口并自动打开浏览器。此时你访问http://localhost:5173就能看到gemiui的界面了。前端的所有API请求都会被代理到localhost:3001。生产构建与部署当你准备将应用部署到线上时需要构建前端静态文件并以后端服务为核心启动。构建前端cd client npm run build这个命令会在client/dist目录下生成优化过的HTML、CSS和JavaScript文件。集成静态文件为了让后端能服务于前端页面通常需要将构建好的前端文件复制到后端的某个目录如server/public并配置Express静态文件中间件。gemiui的项目结构可能已经做好了这种准备。你需要检查server的代码看它是否从某个固定目录如../client/dist提供静态文件。启动生产服务器进入server目录以生产模式启动。cd server npm start现在你的完整应用就运行在配置的PORT如3001上了。访问http://你的服务器IP:3001即可使用。对于更正式的生产部署建议使用PM2这样的进程管理工具来守护Node.js进程确保应用崩溃后能自动重启。同时使用Nginx或Apache作为反向代理处理SSL/TLS加密HTTPS、域名绑定、负载均衡等并将请求转发给Node.js后端。这是将个人项目提升为可稳定对外服务的关键一步。4.4 个性化定制与功能扩展gemiui作为一个开源项目最大的优势就是你可以随意修改和扩展它。以下是一些常见的定制方向修改UI主题项目使用Tailwind CSS修改主题色非常方便。在tailwind.config.js文件中你可以扩展主题颜色。例如将默认的蓝色主题改为紫色// tailwind.config.js module.exports { theme: { extend: { colors: { primary: #8b5cf6, // 紫色 } } } }然后在组件中将使用到bg-blue-500,text-blue-600等类名替换为bg-primary,text-primary。增加对话功能导出聊天记录可以增加一个按钮将当前会话的消息导出为Markdown、PDF或纯文本文件。前端可以使用jsPDF库生成PDF或用Blob对象创建可下载的文本文件。会话搜索当会话很多时在侧边栏增加一个搜索框根据会话标题或内容进行过滤。这需要遍历所有会话的每条消息对性能有一定要求可以考虑使用Web Worker或在后端实现搜索接口。消息编辑与重发允许用户编辑自己已发送的消息然后重新发送。这需要修改消息组件的UI增加编辑状态并在store中提供更新消息内容和重新触发API请求的函数。集成更多模型或后端gemiui的架构是前后端分离的后端目前只对接了Gemini API。你可以修改后端的路由让它同时支持其他AI模型的API比如OpenAI的GPT系列、Anthropic的Claude甚至是本地部署的Ollama。前端可以增加一个模型选择器后端根据前端的选择将请求转发到不同的API提供商。这需要你设计一个统一的请求/响应格式以兼容不同模型的参数差异。5. 常见问题排查与性能优化实战5.1 部署与运行中的典型问题在部署和运行gemiui的过程中你可能会遇到以下几个典型问题问题一前端启动后页面空白或无法连接到后端。排查思路检查终端日志首先查看运行npm run dev的两个终端窗口是否有报错。常见的错误包括端口被占用、依赖安装不完整node_modules缺失、.env文件配置错误。验证后端服务直接在浏览器访问http://localhost:3001或你配置的后端端口。如果后端正常可能会返回一个简单的提示或404页面因为根路径可能没定义路由。如果无法访问说明后端没启动成功。检查前端代理配置打开浏览器的开发者工具F12切换到“网络”标签页。尝试在页面中发送一条消息观察发出的请求地址。它应该是类似http://localhost:5173/api/chat。如果请求地址错误或返回CORS错误说明Vite的代理配置可能有问题。你需要检查client/vite.config.ts中的server.proxy设置确保它正确指向了后端地址。解决方案端口占用使用lsof -i :3001Linux/Mac或netstat -ano | findstr :3001Windows查找占用端口的进程并结束它或修改.env中的PORT为其他值。依赖问题删除node_modules文件夹和package-lock.json文件重新运行npm install。代理配置确保vite.config.ts中的代理目标与后端运行地址一致。问题二发送消息时提示“Invalid API Key”或“403 Forbidden”。排查思路这几乎肯定是API密钥的问题。检查.env文件确认server/.env文件中的GEMINI_API_KEY值是否正确无误前后没有多余的空格或换行符。验证密钥有效性你可以用最简单的cURL命令测试密钥是否有效注意替换YOUR_API_KEYcurl -X POST \ -H Content-Type: application/json \ -d {contents:[{parts:[{text:Hello}]}]} \ https://generativelanguage.googleapis.com/v1beta/models/gemini-pro:generateContent?keyYOUR_API_KEY如果返回包含错误信息说明密钥无效或未启用相关API。检查API启用状态前往Google Cloud Console确保你已在你创建密钥的项目中启用了“Generative Language API”。解决方案重新生成一个API密钥并确保在正确的项目中启用API。将新密钥更新到.env文件并重启后端服务。问题三图片上传后模型无法识别或返回错误。排查思路检查浏览器控制台上传图片时查看网络请求的负载。确认发送的数据格式是否正确图片部分是否是以data:image/...;base64,...格式的字符串传输。检查图片大小和格式Gemini API对图片有大小限制目前通常是20MB以内。过大的图片会导致请求失败。同时确保图片格式是支持的如PNG, JPEG, WEBP, GIF。验证模型选择你上传了图片但选择的模型是gemini-pro它不支持视觉输入。必须选择gemini-pro-vision模型。解决方案在前端代码中增加图片预处理逻辑压缩和缩放图片。确保前端在上传图片后自动或手动将模型切换到Vision版本。在后端增加请求体大小限制的检查并向前端返回友好的错误提示。5.2 性能优化与进阶考量当gemiui投入实际使用尤其是多人使用或会话历史很长时性能问题会逐渐浮现。1. 前端性能优化虚拟化长列表侧边栏的会话列表和聊天窗口的消息列表如果条目成百上千一次性渲染所有DOM节点会导致页面卡顿。解决方案是使用“虚拟滚动”技术只渲染可视区域内的条目。React生态中有react-window或react-virtualized这样的库可以实现。优化状态更新在流式响应时每收到一个数据块就更新整个store中的消息内容可能会触发大量组件的重新渲染。使用Zustand时可以通过选择器selector让组件只订阅其真正依赖的状态片段。对于消息列表每个MessageItem组件只订阅自己对应的那条消息内容而不是整个消息数组这样可以极大减少不必要的渲染。图片懒加载聊天记录中的图片特别是历史图片可以采用懒加载。只有当图片滚动到视口附近时才加载其真实的src初始时只显示一个占位符。2. 后端与数据持久化优化会话存储瓶颈localStorage有容量限制约5MB且同步操作会阻塞主线程。当聊天记录非常多特别是包含大量图片的Base64数据时很容易达到上限导致数据无法保存。解决方案迁移到IndexedDB。IndexedDB是浏览器内置的异步数据库存储容量大得多通常数百MB甚至更多且操作不会阻塞UI。你可以使用idb或Dexie.js这类库来简化IndexedDB的操作。将聊天数据存储在IndexedDB中localStorage只用来存储一些关键的配置或当前会话ID。服务端持久化可选如果你需要跨设备同步聊天记录或者进行团队协作就必须将数据存储到服务器端。这需要为后端增加数据库如SQLite、PostgreSQL、MongoDB并设计用户认证和会话管理。这相当于将项目从一个本地工具升级为一个完整的Web应用。3. 成本与用量控制Token计数与估算Gemini API按token收费。输入的文本和图片经编码后都会消耗token。在前端实现一个简单的token计数器很有帮助。你可以使用一个与Gemini模型分词方式相近的JavaScript分词库如gpt-3-encoder的改编版来估算文本token数。对于图片可以根据其Base64字符串长度和分辨率进行粗略估算。在输入框附近实时显示当前消息的预估token消耗能有效避免意外产生高额费用。设置使用限制在后端可以为每个API密钥或每个用户如果实现了多用户设置每日或每月的token使用上限。当接近或超过限额时拒绝新的请求或返回警告。4. 安全性加固环境变量管理生产环境绝对不要将API密钥硬编码在代码或配置文件里。使用环境变量或密钥管理服务如AWS Secrets Manager, HashiCorp Vault。API请求限速与防滥用如果你的应用对公众开放必须实施限流Rate Limiting例如使用express-rate-limit中间件防止恶意用户刷你的API密钥导致费用暴涨。输入验证与清理后端应对前端发送过来的所有数据进行验证和清理防止注入攻击。虽然Gemini API本身可能有一定防护但良好的习惯应从自己的后端做起。通过以上这些优化和考量你可以将一个简单的个人项目gemiui打磨成一个稳定、高效、可投入实际使用的AI工具平台。这个过程本身就是对全栈开发能力的一次极佳锻炼。

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