新闻详情

新闻详情

首页 / 资讯中心 / 详情

基于大模型的多平台智能客服系统架构与部署实践

发布时间:2026/10/2 14:30:05来源:尧图网络
基于大模型的多平台智能客服系统架构与部署实践
简介这套基于大模型的智能对话客服工具专为多平台运营与客服场景打造覆盖微信、千牛、哔哩哔哩、抖音/抖音企业号/抖店、微博、小红书、知乎等常见渠道适合需要统一管理客户咨询、提升回复效率的运营人员及开发者。包体非常精简共151个文件压缩后仅858KB以ts/tsx/js等前端工程文件为主辅以json配置、png图标、md文档及样式文件便于直接部署或在此基础上二次开发。资源内置可自定义的预设回复、ChatGPT接口接入、图片与二进制文件发送能力并支持上传知识库文件构建专属数字分身或私域助手各平台拥有独立插件系统可访问操作系统和互联网资源便于定制企业级AI应用。目前已吸引558人查看学习对于想快速搭建多平台智能客服或研究大模型客服应用架构的读者是一份轻量而完整的参考工程。1. 这个标题要解决的问题不是“聊天机器人”是“多平台客服收口”“基于大模型的智能对话客服工具支持微信、千牛、哔哩哔哩、抖音企业号、抖音、抖店、微博聊天、小红书专业号运营、知乎等平台接入”这句话真正要命的地方不在“大模型”而在“多平台”。单一平台的机器人你只要写好一套回复逻辑就够了一旦要同时服务微信、千牛、哔哩哔哩、抖音企业号、小红书和知乎你面对的不再是聊天功能而是接口形态、权限限制、限流策略、会话体系、知识库复用、人工转接全部要一起设计的问题。我见过一个小团队五家店铺三个内容账号每天几百条重复咨询外包客服换了一茬又一茬问题不是回答不了而是同样的话要在五个后台各说一遍。这套方案的价值就是把各平台的消息收进同一个大模型对话引擎用一套知识库和话术库在官方开放接口的合规范围内把高频重复问题自动顶住把复杂问题交给人工。适合电商运营、自媒体接单、多平台投放团队也适合想验证大模型客服性价比的中小公司。下面按选型、接入、部署、避坑的顺序把整条路讲透。2. 核心选型与架构大模型、会话引擎与消息网关怎么分工要先想清楚一件事这不是“给每个平台写一个机器人”而是一个统一对话服务对接多个平台的入口。我习惯把系统拆成三层。最底层是模型与推理负责把文本变成回复中间是对话引擎负责会话上下文、知识检索、话术兜底和人工转接最上层是消息网关负责把微信、千牛、哔哩哔哩、抖音、小红书这些平台的回调包统一成一个内部消息结构。三层各改各的平台新增时才不会全局返工。2.1 模型选型API优先还是本地部署客服场景有它自己的特征每条消息短、多轮对话有截断、用户等回复的耐心有限、并发有早晚高峰。考虑到这几条除非你有硬性数据合规要求否则第一选择是云端API而不是本地部署。云API按token付费弹性好效果稳定团队不用养GPU也不用处理推理服务挂了没人救的问题。一个客服机器人通常一天处理几千轮对话云API的成本是可以估量的而本地部署一台能跑得动的消费级显卡只能勉强满足低并发一张工业级显卡的价格和电费对中小团队并不友好。什么时候该本地化两种情况一是业务聊天记录和商品知识库属于敏感数据不能被模型厂商看到二是调用量巨大且稳定比如日均百万轮按token计价远超硬件投入。可以做一张选型表按自己的条件去套判断维度云API本地部署数据边界对话内容经过厂商需接受隐私条款全部留在内网单轮成本按token计费量大有折扣固定电力与折旧并发能力弹性扩容峰值不慌受显存和推理框架瓶颈限制运维成本几乎为零需处理重启、显存泄漏、版本升级适用规模中小团队起步高调用量或强合规要求选型时我建议先去调用云API跑两周把日均token、峰值并发、转人工比例三个数据拿到再决定要不要本地化。刚开始就上本地部署大概率会陷进“模型效果不如线上API”和“显卡不够用”两个泥潭。大模型调用还要注意三个参数它们决定回复的稳定性。做客服服务我通常把 temperature 调到 0.3 左右让它别花式创作max_tokens 控制在 512 以内客服回复不需要长篇大论top_p 默认 0.9 即可不做特殊修改。# 客服场景下的大模型调用参数示例 response llm.chat( messagesconverted_messages, temperature0.3, # 低随机性避免同一句话每次变样 max_tokens512, # 限制回复长度控制成本和回复速度 top_p0.9 # 保留核心候选词防止偏门输出 ) reply_text response.choices[0].message.content这里 temperature 高会导致同样的商品问题每次回复说法都不同用户会觉得奇怪max_tokens 设太大既费钱又拖慢响应。客服回复的目标是稳定、简洁不是文采飞扬。2.2 对话引擎的职责会话管理、RAG知识库与转人工怎么配合把“把消息丢给大模型再返回”是不行的。原因很现实模型不知道用户之前说了什么不知道商品库存表长什么样也不知道哪些话能说哪些话是违规承诺。所以对话引擎至少要有三块会话管理、知识检索、决策兜底。会话管理负责记住聊到哪儿了。它跟普通聊天机器人不一样的地方在于客服会话是围绕一个用户、一个订单、一个售后诉求展开的。我会用一个 session_key 表示一段会话存放近几轮的消息列表超出长度后把早期内容做一次摘要再保留而不是直接砍掉。这样既节省上下文窗口又不会丢失关键信息比如用户说过的订单号或收货问题。知识检索做的是把商品库、售后政策、物流说明这些文本切成片段做向量化存进检索库。每次收到用户消息先从知识库里召回几段相关内容拼进系统提示词再让大模型基于这些材料回答。这个过程就是常说的RAG。直接让模型凭记忆回答商品参数和售后规则不靠谱它一旦记混了就会给用户承诺“七天无理由退货”而实际上店铺根本没有这项政策。决策兜底负责判断模型该不该接什么时候转人工。我的做法是给模型暴露一个特殊动作当它觉得意图不明确、答案置信度低或者用户语气已经很愤怒时就返回一个转人工标记由代码把会话转给客服工作台。大模型客服能解决的让它解决不能解决的不要硬扛。硬扛的结果一定是差评和退款纠纷。2.3 消息网关用统一结构抹平平台差异接入层是整个工程最容易脏的地方。每个平台回调字段完全不同微信推过来是 XML抖音可能是 JSON千牛又走的是另一套消息格式。如果不做统一封装业务代码里就会到处是“if channel douyin”改到后面自己都想删库。正确做法是定义一条内部消息结构把它当成网关和对话引擎之间的协议。# 统一的内部消息结构 class UnifiedMessage: def __init__(self, channel, session_key, msg_id, user_nick, content, timestamp): self.channel channel # 来源平台如 wecom / qianniu / douyin self.session_key session_key # 会话ID决定上下文归哪段 self.msg_id msg_id # 平台消息ID用于幂等去重 self.user_nick user_nick # 用户昵称或备注 self.content content # 纯文本消息内容 self.timestamp timestamp # 平台侧消息时间session_key 是这里最关键的一个字段。它决定上下文怎么串。我推荐用频道加用户维度拼比如qianniu:buyer_001、douyin:open_id_xxx。搞错这个字段就会出现抖音用户看到千牛买家的历史订单这就是“串会话”事故。每个平台写一个适配器把平台回调转成 UnifiedMessage。适配器返回 None 就表示这个事件不需要处理比如用户撤回、系统通知。网关层还要做校验包括签名校验和消息体格式校验不能信任任何未校验的入口数据。再加上消息幂等同一 msg_id 只处理一次后面会详细讲这个坑。3. 平台接入实操微信、千牛、哔哩哔哩、抖音、小红书、知乎怎么进同一个网关3.1 先盘点各平台的开放能力别按想象接接入任何平台之前先做一件事去各个开放平台的后台查“消息接收”和“机器人/客服能力”确认它到底给你什么接口。很多团队的方案死在第一步因为他们以为每个平台都像微信客服一样给现成接口结果发现某个平台只有评论没有私信回调或私信权限要单独申请。常见情况是下面这样具体以你申请时的官方文档为准平台常见入口消息形态需要准备企业微信 / 微信客服客户联系、微信客服、公众号与小程序客服事件回调客户发消息触发推送企业认证、回调URL、Token与EncodingAESKey千牛淘宝开放平台 / 千牛消息推送会话消息回调含买家和卖家子账号信息应用Key、权限申请、消息订阅哔哩哔哩开放平台私信能力私信消息事件回调UP主身份或企业资质、应用审核抖音企业号抖音开放平台消息服务用户私信会话回调企业号认证、应用审核小红书专业号专业号运营中心消息接口私信消息与自动回复专业号资质、能力申请知乎开放平台或私信接口私信消息与机器人能力账号资质与申请审核接入过程中有个大原则优先走官方接口。尤其是在微信生态里个人微信的自动化接入普遍违反平台服务协议轻则封号重则服务停摆团队方案里不要碰这条线。标题里说“支持微信”落地时优先理解成企业微信、微信客服、小程序客服这些官方能力。3.2 适配层怎么写两个平台的归一化示例平台回调不一样但适配层的写法是同一个模式。以抖音企业号的消息回调和千牛的消息推送为例结构上是类似的。抖音通常给你 open_id、消息内容、消息ID、时间戳千牛会给买家昵称、会话ID、消息文本。拿到以后都转成 UnifiedMessage。# 抖音回调适配示例字段名以官方回调为准 def normalize_douyin(payload: dict) - UnifiedMessage | None: if payload.get(event) ! chat_message: return None return UnifiedMessage( channeldouyin, session_keyfdouyin:{payload[open_id]}, msg_idfdouyin:{payload[msg_id]}, user_nickpayload.get(nickname, ), contentpayload.get(content, ), timestamppayload.get(timestamp) ) # 千牛消息推送适配示例字段名以官方推送为准 def normalize_qianniu(payload: dict) - UnifiedMessage | None: msg payload.get(message, {}) if not msg.get(text): return None buyer payload.get(buyer_nick, unknown) return UnifiedMessage( channelqianniu, session_keyfqianniu:{payload.get(conversation_id)}, msg_idfqianniu:{payload.get(msg_id)}, user_nickbuyer, contentmsg.get(text, ), timestamppayload.get(time) )每个平台一个 normalize 函数注册到一个字典里网关收到请求后按 channel 找对应函数。注意这里的关键是 msg_id 要加平台前缀否则两个平台可能都推送“1234”这个ID去重时会把两个平台的同ID消息合并导致会话错乱。session_key 同理也要带平台前缀防止不同平台相同ID的消费者共用上下文。3.3 最小闭环一个Webhook加一条对话流水线接入层的骨架可以用一个简单的 webhook 服务来演示。它做的事情是收回调、归一化、去重、调用对话引擎、按平台发送。这里不依赖任何重量级框架FastAPI 加 Redis 就能跑起来。from fastapi import FastAPI, Request app FastAPI() app.post(/webhook/{channel}) async def webhook_receiver(channel: str, request: Request): raw await request.json() # 按平台取适配器解析成统一消息 adapter adapter_registry.get(channel) if adapter is None: return {ok: False, reason: unsupported_channel} event adapter.normalize(raw) if event is None: return {ok: True, reason: ignored_event} # 幂等去重同一消息只处理一次 if await dedup.is_duplicate(event.msg_id): return {ok: True, reason: duplicated} # 交给对话引擎处理得到回复文本 reply_text await chat_pipeline.process(event) # 如果引擎返回转人工信号就走工作台分配逻辑 if reply_text.startswith([HANDOVER]): await handover.assign(event) return {ok: True, reason: handover} # 通过对应的发送通道回消息 sender sender_registry.get(event.channel) await sender.send(event.session_key, reply_text) await dedup.record(event.msg_id) return {ok: True}这里有个容易被忽略的动作去重要在调用对话引擎之前做。如果平台因为超时重试推送了同一消息而网关没有去重用户就会发现同一个问题被回复了两遍。dedup 用 Redis 的 SETNX 就能实现key 用 msg_idTTL 设置 24 小时足够。发送通道也要按平台注册常见做法是调各平台开放接口的被动回复能力前提是消息在时效窗口内。3.4 初版参数限频、超时、重试怎么设刚上线时不要想着一口气把全平台的流量接进来。先按保守参数跑观察两天再调整。下面是我常用的初始化参数参数初始值说明单平台每分钟发送上限建议 30 条以内避免触发平台风控Webhook响应超时2 秒内必须返回 ack平台重试机制会盯着你不放对话引擎总超时8 秒超过就直接回兜底话术别让用户干等发送失败重试次数3 次超过进入死信队列人工介入普通消息去重TTL24 小时防止历史消息重放会话上下文保留轮数10 轮超出部分走摘要不硬塞模型这些参数不是拍脑袋出来的。客服场景用户等回复的心理极限差不多就是几秒钟平台侧通常也要求你在超时窗口内反馈“收到”。初版宁可保守也不要一上来就把距离拉满限频太低只是回得慢限频太高被平台封了才是真翻车。4. 部署与成本控制多平台大模型客服怎么稳定运行还省钱4.1 部署形态先单机加Docker别一上来就K8s很多团队一开始就把架构设计到 Kubernetes 的容量结果运维成本比开发还高。一个多平台客服系统早期单机完全够用。服务拆成三个进程Webhook 网关、对话引擎 Worker、自动转人工回调。Redis 做会话存储和幂等去重。数据库用 PostgreSQL 或 MySQL 存客户消息记录和操作日志。这样一台 4 核 8G 的云服务器就能扛住初期几个平台的中低流量。version: 3.9 services: gateway: build: ./gateway ports: - 8080:8080 environment: REDIS_URL: redis://redis:6379/0 DB_URL: postgresql://user:passdb:5432/customer_service worker: build: ./worker environment: REDIS_URL: redis://redis:6379/0 DB_URL: postgresql://user:passdb:5432/customer_service LLM_API_KEY: ${LLM_API_KEY} redis: image: redis:7-alpine db: image: postgres:15-alpinegateway 和 worker 拆开很重要。平台回调进来网关照单全收立刻入队返回 ackworker 慢慢消费调大模型回消息。这样平台你的 webhook 不会超时大模型就算偶发几十秒卡顿也不影响入口收消息。如果混在一个进程里模型一慢所有平台回调都堵着平台重试重推雪崩就来了。4.2 Token成本怎么算先估量再优化成本是大模型客服绕不开的话题。先看量级一个订单咨询平均来回 8 到 10 轮每轮上下文约 500 到 800 token加上回复 200 token一条客户线索完整聊完大概消耗一万 token 量级。假设一天 500 个咨询日消耗约五百万 token。云API的价格随市场波动按月账单看初期一个月几百到一千多块是很正常的量级。省成本有四个顺序不能乱。第一先给入口做分类问候、物流查询、退换货、砍价这些高频意图可以用一个轻量分类模型先分出来部分固定话术直接模板回复不放大模型。第二会话要定时压缩超过十轮就把早期对话做成摘要否则越聊越贵。第三把知识库检索做扎实答案能直接从材料里拼出来时让模型做改写而不是自己漫天想。第四模型分等级普通询单用小一点的模型复杂投诉才用大模型。这个降级策略能做到成本直降一半以上。4.3 限流与并发别让平台先把你封了多平台接入注意每家平台都有频率控制策略。你的 worker 是并发的但发送动作必须按平台做限流。常见做法是给每个平台一个独立的发送队列队列里做令牌桶。初始速率参照前面表格之后根据平台后台的报警阈值缓慢上调。限流之外还要设计重试退避。发送接口偶发返回错误码很正常。常见退避时间序列是 1 秒、5 秒、15 秒、60 秒超过四次进入死信队列。这里切记重试要做幂等否则同一回复发两次用户投诉就会从对客服的不满意升级成对平台的不信任。4.4 监控要盯哪些指标多平台客服的黑匣子就是模型内部发生了什么你不知道。想不让它成为黑洞监控指标要抓到第一线。我建议面板上至少放这些指标看什么各平台入站消息量确认回调是否正常有没有突然断流队列积压长度积压持续上涨说明 worker 处理不过来回复成功率区分模型成功、发送失败、超时三类大模型响应P95延迟超过 8 秒说明模型拖后腿或者网络抖动转人工占比占比过高说明知识库覆盖不足日Token消耗观察成本趋势跟业务量做对比延迟和转人工占比是体验的晴雨表。用户不是非要用机器人聊天他们只想快速解决问题如果机器人天天把人气得转人工还不如一开始就转。上面这几个指标每半小时算一次持续三天就能看出系统健不健康。5. 接入与运行避坑大模型客服踩过的五个典型坑5.1 用户被同一个答复砸了两遍现象一位买家问“发货了吗”几秒后收到两条一模一样的回复。原因平台在等待你的回调确认时超时了于是重新推送同一消息网关在第一次处理时已经完成回复但没来得及返回 ack第二次推送又被当作新消息。解决在消息入口处做唯一性去重用 msg_id 作为 Redis 锁处理中标记加已处理标记两步都要有。if await dedup.is_duplicate(event.msg_id): return {ok: True, reason: duplicated}这条代码要放在任何耗时操作之前。处理中先 SETNX成功才继续完事后再次确认TTL 给 24 小时。这样就算平台重推三次也只有第一次真正进入对话引擎。别小看这个坑线上第一个客诉通常就是它。5.2 聊到一半模型突然“失忆”现象用户前几句说过商品尺寸是 L后面问“那我能退吗”模型回答“请问您购买的是什么尺码”。原因会话上下文被粗暴截断。很多实现只保留最近 N 轮早期关键信息直接丢掉了。解决不能只按轮数切割要做分层会话摘要。保留最近十轮原文十轮之前的内容每次在上下文更新时合并成一段摘要放在上下文最前面。def compress_history(session_key: str, messages: list): if len(messages) 10: return messages early messages[:-10] recent messages[-10:] summary summarize(early) # 把早期消息压缩成摘要 return [{role: system, content: f之前的对话摘要{summary}}] recent摘要这个动作虽然多一次模型调用但省的是长期上下文费用也让用户体验稳定非常多。客服场景里用户默认你记得他说过的每一个字失忆是体验崩坏最快的起点。5.3 账号被平台限流甚至收到警示现象某平台渠道突然收不到新消息或者后台提示“操作过于频繁”。原因发送频率陡增尤其在爆款活动期间客服机器人瞬时回消息的速度远超人工风控判定异常。解决第一发送端做令牌桶每个平台独立控速第二加随机抖动比如 300 到 1200 毫秒随机延迟去掉机器的均匀节奏第三重要平台的消息尽量调用官方的“客服消息”通道不要用个人号硬啃。有一个原则要记住多做平台规则允许的事别碰协议模糊的地带。团队做客服系统风控合规是地基地基塌了模型效果再好也白搭。5.4 大模型一本正经地“胡说八道”现象用户问“你们支持退货吗”模型回答“支持七天无理由”但店铺实际是定制商品不支持退货。原因模型没有约束条件在知识库查不到时自己编了一条政策。解决给对话引擎配 RAG 检索并加置信度判断。只有检索到相关内容时才允许模型作答检索不到或者相关度低于阈值时走统一话术“这个问题我需要为您核实已转人工处理”。这一步少赚一点自动化率但能挡住纠纷和差评。docs, score kb.retrieve(query) if score threshold: reply 这个问题我需要为您核实马上转人工处理。 await handover.assign(event) else: reply llm.chat_with_context(messages, docs)threshold 初始可以设 0.3越低越容易触发兜底越高越容易放幻觉进来。上线后根据转人工率和客诉不断调。记住客服工具不是展示模型聪明程度的舞台是帮用户解决问题的生产线。5.5 不同平台的用户消息串进了同一个会话现象抖音粉丝问“你好”客服侧显示的是小红书上另一个用户的完整购买记录。原因session_key 设计成了只用用户昵称而两个平台恰好有同一个昵称。解决所有会话键必须带平台前缀并且只用平台侧稳定唯一的ID比如 open_id、买家ID不用可重复的昵称。代码里强调过的fdouyin:{open_id}就是要杜绝这种事故。我建议把会话键的生成统一放一个函数命名固定为channel:user_id不允许业务代码直接拼字符串。这个键也决定了你的聊天记录落库、转人工数据带过去、知识库检索范围全都正确。串会话的客诉最难解释因为用户会觉得信息泄露必须从根上防止。6. 进阶从“能回复”到“值得上线”的三个验证方法这套系统做到能跑通只是及格线真正难的是证明它值得长期投入。我每接一个新平台都会做三件事。第一是搭一个回归问题集。把过去三个月真实咨询里的问题挑两三百条配上标准答案或验收要点每次改话术、换模型、调参数先把这批问题跑一遍。没有回归集你会陷入“今天改好了明天翻车了”的循环。用脚本标记通过率低于百分之九十就不该上线新版本。第二是灰度上线。不要一个平台全量切换。以抖音为例可以先让 10% 的用户走机器人其余走人工比较投诉率和转人工率确认稳定后再逐步放量到 30%、100%。模型本身可以双跑同一个用户请求旧版和新版同时算但只放新版结果出去观察两者差异这能帮你及时发现新话术带来的体验偏移。第三是建立人工转接的闭环复盘。每一条转人工记录都要打一封邮件或工单给值班人员备注“客户之前问过什么、模型答了什么、为什么转出”。拿这些数据倒推知识库缺口优化提示词里高频出现的模糊点。我一般会在第一个月每天看一遍转人工日志后面改成每周一次。这个习惯帮我避过很多险情。做客服工具久了最大的体会是它的核心竞争力不在“智能”两个字上而在稳定、懂业务、可干预。大模型的聪明是放大器放大的是你对业务的梳理深度你给它多少知识边界和兜底策略它就还你多少用户体验。希望这整套从架构到避坑的思路帮到你。本文还有配套的精品资源点击获取
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Web组态实战:智捷云2D组态与工业监控系统构建指南 2026/10/2 15:24:31

