REA模式详解:用事件溯源重塑业务系统数据建模

第一次看到“rea”这个项目标题时,我也是一愣,三个字母能代表什么?后来才明白,放在业务系统设计的语境下,这基本就是“Resource-Event-Agent,资源-事件-参与者”的简写。如果你正被状态混乱、流程改一发动全身、历史记录对不上账这类问题折磨,那这个模式值得花点时间彻底搞懂。这篇文章我打算从本质概念讲到实操落地,把建模思路、事件表设计、查询优化和常见坑位一次讲清楚。

1. 为什么是“rea”:这个模式到底解决了什么问题

先说破一个常见的误解:REA模式并不是某种框架或工具,你想搜一个叫“rea”的依赖装进项目里,那是搜不到的。它最早来自会计学领域的业务建模方法,后来被大量借用到数据库设计、领域驱动设计和事件溯源架构里。核心就一句话:不要保存业务的“最终状态”,而是保存引发状态变化的一系列“事件”,再通过资源和参与者把事件串成完整链路。

传统业务系统最喜欢做的事,是把一个订单、一个库存、一个账户直接建模成一张表,字段里写着“当前余额”“当前库存”“当前状态”。你下单了,就改订单状态;你付款了,就再改一下状态;状态字段从“待支付”变成“已支付”。这套逻辑在业务简单的时候非常直观,但系统一复杂,问题就接踵而至。

我记得接手过一套库存管理系统,里面对“在库数量”这个字段直接做减法。每次出库,就在原来的数字上减掉一个值。看起来没错,但问题在于:这个数字一旦被多个并发操作同时修改,最后出来的结果往往对不上账。更麻烦的是,当你想搞清楚“上周三那个批次为什么少了三件”时,你盯着一个孤零零的最终数字,根本无从追查。

REA模式规避这个问题的方式非常干脆:你永远不直接修改“在库数量”,你只追加一条事件记录——“2024年某日,某批次出库三件,经手人是谁。”所有看得到的当前状态,都由事件流重新计算出来。数据回溯、审计、对账,都变成了对事件序列的检索,而不是对神秘数字的猜谜。

什么人适合用REA?我个人的判断标准有三条。第一,业务涉及多个参与方,比如买家、卖家、仓库、财务,角色之间需要清晰的边界和记录。第二,系统有较强的审计需求,比如资金流水、订单全链路、物流轨迹,出了问题必须能查得清。第三,业务规则变更频繁,今天允许退货,明天允许换货,后天又加了折扣返还,如果你直接改状态字段,代码里全是if else;但如果你保存的是事件,规则变化往往只需要新增一类事件,而不是推翻整张表结构。

反过来也要泼一盆冷水:如果只是一个小工具,比如自己用的待办清单、内部小报表后台,强行上REA只会让你多写一倍代码。模式和复杂度之间要有一个清醒的匹配。

2. 三个核心概念:把资源、事件、参与者彻底吃透

2.1 Resource:不是那张表,而是业务真正在乎的东西

很多开发者第一次接触REA,最容易犯的错,是把数据库表当成了Resource本身。订单表是Resource吗?不是。订单表只是承载信息的载体,在REA模型里,资源指的是业务上有价值、能被创造、消耗、交换或使用的对象。资金是资源,商品是资源,服务工时是资源,仓库的库位容量也可以看成资源。

要识别一个东西算不算资源,我习惯问自己一个问题:“它是否参与了业务价值的流转?”库存商品从供应商流转到企业,再从企业流转到客户,每一步都涉及价值的增加或减少,所以它是典型的资源。订单本身呢?它更像是一条业务记录的凭证,真正承载价值的是订单里的商品和对应的资金。你可以把订单理解成串联资源和事件的一根线,而不是资源本身。

在设计数据表的时候,我一般会单独建一张资源主数据表,里面存放商品的名称、规格、唯一编码这类相对稳定的信息。另外再建一张资源库存/余额表,这张表存的是当前快照,方便前台快速展示。这张快照表的更新规则很重要:它只能由事件处理程序更新,任何业务代码都不允许直接改它。这句话我写了无数次,每次被破坏掉,后面都会出乱子。

