news 2026/9/6 9:05:56

DocsGPT实践指南:基于RAG的私有知识库问答系统搭建与调优

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
DocsGPT实践指南:基于RAG的私有知识库问答系统搭建与调优

文档越来越多、越堆越乱,想找一段关键信息翻半天却找不到,这是几乎所有团队和个人知识管理都绕不开的痛点。传统的站内搜索只能做关键词匹配,问一句“我的项目里日志模块是怎么处理并发写入的”,搜索框给不了一个像样答案。DocsGPT正是冲着这个痛点来的:它是一个开源的文档问答助手,用大语言模型直接理解你的文档内容,通过自然语言检索文档片段并生成回答。从本地Markdown笔记、产品需求文档到企业知识库,都能变成“可以对话的AI咨询台”。

这篇文章会从架构思路讲到实操部署,再到二次开发和效果调优,适合三种人阅读:想给团队搭一套私有知识库问答系统的运维或开发,想把本地文档变成个人AI资料库的技术爱好者,以及在评估“文档AI化”方案、想弄明白RAG(检索增强生成)到底怎么落地的产品和技术负责人。后面所有内容我都基于arc53/DocsGPT这个项目实际操作过,踩过的坑会给一并讲清楚。

1. 先理解DocsGPT到底帮你解决什么问题

1.1 从“搜索文档”到“提问文档”的范式变化

传统文档消费方式基本是两条路:要么人肉翻目录、一层层找文件,要么用关键词搜索,搜出来一堆标题匹配但内容未必对得上结果。问题在于,文档的语义信息在关键词层面是割裂的——你搜“并发写入”,但文档里写的可能是“多线程同时追加到日志文件”或者“多个worker进程写同一个文件”,关键词机制根本没法把这几句话关联起来。

DocsGPT做的事情,是把“找文档”变成“问文档”。用户输入的自然语言问题会先被转成向量(Embedding),然后从预先索引好的文档向量库里检索出语义最相近的几个段落,最后把这些段落作为上下文交给大模型生成一段有依据的回答。

这套逻辑本质上就是近几年知识库问答的标准范式——检索增强生成(RAG)。DocsGPT的价值在于,它把RAG涉及到的文档解析、文本切分、向量化、检索、调LLM回答这一整条链路都封装好了,而且开源、可私有部署,底层模型可以换,文档格式可以扩展。对不想从零写RAG脚手架的人来说,这是很实用的起点。

1.2 RAG架构:为什么不是让模型硬记文档

有人会问:既然大模型那么强,为什么不直接把所有文档塞给模型,让它记住再回答?

这里面有个很现实的问题——模型上下文窗口有限。哪怕当前很多模型支持几十万token的上下文,塞进去几千页文档也会爆掉;即便勉强塞得下,模型的注意力也会被海量信息稀释,回答的准确率会明显下降。更关键的是,公司或个人的文档是持续更新的,每改一版都要重新训练或微调模型,成本非常高,而且训练周期长,时效性太差。

RAG的思路换了个方向:先把文档全部切块并向量化,存进向量数据库;用户提问时,只把和问题最相关的几个片段(通常是3到8块)检索出来,拼成一小段上下文交给模型。这样每次调用模型消耗的token很少,回答有具体来源可以追溯,文档更新后只需重新索引变更部分,完全不用重训模型。DocsGPT选择的正是这条更灵活、更经济的路线。

1.3 适合谁用:个人、团队、产品线的三种形态

DocsGitHub仓库地址是arc53/DocsGPT,支持三种典型使用方式,我实测下来分别对应不同的需求强度:

  • 个人知识库:本地装一套,把Markdown笔记、PDF资料、技术文档索引进去,平时提问式检索资料。机器有8GB内存就能跑,成本低。
  • 团队内部知识库:部署在公司服务器上,接入内部wiki、设计文档、运维手册,挂到内部聊天工具或网页端,团队成员共用一套问答入口。需要解决权限、并发、模型API费用分摊的问题。
  • 产品化支持:把DocsGPT的API包一层,作为自己产品的“文档AI助手”功能,比如SaaS产品的帮助中心、开发者平台的API文档问答。基于它的路由、模型适配、文档解析能力二次开发。

