REA建模实践指南:用资源、事件、代理重构业务系统

看到"rea"这个题目,我第一反应是可能有人想写"React"但少打了一个"ct",也可能是随手起的名字。真要按网络热词去搜,确实能搜出一堆不相干的结果。但在做业务系统设计和架构落地的人眼里,"REA"这三个字母有一个非常明确的指向:Resource、Event、Agent,也就是资源、事件、代理。它源自会计信息系统领域的业务建模思想,后来被大量引入企业应用架构、事件溯源和数据建模中。这篇文章不讨论React,也不猜人名,专门聊REA这个建模思路,把它讲清楚、讲透,并且用一个完整的案例演示怎么落地。适合后端工程师、领域建模新手、架构师,以及任何想从"改状态字段"的泥潭里跳出来的人。

1. 从"rea"说起:先搞清楚它到底想表达什么

1.1 标题歧义与我对它的取舍

一个只有三个字母的标题,在不同人群眼里完全是不同的东西。前端同学会想到React,英语使用者会觉得像个人名,玩梗的可能联想到某句谐音,但做后端建模的人看到"REA"这三个字母,脑子里冒出来的就是一套完整的企业业务建模框架。我之所以选择从REA本体切入,是因为在真实的项目里,"资源—事件—代理"这套三元模型能直接解决那些让团队反复扯皮的问题:订单状态该不该有、余额表该不该留、对账为什么总是对不上。

很多业务系统做到后期,代码复杂度最大的来源不是功能多,而是"状态"太多。每个业务对象都挂了一堆状态字段,每个状态都有无数种流转可能,改一个字段要牵连十几个方法。REA恰恰提供了另一条路:不保存"当前状态",只记录"发生了什么"。只要把这件事想通,你会发现原来复杂的需求描述可以被拆成非常稳定的三元组,而不随页面和接口变化不断漂移。

1.2 REA本体最核心的概念:先记住九个字

在动手设计任何表结构之前,我建议你先记住一句话:"谁,让什么资源,在一次事件中发生了增减。"Resource指的是被交换、被消耗、被生产的对象,比如商品、钱、工时、积分、库存;Event指的是让资源发生变化的那次动作,比如销售、采购、退货、调拨;Agent则是参与动作的个人或部门,可以是买家、卖家、库管、平台运营,甚至可以是机器和设备。

为什么这三个概念就够用了?因为任何业务,无论看起来多复杂,最后都能落到"某个代理在某个事件中让某些资源发生了增减"。银行记账从来不会只记一个余额,而会逐笔记流水,余额只是流水汇总出来的结果。REA就是把这个朴素的道理推广到任意业务域。我建议你先别管术语,遇到任何业务时只问三个问题:这里有什么资源在变化?发生了什么事件导致它变化?是谁参与了这个事件?能把这三个问题答清楚,REA的骨架就已经搭起来了。

2. 为什么选REA:它解决了CRUD建模解决不了的问题

2.1 传统CRUD建模的痛点:状态字段一改,历史就丢了

大多数业务系统第一版建模都长这样:一张order表,上面有status字段,"待付款"改成"已支付"再改成"已完成",谁改的、什么时候改的、为什么改,全都被覆盖掉了。如果需要追踪订单从创建到发货经历了哪些步骤,只能去翻应用日志,而日志往往只记录操作人,不记录当时的业务上下文。如果状态流转逻辑写了好几个分支,业务规则一变,整个方法的复杂度直接爆炸,最后没人敢动那段代码。

用生活类比一下:你一直只记录手机里存款的"余额",不记账目明细,等月底要核对每一笔钱去哪了,就会寸步难行。CRUD模型表面上是围着订单转,本质上是围着"状态的最终结果"转,过程是隐形的。最麻烦的是,一旦上线一段时间后,产品经理过来说"我想看到这个订单从创建到现在每一步的时间点和操作人",你会发现自己只能从日志里挖,或者干脆对着空气说做不到。这种问题不是加一个字段就能解决的,而是建模视角的问题。