2.2 Event:不只是日志,而是唯一的业务事实来源

事件是整个REA模式里最核心的概念。事件记录的不是“现在怎么样了”,而是“发生了什么”。“用户下单”“用户支付”“仓库发货”“快递签收”……每一条都是一次独立事件。

我从实操角度给出三条关于事件的设计原则,都是踩过坑之后总结出来的。

第一,事件一旦写入,就不可变。你不能在一条事件记录上把数量从3改成4。如果业务上确实需要改,那就再写一条“更正事件”,比如“订单商品数量调整”。保持事件流的原始性,你的审计链路才可信。

第二,事件的命名一定要用过去式。OrderPlaced、PaymentReceived、ShipmentArrived,这就迫使你在设计时认真思考“这件事已经发生了”,而不是“我们现在打算做什么”。状态是动词,事件是动词的完成态。区分不清楚这两者,建模时一定会混。

第三,事件必须包含明确的时间戳、发起方和唯一ID。这三个字段是日后排查问题和避免重复处理的基石,缺一个都会让你在联调时抓狂。

有人会说,这不就是日志吗?不完全对。普通日志只负责记录,没有业务语义,系统挂了日志丢了也不影响核心数据。但REA里的事件本身就是数据,订单金额从哪来、库存数量从哪来,都从事件推演而来。事件流丢失,等于业务直接失忆。

2.3 Agent:把“谁干的”写进业务链路

Agent指的是参与事件的业务主体。一个人是Agent,一家公司是Agent,一个供应商也是Agent。有些系统还会细化出“机构用户下的某个部门账号”,这依然可以建模成Agent,或者在Agent上挂一个归属层级。

设计Agent时,我强烈建议你把“内部参与者”和“外部参与者”分开建模,或者至少用字段做明确区分。原因在于,内部参与者的行为逻辑受到企业制度约束,而外部参与者的行为会有更多不可控变量。一个客户可以反复修改收货地址,一个内部员工不能随意把库存标成破损又变回可用。把这两类主体混在一张表里,权限和规则很快就会写成一团乱麻。

2.4 三者如何协作:一句话口诀

我在这套模型里摸爬滚打,最终简化成了一句口诀:Agent通过Event,改变Resource的状态。

顾客(Agent)通过下单(Event),减少商品库存(Resource);仓库(Agent)通过出库(Event),把商品的在库状态变成在途状态;财务系统(Agent)通过确认收款(Event),增加账户资金(Resource)。

当你拿到一个需求,只要反复用这句话去套,基本上能把模糊的业务场景快速拆解成清晰的事件序列。我见过不少设计文档,画了一堆框图,最后落不了地,原因就是没有做过这个“口诀测试”。做过的,模型基本不会跑偏。

3. REA和传统CRUD的差异:为什么直接改字段不是长久之计

3.1 传统状态的三大隐患:覆盖、耦合、对不上账

传统CRUD设计里,状态字段往往是被直接覆盖的。订单状态从“待支付”改成“已支付”,之前的“待支付”去哪了?没了。如果后续业务需要分析“用户在支付前平均停留多久”,你会发现数据里只有两个孤零零的字段,没有任何时间差可供计算。

耦合是另一个麻烦。一旦“更新状态”这个动作散落在多个服务、多个接口里,每个地方都可能夹带私货。A服务更新状态的时候顺手加了积分,B服务更新状态的时候忘了发短信,结果就是流程不一致,线上出问题后你还得一个个去翻代码找谁改了状态、谁漏了动作。

对不上账更是常见。财务说收到的钱和订单系统里“已支付”的订单数对不上,两边都觉得自己没错。其实两边都没错,错的是你只记录了“当前状态”,而没有记录“每一次状态变化的完整凭证”。对账这件事,本质上是在比较两条事件序列是否一致,而不是在比较两个终态数字是否相等。

3.2 REA的真正优势:可重放与可推算

事件流的可重放性,是我最看重的能力。拿到一份从第一天开始记录的事件流,你可以随时重算任意时刻的库存、余额和订单状态。甚至可以用同一批事件,跑出两套完全不同的业务规则做对比测试,这在传统CRUD下几乎不可能实现。

