DeepSeek开源Agent框架插件化架构深度拆解

1. 打开源码那一刻:插件化比我想象的要深得多

把这套名为 DeepSeek 的开源 Agent 框架下载到本地时,我原本只是想试试它自带的工具调用能力。Agent 项目这几年看得不少,架构套路基本就那么几类:模型调用 + 提示词模板 + 工具列表 + 循环调度,能玩出的花样有限。但当我翻到框架的插件目录、注册机制和事件定义时,我意识到这次低估了它——插件化在这套框架里不是一个挂在 README 上的宣传词,而是把 Agent 的思考、行动、记忆、反馈全部拆成了真正可单独替换的零件。

这篇文章适合两类人:一类是正在做 Agent 应用、想把工具能力和业务逻辑解耦的开发者;另一类是纯粹对“插件化架构”感兴趣、想看看一个框架能把扩展性做到多极致的读者。我会从分层设计、注册机制、任务运行链路、手写插件、取舍反思五个角度来拆,尽量讲透它“为什么这么设计”,而不是只罗列它有什么功能。毕竟,看懂一个框架的设计意图,比记住它的 API 名字有用得多。

1.1 大部分框架的“插件化”其实只是工具注册

先说说我见过的绝大多数 Agent 框架,它们的插件化通常长这样:框架预留一个工具列表,你在里面塞几个函数,每个函数带上名字和描述,模型在推理时会从列表里挑一个来调。做得好一点的,还支持动态加载外部 Python 文件、通过装饰器自动注册函数。

但仔细想想,这种“插件化”只解决了最表层的问题——新增工具。它没有解决其他几个同样要命的扩展需求:

  • 想改变 Agent 的规划策略?改源码。
  • 想替换模型调用层,让框架适配不同的模型供应商?改源码。
  • 想在每次工具调用前后加一层权限校验、限流、日志记录?改源码。
  • 想让不同任务的记忆存储方式不一样,有的用内存、有的落数据库?还是改源码。

问题就出在这:工具只是 Agent 的“手”,而 Agent 还有“脑”和“记忆”。如果框架只把“手”开放出来,其他部分还是写死的,那它就算不上一个真正的插件化框架,只能叫“可扩展工具列表”。这套 DeepSeek 开源的框架,给我的第一印象就是它没有止步于此。

1.2 这套框架的插件层级拆解

我把代码里的扩展点粗粗梳理了一遍,发现它至少把五个层级做成了可插拔的,每一层都有对应的插件接口和生命周期管理:

插件层级职责典型扩展点解决的核心问题
模型层封装不同模型供应商的接口、协议转换消息发送前拦截、流式输出解析换模型不用动业务逻辑
记忆层短期记忆、长期存储、摘要压缩记忆写入、记忆读取、记忆清理不同任务用不同存储方式
工具层Agent 可调用的外部能力工具注册、工具调用分发新增能力不碰核心代码
策略层任务规划、工具选择、反思纠错规划前钩子、选择工具时钩子换一种“思考方式”不改主流程
观测层日志、埋点、token 统计、限流任务开始/结束、调用前后监听可观测能力和业务代码解耦

这个分层一出来,我心里大概有数了:它是把 Agent 这类应用里所有“可能会变”的地方全部抽象成了扩展点。工具层只是其中一层,而且绝不比策略层、记忆层更重要。对插件化来说,真正的野心不是让你多挂几个工具,而是让你在不修改内核的前提下,拼出一个完全符合自己业务需求的 Agent 形态。

2. 插件机制的核心骨架:注册中心、事件驱动与生命周期

分层只是表面文章,真正决定一个插件化框架好不好用的是底下那套机制。这套框架的插件系统,核心可以拆成三块:事件注册、上下文对象、生命周期管理。这三块配合得好,插件之间才能做到互不知晓又协同工作;配合得差,插件一多就会变成一团乱麻。

2.1 内核不主动调度插件,插件自己声明“我关心什么”

