基于Vue 3与FastAPI的ChatGPT Web应用脚手架:从流式对话到生产部署

news2026/5/7 18:01:21
1. 项目概述与核心价值最近在GitHub上看到一个挺有意思的项目叫“Aniuyyds/ChatGPT-website”。光看名字你可能会觉得这又是一个基于OpenAI API的聊天网站前端市面上类似的轮子已经多如牛毛了。但当我真正点进去仔细研究它的代码结构和实现思路后发现它远不止一个简单的“套壳”应用。这个项目更像是一个精心设计的、面向生产环境的“ChatGPT Web应用脚手架”它解决了很多个人开发者和中小团队在快速构建一个功能完整、体验流畅的AI对话应用时所面临的共性问题。简单来说这个项目提供了一个开箱即用的、前后端分离的Web应用模板。前端基于现代化的Vue 3框架后端则提供了Node.js和PythonFastAPI两种主流技术栈的选择。它的核心价值在于它帮你把那些繁琐但又必须的“基建”工作都做好了。比如如何安全地管理API密钥、如何实现流畅的流式响应SSE、如何设计一个合理的对话历史管理机制、如何支持多模型切换不仅仅是GPT-3.5/4、如何实现一个美观且实用的Markdown渲染聊天界面甚至包括用户认证、额度管理等进阶功能的预留接口。你不需要从零开始去纠结这些架构问题而是可以直接基于这个模板快速定制你的业务逻辑和UI风格把精力集中在创造独特的应用价值上。对于想要快速验证一个AI产品想法、为团队内部搭建一个定制化AI助手平台或者学习如何构建一个企业级AI应用架构的开发者来说这个项目是一个非常高质量的参考和起点。它采用的栈都是当前主流且成熟的技术代码结构清晰文档也相对完善降低了上手和二次开发的门槛。接下来我就带大家深入拆解一下这个项目的设计思路、技术实现细节并分享一些基于它进行实际开发和部署的实操经验。2. 项目架构与核心技术栈解析2.1 整体架构设计思路“Aniuyyds/ChatGPT-website”采用了经典的前后端分离架构这种设计在现代Web开发中几乎是标配它能带来更好的开发体验、部署灵活性和可维护性。项目的整体架构可以清晰地分为三个部分用户交互层前端、业务逻辑与代理层后端、AI能力层第三方API。前端作为一个独立的单页应用SPA负责所有用户界面的渲染和交互逻辑包括聊天窗口、消息展示、设置面板等。它通过HTTP请求与后端服务通信而不是直接调用OpenAI的API。这样做有几个关键好处首先是安全性你的OpenAI API密钥等敏感信息可以安全地存储在后端服务器避免暴露在客户端浏览器中其次是灵活性后端可以作为一道“防火墙”和“路由器”在这里你可以轻松地添加请求过滤、频率限制、日志记录、多API源切换比如同时接入OpenAI和Azure OpenAI等业务逻辑而无需改动前端代码最后是可扩展性当你想接入新的AI模型或添加用户管理系统时只需要在后端进行扩展即可。后端在这里扮演了“智能代理”和“业务中枢”的角色。它接收来自前端的用户消息进行必要的预处理如敏感词过滤、上下文组装然后代表前端去调用真正的AI服务提供商如OpenAI的接口。获取到AI的响应后它再处理响应数据如解析流式数据并将其安全、高效地传回前端。项目贴心地提供了Node.js和Python两种后端实现让不同技术背景的团队都能快速上手。2.2 前端技术栈Vue 3 TypeScript Vite前端部分选择了Vue 3的组合式APIComposition API和script setup语法配合TypeScript这代表了当前Vue生态最先进和主流的开发范式。TypeScript的引入极大地提升了代码的健壮性和开发体验在组件通信、状态管理时能提供清晰的类型提示减少运行时错误。构建工具使用的是Vite而不是传统的Webpack。Vite在开发阶段基于原生ES模块提供了闪电般的冷启动和热更新速度这对需要频繁调整UI的聊天应用开发来说体验提升是巨大的。生产构建时它又基于Rollup进行高效的打包优化。UI框架方面项目使用了Element Plus这是一个基于Vue 3的桌面端组件库成熟且丰富。对于聊天应用这类重交互的界面Element Plus提供的布局、表单、按钮、对话框等组件能大大加快开发速度。当然如果你更喜欢Ant Design Vue或Naive UI也可以很方便地进行替换这体现了项目作为“模板”的灵活性。前端核心模块解析聊天界面组件 (Chat.vue): 这是应用的心脏。它管理着当前对话的消息列表、用户输入并处理与后端的WebSocket或SSE连接以接收流式响应。消息的展示通常会集成一个强大的Markdown渲染器如marked、highlight.js让代码块、表格、数学公式等都能完美呈现。对话历史管理: 前端需要将对话历史包括用户消息和AI回复持久化通常使用浏览器的localStorage或IndexedDB。项目会实现对话的创建、重命名、删除以及在不同对话间切换的功能。应用状态管理: 虽然对于中小型应用使用reactive或ref进行组件内状态管理可能就够了但为了更好的可维护性项目可能会引入PiniaVue官方的状态管理库来集中管理用户设置、模型列表、当前对话等全局状态。设置面板: 允许用户配置API端点后端地址、选择的模型、温度Temperature、最大生成长度等参数。这些设置同样需要持久化。2.3 后端技术栈Node.js/Python的双轨选择项目提供了两种后端语言选项这非常贴心。Node.js版本 (基于Express/Koa框架):对于前端开发者或全栈开发者来说Node.js是自然延伸的选择。它利用JavaScript/TypeScript的统一语言优势上下文切换成本低。通常会使用express或koa作为Web框架cors中间件处理跨域dotenv管理环境变量。核心的AI接口调用会使用openai官方Node.js库或axios发起HTTP请求。实现流式响应Server-Sent Events, SSE是后端的关键需要设置正确的HTTP头Content-Type: text/event-stream并保持连接打开将从OpenAI接口收到的数据块chunks实时推送给前端。Python版本 (基于FastAPI框架):Python在AI和数据处理领域有天然优势生态丰富。FastAPI是一个现代、高性能的Python Web框架自动生成交互式API文档Swagger UI并且原生支持异步操作非常适合处理像AI API调用这类I/O密集型任务。使用httpx或aiohttp进行异步HTTP请求调用OpenAI的Python SDK。FastAPI对SSE也有很好的支持可以通过生成器yield的方式优雅地实现流式响应。对于需要复杂数据处理、与向量数据库集成或运行本地模型的后端需求Python版本可能是更强大的选择。后端核心功能模块API路由与控制器: 定义主要的端点如/api/chat处理聊天、/api/models获取可用模型列表、/api/config获取配置等。配置与密钥管理: 通过环境变量.env文件安全地存储OpenAI API密钥、API基础URL等敏感信息。后端负责读取这些配置并在请求AI服务时使用。请求代理与增强: 这是后端最重要的价值所在。它不仅仅是转发请求还可以上下文管理: 根据配置自动将历史对话消息组装成符合模型要求的Prompt格式如ChatML格式。流式响应处理: 处理OpenAI返回的流式数据将其转换为标准的SSE格式发送给前端。错误处理与重试: 对网络超时、API限额错误等进行统一捕获和友好提示并可实现自动重试逻辑。简单的频率限制: 基于IP或令牌如果实现了用户系统对请求进行限速防止滥用。可选用户与会话管理: 基础模板可能不包含完整的用户系统但会设计好数据库模型和API接口方便你后续集成JWT认证、会话管理、对话历史云端存储等功能。3. 核心功能实现与实操要点3.1 流式对话SSE的实现与优化流式响应是让AI对话体验从“等待-完整显示”提升到“实时逐字输出”的关键技术。这个项目前后端配合完整实现了这一功能。前端实现要点前端使用EventSourceAPI或更灵活的fetchAPI来建立SSE连接。EventSource使用简单但不支持自定义HTTP头如Authorization因此在需要传递认证信息时通常使用fetch。// 使用 fetch 处理 SSE 的示例 async function sendMessageStream(message, history, onChunk, onFinish, onError) { const controller new AbortController(); const signal controller.signal; try { const response await fetch(/api/chat, { method: POST, headers: { Content-Type: application/json, // 如果需要认证: Authorization: Bearer ${token} }, body: JSON.stringify({ message, history }), signal, // 用于取消请求 }); if (!response.ok) { throw new Error(HTTP error! status: ${response.status}); } const reader response.body.getReader(); const decoder new TextDecoder(utf-8); let buffer ; while (true) { const { done, value } await reader.read(); if (done) { // 流结束处理可能的最后一段数据 if (buffer.trim()) { try { const parsed JSON.parse(buffer); onChunk(parsed); } catch (e) { /* 忽略非JSON结尾 */ } } onFinish(); break; } buffer decoder.decode(value, { stream: true }); // SSE 数据格式是 data: {json}\n\n需要按行解析 const lines buffer.split(\n); buffer lines.pop(); // 最后一行可能是不完整的放回buffer for (const line of lines) { if (line.startsWith(data: )) { const data line.slice(6); // 去掉 data: if (data [DONE]) { onFinish(); return; } try { const parsed JSON.parse(data); onChunk(parsed); // 将解析出的delta传递给UI更新函数 } catch (e) { console.error(解析SSE数据失败:, e, data); } } } } } catch (error) { if (error.name AbortError) { console.log(请求被用户取消); } else { onError(error); } } }后端实现要点以Node.js/Express为例后端需要设置正确的响应头并保持连接不立即关闭。app.post(/api/chat, async (req, res) { // 1. 设置SSE响应头 res.setHeader(Content-Type, text/event-stream); res.setHeader(Cache-Control, no-cache); res.setHeader(Connection, keep-alive); res.setHeader(Access-Control-Allow-Origin, *); // 根据实际情况调整CORS // 2. 立即发送一个初始消息或保持连接 res.write(data: {id:chatcmpl-start,object:chat.completion.chunk}\n\n); // 3. 组装请求OpenAI的消息 const messages [...req.body.history, { role: user, content: req.body.message }]; try { const stream await openai.chat.completions.create({ model: req.body.model || gpt-3.5-turbo, messages: messages, stream: true, // 关键开启流式 temperature: 0.7, }); // 4. 迭代流将每个chunk转发为SSE格式 for await (const chunk of stream) { const data data: ${JSON.stringify(chunk)}\n\n; res.write(data); } // 5. 流结束发送结束标记 res.write(data: [DONE]\n\n); res.end(); } catch (error) { // 6. 错误处理发送错误信息并关闭流 console.error(调用OpenAI API失败:, error); res.write(data: ${JSON.stringify({ error: error.message })}\n\n); res.write(data: [DONE]\n\n); res.end(); } });实操心得流式响应的稳定性在实际部署中网络不稳定或客户端意外关闭可能导致SSE连接中断。前端需要做好重连机制例如在EventSource的onerror事件中尝试重新连接。后端也需要处理客户端断开连接的情况及时清理资源比如在Express中监听req.on(close, ...)来中止正在进行的OpenAI API请求避免资源浪费。3.2 对话历史管理与上下文组装AI模型尤其是ChatGPT的对话能力依赖于提供的上下文。项目需要高效地管理本地或服务器的对话历史。前端存储策略localStorage: 简单快捷适合存储量不大的对话历史和设置。但容量有限通常5-10MB且是同步操作可能阻塞主线程。IndexedDB: 适合存储大量结构化数据如成千上万条消息。它是异步的容量大。项目可以封装一个简单的IndexedDB工具类来管理对话和消息。数据结构设计:// 一个简单的对话数据结构 const conversation { id: conv_123, // 唯一标识 title: 关于Python的问题, // 自动从第一条消息生成 createTime: 1678886400000, updateTime: 1678886500000, messages: [ { id: msg_1, role: user, content: 如何学习Python, time: 1678886410000 }, { id: msg_2, role: assistant, content: 学习Python可以从..., time: 1678886420000 }, // ... 更多消息 ] };后端上下文组装当后端收到前端的聊天请求时它不能简单地把所有历史消息都发给OpenAI因为模型有Token长度限制如GPT-3.5-turbo通常是4096或16k tokens。因此需要实现一个智能的上下文窗口策略。Token计数: 使用类似tiktokenOpenAI官方或gpt-3-encoder的库精确计算消息列表的Token消耗。截断策略: 当总Token数超过模型限制需要预留一部分给本次生成优先从历史消息的中间部分开始移除最老的消息保留最新的系统提示如果有和最近的对话因为最近的内容通常与当前问题最相关。系统提示System Prompt: 这是一个强大的工具用于设定AI的“角色”和行为准则。后端可以允许用户自定义系统提示并将其固定在上下文的最前面。# Python后端示例上下文截断 import tiktoken def truncate_conversation(messages, max_tokens, modelgpt-3.5-turbo): encoding tiktoken.encoding_for_model(model) total_tokens 0 for msg in messages: # 粗略计算content tokens 一些固定开销如role total_tokens len(encoding.encode(msg[content])) 4 if total_tokens max_tokens: return messages # 开始截断优先保留系统消息和最新的用户/助手消息 truncated [] system_messages [m for m in messages if m[role] system] other_messages [m for m in messages if m[role] ! system] # 保留所有系统消息通常很短且重要 truncated.extend(system_messages) tokens_used sum(len(encoding.encode(m[content]))4 for m in system_messages) # 从最新的其他消息开始添加直到达到上限 for msg in reversed(other_messages): msg_tokens len(encoding.encode(msg[content])) 4 if tokens_used msg_tokens max_tokens: break truncated.insert(len(system_messages), msg) # 插入到系统消息之后 tokens_used msg_tokens return truncated3.3 多模型支持与配置化一个优秀的AI应用模板不应该只绑定于GPT-3.5/4。这个项目的亮点之一是支持配置化地接入不同模型。后端配置设计在后端的配置文件如config.yaml或环境变量中可以定义模型列表。models: - id: gpt-3.5-turbo name: GPT-3.5 Turbo provider: openai max_tokens: 4096 endpoint: https://api.openai.com/v1/chat/completions - id: gpt-4 name: GPT-4 provider: openai max_tokens: 8192 endpoint: https://api.openai.com/v1/chat/completions - id: claude-3-haiku name: Claude 3 Haiku provider: anthropic max_tokens: 200000 endpoint: https://api.anthropic.com/v1/messages后端提供一个/api/models接口前端调用它来动态获取可用的模型列表并渲染到下拉框中。统一的请求适配层不同AI提供商的API接口格式、认证方式、流式响应格式可能不同。后端需要实现一个适配器Adapter模式。每个模型配置项中的provider字段对应一个适配器类。当收到聊天请求时后端根据选择的模型找到对应的适配器由适配器负责将内部统一的消息格式转换为目标API的格式并处理其特有的响应。// 简化的适配器示例 class OpenAIAdapter { constructor(apiKey, baseURL) { this.client new OpenAI({ apiKey, baseURL }); } async createChatCompletion(params) { return this.client.chat.completions.create({ model: params.model, messages: params.messages, stream: params.stream, // ... 其他参数 }); } } class AnthropicAdapter { constructor(apiKey) { this.apiKey apiKey; this.baseURL https://api.anthropic.com; } async createChatCompletion(params) { // 将通用的 messages 格式转换为 Claude 所需的格式 const claudeMessages params.messages.map(msg ({ role: msg.role, content: msg.content })); const response await fetch(${this.baseURL}/v1/messages, { method: POST, headers: { x-api-key: this.apiKey, anthropic-version: 2023-06-01, content-type: application/json, }, body: JSON.stringify({ model: params.model, messages: claudeMessages, max_tokens: params.max_tokens, stream: params.stream, }), }); // ... 处理响应 } }4. 部署方案与生产环境考量4.1 前端部署静态资源托管构建好的Vue应用是一堆静态文件HTML, JS, CSS。部署非常简单可以选择任何静态网站托管服务Vercel / Netlify: 对前端框架支持极好连接Git仓库后自动部署自带CDN、HTTPS。GitHub Pages / GitLab Pages: 免费适合开源项目演示。云存储CDN: 如阿里云OSS、腾讯云COS、AWS S3配合CDN加速成本可控性能强大。传统服务器: 使用Nginx或Apache托管dist目录。关键配置以Nginx为例server { listen 80; server_name your-domain.com; root /path/to/your/dist; index index.html; # 支持HTML5 History Mode避免刷新404 location / { try_files $uri $uri/ /index.html; } # 静态资源缓存 location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ { expires 1y; add_header Cache-Control public, immutable; } }4.2 后端部署Node.js/Python服务后端服务需要常驻运行对可靠性要求更高。Node.js (PM2管理):在服务器上安装Node.js环境。使用PM2进程管理器来启动、守护和监控应用。npm install -g pm2 cd /path/to/backend npm install --production pm2 start ecosystem.config.js pm2 save pm2 startup # 设置开机自启ecosystem.config.js示例module.exports { apps: [{ name: chatgpt-backend, script: app.js, // 或 npm start instances: max, // 根据CPU核心数启动多个实例 exec_mode: cluster, // 集群模式利用多核 env: { NODE_ENV: production, OPENAI_API_KEY: your-secret-key, PORT: 3000, }, }] };Python (FastAPI with Gunicorn/Uvicorn):使用Gunicorn作为WSGI HTTP服务器配合Uvicorn工作进程因为FastAPI是异步框架。pip install gunicorn uvicorn cd /path/to/backend gunicorn -w 4 -k uvicorn.workers.UvicornWorker main:app --bind 0.0.0.0:8000-w 4指定4个工作进程。通常建议设置为(2 * CPU核心数) 1。 2. 同样可以使用PM2或Systemd来管理Gunicorn进程实现持久化。使用Docker容器化部署推荐:将前后端分别容器化是保证环境一致性和简化部署的最佳实践。后端Dockerfile示例 (Node.js):FROM node:18-alpine WORKDIR /app COPY package*.json ./ RUN npm ci --onlyproduction COPY . . EXPOSE 3000 USER node CMD [node, app.js]使用Docker Compose编排:version: 3.8 services: backend: build: ./backend ports: - 3000:3000 environment: - NODE_ENVproduction - OPENAI_API_KEY${OPENAI_API_KEY} restart: unless-stopped # 可以挂载volume用于日志或数据持久化 # volumes: # - ./logs:/app/logs frontend: build: ./frontend ports: - 80:80 depends_on: - backend restart: unless-stopped然后在服务器上运行docker-compose up -d即可一键启动所有服务。4.3 生产环境安全与优化配置环境变量与密钥管理:绝对不要将API密钥等硬编码在代码中。使用.env文件开发环境和服务器环境变量生产环境管理。考虑使用专门的密钥管理服务如AWS Secrets Manager、HashiCorp Vault或在Docker Swarm/K8s中使用Secret对象。API速率限制与防滥用:在后端实现请求频率限制Rate Limiting例如使用express-rate-limitNode.js或slowapiPython。根据IP或用户令牌进行限制防止恶意刷API消耗额度。// Node.js express-rate-limit const rateLimit require(express-rate-limit); const limiter rateLimit({ windowMs: 15 * 60 * 1000, // 15分钟 max: 100, // 每个IP限制100次请求 message: 请求过于频繁请稍后再试。 }); app.use(/api/chat, limiter);HTTPS与安全头:生产环境必须使用HTTPS。可以使用Let‘s Encrypt免费证书通过Nginx反向代理配置。设置安全HTTP头如CSP、HSTS等增强应用安全性。# Nginx SSL配置片段 ssl_certificate /etc/letsencrypt/live/your-domain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/your-domain.com/privkey.pem; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers HIGH:!aNULL:!MD5;日志与监控:后端应用需要记录详细的访问日志和错误日志便于排查问题。集成监控工具如PM2的监控、Prometheus Grafana监控服务的CPU、内存、请求延迟和错误率。对OpenAI API的调用失败、Token使用量进行记录和告警。数据库集成进阶: 当需要用户管理、持久化存储对话历史、实现额度控制时需要集成数据库。SQL数据库: PostgreSQL或MySQL适合关系型数据如用户信息、套餐订阅。NoSQL数据库: MongoDB适合存储结构灵活的对话记录。 项目模板通常会预留数据库连接和模型定义你需要根据业务需求进行填充和实现。5. 常见问题排查与进阶优化5.1 部署与运行常见问题问题1前端访问后端API出现CORS错误。表现浏览器控制台报错Access-Control-Allow-Origin。原因前端域名与后端API域名不同源浏览器安全策略阻止了请求。解决后端配置CORS确保后端正确设置了响应头。以Node.js/Express为例const cors require(cors); app.use(cors({ origin: process.env.FRONTEND_URL || http://localhost:5173, // 允许的前端地址 credentials: true, // 如果需要传递cookie/token }));使用反向代理在生产环境中更佳实践是让前端和后端使用同一个域名。通过Nginx将/api路径的请求代理到后端服务。location /api/ { proxy_pass http://backend:3000/; # 指向后端容器或服务 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } location / { root /path/to/frontend/dist; try_files $uri $uri/ /index.html; }这样前端只需访问/api/chat避免了跨域问题。问题2流式响应中断或不完整。表现回答生成到一半突然停止或者前端收不到[DONE]事件。排查检查网络超时服务器如Nginx或负载均衡器可能有默认的超时设置如60秒对于长文本生成可能不够。需要调整。proxy_read_timeout 300s; # Nginx代理读超时 proxy_send_timeout 300s; # Nginx代理发送超时后端响应超时确保后端框架如Express没有设置过短的响应超时。客户端中断前端可能在用户切换页面或组件卸载时未正确关闭SSE连接或取消Fetch请求。需要在Vue组件的onUnmounted生命周期中清理连接。OpenAI API稳定性偶尔的API抖动也可能导致流中断。前端需要增加错误处理和重试逻辑。问题3部署后静态页面刷新出现404。表现直接访问https://your-site.com/some-route返回404。原因这是Vue Router使用History模式时的典型问题。服务器没有配置对所有路径都返回index.html。解决见上文Nginx配置中的try_files $uri $uri/ /index.html;规则。其他服务器如Apache也需要类似配置。5.2 性能与体验优化技巧前端消息渲染优化虚拟列表如果单次对话历史非常长如超过1000条消息直接渲染所有DOM节点会导致页面卡顿。可以使用虚拟列表技术如vue-virtual-scroller只渲染可视区域内的消息。Markdown渲染懒加载/异步复杂的Markdown渲染特别是包含大型代码块或数学公式可能阻塞UI。可以考虑将渲染任务放入Web Worker或使用异步组件延迟渲染非可视区域的内容。后端上下文缓存对于频繁使用的系统提示词或固定的上下文前缀可以在后端内存中如使用LRU Cache缓存其Token化后的结果避免每次请求都重复计算减少延迟。支持中途停止生成这是一个提升用户体验的重要功能。前端在流式接收过程中提供一个“停止”按钮。点击后前端发送一个AbortSignalFetch API或关闭EventSource连接。后端需要监听连接关闭事件并立即中止向OpenAI发起的请求。Node.js示例在for await (const chunk of stream)循环中检查req.aborted或监听req.on(close, ...)。实现对话导出与分享增加功能允许用户将单次对话导出为Markdown、PDF或图片。可以使用前端的html2canvas和jsPDF库生成PDF或调用后端服务生成更格式化的文档。5.3 从模板到产品功能扩展思路基于这个坚实的模板你可以向多个方向扩展打造属于自己的产品用户系统与多租户集成JWT或Session认证。设计用户表、对话表、额度消耗表。实现注册、登录、个人中心、对话历史云同步。额度管理与支付为每个用户分配Token额度或对话次数。集成支付网关如Stripe、支付宝、微信支付实现套餐购买。实时计算每次对话的Token消耗并扣减额度。模型路由与负载均衡当你有多个API密钥或多个模型提供商时可以实现一个智能路由层。根据模型类型、当前各API的延迟、剩余额度等因素动态选择最优的API端点进行请求提高可用性和成本效益。知识库与检索增强生成RAG这是当前AI应用的热点。允许用户上传文档PDF、Word、TXT后端使用文本嵌入模型如OpenAI的text-embedding-ada-002将文档切片并存入向量数据库如Pinecone、Chroma、Qdrant。当用户提问时先从向量库中检索最相关的文档片段将其作为上下文与问题一起发送给大模型从而得到基于私有知识的精准回答。插件与工具调用Function Calling集成OpenAI的Function Calling能力。当用户询问天气、股票或需要计算时模型可以请求调用你预先定义好的函数如调用天气API、执行计算然后将结果返回给模型由模型组织成最终回答给用户。这极大地扩展了AI应用的能力边界。这个“Aniuyyds/ChatGPT-website”项目为你提供了一个功能完备、架构清晰的起点。它的价值不在于代码本身有多复杂而在于它提供了一个经过思考的、可扩展的最佳实践范本。你可以把它当作一个学习如何构建现代AI Web应用的教材也可以把它作为快速启动自己AI创业项目的基石。在实际使用中最关键的是理解其设计哲学然后根据你的具体需求进行裁剪、加固和扩展。

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