深度对话应用框架Deep-Chat:从原理到实战的集成指南

news2026/5/6 4:53:12
1. 项目概述一个开箱即用的深度对话应用框架如果你正在寻找一个能快速集成到现有项目中的聊天界面或者想构建一个功能强大、可深度定制的对话应用原型那么deep-chat这个开源项目绝对值得你花时间研究。它不是另一个简单的聊天UI组件库而是一个集成了前端界面、后端连接器、多模态支持和丰富扩展能力的“全栈对话应用框架”。我最初接触它是因为一个内部工具开发的需求需要在几天内为一个数据分析平台加上一个能与多种AI模型对话的交互界面deep-chat让我几乎没写几行前端代码就实现了目标。简单来说deep-chat提供了一个现成的、美观的聊天窗口组件。你只需要通过配置告诉它后端API的地址、支持的模型、文件上传的处理方式等它就能自动处理消息的发送、接收、流式显示、历史记录、文件预览等一系列复杂功能。它原生支持与 OpenAI API、Cohere、Hugging Face 等主流服务对接也允许你轻松接入自己的自定义后端。更关键的是它的设计哲学是“深度集成”意味着你可以通过丰富的配置项和事件钩子几乎控制聊天过程的每一个环节从消息渲染、错误处理到自定义按钮和主题样式。这个项目适合哪些人呢首先是前端开发者或全栈开发者尤其是那些不想在聊天UI上重复造轮子希望快速交付产品功能的人。其次是产品经理或创业者可以用它快速搭建概念验证PoC或演示原型。最后对于研究者或学生它也是一个很好的工具可以专注于对话逻辑和算法而无需操心交互界面的实现。接下来我会从设计思路、核心功能、集成实战到深度定制一步步拆解这个强大的工具。2. 核心设计思路与架构解析2.1 为什么是“深度”聊天解构其设计哲学deep-chat的“深度”体现在几个层面这决定了它与其他聊天组件库的根本不同。首先深度集成而非简单封装。很多UI库只是提供一个聊天气泡和输入框你需要自己处理网络请求、状态管理、错误重试、流式响应解析等。而deep-chat将这些底层复杂性全部封装对外暴露的是一个高度抽象的配置接口。你配置一个openAI对象它就能自动处理与OpenAI API的通信包括格式转换、错误处理和流式文本的逐字显示。其次深度可定制与可扩展。它的几乎所有视觉元素和行为都可以通过配置或CSS覆盖来修改。更重要的是它提供了完整的事件系统如onMessage、onError和方法调用如sendMessage允许你将聊天组件无缝嵌入到任何复杂的应用逻辑中。例如你可以在用户发送消息前进行内容审核或者在收到AI回复后触发另一个业务流程。最后深度支持多模态交互。现代对话AI早已不限于文本。deep-chat在设计之初就考虑了文件上传、图片预览、音频播放甚至自定义渲染。它内置了文件上传组件可以处理图片、PDF、文本文件等并能将文件内容作为消息的一部分发送给后端AI模型进行处理。这种对多模态的原生支持让它能轻松应对“上传一张图片并描述内容”或“分析这个PDF文档”这类复杂场景。2.2 核心架构连接器模式与消息流管理理解了设计哲学我们来看它的核心架构。deep-chat采用了一种清晰的“连接器Connector”模式。组件本身是独立于后端的它通过不同的连接器与各种服务通信。1. 预置连接器这是最常用的部分。你只需要在配置中提供API密钥和端点等信息。OpenAI 连接器用于连接 OpenAI 的 GPT 系列、DALL-E 等模型。配置apiKey和model即可。Cohere 连接器用于连接 Cohere 的生成模型。Hugging Face 连接器用于连接部署在 Hugging Face 上的模型。Azure OpenAI 连接器用于连接微软Azure上的OpenAI服务。自定义流式连接器这是一个通用连接器用于连接任何提供 Server-Sent Events (SSE) 流式响应的自定义后端。2. 消息流管理这是组件内部的核心引擎。它负责消息状态追踪维护对话历史区分用户消息、AI消息、系统消息并管理每条消息的发送、接收、错误等状态。流式响应处理当后端返回流式响应如SSE时组件会实时地将数据块拼接并更新到当前AI消息中实现“打字机”效果。请求队列与重试管理消息发送队列在网络不稳定或服务端错误时可以提供自动重试逻辑需配置。文件处理流水线当用户上传文件时组件会触发文件读取、预览生成如图片缩略图并将文件数据转换为适合发送给后端的格式如Base64、FormData。这种架构的好处是职责分离。作为使用者你大部分时间只需要关心“配置连接器”和“响应事件”而无需深入网络请求和UI更新的细节。这种抽象极大地提升了开发效率。3. 快速上手五分钟内创建你的第一个AI聊天窗理论说了这么多我们来点实际的。假设你有一个OpenAI的API密钥想快速创建一个能对话的网页。以下是绝对最小化的步骤。3.1 基础环境与安装首先你需要一个前端项目环境。这里以最简单的静态HTML项目为例你也可以在React、Vue等框架中通过NPM安装。方案一直接通过CDN引入最快创建一个index.html文件在head中引入样式和脚本。!DOCTYPE html html langzh-CN head meta charsetUTF-8 title我的第一个DeepChat/title !-- 引入DeepChat样式 -- link relstylesheet hrefhttps://cdn.jsdelivr.net/npm/deep-chatlatest/dist/style.css /head body !-- 放置聊天容器的div -- div idchat-container stylewidth: 600px; height: 700px; margin: 20px auto;/div !-- 引入DeepChat库 -- script srchttps://cdn.jsdelivr.net/npm/deep-chatlatest/dist/deep-chat.min.js/script script // 初始化配置 const initialConfig { // 将聊天组件挂载到上面的div container: document.getElementById(chat-container), // 配置OpenAI连接器 openAI: { apiKey: sk-你的OpenAI-API密钥, // 重要在实际生产中绝对不要在前端硬编码密钥 model: gpt-3.5-turbo }, // 一些基础界面配置 textInput: { placeholder: { text: 问我任何问题... } }, // 设置初始欢迎信息 welcomeMessage: 你好我是由DeepChat驱动的AI助手。 }; // 创建聊天实例 const deepChat new DeepChat(initialConfig); /script /body /html用浏览器打开这个HTML文件一个功能完整的AI聊天窗口就出现了你可以直接输入文字开始对话。当然将API密钥明文放在前端代码中是极其危险的行为这仅用于演示。正式环境必须通过你自己的后端服务器来中转请求。方案二在NPM项目中使用如果你使用现代前端框架可以通过包管理器安装。npm install deep-chat然后在你的组件中引入并使用import { DeepChat } from deep-chat; import deep-chat/style.css; // 引入样式 // 在组件挂载后初始化 const chatContainerRef useRef(null); useEffect(() { if (chatContainerRef.current) { new DeepChat({ container: chatContainerRef.current, openAI: { // 这里仍然不应该放真实密钥应从环境变量或后端获取 apiKey: process.env.REACT_APP_OPENAI_KEY, model: gpt-4 } }); } }, []); // 在JSX中 return div ref{chatContainerRef} style{{ width: 100%, height: 500px }} /;3.2 核心配置项初探上面的例子只用了最基础的配置。deep-chat的配置对象非常庞大这里先介绍几个最关键的顶层配置container必填。指定组件渲染的DOM元素。openAI/cohere/azure配置对应的云服务连接器。它们是互斥的一次只能使用一个直接连接器。demo布尔值。如果设为true组件会进入演示模式使用一个模拟的后端无需任何API密钥即可体验所有功能。非常适合做原型展示。textInput.placeholder.text输入框的占位符文本。welcomeMessage打开聊天窗口时显示的欢迎信息可以是字符串或对象数组用于多条信息。style一个对象用于覆盖组件的主题样式如颜色、字体、圆角等。events一个对象包含各种事件回调函数如onMessage消息发送时、onResponse收到回复时等。注意API密钥安全是生命线。在任何面向公众的网站中都绝不应该将 OpenAI、Cohere 等服务的API密钥直接暴露在前端代码中。恶意用户可以轻易从浏览器开发者工具中窃取它并用你的账户发起巨额请求导致天价账单。正确的做法是前端deep-chat配置中不设置apiKey而是配置一个customStream连接器指向你自己搭建的后端代理服务器。由你的后端服务器安全地存储API密钥并负责转发请求和响应。这是生产环境必须遵守的准则。4. 深度集成实战连接自定义后端与业务逻辑对于大多数严肃项目使用预置连接器直接连第三方API是不现实的。我们需要连接自己的后端服务并在聊天过程中融入业务逻辑。这是deep-chat真正发挥威力的地方。4.1 使用customStream连接器对接自有APIcustomStream连接器是连接自定义后端的桥梁。它期望你的后端提供一个 Server-Sent Events (SSE) 端点用于返回流式响应。假设你的后端有一个/api/chat的POST接口。前端配置如下const deepChat new DeepChat({ container: document.getElementById(chat-container), // 使用 customStream 连接器 customStream: true, // 启用自定义流式连接 request: { // 指定你的后端端点 url: https://你的域名.com/api/chat, method: POST, // 可以附加自定义请求头比如认证token headers: { Authorization: Bearer userToken, Content-Type: application/json } }, // 可选定义发送到后端的数据格式 requestBodyLimits: { // 默认情况下deep-chat会将整个对话历史messages数组放在请求体中。 // 你可以在这里添加其他固定参数 additionalBodyParams: { temperature: 0.7, user_id: 12345 } }, // 流式响应配置 stream: true, // 告知组件期待流式响应 audio: false, // 根据你的后端能力开启或关闭音频支持 files: { // 配置文件上传行为 maxNumberOfFiles: 3, allowedFormats: .png,.jpg,.pdf,.txt } });在这个配置下当用户发送一条消息时deep-chat会向https://你的域名.com/api/chat发送一个POST请求请求体是一个JSON对象默认包含一个messages数组完整历史记录和你定义的additionalBodyParams。后端实现要点以Node.js Express为例你的后端需要做两件事1. 处理deep-chat格式的请求。2. 以SSE流的形式返回响应。const express require(express); const app express(); app.use(express.json()); 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); // 2. 从请求体中获取数据 const { messages, temperature, user_id } req.body; // 这里 messages 是 deep-chat 格式化好的历史记录 // 3. 调用你的AI服务例如调用OpenAI API但密钥在后端 // 注意这里需要返回一个可读流或者手动模拟SSE try { const openAIResponse await fetch(https://api.openai.com/v1/chat/completions, { method: POST, headers: { Authorization: Bearer ${process.env.OPENAI_API_KEY}, Content-Type: application/json, }, body: JSON.stringify({ model: gpt-4, messages: messages, temperature: temperature, stream: true // 要求OpenAI也返回流 }) }); // 4. 将OpenAI的流式响应转发给前端 const reader openAIResponse.body.getReader(); const decoder new TextDecoder(utf-8); while (true) { const { done, value } await reader.read(); if (done) { // 流结束发送SSE结束标记 res.write(data: [DONE]\n\n); res.end(); break; } const chunk decoder.decode(value); // 直接将OpenAI的SSE数据块转发给前端 // deep-chat 能解析标准的OpenAI流格式 res.write(data: ${chunk}\n\n); } } catch (error) { // 错误处理也需要以SSE格式发送错误信息 res.write(data: ${JSON.stringify({ error: { message: error.message } })}\n\n); res.end(); } });通过这种方式API密钥安全地保存在后端你可以加入用户认证、请求限流、内容过滤、调用其他模型等任何业务逻辑。4.2 利用事件系统实现复杂交互deep-chat提供了丰富的事件钩子让你能在聊天的各个阶段插入自定义逻辑。const deepChat new DeepChat({ container: document.getElementById(chat-container), customStream: true, request: { url: /api/chat }, // 事件配置 events: { // 用户点击发送按钮消息即将发出时触发 onMessage: (message) { console.log(用户发送了消息:, message); // 例如可以进行消息内容检查 if (containsSensitiveWords(message.text)) { alert(消息包含敏感词请修改。); return false; // 返回 false 可以阻止消息发送 } // 可以修改消息对象 message.customMetadata { sentAt: new Date().toISOString() }; }, // 消息成功发送到服务器后触发 onMessageSent: (message) { console.log(消息已发送至服务器:, message); // 可以更新UI状态比如禁用发送按钮组件内部已处理 }, // 收到服务器响应包括流式响应的每一个数据块时触发 onResponse: (response) { // response 是完整的响应消息对象 console.log(收到AI回复:, response.text); // 例如可以触发通知、分析回复内容等 if (response.text.includes(很高兴)) { triggerPositiveFeedback(); } }, // 整个响应完成流结束时触发 onResponseFinished: (messages) { console.log(本次对话完成历史记录:, messages); // 可以在这里将对话历史保存到数据库 saveConversationToDB(messages); }, // 发生错误时触发 onError: (error) { console.error(聊天出错:, error); // 显示自定义的错误提示UI showCustomErrorToast(error.message); }, // 用户上传文件时触发 onFileUpload: (file, data) { console.log(文件已上传:, file.name); // data 可能是Base64字符串或File对象 // 可以在这里进行文件预处理或验证 if (file.size 10 * 1024 * 1024) { // 10MB alert(文件过大); return false; // 阻止上传 } } } });通过组合使用这些事件你可以实现诸如“发送前审核”、“对话状态持久化”、“基于回复的自动化任务触发”等高级功能让聊天组件深度融入你的应用业务流程。5. 高级功能与界面深度定制5.1 多模态支持文件上传、预览与交互deep-chat对文件的支持非常完善。通过files配置项你可以轻松开启文件上传功能。const deepChat new DeepChat({ // ... 其他配置 files: { maxNumberOfFiles: 5, // 最多同时上传文件数 allowedFormats: .png,.jpg,.jpeg,.gif,.pdf,.txt,.csv, // 允许的格式 maxFileSize: 20, // 单个文件最大MB数 // 文件预览配置 preview: { images: true, // 图片预览 text: true, // 文本文件预览 pdf: true // PDF预览需要浏览器支持 }, // 文件上传处理方式 handler: async (files, methods) { // files: 用户选择的文件数组 // methods: 包含 uploadFile, onNewMessage 等方法 // 这里可以实现自定义上传逻辑比如上传到云存储 for (const file of files) { const cloudUrl await uploadToCloudStorage(file); // 上传成功后调用方法将文件信息作为消息插入聊天 methods.onNewMessage({ files: [{ type: file.type, name: file.name, url: cloudUrl }], role: user }); } } } });当用户上传图片后聊天界面内会直接显示缩略图。对于PDF和文本文件组件会尝试提取并显示部分内容作为预览。发送时文件数据Base64格式或URL会被包含在消息对象中一同发送给你的后端服务。你的后端AI模型如GPT-4V可以解析这些数据并生成针对文件内容的回复。5.2 界面主题与样式完全重写如果你觉得默认的界面风格与你的产品不符deep-chat提供了从简单覆盖到完全重写的多种样式定制方案。1. 通过style配置进行主题覆盖这是最简单的方式可以修改主要的颜色、间距和字体。const deepChat new DeepChat({ // ... 其他配置 style: { // 修改聊天窗口整体样式 border: 1px solid #e0e0e0, borderRadius: 12px, // 修改颜色主题 background: #f9f9f9, chatContainer: { background: #ffffff }, textInput: { background: #f0f0f0, border: 1px solid #ccc, placeholderColor: #888 }, // 修改消息气泡样式 userMessage: { background: #007AFF, textColor: #ffffff }, aiMessage: { background: #E8E8ED, textColor: #000000 }, // 修改按钮样式 submitButton: { svg: { style: { fill: #007AFF // 发送按钮颜色 } } } } });2. 通过CSS类名深度定制deep-chat为内部几乎所有元素都赋予了有意义的CSS类名。你可以通过全局CSS样式表进行更精细的控制。打开浏览器开发者工具检查聊天窗口的元素你会看到类名如.deep-chat-message,.deep-chat-user-message,.deep-chat-input等。通过覆盖这些类的样式你可以实现几乎任何设计。/* 在你的全局CSS文件中 */ .deep-chat-container { box-shadow: 0 4px 20px rgba(0,0,0,0.1); } .deep-chat-user-message .deep-chat-message-content { border-top-right-radius: 4px !important; /* 调整用户消息气泡圆角 */ } .deep-chat-ai-message .deep-chat-avatar { /* 替换AI头像 */ background-image: url(/path/to/your-ai-avatar.png) !important; background-size: cover; } .deep-chat-text-input { font-family: Microsoft YaHei, sans-serif !important; /* 修改输入框字体 */ }3. 自定义组件渲染对于追求极致控制的场景你可以使用customComponents配置来完全接管某个部分的渲染。例如自定义AI消息的渲染方式const deepChat new DeepChat({ // ... 其他配置 customComponents: { aiMessage: (message, stream) { // message: 消息对象 // stream: 是否为流式消息的布尔值 const element document.createElement(div); element.className my-custom-ai-message; element.innerHTML div classcustom-header strong我的AI助手/strong small${new Date().toLocaleTimeString()}/small /div div classcustom-content${message.text}/div ${message.files ? div附带了 ${message.files.length} 个文件/div : } ; return element; } } });通过这种方式你可以打破组件自带的样式约束实现与你的应用设计系统完全一致的视觉效果和交互逻辑。6. 性能优化、调试与常见问题排查在实际项目集成中你可能会遇到一些挑战。以下是我在多个项目中总结的经验和常见问题的解决方案。6.1 性能优化要点对话历史管理默认情况下deep-chat会将所有历史消息随每次请求发送给后端。在长对话中这会导致请求体巨大、令牌消耗剧增。优化方案是在后端进行历史管理。前端可以配置requestBodyLimits只发送最近N条消息或者更常见的做法是前端发送当前消息和必要的上下文ID由后端从数据库中检索相关的历史对话。requestBodyLimits: { // 不发送完整的messages历史改为发送当前消息和会话ID override: { message: {{message}}, // 当前用户消息 session_id: {{sessionId}} // 你维护的会话ID } }后端根据session_id获取历史记录再拼接到本次请求中发给AI模型。流式响应与用户体验务必开启stream: true。非流式响应会让用户等待整个AI回复生成完毕才能看到内容体验很差。流式响应可以带来“打字机”效果即使总生成时间相同感知上的响应速度也快得多。确保你的后端也能正确处理和转发流式数据。文件上传优化对于大文件如图片、PDF在前端进行Base64编码会显著增加内存占用和请求体大小。更好的做法是使用files.handler将文件先上传到对象存储如AWS S3、Cloudinary然后只将文件的URL发送给后端AI。AI模型如GPT-4V通常支持通过URL读取文件内容。组件实例化与销毁在单页面应用SPA中如果聊天组件位于一个会被动态挂载/卸载的页面或路由中务必在组件卸载时清理资源。虽然DeepChat类没有显式的destroy方法但你可以移除其挂载的DOM容器并确保没有遗留的事件监听器以防止内存泄漏。6.2 常见问题与排查技巧下面是一个快速排查指南涵盖了集成时最常见的一些“坑”。问题现象可能原因排查步骤与解决方案聊天窗口不显示或空白1.containerDOM元素未找到或未渲染。2. CSS样式未正确加载。3. 脚本执行顺序错误。1. 确保container对应的DOM元素在初始化时已存在于页面中。在React/Vue中使用ref并在组件挂载后初始化。2. 检查浏览器控制台是否有CSS加载错误。确保样式文件路径正确。3. 将初始化脚本放在containerDOM元素之后或放在DOMContentLoaded事件中执行。发送消息后无反应无错误提示1. 后端接口未正确响应。2. 请求被CORS策略阻止。3. 后端响应格式不符合deep-chat预期。1. 打开浏览器开发者工具的“网络(Network)”标签查看发送的请求是否成功状态码200以及响应体是什么。2. 检查控制台CORS错误。确保后端配置了正确的CORS头Access-Control-Allow-Origin等。3. 对于customStream后端必须返回SSE格式Content-Type: text/event-stream且每个数据块以data:开头以两个换行符\n\n结尾。流式响应不显示“打字机”效果一次性全部出现1. 后端没有返回真正的流而是返回了完整JSON。2. 前端配置stream: false或未设置。1. 确认后端AI服务调用如调用OpenAI API时设置了stream: true并且后端正确地将流式数据块转发给了前端。2. 在前端deep-chat配置中明确设置stream: true。文件上传失败1. 文件格式或大小超出限制。2. 自定义handler函数有错误或未调用成功回调。3. 后端接口不支持文件上传的数据格式。1. 检查files.allowedFormats和maxFileSize配置。2. 在files.handler函数中添加console.log和try-catch确保逻辑正确并调用了methods.onNewMessage。3. 检查网络请求看发送到后端的数据格式可能是FormData或Base64。确保后端能解析该格式。样式自定义不生效1. CSS选择器优先级不够。2. 样式被组件内联样式覆盖。3. 自定义样式加载时机晚于组件样式。1. 使用更高特异性的CSS选择器或添加!important谨慎使用。2. 尝试通过配置对象的style属性进行修改这是官方推荐的方式。3. 确保你的自定义CSS在deep-chat样式之后加载。在React/Vue中组件重复渲染或状态异常1. 在每次渲染时都创建了新的DeepChat实例。2. 事件回调函数每次渲染都重新创建导致依赖对比失效。1. 使用useRef(React) 或ref(Vue) 保存实例并仅在组件挂载时初始化一次。2. 使用useCallback(React) 或computed/methods(Vue) 来稳定事件回调函数的引用。调试黄金法则打开浏览器开发者工具。90%的问题可以通过查看控制台(Console)的错误信息和网络(Network)标签的请求/响应详情来定位。重点关注请求的URL、方法、头部、载荷以及响应的状态码和内容。7. 从项目到产品扩展思路与最佳实践当你熟练使用deep-chat的基本功能后可以考虑以下扩展方向将其从一个聊天组件升级为产品的核心交互功能。1. 实现多轮对话与上下文管理对于复杂的客服或辅导场景需要维护跨会话的上下文。最佳实践是在后端维护一个“会话(Session)”表。前端在初始化聊天时创建一个会话ID或使用用户ID。每次对话前端发送消息和会话ID。后端根据会话ID从数据库取出最近N条历史消息拼接后发送给AI并将新的问答对保存回数据库。这样既能保证上下文连贯又能控制每次请求的令牌数。2. 集成知识库与检索增强生成RAG让AI回答你私有的文档内容。架构如下用户提问。前端将问题发送给你的后端。后端使用问题文本在向量数据库如Pinecone, Weaviate中检索相关的文档片段。后端将检索到的片段作为“上下文”连同用户问题一起构造Prompt发送给AI模型如GPT。将AI生成的、基于你知识库的答案流式返回给前端deep-chat。你可以在AI消息中附加一个“引用来源”的折叠区域显示检索到的文档片段标题增强可信度。3. 构建多功能AI助手面板利用deep-chat的可扩展性你可以将其改造成一个控制面板。例如自定义工具按钮在输入框旁添加“总结”、“翻译”、“生成SQL”等按钮点击后自动在输入框中填入预设的Prompt模板。侧边栏集成将聊天组件与一个文档列表、代码编辑器或仪表盘并列。实现“选中一段代码 - 点击‘解释’按钮 - 在聊天窗口获得解释”的流畅体验。这可以通过deep-chat的methods对象通过ref获取实例后调用来实现例如deepChatRef.addMessage({text: ‘解释这段代码’ selectedCode, role: ‘user’})。消息类型扩展除了文本和文件你可以通过自定义渲染在AI消息中嵌入交互式图表、按钮或表单。例如AI回复“这是您本月的销售数据图表”后面跟着一个由ECharts生成的动态图表。安全与生产最佳实践清单API密钥永不前端化重申所有第三方AI服务的API密钥必须通过你的后端服务器中转。实施速率限制在你的后端代理接口上对每个用户/IP实施请求速率限制防止滥用。输入输出过滤与审核在后端对用户输入和AI输出进行必要的敏感词过滤、内容审核确保合规。错误友好处理利用onError事件将网络超时、服务不可用、内容违规等错误转化为用户能理解的友好提示。监控与日志记录所有对话的元数据非敏感内容用于分析使用情况、优化模型表现和排查问题。渐进式增强对于不支持SSE的旧浏览器提供降级方案例如在前端配置中检测并切换到非流式模式stream: false后端也返回完整的JSON响应。deep-chat项目就像一个功能强大的乐高积木它提供了构建现代对话式AI应用所需的大部分基础零件。你的工作不再是从零开始烧制砖块而是如何将这些零件巧妙地组装起来并连接到你自己的业务逻辑和基础设施上。它极大地压缩了从想法到原型的时间让你能更专注于创造独特的对话体验和业务价值。

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