首页/新闻资讯/正文详情

基于私有知识库的LLM智能客服问答系统:从RAG到私有化部署实战

发布时间:2026/9/25 23:05:29 来源:云帆数科 栏目:资讯中心
基于私有知识库的LLM智能客服问答系统:从RAG到私有化部署实战
简介这套资源是基于企业私有知识库的大语言模型智能客服问答系统支持私有化部署主要面向企业技术团队、AI应用开发者以及需要搭建内部智能问答平台的管理者尤其适合对数据安全有较高要求的场景。资源包共1302个文件以Vue/JavaScript前端工程、Go后端服务、SQL数据库脚本、JSON/YAML配置为主并包含Docker部署脚本和客户端SDK整体约34MB目录划分为管理后台、移动端、服务端等模块便于定位与二次开发。系统功能覆盖问答全流程一键接入全球20多种主流大模型仅需配置API Key自动分段、QA分割、CSV导入等多种数据注入方式并对文本自动预处理和向量化可视化界面降低使用门槛可快速完成知识库与问答机器人的创建。此外还支持H5链接、网站嵌入、桌面客户端等渠道适配企业客服、内部知识检索、智能导购等场景。目前已有596人学习下载资源内含完整源码、配置与部署文件能够帮助开发者理解从知识库构建、向量检索到模型调用和前端展示的完整实现链路。1. 私有知识库驱动智能客服为什么直接对着一个大模型聊天行不通企业如果想上一套智能客服机器人最容易踩的坑是直接把一个大语言模型接进对话框结果模型对自家产品一问三不知。原因不是模型不强而是它的知识来自公开语料根本没看过你内部的 FAQ、产品手册、售后工单。基于企业私有知识库的 LLM 智能客服问答系统做的就是一件事把企业内部文档切成知识点、向量化存入知识库用户提问时先检索再让 LLM 生成回答还能整条链路放在内网私有化部署不依赖公网 API。它适合手里有大量文档沉淀、对数据安全敏感、又不想每次改个促销政策就重新训练一次模型的团队。2. RAG 还是微调智能问答系统的两条路线怎么选2.1 微调为什么解决不了「知识随时变」的问题很多团队一上来就想微调觉得只有把知识写进模型权重才算「私有化」。但微调解决的是风格、格式、专业术语表达这一类问题不是知识更新问题。客服场景的知识特点是高频少量更新新活动规则、产品参数变更、售后政策调整每周都有。而一次微调从准备语料、标注、训练到验收周期按周算成本按 GPU 小时算等模型上线知识又变了。更麻烦的是微调后的模型在内部知识细节上照样会一本正经地编答案因为本质还是靠概率生成没有外部约束帮它「对答案」。所以我的判断是通用客服问答优先走 RAG只有当你的回复有极其固定的句式要求比如工单自动回复、审核意见生成才值得单独微调一个专用小模型。维度RAG微调知识更新改文档、重刷索引即可重新训练、验证、上线幻觉控制检索片段约束可溯源靠权重记忆难约束成本低文档处理向量库高训练与人工标注适用场景知识密集、更新频繁固定输出风格、领域语言2.2 RAG 检索增强生成的工作原理与适用边界RAG 的全链路不复杂用户提问进来先把问题向量化到知识库里召回相关片段再把片段和问题拼进 Prompt 交给 LLMLLM 基于检索到的材料组织答案。关键点是「答案由检索决定不由模型记忆决定」所以知识更新只需重刷索引不需要碰模型。但 RAG 不是万能的。检索不准答案必然不准多跳推理类问题比如「上个月买的 XX 型号现在能不能以旧换新」需要跨多个文档片段推理单次检索往往覆盖不全还有一类问题是文档本身没有答案那 RAG 也无能为力。很多人把知识库简单理解成一个内部 wiki但 wiki 只是素材堆RAG 要的是能按语义召回的知识切片切片粒度、索引质量直接决定问答效果。说白了RAG 的瓶颈在检索侧不在模型侧。2.3 私有化部署的硬件与模型选型参考既然标题里写了「支持私有化部署」模型选型就得先落地。我一般按三个层次考虑第一层是 embedding 模型负责把文档和问题变成向量这类模型很小比如 bge-m3几百 MB 量级CPU 都能跑单独装个容器即可第二层是生成 LLM客服场景追求响应速度和稳定性常见做法是选 7B 到 14B 的开源权重模型比如 Qwen 系列或 DeepSeek 系列量化后 14B 模型大约需要 10GB 到 14GB 显存第三层是向量库数据量在百万级以内Qdrant、pgvector 都够用不需要一上来就上重型分布式方案。选型的核心矛盾是「效果」和「硬件成本」。7B 模型在中轻度客服场景足够但面对复杂多轮对话会显得生硬14B 效果明显更好但需要一张 24G 显存的显卡才能保证并发响应。我的建议是先用 7B 跑通流程再根据压测结果决定是否升级不要第一步就把硬件拉满。这里插一句Agent 和 LLM 的区别在这个场景里也值得拎清楚纯 LLM 是「你问一句我答一句」Agent 是「模型自主决定调用哪些工具、查哪些数据」。客服问答初期按 RAG 链路做即可等你要做「查订单、退款、转人工」这类动作时再引入 Agent 编排不迟。3. 系统架构与知识库构建从文档入库到可检索的知识切片3.1 系统模块拆解从文档入库到答案输出整套系统按数据流向拆成五层每一层都有独立职责。文档接入层负责收取 PDF、Word、Markdown、Excel 等原始资料处理层负责清洗、分段、提取元数据存储层负责把向量和原文写入向量库检索层负责在收到问题时做召回和排序问答服务层负责拼 Prompt、调 LLM、把答案返回给客服工作台。模块拆分的价值在于每一层都能独立替换。文档格式变了只改处理层向量库想换只动存储层模型升级只影响问答服务层。我见过不少项目把全部逻辑写在一个脚本里改一个参数要重跑全流程维护成本很高。私有化部署尤其要把服务拆开因为内网环境里各模块的扩缩容节奏不一样embedding 服务可能常年空闲而 LLM 服务高峰期需要多个实例。3.2 知识库清洗与分段chunk 大小、重叠与元数据知识库建设的第一个关键动作是清洗这一步最费人力但最能决定上限。原始 PDF 转出来的文本经常带页眉页脚、目录页码、表格乱码直接切分的话噪声会被当成知识喂给模型。我的习惯是先做一轮规则清洗删掉重复行、统一换行符、把表格转成「字段: 值」的文本行再交给分段逻辑处理。分段参数是第一个需要认真调的点。我常用的起点是 chunk_size 400 到 600chunk_overlap 80 到 120。设置重叠是为了避免一个完整的知识点被硬生生切成两段导致检索时哪段都不完整。分隔符优先级建议按「段落 换行 句号」来排能顺着自然语义切分。参数推荐值说明chunk_size400-600按字符太大则语义混杂太小则上下文不足chunk_overlap80-120保留跨段语义衔接separators\n\n、\n、。、优先按自然边界切元数据source、updated_at、permission引用溯源和权限隔离的基础元数据这一步很多人会跳过但后面做引用溯源和权限隔离全靠它。每条切片至少带三个字段来源文档编号、最后更新时间、可见权限组。客服场景里普通客服和资深客服能看的知识范围不同未发布的政策文档不该被检索到这些都要靠元数据在检索层拦截。3.3 向量化与混合检索召回率不够时怎么补向量化就是把文本变成高维向量语义相近的内容在向量空间里距离更近。中文场景下bge-m3、m3e 这类开源 embedding 模型是主流选择bge-m3 在长文本和中英文混合场景表现更稳。这里有个常见误用直接把对话问题拿去检索问题里的口语化表达会干扰召回。我一般会在检索前加一步查询改写比如「XX 怎么退」改写成「XX 的退货流程」召回效果会明显提升。单靠向量检索在专有名词密集的场景下召回率会掉。客服文档里有大量型号、地名、缩写向量语义匹配容易把这些关键 token 模糊掉。所以我会做混合检索向量召回 20 条关键词召回BM2520 条合并去重后再用 rerank 模型排序取 top 5 喂给 LLM。rerrerank 是 cross-encoder 结构把候选片段和问题一起过一遍模型算相关度比纯 embedding 距离准得多。如果预算有限rerank 可以用一个较小的 cross-encoder 模型对整体资源占用不大。3.4 密钥与权限私有化部署里最容易漏的一环私有化部署不等于安全很多人把模型搬进内网就觉得万事大吉结果 API 密钥硬编码在配置文件里跟着代码包一起分发。使用 LLM 时防止密钥等鉴权信息泄露第一原则是密钥不落盘、不进代码仓库统一从环境变量或密钥管理服务读取第二原则是做一个轻量模型网关所有外部系统只能碰网关不能直连模型服务网关负责鉴权、限流、审计。客服问答场景还要额外做一层知识权限隔离。检索层必须按用户组过滤知识切片比如普通用户组只能看到已发布 FAQ内部测试组才能看到未发布草案。如果这一层不做用户多问几个刁钻问题模型就可能把内部流程、审核标准这些不该给外部看的内容带出来。权限过滤放在检索层比放在 Prompt 提示里可靠检索层是一条硬性的数据通路控制Prompt 只是软约束。4. 核心代码复现知识检索与问答链路的本地实现4.1 先搭向量检索文档切分与向量库写入最小可用实现我按三段来写文档切分入库、问答链路、HTTP 服务。第一步是把清洗后的文档切成切片并写入向量库。下面这段是切分逻辑用 RecursiveCharacterTextSplitter 按优先级切优先保证语义完整。# 文档切分把清洗后的原始文本切成知识切片 from langchain.text_splitter import RecursiveCharacterTextSplitter text_splitter RecursiveCharacterTextSplitter( chunk_size500, # 每片目标长度按字符计中文场景经验值 chunk_overlap100, # 相邻切片重叠100字避免切断语义 separators[\n\n, \n, 。, ], # 按段落换行句号逐级切 length_functionlen, # 直接用字符长度不必转token先跑通再优化 ) chunks text_splitter.split_text(doc_text)chunk_size 和 chunk_overlap 是需要联调的参数。500/100 的搭配适合产品手册这类陈述性文本如果文档以短问答为主可以缩到 300/60让每条切片更像一个独立 QA 对。切分完成后写入向量库这里以 Qdrant 为例# 向量化并写入 Qdrant每条切片带上元数据 from sentence_transformers import SentenceTransformer from qdrant_client import QdrantClient, models model SentenceTransformer(BAAI/bge-m3) client QdrantClient(urlhttp://127.0.0.1:6333) # Qdrant 默认端口 client.create_collection( collection_namefaq_kb, vectors_configmodels.VectorParams(size1024, distancemodels.Distance.COSINE), ) # 分批写入避免一次性把全部向量压进内存 batch [] for idx, (chunk, vec) in enumerate(zip(chunks, model.encode(chunks, batch_size32))): batch.append(models.PointStruct( ididx, vectorvec.tolist(), payload{chunk: chunk, source: product_manual_v3.md, permission: published} )) if len(batch) 500: client.upsert(collection_namefaq_kb, pointsbatch) batch [] client.upsert(collection_namefaq_kb, pointsbatch)注意 bge-m3 输出的向量维度是 1024和别的 embedding 模型不一定兼容换模型时向量库要么重建要么按模型名分集合存放。batch_size 按 32 编码、每 500 条写入一次是兼顾内存和写入频率的折中数据量大时可以调到 256/2000。payload 里的 permission 字段是后面做知识权限拦截的关键建议从一开始就维护好。4.2 再写问答链路检索、拼装 Prompt、流式输出检索和生成是两步先基于问题向量召回候选片段再把片段拼成 Prompt。这里的关键是不要让模型拿到全部候选只喂 rerank 后的 top 5上下文越干净回答越稳。# 问答链路召回 重排 生成核心函数只做两件事 def retrieve(query: str, top_k: int 5): qvec model.encode(query).tolist() hits client.search( collection_namefaq_kb, query_vectorqvec, limittop_k * 4, # 先召回20条给重排留余地 query_filtermodels.Filter( must[models.FieldCondition(keypermission, matchmodels.MatchValue(valuepublished))] ) ) # 实际项目里这里会接一个 cross-encoder 重排模型 # 没有重排条件时直接取相似度最高的 top_k 也可以先跑通 return hits[:top_k] def build_prompt(query: str, hits) - str: context \n\n.join( f[来源:{hit.payload[source]}] {hit.payload[chunk]} for hit in hits ) prompt f你是企业客服助手。只依据下面的知识片段回答用户问题不要编造。 如果知识片段中没有答案直接回复抱歉这个问题我暂时无法回答请转人工处理。 {context} 用户问题{query} 回答时先给结论再给依据。 return prompt检索函数里我用 4 倍召回再截断是为了给 rerank 留出候选池。没有 rerank 模型的情况下直接按向量相似度取 top 5 也能跑通但要把相似度阈值卡在 0.7 左右低于阈值宁可拒答也不要硬答。Prompt 里显式声明「没有答案就转人工」这是控制幻觉最简单有效的一句约束。生成侧我用 OpenAI 兼容协议调内网模型这样不管后端是 vLLM 还是 Ollama接口都不用改# 生成temperature 调低流式输出优先 from openai import OpenAI client OpenAI(base_urlhttp://127.0.0.1:8000/v1, api_keylocal-inference) # 关键参数temperature0.1 让输出尽量贴检索材料 # streamTrue 让首字尽快到达客户端客服体验会好很多 response client.chat.completions.create( modelqwen2.5-14b-instruct, messages[ {role: system, content: build_prompt(query, hits)}, ], temperature0.1, streamTrue, ) for chunk in response: delta chunk.choices[0].delta.content if delta: yield delta # 生产环境用 SSE 推给前端temperature 设 0.1 而不是 0是为了让模型在完全确定的情况下输出不至于过度随机同时保留一点在重复表达时换个说法的余地。流式输出不是可选项内网模型首字延迟经常在 3 秒以上不流式的话用户会以为系统挂了。4.3 接入统一接口给客服工作台留一个 HTTP 服务问答链路独立成服务后客服工作台、APP、企微机器人都是它的客户端。用 FastAPI 包一层 HTTP 接口请求里带上用户身份检索时就按身份过滤权限组。# HTTP 服务把问答链路封装成 /qa 接口 from fastapi import FastAPI, Request from pydantic import BaseModel app FastAPI() class QARequest(BaseModel): query: str # 用户问题 user_group: str customer # 权限组默认普通客户 app.post(/qa) def qa(req: QARequest): hits retrieve(queryreq.query, permissionreq.user_group) # 权限组映射到 payload 里的 permission 字段 # customer - publishedstaff - publishedinternal return {answer: .join(answer_stream(req.query, hits)), hits: [h.payload for h in hits]}返回里带上 hits 是为了让客服坐席能看到答案依据点开就能跳回原文。这一步对实际使用至关重要坐席只有看到引用来源才敢把机器人的答案直接发给客户这也是整个知识库问答系统能被业务部门接受的关键。服务拆出来之后模型升级、知识库重建都不会影响客户端接口。5. 私有化部署避坑指南五条真实踩坑记录5.1 现象日志里报 provider rejected the request schema or tool payload刚接上工具调用时日志里频繁出现LLM request failed: provider rejected the request schema or tool payload一问一个准整个服务直接不可用。原因是启用了 function calling但传给模型的 tools schema 格式不规范要么 JSON Schema 里缺了必要的 type 字段要么参数名和实际调用 payload 不一致内网模型对这类错误的容错率比公网 API 低得多。解决分两步先关掉 tools 直连模型验证基础链路再逐个启用在用的 schema。确认某个工具确实需要再上不要为了炫技把系统做成全工具调用。5.2 现象把检索到的 10 篇文档全塞进上下文回答开始胡言乱语最初为了「不遗漏信息」检索时把 top_k 调到了 10结果模型输出明显变差开始出现前后矛盾、逻辑混乱的句子。这跟 Dify 里 SQL 查询内容太多导致 LLM 返回不稳定是同一个原理检索结果堆得太满模型注意力被无关片段稀释真正关键的信息反而被淹没。解决方法是强制限制输入片段数top_k 控制在 3 到 5 条并且每条片段长度控制在 500 字以内。宁可有漏召回也不要让上下文变成一锅粥。5.3 现象知识库刚上线命中率很高跑了一周后明显下降上线第一周效果不错一周后同样的问题开始答非所问。排查后发现是知识更新流程有漏洞运营修改了产品手册增量脚本只追加新切片没有清理旧的同源切片结果同一个知识点在库里共存七八个版本检索时旧版本频繁占坑。解决方法是给每条切片打上source version组合标识更新时先按 source 删除全部旧切片再写入新切片。从那次之后我每次重建知识库都会做一次全量计数校验确保库里不存在同源多版本。5.4 现象内网部署后首字延迟居高不下客服以为服务挂了模型部署在内网按理说网络开销很小但首字延迟稳定在 8 秒以上。查下来是 embedding 模型和 LLM 共用一张 GPU 卡客服高峰期检索请求把显存占满LLM 推理触发显存换页性能断崖式下跌。解决方法是把 embedding 服务放到纯 CPU 容器里跑bge-m3 在 CPU 上的延迟完全可以接受同时给 LLM 推理服务加并发限制超出并发直接排队配合流式输出把首字体验拉到 2 秒以内。5.5 现象客服机器人被用户套话回复里带出了内部审批流程上线后收到业务部门投诉有用户通过连续追问套出了未发布的促销政策和内部审批流程。原因有两层知识库建的时候没给切片打权限标签全部默认公开Prompt 里又写了「尽可能提供详细信息」模型在诱导下把内部信息也吐了出来。解决方法是双管齐下检索层按用户组硬过滤未发布文档压根不进候选集Prompt 层加拒答规则涉及内部流程、价格策略、审批标准的提问直接转人工。权限过滤放检索层是数据通路的硬控制Prompt 提示只是最后的兜底。6. 落地收尾用回归测试集把问答质量锁死系统跑通后最大的风险不是上线而是后续每一次改 Prompt、调 chunk 参数、换 embedding 模型都可能让一批问题从答对变成答错。所以我会在项目收尾前构建一套回归测试集把问答质量锁死。测试集从真实客服工单里挑抽样 100 条问题覆盖售前咨询、售后故障、政策查询、多轮追问四类每条标注标准答案和允许引用的知识来源。然后写一个评估脚本每天自动把这 100 条问题跑一遍按三个维度打分答案是否命中标准答案要点、是否有引用来源、是否出现拒答误判。分数变化超过阈值就告警逼着你去查是哪次改动引起的。# 回归测试逐条请求 /qa 接口并记录打分结果 # 结果落到 qa_regression_YYYYMMDD.csv用 diff 对比每天得分 for q in $(cat test_questions.txt); do curl -s -X POST http://127.0.0.1:8000/qa \ -H Content-Type: application/json \ -d {\query\: \$q\, \user_group\: \customer\} | \ python3 score_answers.py qa_regression_$(date %Y%m%d).csv done从那以后我每次改知识库或调 Prompt都强制自己先跑一遍回归基线再上线测试环境改动前后分数对比不过关就回滚。数据不比感觉可靠100 条问题一条条翻比任何「我觉得效果变好了」都有说服力。这套思路也是这份资源里最值得带走的部分希望帮到你。本文还有配套的精品资源点击获取