这套框架的注册逻辑和传统的“主程序调用插件”思路不一样。传统做法是框架定义好扩展点,插件实现接口,然后框架在固定位置调用它;这套框架的做法更接近消息总线:内核在各个关键阶段广播事件,插件在安装时把自己挂到它感兴趣的事件列表上,事件触发时由注册中心按顺序分发。

我随便列几个它内部出现的事件,你们感受一下粒度:

事件名触发时机适合干什么
task.start新任务创建后初始化上下文、注入全局配置
planning.started生成执行计划前改写提示词、注入领域规则
tool.register聚合可用工具前向 Agent 暴露新工具
tool.before_call工具调用之前鉴权、参数校验、限流
tool.after_call工具返回结果之后结果清洗、错误统计、触发重试
memory.write需要写入记忆时决定存原文还是压缩摘要
task.end任务收尾时清理资源、上报结算数据

这种设计的精髓在于:内核完全不关心某个插件存在与否,它只负责在正确的时机把事件发出去。插件之间的依赖也被降到了最低——两个插件不需要知道彼此的存在,只需要关心同一个事件。

举个具体例子:如果你想在所有工具调用前加一道审核,按老思路你得去改框架的调用管道;在这套框架里,你只需要写一个插件,让它监听 tool.before_call,审核通过就放行,不通过就抛一个带原因的异常。其他插件和主流程完全无感。

2.2 上下文对象:插件之间唯一的沟通渠道

插件要干活,总得能拿到任务状态、模型回复、已收集的记忆这些数据吧。这套框架没有用全局变量,也没有把数据作为参数一层层传下去,而是设计了一个贯穿任务始终的上下文对象,CommonContext,每个插件在事件回调里拿到的都是这个对象。

为什么这样设计?我个人的理解是:它想兼顾隔离性和便利性。便利性在于,插件可以随时从上下文里拿“当前任务的完整状态”,不用自己维护一堆局部变量;隔离性在于,框架可以对这个上下文做视图裁剪——某些插件只能读不能写,某些插件只能访问自己命名空间下的字段。这样即使某个插件写得比较莽,也不至于把其他插件的数据搞坏。

实际用下来的体验是:写插件的人脑子里只要有“我改 ctx,别人改别人自己的那份”这一个概念就行,不需要理解复杂的调用链。这比我之前见过的一些框架舒服得多——那些框架喜欢把参数散落在各个函数签名里,插件想拿一个数据得翻三层文档找它在哪个参数里。

2.3 插件的生命周期:安装、启动、卸载都有人管

注册中心会管每个插件的完整生命周期:加载代码、调用安装钩子、注册事件回调、按优先级分发事件、任务结束后清理资源。这套流程做得比较完整,插件不可能“注册完就没人管了”。我梳理了一下大致链路:

  1. 加载阶段:框架扫描插件目录,用元数据解析插件类,完成依赖注入。
  2. 安装阶段:调用插件的 install 方法,让插件拿到上下文访问权限,并把自己挂到感兴趣的事件上。
  3. 运行阶段:事件触发时,按 priority 字段排序分发回调。
  4. 卸载阶段:调用 uninstall,注销事件回调,释放持有的资源。

一个容易被忽略但很重要的细节是优先级。当多个插件监听同一个事件时,执行顺序必须是确定且可配置的。比如权限校验插件必须比日志插件先跑,否则日志里会记录一堆被拦截的非法请求。这套框架用整数优先级解决这个问题,数值小的先执行,顺序清清楚楚,不会出现“看运气执行”的情况。

3. 一次 Agent 任务的完整旅程:插件在哪个环节被唤醒

光讲机制有点抽象,我把一个真实任务的执行过程完整走一遍,看看每个环节到底是哪个插件在发挥作用。以“让 Agent 查询数据库并按结果生成报告”为例,任务从创建到结束,事件链路大概是这样的:

task.start -> planning.started (策略插件改写提示词,注入 SQL 安全规范) -> tool.register (数据库插件暴露 db.search 工具) -> tool.select (策略插件决定本轮先调 db.search) -> tool.before_call (鉴权插件检查调用者权限) -> tool.execute (db.search 真正执行 SQL 查询) -> tool.after_call (错误处理插件检查返回结果) -> memory.write (记忆插件决定存摘要还是存全文) task.end

这一串事件里,没有任何一个环节是“内核写死”的,每一站都可以插入自定义插件来改变行为。这就是它和普通工具列表式框架的本质区别:前者只让你决定“Agent 能干什么”,后者还让你决定“Agent 怎么想、怎么记、怎么纠错”。

3.1 任务规划阶段:策略插件先接管

任务创建后的第一件事是规划。所谓规划,就是生成一个“先做什么、再做什么”的执行计划。大多数框架把这部分用提示词写死,比如“You are a helpful assistant that can use tools”,然后靠模型自行发挥。

这套框架的做法是给了一个 planning.started 事件。你想要专业的 SQL 分析 Agent,就写一个策略插件,在这个事件里往上下文注入一段领域规则:必须预编译 SQL、禁止 DROP 语句、遇到语法错误要重写三次而不是直接放弃。你接的是社媒运营 Agent,就换一个策略插件,注入的是内容风格偏好和违禁词列表。

同样的内核,不同的策略插件,跑出来的 Agent 行为方式完全不同。这一点是普通工具列表框架做不到的——那些框架里,提示词要么写死,要么通过配置传参,根本没留出“用代码动态改写规划逻辑”的口子。

3.2 工具选择与调用阶段:动态生成、动态分发

到了执行阶段,模型要先决定调用哪个工具。关键来了:模型能看到的工具列表不是写死的,而是在每次规划时通过 tool.register 事件动态汇总出来的。每个工具插件在自己的注册回调里声明“我会什么、参数长什么样”,框架把这些声明汇总成模型需要的结构。

真正调用工具时,框架会把请求发给对应的插件执行,而不是在核心里写一堆 if-else 分支。每个工具插件的执行回调收到的是一份结构化调用请求,里面包含工具名和参数;执行完把结果返回给框架,框架再把它注入模型上下文。

我比较喜欢的一个细节是,工具调用返回后还会触发 tool.after_call 事件。意味着你可以挂一个“异常检测”插件,专门检查返回结果里有没有报错信息,有的话自动追加一条修正指令让模型重试。这个“调用后补救”的钩子,普通框架基本都不会给你留。

3.3 记忆更新与反思:反馈插件让 Agent 越用越顺

一个任务通常不止一轮工具调用,模型会把上一轮的结果作为下一轮决策的依据,这就涉及记忆。这套框架在每次工具返回后都会触发 memory.write 事件,但具体怎么记忆,完全交给记忆层插件决定。

想省 token 的团队,可以写一个记忆插件只存压缩后的摘要,每次覆盖写;想保留完整行为轨迹的,可以写一个存储插件把原始对话和工具调用全量落库。两种策略跑在同一个内核上,不用改任何主流程代码。

更值得说的是反思机制。当工具调用失败时,框架会触发 tool.error 事件。你可以写一个反思插件,分析失败原因,把“上次因为表名写错失败,下次请先查表结构”这类结论写回上下文,让 Agent 在下一轮规划时自动规避同类错误。这个闭环一旦跑起来,Agent 的表现会随着任务数量提升,而不是每次都从头踩坑。

3.4 观测与调试:可观测性也做成插件

最后聊一个很容易被忽视的层级——观测层。传统框架的日志和监控埋点都是写死在代码里的,想加一个自定义指标得动主项目代码。这套框架把日志、计费、限流也做成了插件,通过监听各个事件来采集数据。

比如你想统计每次任务的 token 消耗,不需要在核心代码里埋点,写一个观测插件,监听 tool.after_call 和 task.end,把模型输入输出里剩余 token 数累加一下,入库即可。想排查问题的时候,把观测插件的日志级别调到 DEBUG,它会把每个事件的进出时间、上下文关键字段全部打出来,业务插件一行日志都不用写。

