Claude长期记忆方案:claude-mem实现跨会话上下文持久化
如果你长期用 Claude 处理实际开发任务多半遇到过这种场景昨天刚和它一起确定了项目的技术选型、约定好了命名规则今天重新打开终端它却像第一次见到这个仓库一样连最基本的背景都要你再讲一遍。我一开始也以为是没切换好上下文后来次数多了才明白问题出在对话式 AI 的记忆机制本身。Claude 的上下文窗口再大也只存在于那一轮会话里会话结束记忆归零。claude-mem 就是为了解决这个问题出现的开源工具——它的思路很直接把每一次交互记录到本地并在后续对话中让 Claude 按需检索这些历史记录。我最早接 claude-mem 是在一个前后端联动的项目上对话经常被我自己打断隔天就接不上。用了它之后相当于给 Claude 配了一个永不关闭的“项目笔记本”技术决策、踩坑记录、命名偏好都能在关键时刻被自动召回。这篇文章我会把它的存储结构、语义索引、部署步骤和实测效果完整拆一遍适合已经在重度使用 Claude Code、或者自己调用 Claude API 做项目的人。如果你正在被“AI 失忆”折磨这篇应该能少走不少弯路。1. 先搞清楚一个前提上下文窗口大不等于有长期记忆1.1 200K 窗口的真实使用体验很多人有个错觉Claude 的上下文窗口已经很大了放下一整个中型项目的代码应该不成问题怎么还会“失忆”这里要分清两个概念窗口容量和记忆持久性。窗口容量决定的是“这一轮对话里能同时放多少信息”而记忆持久性决定的是“下一轮对话开始后上一轮的信息还在不在”。Claude 的上下文窗口再大它也是跟着会话生命周期走的。你关闭终端、开启新会话窗口里的内容就只存在于你的聊天记录文件里模型本身并不会主动去翻历史。也就是说窗口是一块工作台不是仓库工作台再大下班清场之后就什么都不剩了。实际用起来200K 窗口也没有想象中那么能装。塞入大量代码片段后模型对远处信息的注意力会明显下降检索到的关键细节容易被淹没。我自己做过对比上下文塞到一半以上时模型回答的准确率和直接相关度都会打折扣。所以单纯靠加大窗口解决“记得之前说过什么”这个问题既不经济也不可靠。1.2 开发场景真正需要的“项目记忆”是分层的把记忆问题拆开看项目开发过程中需要的背景信息其实分三层。第一层是短期工作上下文比如当前正在改的模块、刚定位到的报错、正在调用的函数签名这些信息应该在当前会话里保持活跃。第二层是中期决策记录比如为什么选 A 方案不选 B 方案、某段代码的历史演变原因、已经排查过但没有解决的问题这些信息可能在几天之后还会被反复引用。第三层是长期偏好与规范比如代码风格、目录组织习惯、某个接口的约定用法这些在一个项目周期内需要保持稳定。典型的对话式 AI 只能完整承载第一层第二层和第三层基本靠人肉提醒。claude-mem 的设计目标就是把这些“窗口之外”的信息沉淀下来在需要的时候按需重新注入对话。1.3 claude-mem 的定位会话之外的第二层记忆所以 claude-mem 不是一个聊天记录查看器也不是简单的日志工具。它的做法是把每次对话内容持久化到本地数据库用向量模型建立语义索引然后在新的对话开始前根据当前问题检索出相关历史作为背景信息提供给模型。这样带来的直接影响是Claude 不再需要你把项目背景从头讲一遍。它只需要检索到之前的关键对话就能快速回到之前的工作状态。这也是我后来把它当成 Claude Code 标配的原因对于跨天的项目开发这套机制解决的不是“方便”的问题而是“能不能持续工作”的问题。2. 记忆机制拆解本地存储、向量索引与按需召回2.1 存储层会话、消息、摘要三层表结构claude-mem 的底层存储选择的是 SQLite这点我认为是个很务实的选择。它不需要你额外装数据库服务数据落在本地单文件里备份就是复制一个文件整个工具的所有状态都能随项目走。存储结构上核心是三张表。sessions表记录每一轮对话的元信息比如项目路径、会话开始时间、会话摘要messages表存具体的消息内容包括角色和正文embeddings表存消息对应的向量。一个简化的建表结构大致长这样CREATE TABLE IF NOT EXISTS sessions ( id INTEGER PRIMARY KEY AUTOINCREMENT, project TEXT NOT NULL, started_at TEXT DEFAULT (datetime(now)), summary TEXT DEFAULT ); CREATE TABLE IF NOT EXISTS messages ( id INTEGER PRIMARY KEY AUTOINCREMENT, session_id INTEGER NOT NULL, role TEXT NOT NULL CHECK (role IN (user, assistant, system)), content TEXT NOT NULL, created_at TEXT DEFAULT (datetime(now)), FOREIGN KEY (session_id) REFERENCES sessions(id) ); CREATE TABLE IF NOT EXISTS embeddings ( message_id INTEGER PRIMARY KEY, vector BLOB NOT NULL, model TEXT NOT NULL, created_at TEXT DEFAULT (datetime(now)), FOREIGN KEY (message_id) REFERENCES messages(id) );注意这里messages存的是原始内容embeddings存的是向量两者通过message_id关联。如果在 SQLite 里做向量检索实际项目中通常需要配合sqlite-vec扩展来实现近邻查询否则就得把向量读出来在应用层算相似度。2.2 语义召回怎么让“想不起来原话”也能查到存储只是第一步真正关键的是“找得回来”。如果靠 SQL 的LIKE做关键词查询效果会非常差。因为你事后回忆一件事往往不会用和当初聊天时一模一样的措辞。比如你昨天问的是“ORM 怎么配置连接池”今天想查的时候很可能说的是“上次那个数据库连接的问题”。语义检索解决的就是这个问题。每条消息在写入时都会被 embedding 模型转换成一个高维向量查询时把当前问题也转成向量然后计算向量之间的余弦相似度取出最相近的 top-k 条。这个过程可以理解成“翻译成同一种语言再比对”词面上的差异不影响召回。一个典型的检索逻辑用 Python 写出来大概是这个感觉import sqlite3 import numpy as np def retrieve(query, top_k5, min_score0.7): db sqlite3.connect(~/.claude-mem/db.sqlite) query_vec embed(query) # 调用本地或在线 embedding 模型 rows db.execute( SELECT m.content, v.vector, m.created_at FROM embeddings v JOIN messages m ON v.message_id m.id ORDER BY v.session_id DESC ).fetchall() scored [] for content, vec_blob, created_at in rows: vec np.frombuffer(vec_blob, dtypenp.float32) score cosine_similarity(query_vec, vec) if score min_score: scored.append((score, content, created_at)) scored.sort(reverseTrue) return [item[1] for item in scored[:top_k]]这里有两个参数直接决定了检索质量。top_k控制召回几条min_score控制相似度门槛。门槛低了会召回一堆语义相关但你根本不想看的对话门槛高了又会漏掉关键信息我后面会在实测部分给出相对靠谱的经验值。2.3 自动摘要长会话不能一直全文堆着对话记录如果只存不整理时间长了数据库会膨胀而且大量细节会淹没真正重要的主线。claude-mem 的解法是分层保留最近的对话保留全文较早的会话定期压缩成结构化摘要。摘要不是随便截取开头几段就完事。它会把一段长对话中涉及的问题、结论、遗留事项提炼出来最好还能带上当时的决策理由。这个摘要任务我建议直接交给 Claude 自己来做给一个固定的提示词模板要求它输出包含“目标 / 决策 / 遗留问题 / 关键词”四段式的摘要比任何规则式截断都可靠得多。压缩策略上按项目维度保留最近 7 天的原始消息更早的数据只保留每日摘要。这样既保证了跨周上下文仍可召回又控制了存储成本和检索噪声。实际跑下来一千轮对话的原始数据加上向量索引磁盘占用大约在 30MB 到 60MB 之间对于现代开发机来说可以忽略不计。3. 从零部署 claude-mem安装、配置与接入3.1 安装与初始化claude-mem 以命令行工具的形式分发安装需要 Node.js 18 以上环境如果打算用本地 embedding 模型建议 Python 3.10 以上。安装命令很常规npm install -g claude-mem安装完先确认版本claude-mem --version然后初始化。初始化会创建默认的配置目录和数据目录并生成一个基础的配置文件claude-mem init初始化完成之后~/.claude-mem/下会生成一个config.json所有后续的行为都由这个文件控制。3.2 关键配置项解析config.json打开之后里面最值得关注的配置项是这几块{ storage_path: ~/.claude-mem/db.sqlite, embedding: { provider: local, model: all-MiniLM-L6-v2, api_base: }, retrieval: { top_k: 5, min_score: 0.72, max_inject_tokens: 1200 } }storage_path是数据库文件位置建议放到项目之外避免误提交到代码仓库。embedding.provider有两个选项local和api。local依赖本地模型完全离线可用隐私性最好但第一次生成向量时会有秒级延迟api则调用在线向量接口速度更快适合对延迟敏感的开发流。我自己的建议是日常开发用本地模型足够因为嵌入的是一个语义向量小模型的精度完全够用。如果觉得本地嵌入质量不稳定再切换到云端模型不迟。至于retrieval里的两个检索参数top_k控制在 5 到 8 之间min_score设在 0.7 到 0.75 之间是我测试下来误召回和漏召回都比较平衡的范围。3.3 接入 Claude Code最推荐的方式是 MCP Serverclaude-mem 接入 Claude Code 最顺滑的方式是作为 MCP Server。MCP 你可以理解成一种标准化的工具协议它能让 Claude 在对话过程中主动调用外部工具而不需要你在提示词里手动注入历史记录。配置方式是在 Claude Code 的 MCP 配置文件里注册一个 server。以 JSON 格式为例{ mcpServers: { claude-mem: { command: claude-mem, args: [mcp], env: {} } } }配置好之后重启 Claude CodeClaude 就能在需要时自动调用 claude-mem 提供的记忆工具。这个路径下有一个明显的好处无需感知记忆的存在检索、召回、注入都是自动完成的。你只需要正常对话Claude 会在合适的时机自己翻历史。如果你不是用 Claude Code而是自己写的程序调用 Claude API也可以直接用 claude-mem 的命令行接口在对话开始前手动跑一次检索claude-mem search 之前讨论的数据库连接池配置把检索到的内容插入到 system prompt 或首轮 user 消息里即可。这种方式虽然多一步手动操作但胜在完全可控。3.4 跑通闭环的验证方法装完之后我建议先按下面的顺序验证一遍确认整个链路是通的。先产生记忆。开一个会话和 Claude 讨论任意一个具体话题比如“给这个脚本加一个超时重试机制重试次数 3 次指数退避”正常聊完。然后查看存储是否生效claude-mem stats这个命令会输出当前的会话数、消息数、向量数和数据库大小。如果消息数为 0说明自动记录没有触发需要回去检查 MCP 配置。最后做跨会话召回测试。关掉当前会话重新打开一个新会话输入claude-mem search 超时重试怎么定的如果返回结果里有上面那轮对话的内容说明存储、嵌入、检索三个环节都工作正常。如果什么都查不到优先检查 embedding 模型是否正常加载了。4. 实测中的数据表现与四个容易翻车的细节4.1 实测场景跨天开发一个内部工具为了验证 claude-mem 在真实开发中的效果我拿一个模拟项目“某内部数据清洗工具”重新走了一遍开发流程。第一天用 Claude 确定了技术栈、日志格式、错误码规则讨论了清洗规则的优先级聊了大概四十分钟。第二天刻意不开任何历史记录直接开一个新会话提的需求是“继续做数据清洗规则”。没有 claude-mem 时Claude 会询问项目背景、重新确认技术栈甚至给出和前一天完全不一致的规则优先级。而接入了 claude-mem 之后新会话里我还没有主动提供背景Claude 就已经根据检索到的历史内容自动说出了“根据之前的讨论清洗规则优先级是空值处理优于格式校验”这样的话。这说明记忆注入确实发生了而且生效在用户完全无感知的环节。最让我觉得值的是它把“重新对齐背景”的轮次直接省掉了。实际体验上跨天继续开发的效率提升至少在五成以上因为不需要重述一遍前提也不需要反复纠正模型对上下文的理解偏差。4.2 延迟与资源占用要不要常驻我顺手测了一组性能数据环境是 Apple Silicon 的开发机SQLite 本地库向量模型是本地小型 embedding 模型。操作耗时备注消息写入不含嵌入1-3msSQLite 单条插入消息向量化本地模型100-300ms首次加载模型额外耗时语义检索 top-530-80ms视库内消息总量而定语义检索 在线 embedding200-500ms网络往返占大头每日自动摘要3-8s取决于对话长度和模型速度这个数据意味着 claude-mem 完全可以常驻运行。它在对话空闲时间做异步写入和嵌入检索的延迟对用户基本无感。唯一要留意的是首次使用本地 embedding 模型时模型加载会有一个明显的卡顿这个属于一次性成本。4.3 四个容易忽略的问题第一个问题是检索噪声。min_score设得太低会出现“语义上相关但实际没用的历史”。最典型的例子是项目里曾经讨论过 A 方案后来否定了结果检索时总是把 A 方案的历史翻出来导致 Claude 做出过时判断。我的经验是把min_score保持在 0.7 以上同时可以把摘要表标记为非实时匹配只作为兜底信息。第二个问题是上下文挤占。注入的记忆如果太多反而会挤压真正要紧的上下文空间。我见过有人把top_k调到 20结果 Claude 的回答质量明显下降因为大量历史占住了窗口当前任务的注意力被稀释。控制注入内容的总 token 数比如单次不超过 1200 token会是一个比较安全的设防。第三个问题是敏感信息。claude-mem 的数据默认是明文存本地的如果电脑不安全或者项目代码库要分享务必检查数据库里有没有误存 token、密钥之类的东西。更稳妥的做法是在初始化阶段就排除敏感文件路径或者对messages表做一层加密存储。第四个问题是版本兼容。Claude Code 更新后MCP 配置的加载方式偶尔会变导致 claude-mem 静默失效。建议每次更新 Claude Code 后跑一次claude-mem stats确认消息数还在增长。这问题不严重但如果你没注意到就会发现记忆功能悄悄停了一周。5. 进阶玩法从工具记忆到个人知识库5.1 定时压缩与归档防止记忆库无限膨胀记忆库如果一直存原件时间长了检索质量会下降因为语义相似的历史太多top-k 召回结果会被不重要的老对话占满。我建议配置一个每日或每周的定时任务来做摘要压缩。比如 macOS 上用 launchd或者 Linux 上用 cron执行一行命令claude-mem summarize --project my-project --older-than 7d --keep summaries这个命令会把超过 7 天的原始消息压缩成摘要同时保留摘要的向量索引。配合数据库定期备份整个记忆体系就能做到既有长期保留又有可控的存储增长。5.2 与笔记体系联动让记忆沉淀到项目文档里claude-mem 的检索能力很强但它的数据天然是私有的存在 SQLite 里没法被常规文档工具检索。为了把这些记忆变成可复用的知识资产我会定期把 claude-mem 的摘要导出成 Markdown追加到项目的 CHANGELOG 或者 docs/decisions 目录下。具体做法是跑一次导出命令claude-mem export --project my-project --format markdown docs/ai-memory.md这样做的额外价值是即使之后换了设备、忘了装 claude-mem项目文档里也留着那份沉淀过的知识。长期下来这个文件几乎就是项目决策记录的核心索引。5.3 多项目隔离与团队协作的取舍claude-mem 默认按项目维度做隔离也就是不同目录下的会话不会互相污染。这个设计很合理推荐继续保持不要让跨项目的记忆混在一起。团队协作场景里有人会想共享一份记忆库但我不建议直接共享。原因是每个工程师的提问方式、关注点和工作节奏不同共享库很容易被混合上下文干扰召回质量。更合适的做法是各自维护本地记忆需要沉淀的决策最终落到项目文档里形成事实标准。这样既保留了个人的上下文优势又避免了团队记忆库变成一锅粥。我后来在真实开发里的体会是claude-mem 最理想的用法不是让 Claude 记住一切而是让它只记住“值得记的”。它解决的是上下文边界问题而不是替你做判断。真正有价值的技术决策最后还是要靠人来确认、沉淀、维护。把工具调教好了它就是一个安静但靠谱的项目伙伴。