我做过一个模拟库存预测系统,原始事件数据就是历史的出入库记录。我们完全不依赖今天的库存快照,而是把事件按时间重放,再加上预测模型,就能推算未来一段时间的库存变化趋势。如果当初只保存了“当前库存”这个数字,这个系统根本无从做起——因为你永远不知道历史每一天的库存是怎么呈现的。

3.3 REA的代价和边界

REA不是免费的午餐。事件表的增长非常快,一个每天几千单的系统,跑一年下来事件记录可能达到上百万条级别。查询当前状态需要在事件流上做聚合,直接查会比查状态表慢一个数量级。所以REA系统往往需要引入投影表和物化视图,这属于配套工程,不能省。

相比之下,传统CRUD胜在直观、简单、开发效率高。如果业务形态非常固定、流程三五年不会变、也不需要增量分析,传统方式完全够用。我个人的经验是,不要把REA当成银弹,而是当成一味对症的药。什么时候该吃?业务里存在多方协作、历史追溯、规则演进三个特征至少占两个时,REA的优势才会真正兑现。

3.4 判断你该不该用的一个快速自测

我列了一张简单的判断清单,拿去套自己的项目:

判断维度适合REA不适合REA
业务参与方多个外部参与方,权责分明单角色内部工具
历史追溯必须追查每笔变更过程只看当前值即可
规则稳定性规则会持续演进、频繁调整规则长期不变
数据量级中等偏上且需要分析极轻量、低并发
技术团队能接受事件表设计和投影维护追求最快交付

如果你表格里“适合REA”一侧打了三个钩以上,那值得认真考虑;如果全落在右侧,就别折腾了。

4. 手把手实操:从业务需求到REA模型的完整落地

4.1 第一步:识别业务事件,分清“动词”和“动词的完成态”

拿到需求,先不要急着画ER图。先从业务描述里把所有动作词拎出来:下单、取消、支付、退款、发货、签收、退货……这些词,基本都是事件的候选。

然后做一个筛选动作:只有那些对资源产生价值变化的行为,才值得建模成事件。“用户浏览了商品页面”虽然也是个动作,但它没有改变任何资源的状态和价值,所以它不应该进入你的业务事件流,它更适合放到用户行为日志里。“用户下单”就是典型事件,因为它锁定了库存,改变了商品的可用状态。

我给模拟项目X做过一次完整的建模练习,第一版我们把“用户修改收货地址”也建成了一个事件,结果发现它既不涉及商品、也不涉及资金、更不涉及库存,纯粹是参与者信息的更正。这种事件放进业务链路只会增加噪音。后来我们把它降级成“参与者信息变更日志”,业务事件流的清晰度一下子提升了不少。

4.2 第二步:定义资源和参与者,让一切有据可依

事件确定了,接下来就是回答两个问题:事件改变了哪种资源的什么状态?事件是由哪些Agent共同发起的?

还是用订单流程举例。顾客下单,参数涉及两个Agent,一个买家、一个系统自动确认策略;涉及的资源有商品库存、待支付的金额承诺。支付完成,Agent是买家和支付渠道;资源是资金,同时把订单的支付状态向前推进。发货之后,Agent是仓库操作员;资源不变,但商品所有权的空间位置发生了转移。

实际操作中,我会为每一类资源维护一个当前状态视图,这个视图不完全是“数值”那么简单,而是记录“这个资源在当下处于哪种可用状态”。比如一件商品在售、被锁定、在途、签收,本质上是它在不同事件阶段下的状态投影。资源本身没有变,变的是它和事件之间的关系。

4.3 第三步:落地一张事件表的物理结构

逻辑讲了一堆,直接上表结构更实在。我用过多种实现方式,最基本的Event表核心字段大概是这样的:

字段名类型说明
event_idvarchar(32)全局唯一事件ID,建议UUID
event_typevarchar(64)事件类型,如ORDER_PLACED
occurred_atdatetime业务发生时间,精确到秒
recorded_atdatetime系统入库时间
agent_idvarchar(32)发起方ID
agent_typevarchar(16)发起方类型,区分内部/外部
resource_object_idvarchar(32)主资源ID
resource_typevarchar(32)主资源类型
payloadJSON事件明细,前后字段差异、数量金额等
previous_event_idvarchar(32)上一事件ID,用于串联链路