这种埋点与业务代码彻底分离的设计,在排障时非常舒服——你可以只打开观测层插件,不用看业务插件内部实现,就能知道整个调用链发生了什么。

4. 手写一个自定义插件:从接口定义到热加载

机制说得再多,不动手写一个总感觉纸上谈兵。这一节我拿一个“数据库查询插件”当例子,完整走一遍开发流程。先说清楚,我按自己的习惯简化了接口命名,方便展示核心思路,实际框架的 API 可能略有出入,但设计模式是同一套。

4.1 插件接口最少要定义哪几个东西

一个插件类,核心结构其实就三样:插件名称、关注的事件列表、事件回调方法。我把接口简化成下面这样:

# plugins/base.py class BasePlugin: name: str = "" hooks: list[str] = [] priority: int = 100 def install(self, ctx): """插件被加载时调用,可以用来注册资源、订阅事件""" pass def uninstall(self, ctx): """插件被卸载时调用,清理资源""" pass

hooks 声明这个插件关心哪些事件,框架在 install 阶段会检查这些声明,把插件挂到对应事件的回调链上。priority 控制同一事件上多个插件的执行顺序,数值小的先跑。

4.2 完整示例:一个只读 SQL 查询插件

现在写一个实际的数据库查询插件,它的功能是向 Agent 暴露一个 db.search 工具,执行只读 SQL 并返回结果。

# plugins/db_search.py import sqlite3 class DBSearchPlugin(BasePlugin): name = "db.search" hooks = ["tool.register", "tool.execute"] priority = 10 def on_tool_register(self, ctx): # 向 Agent 的描述注入这个工具的能力边界和参数说明 ctx.tools.append({ "name": "db.search", "description": "在只读业务库里执行 SQL SELECT 查询,禁止改写数据", "parameters": { "type": "object", "properties": { "sql": {"type": "string", "description": "合法的 SELECT 查询语句"} }, "required": ["sql"] } }) def on_tool_execute(self, ctx, invoke): if invoke.tool_name != "db.search": return sql = invoke.arguments.get("sql", "").strip() # 关键校验:只允许 SELECT,防止注入和误操作 if not sql.lower().startswith("select"): raise ToolExecutionError("只允许执行 SELECT 查询") # 使用参数化查询,避免 SQL 注入 conn = sqlite3.connect(ctx.config["db_path"]) try: cursor = conn.execute(sql) rows = cursor.fetchmany(50) return {"row_count": len(rows), "rows": [list(r) for r in rows]} finally: conn.close()

这段代码里有几个细节值得新手注意。第一,工具注册时就把参数约束写清楚,模型才能生成符合格式的调用请求;第二,执行前强制校验 SQL 前缀,这是最后一道安全闸门;第三,统一返回结构化结果,方便后续的记忆插件做摘要处理。

写好之后,把文件丢进插件目录,框架启动时会自动扫描、加载并安装。这个插件就能被 Agent 使用了,主项目代码一行没改。

4.3 插件热加载与调试的常见坑

做插件化框架,最爽的是支持热加载,改完代码不用重启主程序,插件目录一刷新就生效。但这套机制也埋了不少坑,我踩过的都列出来:

  • 重复注册。热加载时如果框架没有先卸载旧实例,新实例会和旧实例同时挂到事件链上,同一个工具被注册两次。解决方法是开发模式里每次 reload 前强制走一遍 uninstall。
  • 全局变量残留。插件代码里如果有模块级变量,热加载后旧值不会自动清空。比如你在插件里缓存了一个数据库连接,改了代码重载,连接对象还是旧的。我的习惯是:所有状态一律放上下文对象里,不在插件类里保存可变全局状态。
  • 校验不回跑。install 阶段的参数校验只在加载时执行一次,热加载不一定重新触发。我在插件里加了一个 test 钩子,专门做自检,开发时每次 reload 手动跑一遍。

调试方面,强烈建议把框架的插件执行日志打开。它会把每个事件的进入、离开、耗时、异常全打出来,你只要按事件名过滤日志,很快就能定位到是哪一环出了问题,比去看业务插件的内部代码快得多。