我见过不少人把它直接当一个开箱即用的“文档问答搜索框”来用,这其实低估了它。真正把这套东西用好的团队,都是先把自己的文档体系梳理清楚,再按需调整切分策略和检索参数,让模型“在正确的范围里发挥”。后面的章节,我会按这个思路一步步展开。

2. 技术栈与核心组件逐层拆解

2.1 后端:FastAPI + 文档处理Pipeline

DocsGPT的后端用Python加FastAPI实现,所有接口都是RESTful风格,源码里application主服务目录和worker后台任务目录是分开的。这种拆分的用意很明确:短请求(比如聊天询问)和长任务(比如大批量文档索引)不能互相阻塞,否则用户提交一批文档要索引,聊天接口可能就卡住了。

文档处理的pipeline大致是这样:读取文件 -> 解析文本 -> 按规则切块 -> 调用Embedding模型生成向量 -> 写入向量数据库。不同类型文件走不同解析器:

  • Markdown和TXT:纯文本直接解析;
  • PDF:用PyPDF2或类似库抽取文本,遇到扫描版PDF还会触发OCR逻辑;
  • CSV:按表格行列解析,每行作为独立的内容单元;
  • 代码文件:按代码块和注释结构做智能切分。

用DocsGPT官方CLI命令索引文档时,核心配置会用到--docs_folder指定文档目录、--model_path指定embedding模型、--vector_store指定向量库类型,后面在部署章节我会给一份完整可用的命令示例。有一点值得注意:文档解析质量直接决定后续检索效果,如果原始文档是扫描图片或者排版混乱的PDF,解析出来的文本就是乱序的,后面的检索再强也救不回来。

2.2 向量数据库:Qdrant与Embedding选型

向量数据库是DocsGPT的记忆体,它负责存储文档切块后的向量,并在查询时快速返回最相似的top-k个结果。项目默认使用的是Qdrant,一个用Rust写的开源向量搜索引擎,处理千万级向量也没有太大压力。

Embedding模型决定了“相似”怎么度量。DocsGPT支持多种embedding backend,默认配置会走本地模型(sentence-transformers相关的多语种模型),也可以在环境变量里切换成OpenAI的text-embedding-ada-002或其他兼容接口。选型时有三个角度需要考虑:

  1. 语言支持:文档以中文为主的话,选多语种embedding模型效果明显好于纯英文模型,否则中文语义相似度计算会失真。
  2. 向量维度:不同模型生成的向量维度不同,切向量库时维度要匹配,换模型就必须重建索引。
  3. 运行环境:本地embedding模型不需要额外API费用,但对CPU和内存有要求;云端API维度通常更高、效果更稳,但有调用成本。

实际项目中,很多人一开始用默认配置,测下来发现中文场景检索不准,经排查就是embedding模型语言支持不足导致的。这个问题别急着调参数,先确认embedding选型对了没有。

2.3 LLM接入层:多模型适配与切换逻辑

DocsGPT的模型适配层做得比较聪明,它没有把模型调用写死,而是抽象出了一套LLMProvider接口。所以你既可以用OpenAI的GPT系模型,也可以接Anthropic的Claude,或者通过Ollama、llama.cpp跑本地开源模型,甚至可以挂到Azure OpenAI的合规接入点上。

这个设计对实际部署意义很大,尤其是企业内部:“模型API不能出网”和“需要私有化部署”这两类诉求,都能通过换底层模型实现。我在自己的服务器上就用Ollama跑Qwen系列模型接过DocsGPT,作为本地私有化方案完全可以跑通。

切换模型时,需要把对应的环境变量设置好,比如OPENAI_API_KEYOLLAMA_API_BASE,同时在DocsGPT的配置中指定要用的模型名。不同模型对提示词的敏感度不一样,回答风格和格式遵从度也差很多。在DocsGPT里,你可以在Prompt模板中针对具体模型微调指令,比如要求“先用一句话直接回答,再分点补充细节”,实测对输出格式的改善非常明显。

3. 本地部署的完整实操流程