payload字段一定要设计成JSON类型,因为不同类型事件的明细千差万别。为了避免在业务代码里直接解析JSON的麻烦,我一般会为高频事件在业务服务里定义对应的EventData实体类,在写入时统一序列化,在读取时反序列化成强类型对象。

4.4 第四步:从事件流到当前状态的投影机制

事件表是唯一的“事实源”,但每次查当前状态都去扫表肯定不行。所以需要一个投影机制,把事件流“折叠”成一张适合查询的状态表。

我习惯的做法是维护一张CurrentState表,比如当前库存、当前订单状态、当前账户余额。每次新事件写入成功后,事务里同步执行对应的状态更新逻辑。这里有一个关键设计点:状态表必须可以被重建。只要事件流完整,任何时候把状态表清空重放,都能得到一模一样的结果。这既是对状态表自身正确性的验证,也是灾难恢复的最后一条保障。

如果你使用Java技术栈,Spring里可以监听领域事件,在事件提交后做同步投影更新;如果项目特别看重性能,也可以把投影延迟到异步队列处理。但一定要注意幂等性:同一个事件因为网络重试被消费了两次,投影结果必须还是对的。我通常会在投影记录里保存一个processed_event_id,遇到重复事件直接跳过。

4.5 第五步:关键查询怎么做

在REA模式下,有几类典型查询我会频繁使用。查某件商品的库存趋势,直接对事件流按时间聚合;查某个订单的完整生命周期,把该订单关联的各类事件按时间排出来;查某个参与者的操作历史,按agent_id过滤事件表。

聚合查询如果直接跑在原始事件表上,数据量大时容易慢。我的经验是建一张EventProjection表,预先按“资源ID+事件类型+时间”做汇总,比如当天的出入库汇总、当月的订单汇总。这类汇总表本质上就是物化视图,业务查询直接打汇总表,事件表留给审计和对账。

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

5.1 事件表无限膨胀怎么办

事件表只增不改,数据量涨得比普通表快很多。我见过一个运营了一年的系统,事件表刚过千万行,查询已经开始变慢。

解决方案分三层。第一层,冷热分离:三个月内的事件放热表,三个月前的定期迁移到冷存储,冷数据只提供审计查询。第二层,聚合归档:对明细事件做聚合成小时级或天级摘要,比如“当日某商品出库50件”代替每单一条明细,既保留了统计口径又大幅压缩体积。第三层,清理原始终端日志的分层:真正必须无限期保留的,只有涉及资金、合规、争议的事件;纯粹的浏览行为类事件按规定周期过期删除。

5.2 查询状态慢,投影延迟怎么办

这是REA系统最容易被吐槽的地方。我先给一个基准建议:反馈速度敏感页面,强度依赖于投影表;强度分析页面,建议直接查事件流或者分析数仓,不要在同一个库里同时扛这两类压力。

如果投影表更新延迟引发了问题,优先排查消费端的处理时长和幂等逻辑。之前我就遇到过,某个下游服务把投影更新的耗时算进对外接口的响应时间里,导致一个简单的状态查询接口慢到不可接受。解法也很直接:投影更新改成异步,前端先展示旧状态,等事件提交后刷新成新状态。用户无感知,性能压力也解了。

5.3 和已有老系统怎么共存

多数团队不会因为引入了REA就把老系统推倒重来。最稳妥的路是双写:老业务继续走老逻辑,同时在关键节点同步落一份事件记录。等事件数据覆盖一定周期后,新系统开始读取事件流做投影,老系统逐步降级为只读。

双写阶段最大的坑是事件时序错乱。老系统事务里提交了一个业务变更,事件消息却因为网络延迟晚到了,新系统投影就会短暂不一致。我给一个自己试过有效的办法:事件消息里带上老系统事务的提交时间戳,投影更新时按业务发生时间排序,而不是按系统接收时间排序。宁可让投影先卡一下,也不能按错误顺序把状态覆盖掉。