5. 拆完之后的取舍思考:哪些值得抄,哪些是过度设计

看到这里,你可能觉得这套框架很美好。但作为用过不少插件架构的人,我必须泼一点冷水:它把插件化做得很极致,但极致不意味着适合所有项目。拆完一圈,我愿意把它分成“值得借鉴的设计”和“需要警惕的代价”两部分来看。

5.1 和传统单体 Agent 设计的核心差异

对比维度传统单体 Agent这套插件化设计
新增能力改核心代码或改配置文件丢一个插件目录进仓库
切换行为模式换提示词模板换策略插件
故障隔离插件出问题可能拖垮整体单个插件可独立卸载禁用
排查问题直接断点跟核心代码需要理解多一层事件链路
团队协作所有人改同一份核心代码各插件独立演进,冲突少

坦白说,我在自己维护的中小型项目里,已经尝到了这套设计的甜头。以前每次新增一个工具,都得修改核心代码里的工具注册表,测试要重新跑一遍;改成事件驱动的插件方式之后,新增能力变成纯增量,老功能完全不用回归测试,而且插件之间可以独立上线。

5.2 值得抄走的三个设计点

即使你不打算整套引入,我认为以下三个设计点也是可以直接借鉴到普通项目里的:

第一个是“事件注册声明式”。让每个功能模块自己声明“我对什么事件感兴趣”,而不是由主代码显式调用。这个思想放到非 Agent 项目里,可以解决模块之间的硬编码依赖问题。第二个是“单上下文对象”。全模块共享一个上下文,而不是把参数散落得到处都是,能显著降低修改时的连锁反应。第三个是“分层扩展点”。在动手写代码之前,先想想项目的哪些环节未来一定会变,把它们设计成可替换的扩展点,而不是等到需求来了再推倒重来。

5.3 这套设计最大的代价,以及适合谁用

代价是真实存在的。事件满天飞的时候,代码的自然语言可读性会变差——你没法通过简单的“读函数调用”理清执行流程,必须对照事件注册关系来追踪。这对新人来说是个不小的学习成本。另外,每次事件分发都要遍历监听列表,极端高并发场景下会有微秒级开销,但一般 Agent 应用远远触不到这个瓶颈。

还有就是版控和部署复杂度上升。插件多了之后,有些需要单独依赖、单独配置,插件之间的兼容性测试变成一项新的长期工作。如果一个只有两三个工具、代码量不大的项目贸然上这套架构,大概率是给自己找麻烦——架构的复杂度超过了业务本身的复杂度。

我的看法是,这套设计最适合的是工具数量膨胀到接近两位数、且需要开放给其他人写扩展的 Agent 项目。对于这类项目,插件化不是奢侈,而是刚需。

我在自己的工具集项目里,也已经把工具注册方式改成了类似的事件式声明。说实话,上手的前两天很不习惯,调试时总要默认“多一层事件链路”的存在;但适应之后,新增一个工具变成了纯粹的加法,写完插件、进目录、热加载,完事。如果你手头也有一个功能模块多到开始互相牵扯的项目,不妨先拿一个最小模块改成事件式试试,感受一下这种“加法扩展”带来的清爽感。

相关新闻

物理交互驱动的具身智能决策框架设计与工程实践

物理交互驱动的具身智能决策框架设计与工程实践

“基于物理交互的具身智能决策框架设计”——这标题拆开看,其实就是三件事:“具身智能”说的是机器人要通过身体去理解世界,“物理交互”强调的是真实接触而不是纯视觉、纯规则堆出来的假把式,“决策框架”则是把感知、判断、行动…

2026/10/20 20:17:44 阅读更多 →
STM32F4+FreeRTOS+FATFS+LWIP搭建FTP服务器实战

STM32F4+FreeRTOS+FATFS+LWIP搭建FTP服务器实战