相关新闻

多Agent系统设计实战:从架构选型到工程落地

多Agent系统设计实战:从架构选型到工程落地

多Agent这个词,最近一年几乎快被说烂了。只要聊到大模型应用落地,多少都会碰几下“Multi-Agent”。但说句实在话,真正能把多Agent设计明白的人,远没有嘴上聊得那么多。很多项目喊着多Agent,最后做出来就是给同一个模型…

2026/10/13 18:33:52 阅读更多 →
Java多态详解:从原理、优势与坑到综合练习

Java多态详解:从原理、优势与坑到综合练习

如果你已经跟着这个系列学到这儿,说明Java基础语法、面向对象、继承和重写这些关都过了。但我猜你现在的状态跟我当年差不多:继承好像懂了,重写也会写了,一提到“多态”总觉得它神神秘秘,好像所有框架都在用&#xff0…

2026/10/13 14:49:00 阅读更多 →
多Agent架构设计实战:角色定义、通信协议与任务编排

多Agent架构设计实战:角色定义、通信协议与任务编排

1. 先想清楚一件事:你真的需要多Agent吗先说个实在的判断标准。我见过太多人一听说"多Agent"这个词,就觉得单Agent不够高级,恨不得把手里所有任务都拆给好几个大模型,结果做出来的东西不但没有变强,反而更慢…