2.2 REA的优势:事件是唯一事实,状态只是投影

REA的思路完全不同:订单本身不是一个"被改来改去的状态容器",而是一连串事件的聚合结果。买家下单是一个事件,支付是一个事件,发货是一个事件,确认收货又是一个事件。数据库只会追加这些事件,不会去UPDATE一个状态字段;要得到当前订单状态,就按顺序把事件重放一遍,最后推导出来。这样做有两个立竿见影的好处:一是每个业务决策都有据可查,天然满足审计和对账;二是将来如果要改变业务规则,不必改历史数据,只需要改重放和投影的逻辑,历史事实仍然保持完整。

我在实际项目中最大的感受是,REA模型把"事实"和"结论"分开了。事件是事实,状态是结论。事实发生之后就不能再变,结论则可以根据最新需求随时重新推导。一个业务系统只要有可靠的"事件流",无论将来要做新的统计报表、接入新的风控策略,还是做BI分析,都能从事件流中重新运算,而不用去祈求"当时要是多存一个字段就好了"。

3. 核心实操:用REA给一个典型业务系统建模

3.1 场景设定:从零开始搭一个"某集市系统"

为了把建模过程讲明白,我用一个常见的模拟项目做例子:这是一个个人二手交易平台,就叫"某集市系统"。业务看起来不复杂:卖家发布商品,买家浏览并下单,买家付款到平台担保账户,卖家发货,买家确认收货后平台再把钱结算给卖家,期间还可能有取消订单和退款。

很多人的第一直觉是先建user、product、order三张表,order上挂一堆状态。比如先给order加一个status枚举,付款改一次,发货改一次,收货再改一次,退款又要改一次。这个过程在开发前期很爽,因为CRUD写起来快。但等项目跑起来,财务要求对账、客服要查"这笔订单为什么卡在发货环节三天没动"、运营要分析转化漏斗,你就会发现原来的表结构根本回答不了这些问题。所以我们换一种方式,用REA把业务拆成一组清晰的经济事件:发布商品、下单占用库存、买家支付、卖家发货、买家签收、平台结算、退款。每件事都是一条独立且不可修改的审计记录。

3.2 识别人、货、事:资源、事件、代理的完整推导过程

先说资源。在这个场景里至少有四类资源:商品库存、买家账户余额、平台担保资金、卖家待结算款项。注意,"订单"本身不是资源,它是事件的投影结果;而"担保资金"是一个被事件驱动出来的资源池,不是自然语言里的"余额"那么简单。再说事件:发布商品增加可售库存;下单占用库存;支付事件让资金从买家余额流入平台担保资金;发货事件不影响资金,但会把物流状态推进到下一环;确认收货事件让资金从担保资金流出、进入卖家待结算;退款事件则让资金反向流动。最后是代理:买家、卖家、平台运营、物流承运商,每一方都要在事件里记录角色。

有一条我反复强调的原则:一条事件必须保证资源的流入等于流出,并且至少要关联两个代理。拿支付事件来说,资金从买家减少100元,流入平台担保资金增加100元,资源总量不变;代理是买家和平台。如果只记录"买家少了100元"而不记录"平台多了100元",那账永远都对不上。这一条在建模初期最容易忽略,也是后面数据对不上的主要来源。可以把它理解成物理里的能量守恒:事件本身不创造资源,只让资源在不同账户和库位之间转移。

3.3 落地到表设计与事件存储:直接看结构

建模最终要落到存储。REA最简化的落地方案是三类表:事件表、事件资源流水表、事件代理关系表。事件表存每次发生的事件本身,定义如下:

CREATE TABLE event ( event_id BIGINT PRIMARY KEY, event_type VARCHAR(64) NOT NULL, occurred_at TIMESTAMP NOT NULL, correlation_id VARCHAR(128), -- 业务唯一键,用于幂等 schema_version SMALLINT NOT NULL DEFAULT 1, payload JSONB ); CREATE TABLE event_resource ( event_id BIGINT NOT NULL, resource_type VARCHAR(64) NOT NULL, resource_id BIGINT NOT NULL, delta_amount DECIMAL(12,2) NOT NULL, PRIMARY KEY (event_id, resource_type, resource_id) ); CREATE TABLE event_agent ( event_id BIGINT NOT NULL, agent_type VARCHAR(64) NOT NULL, agent_id BIGINT NOT NULL, role_code VARCHAR(32) NOT NULL, PRIMARY KEY (event_id, agent_type, agent_id, role_code) );

看到这个结构,你可能会想:怎么还要两张关联表,不重吗?这地方恰恰是REA模型最值钱的部分。一张event表只有"发生了什么",资源增减流水单独记录"什么资源变了多少",代理表单独记录"谁参与了哪个角色"。三段信息解耦,后面对账、出报表、做风控,全都能从这三张表里重新算出来,不用再依赖业务方写的"统计接口"。

以"买家A支付100元购买卖家B的商品"这个事件为例,实际插入的数据是这样的:event表插一条PAYMENT事件;event_resource插两条记录,一条是买家余额资源delta=-100,另一条是平台担保资金资源delta=+100;event_agent插两条记录,一个是agent=买家A、role=buyer,另一个是agent=平台、role=guarantor。所有记录加起来,资源流的净额等于0。

这个"净额等于0"的校验,我建议直接写到写入事务里,而不是靠事后对账来发现。每一条流水如果不守恒,当时就应该报错。另外还有一个容易踩的坑:correlation_id这个字段一定要设计好。它承载的是业务链路的唯一标识,比如支付单号。没有它,网络重试、消息队列重复投递时,同一个支付事件会被插入两次,账就会莫名不对。加上唯一索引,配合"先查再插"或者数据库层面的insert ignore,能省掉后期大量麻烦。

3.4 建模时最常见的三个误区:状态当资源、事件拆过度、代理不区分

第一,不要把"订单状态"当成资源。订单状态不是一个可增减的资源,它是事件流推出来的投影值。如果你在event_resource里加一条"状态变化"的资源记录,整个模型会变得混乱,审计也失去意义。第二,不要把一次业务交易拆成无数个细碎事件。事件拆分的标准是"是否需要独立审计、是否需要单独对账"。比如支付和发货,两个动作相差很长时间、由不同代理完成,必须拆成两个事件;但同一个动作里多个商品项的明细,建议放在同一事件的payload里,不必每个商品单独建事件,否则光是一个订单就能生成几十条记录,查询成本高且没有额外价值。

第三,不要忽视内部代理和外部代理的区别。买家、卖家是外部代理,平台运营是内部代理。区分它们是为了权限和合规:内部代理发起的调整操作,在审计上要标得更明显,比如运营人工退款和用户主动退款必须分属不同事件类型,否则财务复核时会炸锅。边界划分的总原则是:一个业务动作如果需要被追责、被核算,就值得成为一个事件;如果只是一个计算步骤,就别拆。多问一句"这件事如果说不清,会不会出事",答案通常会变得很清楚。

4. 进阶扩展:REA与领域驱动设计、事件溯源建模的结合

4.1 把REA映射到DDD:聚合、限界上下文、读模型

如果你们项目已经在用领域驱动设计,REA可以很好地和它配合。DDD里的聚合是一个事务一致性的边界,而REA中的事件正好可以作为聚合根公共接口的触发来源。比如"支付上下文"负责发出PaymentMade事件;"订单上下文"并不直接修改订单状态,而是订阅这个事件,把订单的读模型推进到"已支付"。这样写的好处是:每个限界上下文只关心自己负责的资源增减,不用跨表去改别人的状态。