5.4 建模阶段最容易犯的三个错误

第一个错误是把“状态”当成“资源”。建模“已支付”是一个状态,可能由PaymentReceived事件推导出来;但有人会把“已支付订单”这种状态值直接建模成一个资源。结果就是事件流里混入了一堆处境尴尬的“状态资源”,后续所有推导都走不通。

第二个错误是事件粒度不统一。有人把“用户上传了一张图片”和“用户完成了一笔结算”记在同一层事件流里,粒度差距悬殊。前者是原始操作日志,后者是企业业务事实。混在同一个流里,分析时你要不停做过滤,审计时又怕漏掉关键数据。正确做法是分两层事件:业务事件层和操作日志层,进不同的存储。

第三个错误是忘记事件之间的上下文关系。单看一条“退货”事件看不出问题,你得知道它关联的是哪一单、哪一个商品、退款了多少钱。如果payload里没有保存上下文ID链,事后分析基本只能放弃。所以我每次建模都会强制要求:每个业务事件里,必须显式带上业务聚合根ID和相关资源ID列表。

还有一个我特别想提的教训:不要试图用REA去解决所有并发问题。事件流本身保证的是追加和顺序,但两个操作同时修改同一资源,仍然需要靠锁、版本号或乐观并发控制来兜底。事件只是留了痕迹,不替你解决冲突。

6. 写在最后:我对这套模式的一些真实体会

做过的项目越多,越觉得业务系统最难的不是技术选型,而是如何让数据结构诚实地还原业务真相。REA模式本质上是逼着你去思考“业务到底发生了什么”,而不是“我要怎么快速改一个字段”。这种思维方式转变,带来的收益是长期的。

我个人在实际操作中的体会是:上线REA模式后的头一两个迭代,会比传统CRUD慢半拍,因为建模和投影都要花心思;但是到了第三四个迭代,当业务开始频繁调整策略,当运营开始问各种“为什么是这个数”的时候,REA的底气就出来了。你不需要回翻十几个版本的数据库变更记录,只需要打开事件流,把时间轴拉起来,所有答案都在那里。

最后分享一个小技巧:如果你决定在项目里尝试REA,千万不要一上来就全量改造。挑一个有审计强需求、流程引得清楚的核心链路,比如订单或库存,先切一小段。跑通之后,再逐步把其他模块往事件流上靠。这套路线我验证过,成功率比一开始就铺开要高得多。

相关新闻

Java jar包Docker部署实战:多阶段构建与镜像优化指南

Java jar包Docker部署实战:多阶段构建与镜像优化指南

1. 为什么把 jar 包塞进 Docker 是个值得聊的话题刚入行那会儿,我部署一个 Java 服务的标准动作是这样的:本地mvn package打出 jar,scp 传到服务器,写个nohup java -jar xxx.jar &,然后祈祷它别在半夜挂掉。挂了就…

2026/10/21 4:48:54 阅读更多 →
C盘清理与注册表整理全攻略:三款工具组合实操流程

C盘清理与注册表整理全攻略:三款工具组合实操流程

C 盘又变红了,这大概是 Windows 用户最熟悉也最头疼的画面。不管你是新装系统用了一两年,还是刚接手别人用过的电脑,Windows 的临时文件、浏览器缓存、更新补丁残留、软件卸载后留在注册表里的失效键值,都会一点一点把系统盘和注册…

2026/10/21 4:48:54 阅读更多 →
ExtractBench 数据集解剖:一行 JSONL 里的 8 个字段与 JSON Schema 定义完全详解

ExtractBench 数据集解剖:一行 JSONL 里的 8 个字段与 JSON Schema 定义完全详解

【免费下载链接】ExtractBench 项目地址: https://ai.gitcode.com/hf_mirrors/llamaindex/ExtractBench 点击查看 免费下载 做文档信息抽取(Information Extraction)评测时,你是否想知道一个基准数据集到底长什么样?这…

2026/10/21 4:47:54 阅读更多 →

最新新闻

iOS 15 ATT审核被拒两次?Xcode自动隐私清单解法揭秘