相关推荐

MaaEnd节点测试教程:如何用测试用例验证识别稳定命中
MaaEnd节点测试教程:如何用测试用例验证识别稳定命中

MaaEnd节点测试教程:如何用测试用例验证识别稳定命中 【免费下载链接】MaaEnd MaaEnd 终末地小助手:基于视觉 AI 的「明日方舟:终末地」自动化工具 项目地址: https://gitcode.com/gh_mirrors/maa/MaaEnd MaaEnd 是基于视觉 AI 的《明… · 2026/9/25 23:05:29

Apache Pulsar Functions 快速入门实战:从本地运行到集群部署
Apache Pulsar Functions 快速入门实战:从本地运行到集群部署

消息队列后端流处理 【免费下载链接】pulsar Apache Pulsar - distributed pub-sub messaging system 项目地址: https://gitcode.com/gh_mirrors/pulsar28/pulsar 点击查看 免费下载 本指南以 Apache Pulsar 的 Pulsar Functions 轻量级流处理模型为主题&#xff… · 2026/9/25 23:05:29

Dora 分布式部署指南:多机集群、标签调度、滚动升级与 systemd 运维完整手册
Dora 分布式部署指南:多机集群、标签调度、滚动升级与 systemd 运维完整手册

Dora 分布式部署指南:多机集群、标签调度、滚动升级与 systemd 运维完整手册 【免费下载链接】dora DORA (Dataflow-Oriented Robotic Architecture 面向数据流的机器人架构) 是为 AI 与具身智能机器人打造的高性能开发框架,以数据流范式重构开发逻辑&am… · 2026/9/25 23:05:23