聚合划分方面,我的建议是保持小聚合:Order是一个聚合,Payment是另一个聚合,Inventory是第三个聚合。不要把从下单到结算的一整条链路塞进同一个聚合,否则事务锁范围会随业务量膨胀,最终拖垮系统。从另一个角度看,REA实际上能帮DDD做建模:如果一个候选实体不是资源、不是事件、也不是代理,那你就要谨慎考虑它是否真的适合放进领域模型。这种"三个维度筛选实体"的方式,能把DDD建模过程中经常出现的模糊地带大幅压缩。

4.2 REA加上事件溯源:只有追加的事件,没有可改的状态

事件溯源是REA的自然延伸:存储层只保留事件,不保存当前状态,当前状态由投影函数重算得到。用一个TypeScript的例子来说明,假设我们有一个支付事件:

type PaymentMade = { eventId: string; buyerId: string; sellerId: string; amountInCents: number; occurredAt: string; }; type AccountState = { agentId: string; balanceInCents: number; }; function projectAccounts(events: PaymentMade[]): Map<string, AccountState> { const result = new Map<string, AccountState>(); for (const e of events) { const buyer = result.get(e.buyerId) ?? { agentId: e.buyerId, balanceInCents: 0 }; buyer.balanceInCents -= e.amountInCents; result.set(e.buyerId, buyer); const platform = result.get("platform") ?? { agentId: "platform", balanceInCents: 0 }; platform.balanceInCents += e.amountInCents; result.set("platform", platform); } return result; }

这段代码看起来简单,但它背后有一个重要原则:余额不是存出来的,是算出来的。系统每次启动时从事件表的起点重放所有事件,或者在晚上做一次快照,再把快照之后的新事件增量投影一遍。这样一旦发现当前余额不对,不需要改生产库,只需检查事件投影逻辑,重新投影即可修复。

我个人的实践经验是:在模拟项目里,用这种方式改造后,排查数据问题的时间明显缩短,因为"真相"始终只有一个来源,不存在"账上余额"和"流水明细"互相矛盾的情况。事件溯源对存储的要求就是"只追加、不修改、不删除",所有旧数据都是不可变的历史。这种不可变带来的好处是,任何时间点上的系统状态都能被精确还原,这几乎是审计需求最理想的答案。

4.3 读模型要不要缓存:状态表也不是完全没用

这里要澄清一个容易误解的点:REA并不反对你建order_current_status这种状态表,它反对的是把状态表当成权威事实。实际项目里,读取要比写入频繁得多,如果每次下单后都要把过去一年的事件全部重放一遍才能看到订单状态,那系统早就崩了。所以标准做法是把状态表降级为"读模型"或"投影",事件是权威事实,状态表只是缓存。

事件到达时更新投影,查询时直接读投影。需要修改投影逻辑时,只需要把事件重放到新的投影表,旧的状态表可以停用。这个"事件为源、状态为缓存"的心智模型,是REA落地时最值得体会的部分。刚开始你可能会不太习惯,总觉得多了一步操作;但当需求方要求"把已完成的订单再按新规则统计一遍"时,你会发现只要重写投影逻辑然后重放,几分钟就能输出一套全新报表,而传统改表结构的方式可能要加班一晚上。

5. 实操中的踩坑记录与排查速查表

5.1 踩坑案例:把"库位"和"商品"混成一个资源

有一次我在模拟项目里给一个仓库系统做REA建模,最初直接把"商品"当作唯一的库存资源。结果一遇到"同一款商品从A库调到B库"的业务,就不知道该怎么记了:是记商品减少还是增加?无论怎么记,资源总量都可能被误扣,调拨单在财务看来也变得莫名其妙。后来才意识到,这里真正发生变化的资源是"A库位的库存"和"B库位的库存",而不是抽象的商品本身。正确的做法是把每个库位当成独立的资源,用两个事件分别记录A库位减少、B库位增加;如果只是一个调拨指令,则可以把减少和增加放在同一个调拨事件的两条资源流水里。