3.1 环境准备与配置项说明

部署DocsGPT之前,先把基础环境准备好。不需要太高配的机器,但如果要跑本地embedding模型加本地LLM,建议内存不小于16GB,磁盘留出至少20GB空间存放模型和向量索引。

以下是几个核心环境变量的含义和取值建议:

环境变量作用建议取值
API_KEY访问DocsGPT后端接口的鉴权Key自己生成一段随机字符串
VECTOR_DB指定向量数据库类型qdrant(默认)
EMBEDDING_BACKENDEmbedding模型来源local(本地)或openai
OPENAI_API_KEY使用OpenAI系列模型时必填仅在需要时配置
OLLAMA_API_BASE使用Ollama本地模型时的服务地址例如http://localhost:11434
LLM_NAME指定使用哪个LLM模型例如gpt-4o-miniqwen2.5

以上配置项是绝大多数场景都会用到的,更细的参数在项目.env模板里都有注释,部署时按需打开。需要特别强调一点:API_KEY一定要设成强随机值,默认空值直接暴露在公网上,别人扫描到端口就能无鉴权调用你的模型,烧的是你自己的钱。

3.2 启动后端与前端,第一次提问

先把代码拉下来:

git clone https://github.com/arc53/DocsGPT.git cd DocsGPT

后端启动我用的是Docker Compose方式,项目根目录下已经写好了docker-compose.yml。执行:

docker-compose up -d

这条命令会拉起三个核心服务:后端API、前端Web界面、Qdrant向量数据库。首次启动会自动构建镜像,网络不好会慢一些,耐心等即可。

服务起来之后,打开http://localhost:5173(默认前端端口)就能看到DocsGPT的聊天界面。第一次提问前,得先确认后端能连通LLM和embedding模型,否则界面会报错“model not found”之类的问题。我的建议是先在后端容器里跑一个最小请求验证:

curl -X POST http://localhost:7091/api/ask \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $API_KEY" \ -d '{"question":"hello","history":[]}'

返回内容如果包含回答文本,说明整体链路已经通了。第一次打通之后,再接入自己的文档库。

3.3 接入自己的文档库:CLI索引与批量导入

DocsGPT提供了命令行工具来索引本地文档,最先要做的就是把你的文档目录准备好。以我常用的一个目录结构举例:

/home/user/documents/ ├── product/ │ ├── requirements.md │ └── spec.pdf └── tech/ ├── architecture.md └── api-notes.txt

安装docsgpt CLI工具:

pip install docsgpt

然后执行索引命令:

docsgpt index \ --docs_folder /home/user/documents \ --model_path local \ --vector_store qdrant \ --qdrant_url http://localhost:6333

这个命令会递归读取documents目录下的所有支持格式文件,逐一切块、生成向量并写入Qdrant。索引完成后,回到Web界面再提问,问题就只会在你索引的文档范围内寻找答案了。

这里有个细节容易踩坑:文档索引是增量还是全量,取决于工具版本和配置。默认情况下很多版本是全量重建索引,如果文档很多,重复索引会浪费大量时间。处理方式是把它封装成定时任务,只在文档有变更时重新运行,或者把索引逻辑改成按更新时间增量处理。

4. 效果调优:从“能用”到“好用”

4.1 文档切分策略与参数选择

文档切分(Chunking)是RAG系统里回报率最高的调优点之一。切太大,检索召回的内容包含大量噪声,浪费上下文窗口,也容易干扰模型判断;切太小,段落语义不完整,模型理解不到上下文,回答容易变成片面的“断章取义”。

DocsGPT默认的切块逻辑偏向通用场景,按固定长度切分,并带一部分重叠(overlap)来保持相邻块之间的语义衔接。实操中我一般按内容类型做差异化设置:

  • 技术文档/API说明:块大小可以设到800到1200字符,因为这类文本结构性强,上下文依赖大,切碎了很难回答准确。
  • FAQ/操作手册:块大小设到300到500字符就够了,这类文本每段自包含,切大了反而把不相关的内容混在一起。
  • 代码示例/配置文件:按代码块切分,尽量保证函数或类的完整闭合。