传统机器学习图像分类实战:小样本、低算力、高可解释性方案
传统机器学习图像分类实战:小样本、低算力、高可解释性方案

简介:本资源是一套面向机器学习初学者与图像处理开发者的实践型工具包,聚焦SVM与贝叶斯算法在图像分类任务中的工程实现,解决传统方法中特征提取、模型训练与效果对比等关键环节的落地难题。压缩包共216个文件,含102幅BMP格式样本… · 2026/9/25 23:37:45

从0到1掌握DeerFlow:字节跳动开源AI Agent框架,用TaoToken统一Key打通企业级智能体平台!
从0到1掌握DeerFlow:字节跳动开源AI Agent框架,用TaoToken统一Key打通企业级智能体平台!

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 23:37:26

Cygwin下编译运行Varnish Cache实战指南
Cygwin下编译运行Varnish Cache实战指南

简介:本资源是专为Windows开发者与系统管理员定制的Cygwin平台Varnish Cache适配方案,解决Varnish在原生Windows环境无法直接运行的核心兼容性问题。项目通过针对性修补源码(含文件路径、网络I/O、线程及信号处理等关键模块)&… · 2026/9/25 23:37:19

MinIO Java分片上传实战:断点续传与高并发优化
MinIO Java分片上传实战:断点续传与高并发优化