这个教训让我记住一句话:资源边界选错了,后面所有对账都会跟着错;资源边界选对了,剩下只是机械的记录。反过来想,这也是REA建模最有挑战的地方:Resource的定义不能太粗,也不能太细。太粗,业务语义丢失;太细,表数量爆炸。我的经验是,先和业务方对齐"这个东西在财务上有没有独立的核算意义",如果有,就是一个独立资源。

5.2 实践中常见问题速查表

下面这张表是我在多个项目里积累的排查思路,遇到类似问题时可以直接按这个顺序查。

现象排查思路解决方向
事件重放后净额不为0检查是否有事件重复插入,或者资源增减没有成对出现写入事务增加净额校验;为事件增加唯一业务键
并发下单导致库存超卖投影读模型更新冲突对资源增减做乐观锁或行级锁,保证同一资源串行更新
查询余额越来越慢事件数量过大,每次都要重放全量建立持久化投影表,或定期生成快照做增量重放
业务新增资源类型旧事件里没有对应资源字段通过schema_version做版本兼容,新事件才带新字段
同一业务动作被拆成多个事件,状态反复横跳业务方与开发对"事件"边界理解不一致回看事件拆分原则:优先保证可审计、可对账,不为实现方便拆分

除了表里的问题,还有一个经常被忽略的事:不要把REA当成银弹。对于内部工具、原型验证、一次性的数据处理脚本,传统CRUD就是最快最好的方案。REA适合的是那些需要长期演进、需要审计对账、需要支持复杂查询的正式业务模块。小项目强行上事件溯源,只会让简单问题复杂化。

5.3 一点实操体会与建议

最后分享一点最真实的感觉。我第一次尝试把系统中的几个状态字段改成REA事件时,第一反应是"代码变多了,查询变复杂了,好像没有必要"。但坚持做完一个功能模块后,感受完全变了:和业务方对需求时,不再纠结"订单状态什么时候从A变到B",而是讨论"发生了什么事件、谁参与、资源怎么流动"。业务方对这种表达方式接受度极高,因为他们在现实里本来就是这么看待业务的。

如果你也想尝试,我建议不要一上来重构整个系统,而是挑一个状态字段最少但审计要求最高的模块,比如优惠券发放或资金变动,先做一轮REA改造,把账对平,再慢慢推广。这样既不会伤筋动骨,也能让人真正体会到"事件优先、状态其次"的建模方式到底有多稳。

相关新闻

破解AI五大迷思:从魔法到失控,正确评估与落地AI的关键指南

破解AI五大迷思:从魔法到失控,正确评估与落地AI的关键指南

我在一线做AI落地项目已经有几年了&#xff0c;见过太多团队在“AI时代的迷思”里打转&#xff1a;有人把AI当成许愿池&#xff0c;有人把AI当成毁灭者&#xff0c;还有人干脆觉得AI就是个高级搜索引擎。这些认知偏差&#xff0c;比模型本身的缺陷更危险。因为带着错误预期去立…

2026/10/21 4:49:54 阅读更多 →
ArcGIS中长三角shp底图的坐标系、图层配置与出图指南

ArcGIS中长三角shp底图的坐标系、图层配置与出图指南

简介&#xff1a;面向ArcGIS用户的最新长三角shp矢量底图&#xff0c;覆盖上海直辖市及江苏、浙江、安徽三省共27个地级及以上城市中心区&#xff0c;适合区域规划、经济地理、交通物流等领域的专题制图与空间分析。资源包共10个文件&#xff0c;以shp矢量主文件为核心&#xf…

2026/10/21 4:49:54 阅读更多 →
从0到1搭建AI虚拟员工平台:选型、配置与上线全流程实操

从0到1搭建AI虚拟员工平台:选型、配置与上线全流程实操

大家好&#xff0c;我是那个喜欢把开源项目往生产环境里折腾的人。前阵子帮团队搭建了一套AI虚拟员工平台&#xff0c;从最开始的源码获取&#xff0c;到本地跑通&#xff0c;再到正式环境上线&#xff0c;整个过程花了一周多。如果你正准备搞类似的东西&#xff0c;我先把话放…

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