iOS 15 ATT审核被拒两次?Xcode自动隐私清单解法揭秘

1. 项目概述:一次被驳回两次的ATT权限申请,背后藏着什么真实逻辑? “苹果审核iOS 15版本App Tracking Transparency两次被驳回”——这个标题一出来,很多做iOS开发、运营或合规的同学第一反应是:又一个被ATT政策卡住的…

2026/10/21 6:12:29 阅读更多 →
多智能体动态事件触发共识控制的Matlab仿真与实现

多智能体动态事件触发共识控制的Matlab仿真与实现

多智能体系统的分布式协同控制,这些年无论是在学术界还是工业界都是个大热点。以前我们做多机器人编队、无人机集群、卫星星座协同这类课题时,最头疼的问题之一就是:怎么用最少的信息交互,还能保证所有智能体最终达到一致的状态&a…

2026/10/21 6:12:29 阅读更多 →
鸿蒙ArkUI开发:Slider滑块与Progress进度条从入门到工程实践

鸿蒙ArkUI开发:Slider滑块与Progress进度条从入门到工程实践

在鸿蒙应用开发的实际项目中,Slider和Progress这两个组件往往不会像Text、Button那样被单独拎出来讲,但它们恰恰是提升应用完成度与交互质感的关键细节。很多开发者在入门阶段容易忽略这两个控件,直到做播放器、设置页、上传下载状态展示时&a…

2026/10/21 6:12:29 阅读更多 →
ONVIF Java SDK实战:摄像头统一接入、RTSP取流与PTZ控制

ONVIF Java SDK实战:摄像头统一接入、RTSP取流与PTZ控制

简介:这份资源是一套基于Java的ONVIF协议开发SDK,面向需要对接网络摄像头、实现设备发现、鉴权与媒体流控制的开发者。包内共1157个文件,主体为1147个Java源码文件,另有少量jar依赖库(如commons-codec、javaWsDiscover…

2026/10/21 6:12:29 阅读更多 →
知识工作插件实战:搭建高效采集整理输出工作流

知识工作插件实战:搭建高效采集整理输出工作流

“知识工作插件”这几年被反复提起,但真要问它到底是什么——是一类浏览器扩展,还是编辑器里的组件,又或者某个知识管理工具的二次开发能力?我自己的答案是:都不是单独一个,而是围绕“输入→处理→沉淀→输…

2026/10/21 6:12:29 阅读更多 →
机器人对话系统地图模块设计:POI检索、路径规划与避坑实践

机器人对话系统地图模块设计:POI检索、路径规划与避坑实践

做机器人对话系统最头疼的一件事,不是意图识别,也不是自然语言生成,而是把真实世界接进来。用户问一句“我从现在的地方去服务中心怎么走”,你得在几百毫秒内完成坐标解析、路径计算、话术拼接,还得把路线图用卡片发出…

2026/10/21 6:11:29 阅读更多 →

日新闻

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

这段时间硬件圈和AI圈都在传一个事:AMD锐龙AI Max PRO 400系列把最高192GB统一内存搬进了PC形态的产品里,按宣传口径,本地跑320B参数的大家伙不再是纸面概念。我第一反应倒不是“内存真大”,而是这话背后的含金量——它把过去只能…

2026/10/21 0:00:11 阅读更多 →
AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

1. 从“封号重开”这个行为说起:用户到底在追求什么“封号重开”这四个字,放在任何产品语境里都带着一股决绝的味道。一个账号从零开始积累使用记录、调教偏好、沉淀工作流,背后是大量的时间和精力成本。正常情况下,没有人愿意主动…

2026/10/21 0:00:11 阅读更多 →
ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

1. 为什么在ROS里硬刚YOLOv3不是“炫技”,而是工程落地的必经之路我第一次在某高校机器人实验室看到那台搭载Jetson TX2的移动底盘原地打转、反复识别错垃圾桶时,就意识到:单纯跑通darknet_ros demo和真正让YOLOv3在ROS里“干活”&#xff0c…

2026/10/21 0:00:11 阅读更多 →

周新闻

基于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/21 4:27:17 阅读更多 →

月新闻

我发现了一个新思路:用 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 阅读更多 →