做AI Agent相关的项目做了快两年我越来越觉得一个残酷的事实单点Agent的能力天花板早就不是模型本身了而是记忆。你给Agent配了工具、写了提示词、接了知识库它还是会在第二次任务里把第一次的结论忘得一干二净。所以我一直在关注跨Agent记忆层这个方向。ai-memory这个项目能在GitHub涨到7.9K Stars说实话一点都不意外——它把“记忆”从单一Agent的内部缓存做成了一个可以被多个Agent共享读写的基础设施层。这篇文章我会结合自己的落地经验把这个开源项目的设计思路、核心原理、接入方式和踩坑记录都摊开讲清楚。1. Agent 集体失忆的病灶上下文窗口、无状态会话与“跨 Agent”这三个词的分量1.1 LLM 天生无状态你在聊天框里的上下文凭什么能被另一个 Agent 记住先从一个最简单的现象说起。你让一个Agent帮你查了一份行业报告它当时总结得头头是道过了半小时你再问它“上份报告里那个增长率的数据是多少”它一脸茫然。原因不复杂绝大多数对话型Agent服务每次请求都是独立的模型本身没有“记性”它只看得见你当前请求里塞进的那段上下文。很多人一开始都用“把历史对话拼进Prompt”来解决问题这本质上是在做缓存不是在做记忆。缓存是临时的、局部于会话的、用完即弃记忆是长期的、结构化的、可以被检索和重组的。ai-memory这类项目站出来做的就是把“会话缓存”升级成“记忆库”并且这个记忆库不是某个Agent私有的而是跨Agent共享的——这才是它名字里“跨”字的重点。你想象一下一个团队里同时跑了销售助手、客服助手、数据分析助手三个Agent它们面对的是同一个用户。如果每个Agent各记各的用户上午告诉销售助手“我预算是5万以内”下午跟客服助手沟通时又得重新描述一遍需求这就是典型的集体失忆。跨Agent记忆层的价值就是让任何一个Agent写入的记忆能成为所有Agent共享的公共资产。1.2 长上下文窗口不是万能药成本、噪声、还有绕不开的隐私边界有人会问现在模型动不动就128K、200K上下文窗口把聊天记录全塞进去不就行了吗我在项目里试过这条路老实说短期demo没问题一旦数据量上来问题一个接一个。首先是成本问题。Token按量计费200K上下文窗口就算没填满单次请求的输入成本也足够让你肉疼更不用说多Agent高频调度时每个请求都要把全量历史背一遍。其次是噪声问题。模型不是搜索引擎你给它塞一堆跟当前任务无关的旧对话它反而会被干扰回答质量肉眼可见地下降甚至出现幻觉——因为它分不清哪些历史信息对当前任务是有效的。还有一个经常被忽略的问题隐私边界。用户的原始对话往往包含大量敏感信息如果所有历史都要进上下文开发者在权限控制上就非常被动。而记忆层的思路是“按需提取摘要、结构化存储、最小化注入”该暴露的才暴露不该暴露的留在库里。这个设计理念比单纯堆上下文要高一个层次。1.3 记忆层的本质把“会话内缓存”升级成“团队级共享数据库”我用一个生活化的类比来说记忆层是什么。单Agent的上下文窗口相当于你工位抽屉里的便签纸自己临时记两句用完就扔。而跨Agent记忆层相当于团队的共享文档库任何成员都能往里写、按需检索、永久沉淀。ai-memory做的就是后者。它不是让Agent“记住所有东西”而是让Agent在需要的时候能快速找到“跟自己当前任务相关的历史记忆”。这涉及写入、索引、检索、注入、遗忘等一系列机制。接下来的章节我会逐层拆解它到底是怎么做到这件事的。2. ai-memory 是怎么工作的从写入、检索到上下文注入的完整链路解析2.1 项目定位与核心能力为什么它在开源社区能拿到7.9K Stars先说项目的定位。ai-memory在GitHub上的定位很清晰它不是某个特定Agent框架的插件而是一个独立的记忆服务/组件。无论你用的是LangChain、LlamaIndex、Dify还是自己写的调度框架都可以通过API把记忆能力接进去。我看过这个项目的设计文档和社区讨论它7.9K Stars很大程度上得益于解决了一个真实的共性痛点Agent框架本身不提供跨会话、跨Agent的记忆能力开发者只能自己造轮子。而ai-memory把记忆的写入、存储、检索、共享做成了标准化接口相当于给了生态一个统一的“记忆层”实现。它的核心能力可以归纳为四条长期存储、语义检索、跨Agent共享、生命周期管理。前两项不稀奇很多向量数据库方案就能做后两项才是跨Agent记忆层的灵魂。共享意味着记忆的多读多写生命周期管理则意味着记忆不是只增不减的黑洞而是有优先级、有过期时间、有清理机制的数据资产。2.2 记忆的写入谁有权限写、写什么粒度最合理记忆层的入口是写入。但“把什么都存下来”是最常见的错误。我见过有人把Agent的每一句原始对话都当记忆存进去结果记忆库变成垃圾场检索时全是噪声。合理的做法是让Agent在完成一个阶段性任务后生成一条结构化的记忆摘要而不是逐字记录。举个典型的数据结构这类项目里一条记忆记录通常长这样memory_record { memory_id: mem_001, agent_id: researcher_a, # 写入者标识便于追溯 source: conversation_summary, # 来源类型摘要/偏好/事实/决策 content: 用户每周三发布行业简报偏好数据图表而非纯文字描述, embedding: [...], # 内容向量用于语义检索 metadata: { created_at: 2025-06-11T10:00:00Z, importance: 0.9, # 重要度越高越难被清理 scope: shared # 共享范围私有/公开/分组 }, expire_at: None # 过期时间None表示长期有效 }写入时机也很关键。我的经验是千万别在用户交互的响应链路上同步写记忆那会把首Token延迟拉高一两百毫秒。正确做法是异步落库Agent返回用户回答之后再触发一次摘要生成和写入动作。用户感知不到这个额外开销记忆也在后台安静沉淀。2.3 记忆的读取按需检索比“全量回放”更接近人的记忆方式读记忆的方式决定了记忆层的实用程度。早期方案喜欢把历史记录做时间排序然后一股脑截断塞进Prompt这本质上还是记忆的搬运不是记忆的检索。真正好用的记忆层必须支持语义检索具体流程是当前Agent收到新任务后先把任务内容转成查询向量再去记忆库中搜索最相关的若干条记忆最后把命中的记忆和当前上下文一起注入Prompt。这个“注入”环节值得细说。注入不是把记忆原文堆在Prompt开头就完事而是要对命中的记忆做一层重组。比如从十几条命中记忆里按与当前任务的相关度排序只取Top 5同时把每条记忆压缩成一句话。我在接LangChain Agent时会把注入抽成一个函数用模板拼一段“相关记忆”区域You are an AI assistant with long-term memory. Relevant memories from the shared memory layer: - {memory1} - {memory2} - {memory3} Current conversation: {current_messages}这样做的收益是既让模型感知到“我是有记忆的”又不会让记忆内容淹没当前任务指令。一个好的记忆注入应该像人一样——只想起跟眼前这件事有关的那部分。2.4 跨 Agent 的关键共享命名空间、角色隔离与写入冲突跨Agent共享记忆最怕的是“一锅炖”。销售Agent写入的客户偏好如果原封不动被售后Agent当作通用事实拿去用很可能翻车。所以成熟的跨Agent记忆层一定会有两个机制共享命名空间和角色隔离。以ai-memory为代表的方案通常会给记忆加一个scope字段区分是“公开记忆”还是“某个Agent的私有记忆”。公开记忆可以被所有Agent检索到私有记忆只有特定Agent能读。这还不够我建议再做一层“来源Agent标识”也就是记录这条记忆是谁写的下游Agent读到它时可以判断这条记忆来自哪个视角必要时带上来源提示。我在实际项目中遇到过这样的情况A Agent记下“用户偏好某品牌”但这条信息来自销售场景在技术支持场景下并不成立。如果不带来源信息B Agent就可能误用。写入冲突则是另一个坑。两个Agent同时更新同一条用户偏好时不能简单后写覆盖前者。更稳妥的做法是记忆版本化保留更新历史或者在冲突时按时间、置信度和写入者优先级做合并判断。这一层ai-memory有自己的一套处理逻辑你也可以在封装层再做一层策略控制。3. 为什么“记忆层”能跑赢“更长的上下文窗口”三笔必须算清楚的账3.1 成本账全量历史丢给模型是最省事也是最烧钱的做法先算一笔具体的账。某企业客服Agent每天约1万次会话每次会话平均产生3K Token的历史。如果采用“全量历史拼Prompt”方案每个请求都要把这3K Token从头再算一遍一个月仅输入Token就是9亿按常见模型计费标准这可不是一笔小钱。而记忆层方案每次请求只注入Top 5相关记忆压缩后通常不超过500 Token成本直接降一个量级。更隐蔽的是隐性成本。全量历史一旦拖慢响应速度用户体验下降转化成流失客户那成本就更没法算了。记忆层用“极低的检索成本”换掉“高昂的全量回放成本”从架构上就是更划算的设计。3.2 效果账噪声让模型“聪明反被聪明误”而关键记忆才是有效信息任何尝试过给Prompt堆历史的人都会发现一个反直觉现象历史越多模型反而越容易答非所问。原因在于长上下文里的信息密度被稀释了模型在注意力分配上抓不住重点。比如用户当前问的是发货时间你把一个月前聊过的十条售后记录都塞进去模型很可能被带偏到投诉处理话题。记忆层的检索机制天然规避了这个问题。它像是一个高分辨率的筛子只把当前任务最相关的2到5条记忆捞出来其余全部留在库底。信息密度高模型的注意力自然聚焦。我在跑评测时用同一组测试集对比过“全量历史”和“检索记忆”两种方案后者在事实准确性上的得分明显更高。3.3 架构账把记忆从“单Agent私产”变成“团队共享资产”才能支撑复杂协同绝大多数Agent项目走到中期瓶颈一定不在单Agent的智能程度而在多Agent之间信息是否流通。你让一个Agent花了三天积累的行业洞察另一个Agent完全不知道这团队怎么协作跨Agent记忆层解决的是系统性协同问题。当记忆成为公共基础设施Agent之间的信息传递不再依赖开发者手动写共享变量或数据库而是通过记忆层天然完成。这个架构层面的升级就像公司从“每个部门各拉各的Excel表格”进化到“统一数据中台”——单看某个部门效率不一定提升多少但整个组织的信息流动性完全是两个数量级。4. 上手实操把 ai-memory 接进本地 Agent 环境的四步走4.1 准备一个记忆服务、一个Agent环境以及最容易被忽略的数据表设计第一步是准备环境。到GitHub仓库把ai-memory拉下来按README说明把服务起起来。部署时重点检查三点记忆存储用的是哪个向量数据库或关系型数据库Embedding模型用的是本地小模型还是云端API记忆服务监听的端口是否能被你的Agent服务访问到。如果你只是本地调试建议先用默认配置跑通再换生产配置。环境就绪后不要急着写代码先把数据表设计想清楚。我踩过一个没提前设计的坑上线两天后发现记忆库里塞满了无法区分来源的脏数据最后只能全量清洗。所以建表阶段至少要有这样的字段记忆ID、写入Agent、所属会话、内容摘要、原文可选、Embedding向量、共享范围、重要度、创建时间、过期时间。字段表可以在ai-memory默认实现的基础上调整但“来源可溯”和“范围可控”这两条底线不能丢。4.2 写入侧对话结束后异步落库摘要抽取和质量把关都必须有我把写入逻辑封装成一个异步任务大致链路是这样的用户和Agent的对话结束后后台任务拿到本次会话的全部消息调用一次摘要模型把对话提炼成结构化记忆然后写入记忆库并生成对应的Embedding索引。写摘要时有个技巧不要只让摘要模型“总结对话”要给它明确指令告诉它“提取用户透露的持久性事实、偏好和明确需求过滤临时性寒暄和与任务无关内容”。否则它会把“今天的天气不错”这种废话也存进记忆库。质量把关的另一招是重要度打分让摘要模型给每条记忆按0到1打一个importance分低于阈值的记忆不写入或标记为易清理。这招能帮你省掉大量后期维护成本。4.3 检索侧任务进来先查记忆再拼Prompt顺序执行别倒置检索侧的接入逻辑很简单但很重要用户消息到达Agent之前先经过记忆层做一次语义检索把Top N条记忆带到Prompt组装环节。我把这个顺序写死在代码里先检索后组装再送模型。顺序一旦倒置比如先让模型理解用户消息再检索就会白白多一轮模型调用延迟和成本都上去了。检索参数也要调几轮。常见的包括Top N数值我一般取3到8、相似度阈值低于0.5的结果宁可不要、以及是否按重要度优先排序。调参时建议做一组小样本评测不要拍脑袋定参数。项目默认参数是个不错的起点但每个业务场景的最佳值都不一样。4.4 验证记忆是否真正生效用同一个任务的前后对比来说话接入完成后最关键的验证步骤是“对比测试”。我通常准备三组测试任务第一组是纯重复性任务比如让Agent复述用户上次提过的偏好第二组是跨Agent任务让B Agent读取A Agent写入的记忆第三组是干扰性任务在记忆库里塞入大量无关信息看检索是否还能精准命中。对比方式也很直接同一组问题分别跑“无记忆版Agent”和“接记忆版Agent”把回答并排摆在一起打分。如果接入记忆后回答没有明显改善八成是检索命中率或注入方式出了问题得回头查。千万别只看“能跑通”就以为成功记忆层的价值必须体现在回答质量的提升上。5. 踩坑实录让多个 Agent 共享记忆层的三个典型问题及排查链路5.1 记忆污染A任务写入的偏好为什么会影响B任务的关键判断我在一次多Agent协同项目中遇到了记忆污染问题。当时销售Agent记忆了一条“用户对价格敏感”结果售后Agent在处理该用户的故障咨询时检索到这条记忆居然开始主动给用户推荐优惠套餐完全跑偏了。排查链路是这样的先在日志里确认售后Agent播放的Prompt中到底注入了哪些记忆发现“价格敏感”这条确实命中了再去看它的检索条件和业务场景发现它并没有对记忆的scope做过滤。最终修复分两层第一层是写入侧给销售场景的记忆打上scopeleads_leveraged_mem属性第二层是检索侧要求售后Agent在检索时排除与自身业务无关的场景标记。修完之后同类问题再没有出现过。这个坑告诉我们跨Agent共享记忆不是“所有人都能读所有记忆”必须在业务层面定义清晰的可见性边界否则共享会变成互相污染。5.2 检索命中率低相似度不等于相关性Embedding有它的脾气第二个坑是检索命中率。有时候记忆库里有正确答案但Agent就是检索不到返回的结果跟用户问题毫无关系。我一开始以为是Embedding模型不行换了更大的模型也没解决。后来排查发现两个根因。一个是查询向量构造方式不对。直接拿用户当前问题原文去做Embedding效果往往不好需要先把用户问题做一次意图补全转换成更完整的查询句子再Embedding。另一个是记忆内容本身太长或者太抽象导致向量表示在语义空间中偏离主题。解决办法是把记忆写得尽量具体带上业务实体和时间节点比如“2025年6月的促销活动主推A套餐折扣8折”就比“用户喜欢促销”好检索得多。5.3 记忆只进不出是记忆层项目的隐藏地雷不是所有记忆都有长期价值。我见过有项目上线三个月后记忆库膨胀到几百万条检索延迟从50毫秒涨到500毫秒成本也跟着翻倍。更严重的是旧记忆和新记忆混在一起模型经常被过时信息误导。这块必须在一开始就设计遗忘机制。两条路径都可以一是基于时间衰减对超过指定期限的记忆自动降权或清理二是基于用户反馈当新知识明确覆盖旧知识时主动标记旧记忆为过时。我曾经试过完全靠定期脚本批量清理结果把一些有价值的长期偏好给清掉了。后来改成“人工抽查置信度加权清理”效果才稳定下来。记忆层和数据库一样设计时就要考虑数据生命周期否则后续维护会非常痛苦。6. 把记忆层当产品功能来设计分层的现实建议与后续扩展方向6.1 记忆分层短期、中期、长期各管各的别混在一个池子里踩过几轮坑之后我形成了自己的记忆分层方法论。短期记忆对应当前会话内的临时信息比如用户刚刚随口说的一句话可能几分钟后就失效中期记忆对应单个Agent跨会话的偏好积累比如某个用户常用的沟通风格长期记忆对应组织级的核心资产比如业务规则、关键决策记录、领域知识。在实现上我建议在记忆库中为不同层级的记忆设置不同的字段约束和清理策略。短期记忆可以高频写入、高频过期重要度天然低长期记忆要经过更高标准的摘要和质量审核才能写入重要度高、几乎不清理。通过这样的分层设计记忆库的维护复杂度会大大下降——不是每条信息都值得永久保留。6.2 接入跨Agent记忆层之后权限与审计会让你的生产环境更稳到生产环境这一层记忆的权限和审计就不是可选项了。多Agent共享记忆意味着任何Agent写入的信息可能被其他Agent读取如果其中包含用户敏感信息风险链路是很长的。我的建议是每条记忆的可见性必须可控至少要支持私有/公开/分组三级写入和读取都要有日志谁读了哪条记忆、谁写了哪条记忆要能回溯。有一部分开发者的Agent项目规模不大觉得审计功能没必要但等出问题再补非常被动。我在早期版本里没加审计结果有一次记忆被错误覆盖查了半天定位不到是哪个Agent干的。后来补上了写入者和来源字段排查效率大幅提升。6.3 从“记对话”到“记决策图谱”让记忆层承载更复杂的信息结构ai-memory这类项目的后续想象力远不止对话摘要。真正长期有价值的是结构化决策记忆某个用户在执行某个任务时做了哪几步选择、依据什么理由做出这个决策、最终结果如何。如果把这些沉淀成一一关联的记忆网络Agent在新任务中就能基于历史决策范式来推理而不是每次从零开始。我在本地实验时尝试过在记忆库中增加“决策节点”和“决策关联”两类记录。比如数据分析Agent在选模型时曾经对比过A/B两种方案并记录了理由下次遇到类似建模任务时它可以先调用记忆层里的决策历史再决定是复用还是重新搜索。这个方向把记忆从“事实回忆”推进到“经验沉淀”对复杂Agent系统来说才是真正的护城河。从我个人的实际体验出发做一个能用的记忆层不算难难的是让记忆在跨越会话、跨越Agent之后仍然保持高信噪比同时不给系统带来过重的维护负担。ai-memory这类项目把最难的基础设施部分做了抽象剩下来的业务层设计拼的更多是对自己场景的理解。如果你正在做多Agent项目我建议把它当成一个独立产品模块来推动而不是顺手加上的辅助功能——记忆层建设得越早后续的Agent协同之路会越顺畅。
企业数字化 ERP 产品动态
相关推荐
OpenSpec与Cursor集成:AI编程规范驱动开发实践 1. OpenSpec与Cursor的AI原生开发工作流概述OpenSpec作为规范驱动开发(SDD)框架,正在重塑AI编程的工作方式。它通过结构化的工作流将原本随意的AI对话转变为可追踪、可复现的工程实践。在Cursor这样的智能IDE中集成OpenSpec,相当于为AI编程装上了"导… · 2026/11/2 22:34:56
HTTPS证书验证机制详解与最佳实践 1. HTTPS证书验证机制概述 当我们在浏览器地址栏看到那个绿色的小锁图标时,背后其实隐藏着一套精密的数字证书验证机制。HTTPS连接建立过程中,客户端(通常是浏览器)会通过以下几个关键步骤验证服务器证书的合法性: 想… · 2026/11/2 22:34:56
学术论文AIGC检测与查重双优化技术方案 1. 项目背景与核心痛点去年帮学弟修改毕业论文时,发现一个令人头疼的现象:某高校要求论文AIGC检测率不得超过15%,同时查重率要低于10%。这就像要求一个人同时做到"说话不能像机器人,但又不能和别人说同样的话"。传统降重… · 2026/11/2 22:34:56
【JVM】避免java内存泄漏、溢出的几种方法 /* 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:14:09
nginx搭建网站 /* 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:14:09
【flink报错】flink cdc无主键时的操作 /* 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:14:09
【架构方法论(一)】架构的定义与架构要解决的问题 /* 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:14:09
【设计模式之美】快速地改善代码质量的几条编程规范(上) /* 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:14:09
2024年Java高阶 /* 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:13:09
双极步进电机控制实战: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/2 4:42:45
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/2 5:17:18
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/2 4:42:45
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/2 5:17:18