Web组态实战:智捷云2D组态与工业监控系统构建指南

1. 从桌面组态到浏览器组态:这波迁移到底解决了什么实际问题1.1 老组态软件我用了十年,最大的痛不在功能做工业监控这些年,我碰过的组态软件两只手数不过来。早期守着组态王做水厂项目,后来给电厂配过WinCC,也在几个产…

阅读更多 →
24GHz雷达传感器选型指南:频段原理、安装调试与工业应用 2026/10/2 15:24:30

24GHz雷达传感器选型指南:频段原理、安装调试与工业应用

1. 为什么是24GHz:一个频段如何决定了产品的探测上限在物联网感知层摸爬滚打这些年,我上手过的雷达传感器少说也有十几个型号,从几块钱的倒车雷达模块到上万的毫米波工业传感器都碰过。选型时候最容易被忽视、却又最致命的一个参数&#xff0…

阅读更多 →
向量库把 C 盘吃到 0 字节:75M 数据撑出 48.6G 索引的清理复盘 2026/10/2 15:24:24

向量库把 C 盘吃到 0 字节:75M 数据撑出 48.6G 索引的清理复盘

一次真实的磁盘事故:应用数据只有 75MB,它的向量库索引目录却悄悄长到 48.6GB。定位、回收、验收的完整过程,以及为什么索引型存储必须纳入磁盘监控。 事故现场 一台开发机 C 盘可用空间归零,系统开始随机弹"磁盘已满"…

阅读更多 →
CLion编译器配置手册:Windows下MinGW/MSVC等四种工具链全指引 2026/10/2 15:24:18

CLion编译器配置手册:Windows下MinGW/MSVC等四种工具链全指引

CLion的配置里最容易被忽略、也是最早出问题的,就是Settings里的Toolchains那一栏。很多新手第一次创建C项目,直接New Project,写完代码一按Run,界面红了,日志里出现“编译器未包含main类型”或者“No compiler set”。…

阅读更多 →
Windows下编译安装PETSc:用MSYS2+MinGW-w64把环境改到TaoToken 2026/10/2 15:24:05

Windows下编译安装PETSc:用MSYS2+MinGW-w64把环境改到TaoToken

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

阅读更多 →
TCA MCP Server 实战:把代码分析接进 IDE,TaoToken 统一 Key 打通调用链 2026/10/2 15:24:05

TCA MCP Server 实战:把代码分析接进 IDE,TaoToken 统一 Key 打通调用链

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

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