如果你发现自己改这个参数需要改代码,不妨看看项目里的切分配置是否已经暴露成了环境变量或配置文件。很多版本已经支持,但你得主动找一下,官方默认文档里不会特别强调。

切分策略调优后,需要重新做一次全量索引,否则新的切分规则不会生效。调整后建议用同一组测试问题做前后对比,重点关注:答案是否更完整、有没有引入原来没出现的错误信息。

4.2 Prompt模板定制与系统提示词注入

DocsGPT流程里,真正发给LLM的Prompt由三部分拼接而成:系统提示词(system prompt)、检索到的上下文片段、用户问题。系统提示词就是官方提供的默认模板,主要作用是约束模型“根据上下文回答问题,不要编造”。这个模板对效果影响极大,值得花时间定制。

我的定制经验是围绕四个方向:

  1. 限定回答来源:明确要求“只能基于提供的上下文回答,找不到就直说不知道”,能显著降低幻觉。
  2. 规定回答结构:比如“先给结论,再分点说明原因,最后提供参考资料片段名”,输出会更适合团队消费。
  3. 设定语气与详略:内部知识库可以要求简洁口语化;面向客户的帮助中心则要求正式、严谨。
  4. 注入事实前提:如果文档里有很多业务缩写和内部概念,可以在prompt中加一句“这些上下文来自XX团队的内部文档,术语含义以团队定义为准”,提高理解准确率。

调整prompt模板之后,记得同时看一下是否会丢失原文引用。原文引用对知识库问答很重要,如果模板改得太激进,模型可能只给结论不给来源,这会直接影响团队对答案的信任度。

4.3 检索增强:Top-K、相似度阈值与混合检索

检索质量决定了大模型“看到的素材”质量。DocsGPT的检索结果主要由两个指标控制:返回给模型的片段数量(Top-K)和相似度阈值。

  • Top-K太小(比如1到2):上下文信息不足,模型容易漏答,尤其当答案分散在多个文档片段里时。
  • Top-K太大(比如10以上):无关片段混入的比例上升,模型会被噪声带偏,回答变啰嗦且准确率下降。
  • 相似度阈值太低:完全无关的内容也可能被当成相关上下文,这是幻觉的常见来源。
  • 相似度阈值太高:查全率下降,明明文档里有答案,却因为分数略低于阈值而检索不到。

我常用的一组参考值是Top-K设为4到6,相似度阈值设在0.3到0.5之间。但这个值必须结合你实际embedding模型的分数分布来看,不同的embedding模型分数范围差异非常大,不能照搬别人的数字。我的建议是先跑几组典型问题,打印出相关片段的相似度分数,看看有效片段的分数分布在哪个区间,再据此设定阈值。

DocsGPT也支持接入传统关键词检索做混合检索(Hybrid Search),在部分复杂场景下,关键词精确匹配和向量语义检索有互补性。比如搜产品型号“XG-2000”这种强精确词,用向量找可能不如关键词直接;而搜“稳定的连接方式”这类语义描述,关键词就力不从心了,向量效果更好。混合检索均衡了两者,实现上需要额外配置ES或支持混合检索的后端,适合对检索要求较高的团队。

5. 二次开发与场景扩展

5.1 通过API构建企业知识库应用

DocsGPT的后端API设计得比较规整,核心接口就那几个,封装起来很快。我实际用过的接口包括:

  • POST /api/ask:发起一个问答请求,传入questionhistory(历史对话),返回回答文本和引用来源。
  • POST /api/answer:提交一段文档内容,直接让模型基于该内容作答,适合临时性的小范围问答,不需要走检索流程。
  • GET /api/documents:查看当前已经索引的文档列表,方便做知识库管理后台。
  • DELETE /api/documents/{id}:删除指定文档的索引,配合文档下线流程使用。
  • POST /api/feedback:提交用户对回答的点赞或点踩反馈,这些数据积累下来可以分析哪些领域的知识缺口大。