简介:这份资源面向需要在STM32F4平台上实现跨系统文件传输的嵌入式开发者,尤其适合已具备一定RTOS与网络编程基础、正在做双机通信项目的工程师。工程将FreeRTOS实时操作系统、Fatfs文件系统与LWIP网络协议栈整合到STM32F4芯片上,并基于操作系…

2026/10/20 20:16:42 阅读更多 →
实测Claude2:AI聊天工具的长文本处理与提示词实战指南

实测Claude2:AI聊天工具的长文本处理与提示词实战指南

最近有个AI聊天工具让我挺上头的,就是标题里这个Claude2。坦白说,市面上号称“能聊”的AI我试过不少,但绝大多数聊不了几轮就开始露馅——忘了你前面说过什么,答非所问,翻来覆去就那几句车轱辘话。Claude2给我的感觉不…

2026/10/20 20:16:42 阅读更多 →

最新新闻

鸿蒙ArkTS生鲜超市实战项目解析与避坑指南

鸿蒙ArkTS生鲜超市实战项目解析与避坑指南

简介:本资源是一套基于华为鸿蒙操作系统(HarmonyOS)开发的生鲜超市行业应用实战项目,面向Android开发者转型鸿蒙生态、高校学生学习分布式应用开发及企业级HarmonyOS项目实践者。项目聚焦线上线下融合购物场景,完整呈现…

2026/10/20 20:58:45 阅读更多 →
Chrome链接总是覆盖当前页?教你设置自动在新标签页打开

Chrome链接总是覆盖当前页?教你设置自动在新标签页打开

"每次点链接都把当前页覆盖掉,后来越来越烦"——这个需求我收到过太多次了。Chrome 默认点击链接就在当前标签页打开,想在新标签页打开,要么按着 Ctrl 点,要么右键菜单选"在新标签页中打开链接"。一次两次还行…

2026/10/20 20:58:45 阅读更多 →
LMDeploy实战:开源大模型量化、推理与OpenAI兼容服务部署

LMDeploy实战:开源大模型量化、推理与OpenAI兼容服务部署

这段时间一直在折腾开源大模型的落地部署,试了不少推理框架,最后在业务环境里稳定跑下来的是 LMDeploy。如果你也在做类似的事情——想把 Qwen、Llama 这类开源模型接到自己的系统里,或者想在项目里做一个带 API 的聊天服务,那么这…

2026/10/20 20:58:45 阅读更多 →
Windows cmd进入指定目录全攻略:cd命令、跨盘符与批处理技巧

Windows cmd进入指定目录全攻略:cd命令、跨盘符与批处理技巧

Windows 下在 cmd 里进指定目录,这事看起来简单到不值一提,但实际操作中我见过太多人在这一步卡住——输入cd D:\某文件夹没反应,路径一长就报错,带空格的目录怎么都进不去,还有一个很经典的cd后提示「不是内部或外部命…

2026/10/20 20:58:45 阅读更多 →
LMDeploy 大模型部署实战:从模型量化到API服务全流程指南

LMDeploy 大模型部署实战:从模型量化到API服务全流程指南

之前帮某开发者的“模拟项目X”做大模型部署时,我在 GPU 服务器上对比过好几套推理方案,踩完一圈坑之后,现在手里的长期方案基本固定成了 LMDeploy。如果你手里已经有一个开源对话模型,正打算放进业务里做 API 服务,或…

2026/10/20 20:58:45 阅读更多 →
TensorFlow鞋类识别实战:Fashion MNIST图像分类全流程

TensorFlow鞋类识别实战:Fashion MNIST图像分类全流程

前段时间重新整理之前的深度学习实验笔记,翻到鞋类识别(Fashion MNIST)这个项目时,觉得特别值得拿出来单独写一篇。原因很简单:很多人入门深度学习时,都会被建议先跑通手写数字识别(MNIST&#…

2026/10/20 20:57:37 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

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

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

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

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

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

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/20 20:43:59 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 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/20 10:02:08 阅读更多 →
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/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练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/20 9:50:45 阅读更多 →