简介:本资源是一套面向Java后端开发者与云存储集成工程师的MinIO高性能文件上传实战示例,聚焦分片上传与断点续传两大核心场景,解决大文件稳定上传、网络中断恢复及服务端资源优化等实际问题。压缩包共13个文件,含7个Java类&#… · 2026/9/25 23:37:19

Netdiscover实战:用ARP扫描快速摸清局域网设备
Netdiscover实战:用ARP扫描快速摸清局域网设备

简介:Netdiscover是一款开源的ARP网络扫描工具,主要面向网络管理员与安全测试人员,用于在无线网络或缺乏DHCP的环境中快速发现活跃设备、获取IP与MAC地址并推测网络拓扑。这份源码包为netdiscover-0.3-pre-beta7,共包含39个文件&a… · 2026/9/25 23:37:13

OpenCV实时人眼识别与眨眼检测实战:基于68点关键点的鲁棒方案
OpenCV实时人眼识别与眨眼检测实战:基于68点关键点的鲁棒方案

简介:本资源是一套基于Python与OpenCV实现的实时人眼识别、眨眼及闭眼检测的完整实践方案,面向计算机视觉初学者、AI课程设计者及嵌入式视觉应用开发者,解决人脸关键区域动态行为分析的实际需求。压缩包共61个文件,含37个核心Pyth… · 2026/9/25 23:37:06

数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)
数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31

创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31

MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码