2026/10/14 20:23:13 阅读更多 →

最新新闻

Sub-Agents、Skills与知识库:大模型应用架构重构实践

Sub-Agents、Skills与知识库:大模型应用架构重构实践

去年做一个复杂业务场景的大模型应用时,我一开始图省事,把所有能力塞进单个 Agent:检索、生成、校验、执行全在一个上下文里跑。结果很快发现这条路走不通——prompt 越来越长,模型在工具调用里频繁迷失,多轮对话后甚至…

2026/10/14 23:51:18 阅读更多 →
智能体角色拆分实践:Sub-Agents、技能包与知识库协同跑通

智能体角色拆分实践:Sub-Agents、技能包与知识库协同跑通

1. 为什么要把智能体拆成角色,而不是做一个万能大脑做AI智能体项目,组里最常听到的一句话就是“能不能让这个Agent自己搞定所有事”。最开始谁都这么想,真做两个星期就会发现,任务越复杂,单个Agent越容易顾此失彼。这个…

2026/10/14 23:51:18 阅读更多 →
归并排序实战指南:从寻找大富翁读懂排序算法的取舍与细节

归并排序实战指南:从寻找大富翁读懂排序算法的取舍与细节

做这套题时我最初的提交记录特别丢人——先写了个裸的sort直接交,数据量不大,过了,但我自己清楚,这种写法对“寻找大富翁”可以说毫无解释力。题目考的是排序,可你要真只会调库,那“归并排序”四个字就永远…

