1. 从“hindsight”说起为什么我们需要给 Agent 装上“后视之明”“hindsight”这个词本身很有意思字面意思是“事后的洞察力”也就是我们常说的“后见之明”。放在 LLM Agent 的语境里它指向一个非常具体且棘手的问题Agent 的记忆到底该怎么存、怎么取、怎么用才能让它在下一轮对话或任务中真正“记得住、想得起、用得对”。我接触过不少做 Agent 的团队大家一开始都觉得记忆是个小功能——不就是把对话历史塞进 context 里吗但真跑起来就会发现context 窗口再大也扛不住长周期任务而且把所有历史一股脑塞进去token 成本飙升不说模型还会被无关信息干扰回答质量反而下降。更麻烦的是当 Agent 需要跨会话、跨任务保持一致性时简单的“历史拼接”根本不够用。这就是“hindsight”这个项目要解决的核心问题为 LLM-based Agent 构建一套可持久化、可检索、可演进的记忆系统。它不是一个简单的对话缓存而是一套完整的记忆架构涉及存储层设计、检索策略、记忆压缩、遗忘机制等多个维度。结合热搜词里出现的agent memory、MCP、Docker、a-memguard等关键词可以看出这个项目大概率是一个面向生产环境的 Agent 记忆中间件可能以 MCP Server 的形式对外提供服务通过 Docker 容器化部署并且内置了某种主动防御机制来保护记忆安全。这篇文章适合谁看如果你正在做 Agent 应用开发尤其是涉及长周期任务、多轮复杂交互、跨会话状态保持的场景那这套思路值得你花时间研究。如果你只是刚接触 LLM 应用还没碰到记忆瓶颈也可以先了解一下整体架构等真正遇到问题时再回来细看。我会尽量把每个设计决策背后的“为什么”讲清楚让你不仅知道怎么做更知道为什么这么做。2. 记忆系统的整体架构设计分层、分治、分策略2.1 为什么不能把记忆当成一个“大桶”很多团队最初的做法是搞一个向量数据库把所有对话历史 embedding 后存进去检索时按相似度 top-k 召回。这个方案在 demo 阶段能跑通但上生产就会暴露三个致命问题。第一记忆没有生命周期。三个月前的一句闲聊和昨天确认的关键参数在向量空间里可能距离很近但重要性天差地别。没有优先级和时效性管理检索结果就是噪声。第二记忆没有结构。Agent 的记忆不只是“对话文本”还包括实体、关系、任务状态、工具调用结果、用户偏好等。全部拍平成文本再 embedding信息损失严重。第三检索没有策略。不同场景需要不同的召回逻辑有时候要精确匹配比如用户 ID有时候要语义相似比如“上次说的那个方案”有时候要时间衰减最近发生的更重要。单一向量检索覆盖不了这些需求。“hindsight”的思路应该是分层存储 多路召回 策略融合。我根据常见实践推测它的架构大致分为三层工作记忆Working Memory、短期记忆Short-term Memory、长期记忆Long-term Memory。工作记忆就是当前 context 窗口里的内容短期记忆是最近若干轮对话的摘要或关键信息长期记忆则是持久化的、经过压缩和索引的知识。2.2 工作记忆、短期记忆、长期记忆的职责划分工作记忆的容量受限于模型的 context window所以它的核心任务是“精挑细选”。不是把所有历史都塞进去而是根据当前 query 动态组装最相关的信息。这里的关键是记忆组装器Memory Assembler它负责从短期和长期记忆中召回内容再按优先级和 token 预算拼装成最终的 prompt。短期记忆通常以“会话”为单位保存最近 N 轮对话的原始文本或轻量摘要。它的作用是维持对话连贯性让 Agent 知道“刚才聊到哪了”。短期记忆的淘汰策略一般是 FIFO 或者基于重要性的 LRU具体取决于业务场景。长期记忆是真正的“知识库”存储经过提炼的事实、偏好、任务结果等。它的写入不是每轮对话都触发而是由记忆写入策略决定哪些信息值得长期保留我的经验是至少满足以下条件之一才写入长期记忆用户明确表达的偏好、任务的关键结论、可复用的工具调用参数、跨会话需要保持一致的状态。注意长期记忆的写入一定要做去重和冲突检测。我见过太多案例同一个事实被反复写入检索时返回一堆重复内容白白浪费 token。2.3 MCP 协议在记忆系统中的角色热搜词里MCP出现频率很高这说明“hindsight”很可能以 MCP Server 的形式对外提供服务。MCPModel Context Protocol本质上是一套标准化的工具调用协议让 LLM 能够以统一的方式访问外部资源。把记忆系统做成 MCP Server好处非常明显。首先解耦。Agent 框架不需要关心记忆怎么存、怎么取只需要通过 MCP 协议调用即可。换记忆后端、升级检索算法对上层透明。其次复用。同一个记忆服务可以同时被多个 Agent、多个应用共享避免每个项目重复造轮子。再次安全边界清晰。MCP Server 可以独立部署、独立鉴权记忆数据的访问控制集中在一处比散落在各个 Agent 里安全得多。从热搜词里还看到了wss://api.xiaozhi.me/mcp/?token...这样的 URL说明 MCP 支持 WebSocket 长连接这对于需要实时同步记忆的场景很重要。另外playwright mcp、burpsuite mcp、blender mcp这些词也印证了 MCP 生态正在快速扩张记忆服务作为其中一个 Server 类型完全符合趋势。2.4 Docker 化部署的考量Docker和Docker Desktop出现在热搜词里说明“hindsight”大概率提供了容器化部署方案。这其实是很务实的选择。记忆系统通常需要搭配向量数据库、关系数据库、缓存等组件如果让用户手动安装配置门槛太高。打成 Docker 镜像后一条docker compose up就能跑起来体验好很多。不过 Docker 部署也有坑。热搜词里出现了virtualization support not detected docker desktop failed to start because v这是 Windows 用户常见的虚拟化支持问题。还有docker网络不通、docker安装mysql8.0并使用、docker安装redis主从这些词说明用户在实际部署时会遇到各种环境问题。后面我会专门用一章来讲排查技巧。3. 核心细节解析记忆的写入、检索与遗忘3.1 记忆写入什么值得记什么应该丢记忆写入是整套系统的入口也是最容易出问题的地方。写多了噪声大、成本高写少了Agent 显得“没记性”。我的经验是采用多信号打分 阈值过滤的策略。具体来说每轮对话结束后系统会对候选记忆片段计算一个重要性分数参考信号包括用户显式反馈比如“记住这个”、信息类型偏好 事实 闲聊、出现频率反复提到的内容更重要、时间衰减越新越重要、任务相关性与当前任务目标相关的优先。分数超过阈值的才写入长期记忆低于阈值的只保留在短期记忆中随会话结束自然淘汰。这里有个细节值得展开记忆的粒度。是把整轮对话作为一个记忆单元还是拆成更细的片段我倾向于拆成“原子事实”或“独立语义单元”。比如用户说“我下周要去北京出差帮我订个酒店要靠近国贸”这里至少包含三个记忆单元出行计划下周去北京、任务需求订酒店、偏好约束靠近国贸。拆开存储后检索时能更精准地命中相关片段而不是把整句话都召回。实操心得写入时给每个记忆单元打上标签tag比如preference、task、fact、entity。检索时可以按标签过滤效率比纯向量检索高很多。3.2 记忆检索多路召回与重排序检索是记忆系统的核心价值所在。单一向量检索的问题前面说过了这里讲具体怎么改进。我推荐的方案是三路召回 融合重排。第一路是向量检索负责语义相似第二路是关键词检索比如 BM25负责精确匹配第三路是结构化查询负责按标签、时间、实体关系过滤。三路结果合并后用一个轻量级的重排序模型或者基于规则的打分函数做最终排序取 top-k 送入工作记忆。重排序的打分函数可以这样设计score w1 * 语义相似度 w2 * 时间衰减因子 w3 * 重要性分数 w4 * 标签匹配度。权重需要根据业务场景调没有万能值。比如客服场景可能更看重时间新鲜度知识问答场景可能更看重语义相似度。热搜词里有个很有意思的说法llm的token三个点key我是谁、query我在找什么、value我能提供什么。这其实是在用 KV 的视角理解记忆检索key 是检索线索query 是当前需求value 是记忆内容。好的记忆系统要让这三者对齐——用户问的问题query能通过合适的线索key找到正确的记忆value。3.3 记忆压缩与摘要让长期记忆保持“瘦身”长期记忆不能无限增长否则检索效率会下降存储成本也会失控。所以需要记忆压缩机制。常见做法有两种一是定期对相似记忆做聚类合并把多条相关记忆压缩成一条摘要二是对长文本记忆做摘要保留关键信息丢弃冗余细节。压缩的触发时机很关键。我一般设置两个条件记忆数量超过阈值或者距离上次压缩超过一定时间。压缩过程本身也可以借助 LLM 来完成比如让模型把一组相关记忆改写成更精炼的表述。但要注意压缩是有信息损失的所以关键记忆比如用户明确要求记住的内容应该标记为“不可压缩”直接跳过压缩流程。3.4 遗忘机制主动删除比被动淘汰更重要遗忘不是 bug是 feature。一个健康的记忆系统必须能主动遗忘过时、错误或敏感的信息。过时的信息比如“用户上周说要去北京”如果这周用户已经回来了这条记忆就应该被标记为失效或删除。错误的信息比如用户纠正过的内容旧版本必须清理掉否则检索时可能召回错误版本。敏感信息则涉及隐私合规需要支持按用户、按类型批量删除。遗忘的实现方式可以是软删除标记为 deleted检索时过滤或硬删除物理删除。软删除更安全支持恢复硬删除更彻底适合合规要求严格的场景。我建议默认软删除定期做物理清理。3.5 a-memguard 的启示记忆安全不能忽视热搜词里出现了a-memguard: a proactive defense framework for llm-based agent memory这是一个专门针对 Agent 记忆的主动防御框架。这提醒我们记忆系统不只是功能问题还是安全问题。攻击者可能通过注入恶意记忆来操控 Agent 行为。比如在对话中埋入一段看似正常的内容被写入长期记忆后在后续会话中被检索出来影响 Agent 的判断。防御思路包括写入时做内容审核和来源验证检索时做异常检测定期审计记忆库中的可疑内容。“hindsight”如果内置了类似 a-memguard 的机制那它在安全性上就有明显优势。具体实现可能是对每条记忆打上来源标签和可信度分数检索时优先召回高可信度的内容低可信度的需要额外验证。4. 实操过程从零搭建一套 Agent 记忆服务4.1 环境准备与 Docker 部署假设我们要部署一套基于“hindsight”思路的记忆服务第一步是准备环境。推荐用 Docker Compose 来编排因为需要同时跑记忆服务、向量数据库比如 Qdrant 或 Milvus、关系数据库比如 PostgreSQL、缓存比如 Redis。version: 3.8 services: memory-service: image: hindsight-memory:latest ports: - 8080:8080 environment: - DB_URLpostgresql://user:passpostgres:5432/memory - VECTOR_DB_URLhttp://qdrant:6333 - REDIS_URLredis://redis:6379 depends_on: - postgres - qdrant - redis postgres: image: postgres:16 environment: - POSTGRES_USERuser - POSTGRES_PASSWORDpass - POSTGRES_DBmemory volumes: - pg_data:/var/lib/postgresql/data qdrant: image: qdrant/qdrant:latest ports: - 6333:6333 volumes: - qdrant_data:/qdrant/storage redis: image: redis:7-alpine ports: - 6379:6379 volumes: pg_data: qdrant_data:这个编排文件定义了四个服务记忆服务本身、PostgreSQL 存结构化数据、Qdrant 存向量、Redis 做缓存。实际部署时记忆服务的镜像可能需要自己构建或者从私有仓库拉取。注意Windows 用户如果遇到virtualization support not detected错误需要进 BIOS 开启虚拟化支持Intel VT-x 或 AMD-V然后在 Docker Desktop 设置里确认 WSL2 后端已启用。这个坑我踩过好几次尤其是公司配的笔记本出厂默认关闭虚拟化。4.2 记忆写入接口的实现记忆服务的核心接口至少包括写入记忆、检索记忆、删除记忆、更新记忆。以写入为例请求体大概长这样{ agent_id: agent-001, session_id: session-123, content: 用户偏好靠窗座位, type: preference, tags: [travel, seat], importance: 0.85, source: user_explicit, ttl: null }服务端收到后先做内容审核和去重检查然后分别写入 PostgreSQL结构化字段和 Qdrant向量。去重检查可以用向量相似度加内容哈希双重判断相似度超过 0.95 且内容高度重叠的视为重复只更新时间和重要性分数。写入时的 embedding 模型选择也很关键。我一般用text-embedding-3-small或bge-m3前者成本低、效果好后者支持多语言且本地可部署。如果对延迟敏感可以用 ONNX 运行时加速热搜词里onnx部署llm模型也印证了这条路线的可行性。4.3 记忆检索的完整流程检索请求进来后流程分为四步。第一步解析 query提取关键词、实体、时间范围等结构化线索。第二步并行执行三路召回向量检索取 top-50关键词检索取 top-50结构化过滤取 top-50。第三步合并去重后用重排序模型打分取 top-10。第四步按 token 预算组装成最终上下文返回给调用方。这里有个工程细节缓存热记忆。高频访问的记忆可以缓存在 Redis 里减少向量数据库的压力。缓存 key 可以用agent_id query_hash过期时间设短一点比如 5 分钟避免记忆更新后缓存不一致。4.4 与 Agent 框架的集成记忆服务通过 MCP 协议暴露给 Agent 框架。Agent 在需要时调用memory_search工具传入 query 和参数拿到相关记忆后拼接到 prompt 里。MCP 的好处是标准化不管上层用的是 LangChain、AutoGPT 还是自研框架只要支持 MCP 就能接入。集成时要注意调用时机。不是每轮对话都要检索记忆那样太浪费。我一般在这几种情况下触发检索用户提到“上次”“之前”“记住”等关键词时任务开始时需要加载上下文时Agent 主动判断需要回忆时。其他时候可以跳过直接用工作记忆里的内容。5. 常见问题与排查技巧实录5.1 Docker 环境问题速查问题现象可能原因解决方法Docker Desktop 启动失败提示 virtualization support not detectedBIOS 虚拟化未开启重启进 BIOS开启 Intel VT-x 或 AMD-V容器间网络不通未加入同一 network在 compose 文件中定义 networks所有服务加入同一网络向量数据库连接超时端口未映射或防火墙拦截检查 ports 映射确认宿主机防火墙放行数据丢失未挂载 volume为数据库服务配置 volumes持久化数据目录Docker 网络问题我遇到过好几次最隐蔽的一次是容器能 ping 通但 HTTP 请求超时最后发现是 MTU 不匹配。解决办法是在 daemon.json 里设置mtu: 1450重启 Docker 后恢复正常。5.2 记忆检索效果差的排查思路如果发现 Agent“记不住”或“记错了”按以下顺序排查。先看写入是否成功查 PostgreSQL 里有没有对应记录Qdrant 里有没有对应向量。再看检索是否命中手动执行一次检索请求看返回结果里有没有目标记忆。如果写入成功但检索不到大概率是 embedding 质量问题或相似度阈值设得太高。如果检索到了但 Agent 没用上可能是 prompt 组装时被截断了检查 token 预算分配。还有一个常见问题是记忆冲突。比如用户先说“我喜欢咖啡”后来说“我戒咖啡了”两条记忆都存着检索时可能同时召回Agent 就懵了。解决办法是写入时做冲突检测新记忆与旧记忆矛盾时把旧记忆标记为失效或者用时间戳做优先级排序。5.3 性能优化的几个实用技巧记忆系统的性能瓶颈通常在向量检索和 embedding 计算上。优化方向有几个一是用量化索引比如 Qdrant 的 scalar quantization减少内存占用和检索延迟二是批量写入攒一批记忆一起 embedding比逐条快很多三是异步处理写入和检索解耦写入走消息队列不阻塞主流程。实操心得embedding 模型不要频繁换。换模型意味着所有历史记忆的向量都要重新计算成本很高。如果非要换建议新旧模型并行跑一段时间逐步迁移。5.4 记忆安全与隐私合规最后强调一下安全。记忆里可能包含用户隐私信息必须支持按用户删除被遗忘权。写入时要做敏感信息检测手机号、身份证号、银行卡号等要么脱敏存储要么加密存储。检索时要做权限校验确保 Agent A 不能访问 Agent B 的记忆。如果部署在公有云上还要考虑数据传输加密和静态加密。MCP 的 WebSocket 连接建议用 WSStoken 鉴权要做时效性和权限范围控制。6. 记忆系统的演进方向与个人体会“hindsight”这个项目名本身就暗示了一个方向让 Agent 具备“事后回顾”的能力从历史中学习而不是每次都从零开始。我实际用下来记忆系统对 Agent 体验的提升是立竿见影的但前提是设计得当。最怕的是把记忆做成“什么都存、什么都查、什么都不精”那样还不如不做。我个人比较看好的演进方向是记忆的主动整理。现在的系统大多是被动写入、被动检索未来应该能主动发现记忆之间的矛盾、主动合并相似记忆、主动遗忘过时信息。这需要 LLM 本身具备更强的推理能力也需要记忆系统提供更丰富的元数据支持。另外记忆的可解释性也很重要。当 Agent 做出一个决策时能追溯到它是基于哪条记忆做出的判断这对调试和信任建立都很关键。我现在的做法是给每条记忆打上唯一 IDAgent 输出时附带引用的记忆 ID方便回溯。最后分享一个小技巧记忆的冷启动。新用户或新 Agent 没有历史记忆时检索会返回空结果体验很差。可以在初始化时写入一些通用知识或默认偏好让系统有个基础。等真实记忆积累起来后再逐步替换掉这些默认值。这个细节很小但能明显提升首次使用的体验。
企业数字化 ERP 产品动态
相关推荐
Thread线程停止的正确方式:从标志位到中断的优雅实现 1. 线程停止这件事,为什么值得单独拎出来讲做过多线程开发的人大概都有过这样的经历:程序跑着跑着,某个后台任务需要提前结束,你随手写了个标志位,结果线程要么停不下来,要么停得太粗暴把共享数据搞坏了&am… · 2026/11/3 15:55:51
子网划分实战:从C类地址到20个隔离子网的设计全过程 简介:本资源是一份面向计算机网络初学者与高职院校学生的子网划分实验报告,聚焦C类IP地址201.222.5.0的实操拆解,解决“如何根据子网数量与主机需求科学设计子网掩码、计算子网号/广播地址/主机范围”这一核心问题。报告完整覆盖实验目的、环… · 2026/11/3 15:55:51
GA/T 1788.2—2021前端设备分类分级与表1判定矩阵解读 简介:面向公安视频图像信息系统的设计、制造、检验与安全测评人员,提供GA/T 1788.2—2021《公安视频图像信息系统安全技术要求 第2部分:前端设备》的规范正文,可用于理解前端设备分类分级、安全能力等级及合规核对要点。压缩包内共… · 2026/11/3 15:54:50
Opus 5.5、Grok 4.7与GPT-5.6 Sol实测对比:谁是最强AI模型? 从昨天开始,AI圈的朋友应该都没睡好。Opus 5.5、Grok 4.7、GPT-5.6 Sol,三家重量级选手在两天内先后放榜,节奏紧凑得像是商量好的。我刷完三场发布的技术报告和实测数据,第一反应是:这哪是发布,分明是三场复… · 2026/11/3 16:36:58
RTL8367S五口千兆交换机原理图设计:GPIO复用与上电避坑 简介:面向硬件工程师、嵌入式开发者和网络设备学习者,基于RTL8367S芯片的五口交换机参考原理图,可用于理解以太网交换机的硬件架构、接口定义与外围电路组织,适合原理图评审、方案预研和教学参考。压缩包内共1个PDF文件࿰… · 2026/11/3 16:36:58
Prometheus告警规则模板:四层分级与阈值推导实战 告警规则写得好不好,直接决定了值班那晚能不能睡个整觉。我见过太多团队把 Prometheus 部署起来、Grafana 面板拉得漂漂亮亮,结果告警规则要么是从别处抄来的一堆 up 0 ,要么是阈值拍脑袋定的,上线第一周就被误报淹没ÿ… · 2026/11/3 16:36:58
渗透测试高阶技巧与实战经验分享 1. 渗透测试进阶学习路径解析最近完成了为期四天的渗透测试强化训练,这套课程设计针对已有基础的安全从业人员,重点突破Web应用和系统渗透中的高阶技术难点。不同于入门阶段的基础工具使用,本次课程更注重攻击链路的完整构建和对抗思维的培养… · 2026/11/3 16:36:58
DC-4靶机渗透实战:从Web漏洞到Root提权 1. 靶机渗透实战概述DC-4是Vulnhub平台上经典的Linux靶机环境,专为渗透测试实战训练设计。这个靶场模拟了企业环境中常见的Web应用漏洞、权限提升路径和系统配置缺陷,特别适合中高级安全爱好者练习综合渗透技巧。与DC系列前作相比,DC-4在权限… · 2026/11/3 16:36:58
Swisslog百年转型:从电气小厂到物流自动化巨头的历程 1. Swisslog百年转型史:从配电小厂到物流自动化巨头的蜕变1900年,瑞士阿尔劳小镇上,两位电气工程师创立了一家名为SprecherSchuh的小型配电设备厂。谁曾想到,这家最初生产电气控制柜的小作坊,会在125年后发展成为全球物… · 2026/11/3 16:35:57
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 6:04:24
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 5:52:46
STM32F411RE与MAX14431实现SPI隔离:工业现场抗共模干扰实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59
ESP32+大模型AI硬件开发:从Demo到产品的8个工程问题 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59
基于MAX14431BAEE+与PIC18F85J10的SPI隔离方案设计与实践 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 1:01:59
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 6:04:24
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 5:52:46