最新新闻

代码托管平台访问慢?从DNS到资源加载的全链路优化指南

代码托管平台访问慢?从DNS到资源加载的全链路优化指南

1. 为什么打开代码托管平台会慢&#xff1a;先搞懂瓶颈在哪很多人一遇到页面转圈&#xff0c;第一反应就是“网不行”&#xff0c;然后开始重启路由器、切换网络&#xff0c;折腾半天发现该慢还是慢。我刚开始也这样&#xff0c;后来才意识到&#xff0c;打开这类海外代码托管平…

2026/10/21 5:28:10 阅读更多 →
PHP性能调优实战:Xdebug与QCacheGrind定位慢接口分析

PHP性能调优实战:Xdebug与QCacheGrind定位慢接口分析

做PHP开发这几年&#xff0c;我最大的体会是&#xff1a;性能问题不是靠猜&#xff0c;而是要靠数据说话。一个接口从20ms变成200ms&#xff0c;一行SQL的事&#xff1b;一个页面响应慢到让人抓狂&#xff0c;可能只是循环里不小心嵌套了一次查询。但难的不是修&#xff0c;而是…

2026/10/21 5:28:10 阅读更多 →
Agent零基础实操指南:用低代码搭一个能干的数字分身

Agent零基础实操指南:用低代码搭一个能干的数字分身

1. 为什么现在都在聊Agent&#xff1f;先搞清楚它到底解决了什么问题我接触过不少刚工作一两年的职场新人&#xff0c;也包括还在上学但已经开始实习的同学&#xff0c;大家挂在嘴边的一句话是&#xff1a;“事情太多太杂&#xff0c;精力不够用。”写周报、整理会议纪要、找文…

2026/10/21 5:28:10 阅读更多 →
ARM Linux嵌入式libiconv构建与字符集转换实战指南

ARM Linux嵌入式libiconv构建与字符集转换实战指南

简介&#xff1a;本资源是专为ARM架构Linux嵌入式系统定制的libiconv字符编码转换库&#xff0c;面向嵌入式开发工程师、交叉编译实践者及需在树莓派、ARM网关等设备上处理多语言文本&#xff08;如UTF-8/GB2312/ASCII互转&#xff09;的技术人员。资源通过arm-none-linux-gnue…

2026/10/21 5:28:10 阅读更多 →
降AI率有套路!3步把论文AIGC检测率从80%降到5%

降AI率有套路!3步把论文AIGC检测率从80%降到5%

又到交论文的季节了&#xff0c;后台收到好多私信&#xff0c;问的最多的就是“AI率太高怎么办”。说实话&#xff0c;我看到不少同学用AI辅助写完后&#xff0c;一检测&#xff0c;AI率直奔80%。这个数字确实吓人&#xff0c;但别慌&#xff0c;这题我能解。这篇就把我自己实操…

2026/10/21 5:28:10 阅读更多 →
在线字典学习MATLAB实现:稀疏编码与字典更新实战指南

在线字典学习MATLAB实现:稀疏编码与字典更新实战指南

简介&#xff1a;在线字典学习代码是一套基于MATLAB的机器学习实现资源&#xff0c;面向处理文本、音频等序列数据的开发者与研究者。代码演示了在线学习与字典学习的结合&#xff1a;通过逐样本或小批量方式更新模型参数&#xff0c;在节省内存的同时适应数据流场景&#xff0…

2026/10/21 5:27:10 阅读更多 →

日新闻

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

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

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

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

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

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

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

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

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

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

周新闻

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

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

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

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

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

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

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

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

如果你的信息流最近也天天刷到“机器人大脑”这个词&#xff0c;你会发现一个很有意思的现象&#xff1a;每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型&#xff0c;有人指的是运动控制系统&#xff0c;还有人指的是能理解物理世界的端到端模型。在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 阅读更多 →