2026/10/14 23:51:18 阅读更多 →
ScanNet SensReader:.sens RGB-D 传感器流文件格式与读取工具完全解析

ScanNet SensReader:.sens RGB-D 传感器流文件格式与读取工具完全解析

数据集计算机视觉3D视觉 【免费下载链接】ScanNet 项目地址&#xff1a; https://gitcode.com/gh_mirrors/sc/ScanNet 点击查看 免费下载 在 ScanNet 数据集中&#xff0c;每个扫描序列目录&#xff08;scene%04d_%02d&#xff09;都包含一个 <scanId>.sens 文件&#x…

2026/10/14 23:51:18 阅读更多 →
统一内存撑起万亿参数模型:本地部署大模型的算力与功耗实战指南

统一内存撑起万亿参数模型:本地部署大模型的算力与功耗实战指南

去年年底&#xff0c;我把一台以前只在数据中心见过的计算设备搬进了工位旁边的小机房里。开机那一刻&#xff0c;我盯着监控面板半天没说话——系统里那串 748GB 统一内存余量&#xff0c;比我手头几台常用服务器的内存总和还多。更离谱的是&#xff0c;它不是一台机架式服务器…

2026/10/14 23:51:18 阅读更多 →
守株待兔式投资:构建路径图与触发哨兵的稳健交易体系

守株待兔式投资:构建路径图与触发哨兵的稳健交易体系

有一年年初&#xff0c;我给自己的投资研究体系编了个内部代号&#xff0c;就叫“投资-408”。编号本身没什么特殊含义&#xff0c;纯粹是项目管理习惯&#xff0c;但一整年跑下来&#xff0c;这个代号越来越像一句提醒&#xff1a;真正让账户曲线变得平滑的&#xff0c;往往不…

2026/10/14 23:50:17 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起&#xff1a;它到底想解决什么问题第一次看到"AnyPS5"这个标题&#xff0c;我脑子里冒出来的第一个念头是&#xff1a;这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述&#xff1a;Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师&#xff0c;我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性&#xff0c;实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景&#xff0c;也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间&#xff0c;确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中&#xff0c;这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介&#xff1a;基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码&#xff0c;面向计算机相关专业课程设计与期末大作业学生&#xff0c;以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程&#xff0c;…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程&#xff1a;键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化&#xff0c;十个新手有八个栽在"往输入框里填东西"这件事上&#xff1a;要么填不进去&#xff0c;要么填了一半&#xff0c;要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程&#xff1a;阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀&#xff1a;什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面&#xff0c;跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式: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/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/14 7:53:34 阅读更多 →