基于这些接口,你可以快速做一个前端封装,比如把DocsGPT嵌入到公司内部 Admin 面板里,做成一个只面向客服团队的“工单知识助手”。也可以接进企业微信或钉钉机器人,让员工在聊天窗口里直接提问。我在实际项目中就是这么干的,后端只做了个薄代理层负责鉴权和日志记录,核心问答逻辑全部复用DocsGPT,两周内就上线了内部版知识库机器人。

封装API的时候要注意一个问题:/api/ask接口是流式返回还是整段返回,不同版本表现不一样。如果要做对话式UI体验,建议优先用支持流式的接口,逐字输出;如果是机器人Webhook回调场景,流式反而麻烦,需要等完整回答再一次性推送。这一步值得在开发前确认清楚,避免后面返工。

5.2 自定义扩展:新文件格式、新向量库、新模型

DocsGPT在架构上留了不少扩展点,方便按需接入。常见需求有三类:

第一类:增加新文件格式。默认支持Markdown、TXT、PDF、CSV等常见格式,但如果你要索引Word文档(.docx)、设计稿说明页或者老旧的.rtf文件,就得自己写解析器。实现方法是继承DocsGPT的文档解析基类,在load_documents相关代码里注册新的文件类型,把文件内容抽取成纯文本后再走后续的切块和向量化流程。

第二类:更换向量数据库。Qdrant虽然好用,但有些公司内部已经有一套Milvus或Elasticsearch,不想再多维护一套存储。DocsGPT设计了向量存储抽象层,切换主要工作是实现对应的存储类,包括insert、search、delete这几个核心方法。我建议优先看看项目里已有的document_store相关模块,参考内置实现去写,比自己从零设计要省力得多。

第三类:接入新模型。前文提过,DocsGPT通过LLMProvider接口屏蔽不同模型提供方的差异。新模型接入主要是实现一个Provider类,把模型的请求参数映射好。这里有一个比较容易忽略的点:不同模型对上下文长度的支持不同,超长输入会导致报错。Provider里最好做一次输入超长截断,把上下文片段按顺序裁剪到模型上限以内。

对于大多数团队来说,第二类“切换到已有向量库”是最常见的需求,这通常不是性能问题,而是运维集成问题。务必提前确认好公司现有的向量化基础设施是什么,再决定要不要动这块。

5.3 多语言与多用户场景注意事项

DocsGPT本身对多语言的支持主要依赖底层的embedding模型和LLM。中文场景下,我前面建议选多语种embedding模型,这里再展开说下原因:embedding模型如果只在英文语料上训练过,它内部生成的向量空间里中文语义词映射是扭曲的,检索“登录失败”可能匹配到“login failure”的中文直译,但匹配不到“账号无法登录”。换用多语种模型后,这个情况会显著改善。

多用户场景下要注意的则是并发和隔离问题。默认配置下,所有用户共享同一个向量库和同一个LLM API Key。如果团队成员不多、文档权限不敏感,这样没有问题;但如果知识库包含不同部门、不同密级的文档,就需要做权限隔离:

  • 维度一:把不同权限的文档索引到不同的collection或租户,用户提问时路由到对应集合;
  • 维度二:在应用层做文档过滤,检索前先根据用户角色过滤可访问的文档ID集合,再进向量检索;
  • 维度三:对回答内容做二次校验,确认引用的片段落在用户权限范围内。

并发方面,LLM API有速率限制,团队使用一旦频繁就可能触发429报错。我的经验是在DocsGPT前面加一层简单的请求队列或限流中间件,控制每秒请求数在API配额以内,同时设置超时重试。

6. 常见问题与排查技巧实录

6.1 问题速查表

现象可能原因处理方式
提问报错“model not found”LLM配置名错误或Provider没连通检查LLM_NAME配置,确认模型服务可用
回答总是“不知道”检索阈值过高或文档没索引成功降低相似度阈值,重新索引文档库
回答只包含一半内容Top-K太小,答案跨多个片段增大Top-K,调整切块策略
中文检索结果很差Embedding模型语言支持不足切换到多语种embedding模型并重建索引
接口返回429LLM API限流增加请求限流和重试,或换更高配额API
索引文档后搜索不到文档格式不支持或切块为空确认解析器是否支持该文件类型,查看日志
部署后页面白屏前端API地址配置错误检查前端环境变量VITE_API_BASEURL指向后端
回答引用了不存在的来源Prompt模板丢失了引用约束恢复系统提示词中的引用要求

这个速查表没法覆盖所有场景,但覆盖的是大多数团队从部署到上线的过程中最高频的几类问题。

6.2 实际踩坑记录

最后分享几个我在实操中遇到的具体问题,每一个都花过不少时间排查。

第一个坑是切块把代码切碎了。我索引一个包含Python示例项目的文档库时,发现回答里经常出现“def xxx”这种半行代码。排查后发现是固定长度切块把函数定义和函数体切到了两个block里,模型拿到不完整片段自然难以回答。解决方法是改用按代码结构切分,并且在保留overlap的同时加上“尽量保持段落完整性”的切分逻辑,代码类文档的正答率明显回升。

第二个坑是embedding模型换了一次,旧向量没有清理。我一开始用本地英文embedding模型,后来换成多语种模型,结果没有重建索引,新旧向量就在同一个collection里混着。由于两代模型向量维度不同,新写入时直接报向量维度冲突,而且历史索引全部不可用。最后只能删除collection重建。教训是:embedding模型这类影响向量语义空间的核心配置,一旦确定就不要轻易频繁切换,真要切换时果断全量重建索引,不要尝试“混着用”。

第三个坑是通过Docker部署时忘记持久化数据卷。默认docker-compose配置如果没把Qdrant的存储目录映射到宿主机,容器一删所有索引都没了,等于所有文档重新索引一遍。团队成员多的时候,重新索引时间不是几分钟能解决的,成本很高。而且这是一个静态配置问题,早点发现就早点解决,后期文档量大了再改会很折腾。建议第一次部署就把数据卷映射配好。

第四个坑是用户反馈数据没有利用起来。DocsGPT有feedback接口可以记录用户对回答的满意程度,但默认只是存起来。我后来开发时把feedback数据接到了一个简易分析面板上,定期查看哪些问题被点踩最多,从而优先优化这些文档。单纯靠拍脑袋优化知识库,往往优化方向是错的,用真实数据驱动调整才靠谱。

写在最后

我在实际项目中把DocsGPT接进团队知识库之后,最大的感受是它把“文档利用率”这个原本很虚的指标变成了可感知的改变。以前同事查一个配置参数的用法要靠翻聊天记录和问人,现在直接在对话框里问一句就能拿到带来源的答案。技术的门槛其实不高——开源项目帮你把RAG链路搭好了,真正决定上限的是你对文档质量、切分策略、检索参数和模型选型这些环节的打磨。别指望部署完就一劳永逸,带着一批高质量测试问题持续迭代,把每次答错的case记录下来往回倒查,这套系统才会越来越懂你的文档。如果你正准备动手,那就先从一份结构清晰的文档目录和一台能跑Docker的机器开始吧。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/6 9:04:03

GLM-5.3-Flash携手Cline免费开放:配置实战与编码智能体落地全解析

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

作者头像 李华
网站建设 2026/9/6 9:01:22

AI情感陪伴数字人技术拆解:从环境部署到API调用的全链路实践

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

作者头像 李华
网站建设 2026/9/6 9:00:12

温湿管控机如何实现环境温湿度稳定?原理、选型与实操指南

1. 项目背景与环境痛点分析 1.1 环境温湿度波动,到底能造成多大损失 干我们这行的人,谁没被环境温湿度折腾过?机房里的服务器一过热就报警、档案室里的纸质文件一到梅雨季就发潮、实验室里的试剂柜湿度一高数据就全废。最气人的还不是单次失…

作者头像 李华
网站建设 2026/9/6 9:00:07

75-SKill实时进度监控:WebSocket+RESTful API技术方案详解

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

作者头像 李华
网站建设 2026/9/6 8:58:16

基于开源框架构建自定义玩法游戏服务器全流程指南

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

作者头像 李华
网站建设 2026/9/6 8:52:51

从GPU到RK3566:强化学习四足机器人Microduck实战部署手记

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

作者头像 李华