一个 Agent 额度用完,怎么让别的接着干?
掘金
OpenViking 打破 Agent 记忆壁垒,跨角色接力。统一上下文,任务不丢进度,额度耗尽可召回。3 步接入,前 50 文档免费,开源共建。
Score: 57.15Confidence: 54%
View offerLoading the catalog…
THE AI OPPORTUNITY INDEX
Find your next AI tool. Explore free access, trials, and credits — all in one place.
掘金
OpenViking 打破 Agent 记忆壁垒,跨角色接力。统一上下文,任务不丢进度,额度耗尽可召回。3 步接入,前 50 文档免费,开源共建。
Score: 57.15Confidence: 54%
View offer人人都是产品经理
横店变成了「竖店」,云栖大会上又有人接了句「空店」——很多剧组已经不用群演,直接靠 AI 生视频。阿里云牵头成立短漫剧产业发展联盟,掌阅、快看、麦芽、点众与淘宝短剧、优酷一同做了分享:效率确实高,但不好赚钱。 这两年流行一个说法:横店,变「竖店」了 而在上周的云栖大会上,赵晖教授又接了句:现在叫「空店」 至于为啥,不难解释...现在很多剧组已经不用群演了,直接 AI 生视频 山海短剧付磊:AI 短剧上线 22 万部 但...事情好像也没那么简单,搞 AI 短剧的话 优点:效率很高 缺点:不好赚钱 以今年春节档为例,虽然 AI 剧的量是真人的 50 倍,但播放量却只有 4%,爆款寥寥无几 云栖大会期间有个分论坛,阿里云牵头成立了短漫剧产业发展联盟,既包括掌阅、快看、麦芽、时刻互动、井英、点众,也包括阿里系的淘宝短剧、书旗中文网和优酷等等,对这个行业做了较为深度的分享,于是就让我们看看, 现在做 AI 短剧的人,都在愁什么 本文的各种思考、观察与洞见,均来自各位嘉宾 走入影视 在云栖大会之前,阿里 8 月底上线了Wan 3.0能生成 30 秒视频、保持高度连贯,支持以图片、视频、音频作为参考,简单镜头基本一次能出(对了,阿里在 11 月会有下一代更大尺寸的视频模型) 这款模型在实战上还是很能打的,于是被电影、短剧群体大量使用。比如陆川在筹备电影《天工开物》时,查到四百年前北京的一场大爆炸。天启六年五月初六,王恭厂的火药库炸了,那里离紫禁城不过六里地 陆川短片里的王恭厂 这样的场面放在传统片场,要么花大钱搭,要么干脆不拍。但有了 AI 的加持,一上午就给搭出来了 在另一方面,短剧公司会想着一部接一部地出片,很多创作者群体也拿出了自己的作品 提示词与 Skill 剧组里面通常有个职位,叫场记。负责实时记录演员的状态,以及服化道的摆放信息比如说桃园三结义的时候,你看着是你一句我一句,但很有可能两个人的戏码压根不是在同一天拍的,这时候就需要场记来进行核对,保证情节的不出偏差,就比如... 而在 AI 生视频这一块,提示词就是场记,负责记录衣服的褶皱、天空的颜色,保证场景的连续性。很多人总觉得 AI 生的东西很飘,其实很多的时候就是给的提示词(或者说上下文)的问题。 对于「如何去优化提示词」这块,阿里云的潘奕如在服务了很多的短剧客户后,攒下了不少的经验,然后从实践的角度做了些分享,总结便是: 先把不能变的锁住,再写每个镜头的变化 先锁不变量,再写变化 具体来说,假如想要固定角色,就可以在开头 @对应参考图 。如果是多人戏,则可以先给一张站位图,再写清楚谁在左边、谁在前面、眼睛看着谁 多人站位写法 这些讲究最开始都是人来摸索出来的,现在呢也在转交给人山海的付磊,在长期的业务探索中,把短剧分成三代 第一代:真人实拍,一部剧要四五十个人,拍一个多月,花三五十万 第二代:AI 辅助,不过可提示词还是靠人手写 第三代:AI 干活,人负责判断(和喂 token),也就是目前的阶段现在山海九成的集数一次就能成片,一集的算力成本一百块钱上下,五个人干得了原来四十个人的活 点众也是类似的思路,目前他们有三百多个编剧,这些人的经验被一条条做成了 skill,包括男频、女频、海外剧...在于博文的眼中:“ 工具只是躯壳,Skills 才是灵魂 ” 在这个方向上,阿里云也探索了自己的产品:万镜一刻,用「Agent + 画布」的方式,把剧本策划、故事板、剪辑串在一块画布上,同时能够挂上自己的 skill,一站式交付 赚钱吗? 答: 赵晖带来了一份报告,提到了这么一个信息:今年春节档,真人剧的上线量只有 AI 剧的五十分之一,播放量却是 AI 剧的 25 倍 2026 年春节档 AI 剧与真人剧 诸云科技的尹星富一路跟着 ai 视频过来的,在去年解说漫火的时候,公司要他们搭一套工作流,两个人一两天就能出一部。后来 agent 热了,他们又做了个一键成片, “但发现,这个并不赚钱” 为啥呢?...虽然剧的数量翻了十倍,但市场并没有扩大,毕竟看剧的还是那么多人,那么多时间 对了,这里还有个好玩的数据,来自井英科技就是拿拿每个题材的爆款数除以剧目数,看看哪个最热,得到了这样的结论: 霸总甜宠的剧最多,爆的概率却偏低 帮派斗争、身份桎梏这些剧少,爆的概率是霸总甜宠的四倍多 不同题材的相对爆款系数 IP 与版权 现在 AI 写小说还是稍微差点意思的,很容易陷入比较诡异的剧情,比较典型的是早年 AI 写故事总喜欢来一个「终极一战」,就尼玛非常诡异的套路。而现在一个比较成熟的思路,是走 ip 改编 在这里我突然想插入一个暴论:AI 改编,让 IP 也具有了长尾效应 所谓长尾效应,最早是说在有了电子商城之后,那些小众商品也能上架售卖,让长尾货品流入市场IP 则也是类似,过去 20 年有非常多的网文作品涌现,但每年只有少数即使不得到了漫改机会(btw:凡人修仙传改的真不错,银月的耳朵贼好玩)。毕竟常规的来改伊布作品,投入都是百万起步的计数,周期更是按年来算 而现在,改编的成本被 AI 打了下来,版权方终于可以对长尾下注了,对此掌阅的杨翼如是分享到: 由于转化成本高,之前只能押注头部 但在另一层面上,来自快看漫画的邵远则补充说道: 九成以上的漫画作者不愿意自己的作品被 AI 改 ,漫画读者的眼睛又毒,“只要一点点 AI,他马上就能看出来”。于是在这一赛道上,快看便按着漫画主线不动,在其他场景上做突破尝试 最后 AI 影视方兴未艾,该怎么发展尚未有定论,一切都在一个蛮荒的时期最后,便让我用麦芽传媒副总裁梁彪的一页 PPT 作为收尾 本文由人人都是产品经理作者【赛博禅心】,微信公众号:【赛博禅心】,原创/授权 发布于人人都是产品经理,未经许可,禁止转载 题图来自作者提供
Score: 57Confidence: 54%
View offer人人都是产品经理
一家机构把 75 家工程与建筑咨询企业的品牌使命宣言隐去名称再做比对,结果几乎无法区分。文章借马斯洛与柯林斯的观点指出:使命若不扎根企业自身的历史、文化与真实行为,就只是在描述整个行业,外观再好看也只完成了一半。 不少行业重金投入“使命导向型”品牌建设,却陷入最严重的同质化 ——问题出在哪? 一、一个令人不安的发现 最根本的问题在于,激励你的愿景是什么? ——亚伯拉罕·马斯洛 吉姆·柯林斯在《卓越基因》说:领导者的职责——领导者的第一要务—— 是激发明确的使命和愿景,并确保人们对这一愿景的持续投入和追求。 所以,围绕“使命愿景”搭建战略, 论证“清楚自身存在意义的组织,行事方式会截然不同” ,这个逻辑本身没有错 。 但从近期的一个调研来看,事情可能没有那么容易。 一家机构对工程与建筑咨询领域75家企业的品牌使命、定位与对外表述做了一次系统盘点,他们从七个品牌表达维度逐一评估各家的差异化水平。研究初期,把这75份品牌使命宣言隐去企业名称,再做比对。 结果是——几乎无法区分它们。 “打造更美好的工程世界”、“塑造更好的未来”、“共创更好的明天”,这些表述或许发自本心,但毫无疑问,彼此没有差别。 二、好看的外表,不等于清晰的定位 要言简意赅地用一句话清晰地表达公司使命。它能迅速说明企业存在的原因,如何实现人们的基本需求,如何影响世界 ——吉姆·柯林斯在《卓越基因》 我们都知道,找到、公布其使命宣言必有价值。但如果一项品牌使命真正属于企业—— 扎根于自身历史、文化与真实行为——才会拥有强大力量。 可问题在于,当企业拿一套话术做市场定位,而措辞和隔壁竞品几乎一模一样时,使命就不再具备差异化作用,它只是在描述整个行业。 本次调研中,近八成企业的表述高度趋同,就算替换成别家公司名字,文意完全不受影响。 还有一个出乎意料的发现,更能说明问题。 有几家最难分辨的企业,恰恰完成了高调的品牌升级,投入巨大。他们的视觉体系经过精心打磨,拿过奖项,看上去和行业传统风格截然不同。但在文字定位层面,品牌辨识度反而低于行业均值。 可见,独特视觉识别和差异化定位,本是两套相互独立的体系。 我们可以得出这样一个结论:仅有好看的外表,缺少清晰的战略定位,品牌只完成了一半。 三、使命为什么也会“同质化”?根源不是抄袭 话说回来,为什么会出现这种同质化现象? 这并非企业偷懒,也不是单纯抄袭,根源是比咨询公司的作业流程更深的“叙事”。 首先, 受可持续发展、社会价值、建筑环境等诉求的影响 ,整个行业几乎同步转向使命导向定位。 其次,当头部企业长期、成功地占据这套话语体系,它就慢慢变成一套参考范本—— 不完全是模仿,更像一种引力牵引。 第三,客户提案里会附上 标杆案例 ,内部流程追求共识。 最终留下来的语言, 是所有人都不会反对的表达:包容、宏大、刻意模糊。 这种现象并不局限于工程咨询行业,在所有专业服务领域,走使命导向定位的路径都大同小异: 初衷真诚,结果趋同。 四、一个根本性误区:使命=定位 你可能已经注意到了,这里有一个误区: 企业使命和市场定位,承担的是完全不同的职能。 企业使命: 用来凝聚内部员工,是组织的文化根基,是利润之外的驱动力,也是行为准则。 市场定位: 包括公司战略,公司业务,公司目标等,这些是动态规划,而不是驱动因素。 品牌定位则是另一回事: 它告诉客户,为什么要选你,而不是你的对手。 如果强行让使命同时承担三项工作,它就会被拉伸到不属于它的领域,沦为一句空洞口号。 它很容易被拿来对比、被客户弱化、失去说服力。最终的结果,既丢失了定位本可以带来的差异化,更糟糕的是,原本有分量的品牌使命,其文化内核也被稀释。 换句话说,当使命被强行用来承担定位的任务,它最珍贵的内核就被剥离了。 五、使命支撑定位的前提:不是口号,是“做法” 当然,也有企业避开了这个陷阱——而且并非偶然。它们的共同点是: 使命不是写出来的,是活出来的。 奥雅纳(Arup):塑造一个更美好的世界。 这句话不是应对市场风潮仓促提出的口号,它可以追溯到创始人奥夫·奥雅纳1970年的《重要演讲》,点明了企业存在的意义与行事准则。企业通过信托结构实现员工持股,正是这一理念的实体落地——本质上,这套使命已经变成了嵌入企业运营的硬性约束。 胖东来:成就阳光个性的生命,让社会更美好。 表述同样朴实,但于东来用一系列具体行动让使命落地:员工持股、帮助员工成长、高品质产品、卓越服务......。这些不是手册上的话术,而是落地的行为准则和日复一日的经营选择。 泡泡玛特:创造潮流,传递美好 王宁曾这样说:“ 我们的愿景是,我们坚守成为一家伟大的企业,做一个让人尊敬的品牌这是不变的。然后我们自己做事的方法和理念,用我们自己的话说,尊重时间,尊重经营的长期主义理念......。 ‘创造潮流,传递美好’属于我们想做的事情, 它是基于刚才说的理性和感性之间的事情。我们对品牌的理解,不是“多快、好、省”这种购物型的,而是你在这个店里待着,或者你买了几样东西,能让你觉得生活还挺好,是一种更高的、精神类的消费场景和消费需求,这是我们的追求,也是我们对品牌和文化的理解。” 此处关键,在于泡泡玛特对“顾客核心价值”的独特定义与创新,而非口号本身。 三者共同点是——它们的使命,来自自身独特的信仰、原则与长期实践,而非行业流行语的拼凑。 这里也会看到使命 “ 起作用 ”的核心机制 —— 企业不只是口头宣告使命,而是用制度、行为和产品亲身践行。当使命变成嵌入组织肌理的硬性约束,它自然就能回答那个定位问题:“客户为什么要选你?” 反过来说,如果别的企业照搬这些话,只把它当成一种美好愿景挂在墙上,那它只能告诉外界:这家企业属于哪个行业。却无法说明,客户为什么要选择它,而非别家。 德普尔:世界智控门,中国德普尔 。 这正是我们在服务一家门控企业时,反复思考的核心问题。 德普尔是全球自动门行业的隐形冠军——销售早已遍布世界。全球主流门控品牌的门控产品,都出自它的工厂。那么,如何为这样一家企业找到属于自己的使命? 我们没有套用多玛、盖泽、亚瑟合莱、松下等行业标杆惯用的“可持续未来”、“更好的通行体验”,而是从三个维度切入:一是企业自身“内敛却强劲”的特质;二是智能门控正在重塑自动门行业的趋势判断;三是中国智造崛起的时代背景。 最终,一句专属德普尔的使命宣言就这样诞生: “世界智控门,中国德普尔” 。 这不是一句空洞的使命愿景——“智控门”而非“自动门”,重新定义了行业方向,也符合中国市场口号式传播的习惯;“中国德普尔”则将企业身份与中国智造的力量绑定;更关键的是,25年来德普尔的所有行动与创造,都在不断印证和落实这一使命。 六、在找“使命”之前,先问自己一个不同的问题 大多数企业并没有完成这一步。不是缺乏诚意——很多企业和创始人真心认同使命的价值。 但定义专属于自己的信念,把它渗透在真实业务中,坚定到足以引发不同意见,远比撰写一句使命宣言难得多。 这要求企业诚实地面对“自己是什么”,而不是只描绘“渴望成为什么”。 因此,在撰写使命表达之前,请先问自己一个不一样的问题——不是“我们想要对外说什么”,而是: “我们有哪些独有的信念、独有的做法,是竞品都不具备的?我们能否拿出实证,而不只是口头宣称?” 诚然,这样的使命,难度远高于常规版本。但这份投入,值得。 再回到标题的问题: 同质化的“使命宣言”,正在毁掉品牌差异化? 很显然,根源不在于表述的同质化,而在于大多数企业既没有对顾客核心价值的独特定义 ,更没有与之匹配的、可验证的具体行动。 为一句话说一句话,使命就只是一句同质化的口号。 本文由人人都是产品经理作者【品牌猿】,微信公众号:【品牌猿创】,原创/授权 发布于人人都是产品经理,未经许可,禁止转载。 题图来自Unsplash,基于CC0协议
爱范儿
换电走到今天,或许才刚刚进入第二阶段。 #欢迎关注爱范儿官方微信公众号:爱范儿(微信号:ifanr),更多精彩内容第一时间为您奉上。
Score: 56.12Confidence: 54%
View offervelog
GitHub 링크 Notion 링크 Blocking Locomotion Contents Blocking 시스템 Contents Parrying 시스템 Contents
Score: 54.4Confidence: 49%
View offervelog
남은 리스크 예산 1.9 USDT, 매수가 잠긴 하루 순 리스크 30.8 USDT, 허용 32.7 USDT. 신규 돌파가 와도 살 수 없는 상태에서 포트폴리오는 조용히 10 USDT를 내줬다. 포트폴리오 현황 항목 값 USDT 잔고 214.85 활성 포지션 DOT(51), AVAX(156), SHIB(0), APT(62), PEPE(0), ETHFI(45), MUBARAK(129), BROCCOLI714(58) 미실현 P&L +85.18 USDT 총 포트폴리오 715.61 USDT 시스템 업데이트 외부 시가총액 API 장애 시에도 티커 스캔이 중단되지 않도록 보강하고, 수동 스캔 결과를 바로 반영하는 운영 도구를 추가했다. 리스크 한도 검사가 최신 설정값을 읽도록 수정하고, 매수가 차단될 때 어떤 한도 때문인지 알림에 명시하도록 개선했다. 매매일지 자동 발행이 인증 문제로 멈추는 현상을 수정하고, 실패 시 원인이 로그에 남도록 보강했다. 일일 회고 오늘의 교훈 신규 거래 없이 하루가 지났다. 순 리스크가 허용치의 약 94%(30.8/32.7 USDT)를 차지해 ASTER, ATOM 등 감시 중인 돌파 후보가 와도 매수가 불가능한 상태였다. 리스크 예산은 포지션 수가 아니라 각 포지션의 (평단 - SL) 거리로 소진된다. 수익 중인 APT(+11%), BROCCOLI714(+17%), AVAX(+19%)의 SL이 아직 평단 아래에 있어 익스포져가 그대로 남아 있다. 미실현 P&L이 +95.96에서 +85.18 USDT로 줄었다. 추세 추종에서 되밀림은 정상 비용이지만, SL이 평단 아래인 포지션은 되밀림이 커지면 수익이 손실로 바뀐다. 잘한 점 리스크 한도 초과 상태에서 시스템이 신규 매수를 차단해 총 익스포져가 규칙 안에서 유지됐다. 6개 포지션 모두 SL이 유지된 채 감시됐고, 오전 외부 API 장애와 세 차례 재기동에도 포지션 보호에 공백이 없었다. 누적 실현 손익은 -386.4 USDT로 저점 대비 소폭 회복 중이며, MUBARAK(+76.5%)처럼 추세를 끝까지 끌고 가는 포지션이 기대값을 떠받치고 있다. 아쉬운 점 수익 포지션의 SL을 평단 위로 끌어올리지 않아 리스크 예산이 해제되지 않았고, 그 결과 새 돌파 기회를 받을 여력이 0에 가까웠다. 티커 스캔이 외부 API 장애로 실패해 기존 리스트를 그대로 썼다. 당일 수정은 됐으나, 그 사이 신규 후보 종목이 갱신되지 않았다. 재기동이 세 차례 있었다. 각 재기동은 짧았지만 운영 안정성 측면에서 반복되지 않아야 한다. 다음에 적용할 점 APT, BROCCOLI714, AVAX의 SL을 최소 평단 이상으로 조정해 수익을 확정하고, 해제되는 약 14 USDT의 리스크 여력을 신규 돌파에 배정한다. MUBARAK은 +76% 구간이므로 트레일링스탑 간격이 ATR 기준으로 적정한지 점검하고, 수익의 상당 부분이 반납되기 전에 SL이 따라붙는지 확인한다. 티커 스캔 복구 후 첫 정기 스캔이 정상 완료되는지 확인하고, 감시 리스트가 최신 시가총액 기준으로 갱신됐는지 점검한다.
Score: 54.4Confidence: 49%
View offervelog
요즘 AI로 사주 사이트 만드는 분들 많죠. 저도 그렇게 사주 사이트를 만들어서 운영했었어요. 생년월일시를 넣으면 사주를 계산하고 AI 상담가가 고민이나 궁합을 봐 주는 사이트였는데요. 막상 해 보니 제일 오래 걸린 게 사주 계산이었어요. 사이트를 접고 나니 남은 건 데이터뿐 사이트는 접었는데 그때 만든 계산 엔진이랑 데이터는 그대로 남았어요. 태어난 날짜, 시간, 도시만 넣으면 아래 화면에 들어가는 값이 다 나와요. (사진은 엔진 계산값으로 그린 예시 화면이에요. 화면 코드는 키트에 없어요.) 사주 네 기둥, 일주 풀이, 오늘의 운세, 지금 대운까지 한 번에 나와요. 태어난 도시랑 그해 서머타임까지 따져서 시간도 보정해요. 궁합은 100점 만점으로 나오고 항목별 점수도 같이 나와요. 자미두수 명반도 나와요. 12궁에 별 66개, 사화, 10년 운까지 들어 있어요. 만세력 달력도 있어요. 날짜마다 음력, 일진, 손없는날이 나오고 이사나 결혼하기 좋은 날도 골라 줘요. AI한테 계산을 맡기면 안 되는 이유 운영하면서 제일 크게 배운 게 이거예요. AI한테 사주 계산까지 맡기면 간지를 틀릴 때가 많아요. 그래서 계산은 코드가 다 하고 AI한테는 계산된 값만 넘겨서 풀이만 쓰게 했어요. 무료 체험 키가 있으면 아래처럼 바로 불러 볼 수 있어요. curl -X POST https://sajuaedam.kro.kr/kit/api/v1/saju_chart \ -H "Authorization: Bearer 체험키" \ -H "Content-Type: application/json" \ -d '{"birth":"1992-10-24","time":"09:10","gender":"female","city":"서울"}' 결과에는 화면에 바로 띄울 수 있는 풀이 문장도 들어 있어요. "dayPillar": { "pillar": "계유", "reading": "바위에서 스며 나오는 샘물을 닮아, 섬세한 통찰로 남의 사정을 깊이 헤아리는 편으로 보입니다. ..." } AI에 붙여 넣을 사주 텍스트도 같이 나와서 Claude나 GPT한테 넘기면 풀이만 써 줘요. Claude Code나 Cursor에 연결하면 대화하면서 바로 계산도 돼요. 같은 날 태어났는데 명반이 다른 이유 요즘 사주 사이트에 자미두수 넣는 분들 많더라고요. 사주가 태어난 연월일시 여덟 글자로 보는 거라면 자미두수는 별을 나, 재물, 직업, 배우자 같은 12칸에 나눠서 봐요. 그래서 돈, 일, 연애를 따로따로 풀어 주기 좋아요. 근데 자미두수는 음력 날짜로 명반을 세우는데 한국 음력이랑 중국 음력은 1900~2100년 중에 2,727일이 달라요. 중국 달력으로 계산하면 그날 태어난 사람은 명반이 달라져요. 이 엔진은 사주랑 똑같이 한국 음력으로 계산해요. 사람이 늘수록 호출비만 느는 구조 사주 API는 대부분 월 구독이거나 부를 때마다 돈이 나가요. 무료로 서비스를 열면 사람이 늘수록 호출비부터 늘어요. 계산을 내 서버에서 돌리면 호출비가 안 들고 남의 API가 멈춰도 내 사이트는 멀쩡해요. 묵혀 두기 아까워 만든 키트 그래서 계산 코드랑 데이터를 통째로 키트로 묶었어요. 만세력, 사주 분석, 궁합, 오늘의 운세, 좋은 날 고르기 한국 음력 자미두수 1900년부터 2100년까지 200년치, 7만 3천 건 사주 데이터 AI 없이 바로 띄우는 풀이 문장 (60일주, 일간, 십성) Claude Code·Cursor 연결, 내 사이트용 API, 사이트 만들기 프롬프트 그대로 내 사이트에 붙여 써도 되고 풀이를 더해서 나만의 사주 앱으로 키워도 돼요. 키트는 유료고 한 번 사면 끝이에요. 월 구독은 없어요. 사기 전에 메일만 넣으면 7일 동안 30번 무료로 돌려 볼 수 있어요. (카드 등록 없음) https://sajuaedam.kro.kr/kit/?ref=velog2 계산이 맞는지 먼저 보고 싶으면 만세력 앱들이 잘 틀리는 생일 8개랑 정답도 올려 뒀어요. (가입 없음) https://sajuaedam.kro.kr/kit/check?ref=velog2 날짜 계산이 어디서 꼬이는지는 지난 글에 정리해 뒀어요. https://velog.io/@ahju411/사주-앱-만들-때-AI가-틀리게-짜는-날짜-계산-5가지-JS-코드-포함 사주 사이트 만들고 계신 분들, 어디서 제일 막히셨는지 댓글로 알려 주세요.
Score: 54.4Confidence: 49%
View offervelog
A show this popular inevitably attracts cheap imitations alongside genuinely well-made pieces, and knowing what separates the two matters more here than for a less recognizable reference, since the entire appeal of this wardrobe depends on looking authentically worn and functional rather than costume-perfect. Why Generic "Western Jacket" Listings Fall Short A lot of sellers label any leather or shearling piece as Yellowstone-inspired without matching the specific balance the show's costume design actually strikes, genuine ranch practicality combined with understated quality rather than flashy Western styling. A listing that only uses vague terms like "cowboy jacket" or "ranch style" without more specific construction detail is often a sign the seller hasn't paid close attention to what actually makes this show's wardrobe distinct from generic Western fashion. What Genuine Materials Reveal That Synthetic Substitutes Don't Real leather and shearling develop texture and character with wear in a way synthetic alternatives typically can't replicate convincingly. Since the show's aesthetic specifically depends on clothing looking authentically worn rather than costume-new, genuine material actually serves the reference better here than it might for a more polished, stylized show. A listing that specifies real leather or shearling explicitly, rather than vague "leather-look" language, is worth trusting more than one that leaves the material ambiguous. Why Color Accuracy Matters More Than People Expect The show's wardrobe relies on a specific, earthy color palette, muted browns, deep blues, weathered greens, and a jacket that leans too bright or too far from that range misses an important part of what makes the reference recognizable. Checking multiple product photos rather than a single hero image helps confirm the actual tone matches expectations rather than reading more saturated or washed out than intended. Construction Details That Separate Real Quality From Approximation Reinforced seams, proper lining, and functional closures matter more for this particular reference than they would for a purely decorative costume piece, since genuine wearability is central to what makes this wardrobe work in the first place. A jacket that falls apart within a season undercuts the entire authenticity the reference is supposed to convey. Reading Reviews for the Details Photos Won't Show Reviews mentioning whether the material actually felt genuine, whether the color matched real-world expectations, and whether the jacket held up to actual cold-weather wear are considerably more useful than generic star ratings without elaboration, particularly for a reference this dependent on authentic function rather than pure visual accuracy. You can browse the full Yellowstone Outfits collection and compare specific listings before ordering. The Takeaway None of this requires special expertise, it just requires reading past the photos and into the specific material and construction details a listing provides. A reference this widely searched will always attract shortcuts, which is exactly why the buyers who end up satisfied are the ones who checked these details before ordering, not after a disappointing jacket arrived.
velog
NewVent 3편. 1·2편은 모델 벤치마크 얘기였고, 이번은 그 뒤에 벌어진 일이다. 구현·컨테이너화·배포 준비·프론트 연동을 하면서 만난 것들. 1. 지금까지 만든 것 벤치마크가 끝나고 실제 코드로 옮긴 것들. 상태 BedrockClient Converse API, gemma-3-27b. stopReason == MAX_TOKENS 로 절단 판정 컨테이너화 멀티스테이지 빌드. 659MB → 422MB 인프라 EC2(t3.small) + Elastic IP + DuckDNS + SSM 접속 IAM 모델 단위 최소권한. gemma·임베딩만 열고 Claude 계열은 차단 채팅 수정 라우터 1회 + 블록별 재시도. 못 알아들으면 되묻기 RAG pgvector, 1024차원, HNSW 코사인 인덱스 개인정보 필터 감지되면 확인 전까지 LLM 호출 보류 인증 경로·쿠키를 사용자/관리자로 분리 IAM 을 모델 단위로 좁힌 건 벤치마크에서 배운 것이다. 2편에서 Haiku 를 쓰다가 비용의 대부분을 거기서 썼다. 그래서 팀원에게 나눠줄 키는 모델 3개만 부를 수 있게 만들었다. 정책 시뮬레이션으로 확인했다. google.gemma-3-27b-it allowed amazon.titan-embed-text-v2:0 allowed embed-multilingual-v3 allowed us.anthropic.claude-haiku-4-5-20251001-v1:0 implicitDeny us.anthropic.claude-sonnet-5 implicitDeny 실수로든 호기심으로든 비싼 모델을 부를 수 없다. 개인 계정에 월 $10 예산을 걸어둔 상태에서는 이게 예산 알림보다 확실하다. 2. JWT 오류 앱이 이 메시지로 죽었다. WeakKeyException: The specified key byte array is 104 bits which is not secure enough for any JWT HMAC-SHA algorithm. .env 의 JWT_SECRET 은 47자였다. 376비트다. 충분하다. 그런데 앱은 104비트를 봤다. 104비트는 13바이트다. 13자짜리 문자열이 뭘까 세어봤다. ${JWT_SECRET} → 13자 치환되지 않은 플레이스홀더가 그대로 키가 됐다. application.yaml 에 secret: ${JWT_SECRET} 이 기본값 없이 적혀 있었고, 환경변수가 없으면 이 문자열이 값으로 들어간다. 왜 환경변수가 없었나. .env 는 Docker Compose 가 읽는 파일이고 JVM 은 읽지 않는다. IDE 로 띄우면 아무것도 전달되지 않는다. DB 설정은 ${DB_PASSWORD:123} 처럼 기본값이 있어서 조용히 넘어갔고, JWT_SECRET 만 기본값이 없어서 리터럴이 새어 나왔다. 무서운 건 자리표시 문자열이 32바이트를 넘었다면 아무 오류 없이 떴을 거라는 점이다. 누구나 아는 값으로 JWT 를 서명한 채로. 팀에서 고친 방식이 좋았다. 설정을 읽는 순간 검사한다. if (secret == null || secret.isBlank() || secret.contains("${")) { throw new IllegalStateException("JWT_SECRET 이 없습니다. (openssl rand -base64 48)"); } contains("${") 한 줄이 이 클래스의 사고를 다 막는다. 그리고 값은 메시지에 싣지 않고 길이만 알려준다. 3. AWS Bedrock API 오류 RAG 담당 팀원이 Cohere 임베딩을 부르는데 AccessDeniedException 이 났다. IAM 정책에 모델 ARN 을 넣었는데도 그랬다. 정책 시뮬레이션은 통과라고 했다. bedrock:InvokeModel cohere.embed-multilingual-v3 → allowed 정책을 아무리 고쳐도 안 풀리는 게 당연했다. 정책은 처음부터 맞았다. 모델 가용성을 조회하니 답이 나왔다. { "authorizationStatus": "AUTHORIZED", // IAM 은 통과 "regionAvailability": "AVAILABLE", "entitlementAvailability": "AVAILABLE", "agreementAvailability": { "status": "NOT_AVAILABLE" } // 여기 } Bedrock 은 서드파티 모델을 쓰기 전에 제공사 약관 동의 를 요구한다. IAM 과 완전히 다른 관문인데, 막힐 때 나오는 건 똑같이 AccessDenied 다. 그래서 전부 IAM 문제로 보인다. Cohere 모델은 전부 NOT_AVAILABLE 이었고, 이미 쓰던 gemma·Titan 은 AVAILABLE 이었다. Amazon·Google 모델은 자동으로 열려 있었고 Cohere 만 따로 동의가 필요했던 것이다. 약관은 계정 단위, 리전별 이다. 한 번 동의하면 그 계정의 모든 IAM 사용자와 EC2 역할이 쓴다. 팀원이 각자 할 일은 없다. 대신 리전을 옮기면 다시 해야 한다. 4. AWS 자격증명 오류 배포 없이 백엔드·프론트를 붙여보려고 로컬에서 끝까지 돌렸다. 로그인 → 이벤트 생성 → LLM 생성 → 폴링 → 미리보기. 전부 200 이었다. E2E 통과라고 적었다. 며칠 뒤 컨테이너에 AWS 자격증명을 안 넣고 같은 흐름을 돌렸는데 또 성공했다. 자격증명이 없는데 LLM 생성이 성공할 수는 없다. 단서는 응답에 있었다. { "phase": "DONE", "versionId": 75, "attempt": null } attempt 가 null 이었다. 재시도 카운터인데 값이 없다는 건 모델을 한 번도 안 불렀다 는 뜻이다. 생성 API 에 templateCode 를 주면 템플릿 경로로 가고, 그 경로는 템플릿 HTML 을 그대로 쓴다. 모델을 부르지 않는다. 모델을 타는 건 templateCode 를 생략한 백지 경로뿐이다. 즉 내 E2E 테스트는 파이프라인은 검증했지만 모델 호출 구간을 한 번도 지나지 않았다. 그것도 모르고 "끝까지 돌았다"고 보고했다. 백지 경로로 다시 하니 정상적으로 실패했다. phase: FAILED message: "페이지 생성 서버에 연결하지 못했습니다. 잠시 후 다시 시도해 주세요." 그런데 이 문구도 문제였다. "잠시 후 다시 시도해 주세요" 는 일시적 장애처럼 읽힌다. 실제 원인은 설정 누락인데 관리자는 네트워크를 의심하고 재시도한다. 재시도는 호출 기록에 실패 행을 남기고, 그 행은 하루 호출 상한을 깎는다. 호출은 못 했는데 예산은 줄어든다. 그래서 기동 시점에 자격증명을 확인하는 검사를 넣었다. 없으면 앱이 아예 뜨지 않고 원인을 한국어로 알려준다. 5. AWS_ACCESS_KEY 오륮 컨테이너 설정에 필수 변수 검사를 넣었다. 값이 없으면 멈추게. AWS_ACCESS_KEY_ID: "${AWS_ACCESS_KEY_ID:?키가 필요합니다}" 의도는 좋았는데 부작용이 있었다. docker compose down 도 막혔다. Compose 는 모든 서브커맨드가 먼저 설정 모델을 만들고 , 치환은 그 파싱 단계에서 일어난다. down 이 키를 필요로 하는 게 아니라, Compose 가 설정을 못 만들어서 무엇을 내려야 할지 모르는 상태가 된다. config · ps · logs · kill 전부 같이 막혔다. 여기서 " down 을 조심해야 한다"와 "필수 변수 검사"를 한 문단에 섞어 써서, 두 문제를 하나로 만들어버렸다. 실제로는 완전히 별개 였다. 검사를 지우고 mock 만으로 재현해보니 여전히 이랬다. docker compose down Container newvent-postgres Removed Network backend_default Resource is still in use ← 실패 남은 컨테이너: newvent-app ← 고아 원인은 앱을 별도 오버라이드 파일에 정의한 구조였다. Compose 에게는 넘긴 -f 파일들이 곧 프로젝트의 정의 다. 기본 파일만 주면 앱을 자기 것으로 보지 않고 고아로 분류한다. 그리고 함부로 지우지 않는다 — 의도적으로 스택을 쪼개 쓰는 경우가 있으니까. 경고조차 뜨지 않는다. 유일한 단서가 Resource is still in use 라는 간접적인 실패 메시지다. "DB 는 내렸는데 8080 이 왜 살아 있지"로 헤매게 된다. --remove-orphans 를 붙이면 해결된다. 그리고 이건 필수 변수 검사를 없애도 그대로 남는다. 두 문제를 분리하고 나서야 그게 보였다. 앞으로 남은 것들 프론트 연동에서 SSE 전제를 폴링으로 바꾸는 작업 되묻기 상태를 실패와 구분해서 화면에 보여주기 nginx + certbot, 그리고 RDS 전환 검토 관리자 목록 API 와 생성 API 의 템플릿 코드 어휘 통일 등
velog
1001 운영 자동화/AI 워크플로우 심화 (25/N): Outbox·Inbox, Event Delivery와 Eventual Consistency ✅ 1. DB 저장과 Queue 전송 사이에는 항상 위험한 틈이 있다 예를 들어 주문 상태를 변경한 뒤 알림톡 Job을 만들고 싶다고 하자. 단순 구현은: 1. 주문 상태 DB 변경 2. Queue에 Notification Job 전송 이다. 코드로 보면: await prisma.order.update(...); await queue.add('notification', ...); 문제는 두 작업 사이에서 장애가 발생할 수 있다는 것이다. ✅ 2. 가장 대표적인 실패 상황 DB Update SUCCESS ↓ 서버 Crash ↓ Queue Publish 실행 못 함 결과: 주문은 완료 상태 알림톡 Job은 존재하지 않음 이다. DB만 보면 정상처럼 보이지만 후속 자동화가 영원히 실행되지 않는다. ✅ 3. 반대 순서도 안전하지 않다 그러면 Queue부터 넣으면 될까? 1. Queue Publish 2. DB Update 이렇게 바꿔도 문제가 생긴다. Queue Publish SUCCESS ↓ DB Update FAILED 그러면 Worker는: 주문 상태가 바뀌지도 않았는데 알림톡을 발송 할 수 있다. ✅ 4. 두 시스템을 하나의 DB Transaction으로 묶을 수 없는 이유 PostgreSQL 내부 작업은: BEGIN Order Update Audit Insert COMMIT 처럼 묶을 수 있다. 하지만: PostgreSQL + Redis Queue 또는: PostgreSQL + External Message Broker 는 서로 다른 시스템이다. 일반적인 DB Transaction 하나로 둘을 동시에 Commit할 수 없다. ✅ 5. Dual Write Problem 이런 문제를 실무에서는 흔히 Dual Write Problem 으로 본다. 즉: DB에 쓰기 + 다른 시스템에도 쓰기 두 작업을 하나의 업무로 처리해야 하는데 둘 중 하나만 성공할 수 있는 문제다. ✅ 6. 단순 Retry만으로 해결하기 어렵다 Queue 전송에 실패하면 Retry할 수 있다. 하지만: Queue 요청 Timeout 이 발생했다고 하자. 실제로 Queue 등록이: 성공했는지 실패했는지 모를 수 있다. 무작정 Retry하면 중복 Job이 생길 수 있다. ✅ 7. 여기서 Transactional Outbox가 등장한다 핵심 아이디어는 단순하다. DB 변경과 “나중에 전달해야 할 Event”를 같은 DB Transaction에 저장한다. 즉: BEGIN Order Update OutboxEvent Insert COMMIT 한다. Queue에 직접 보내지 않는다. ✅ 8. Outbox 구조 예: Order Update ↓ OutboxEvent type: ORDER_STATUS_CHANGED status: PENDING 까지 PostgreSQL에 저장한다. 이 두 작업은 같은 Transaction이다. ✅ 9. Transaction 성공 Order COMPLETED Outbox PENDING 둘 다 존재한다. ✅ 10. Transaction 실패 Order 변경 없음 Outbox 생성 없음 둘 다 Rollback된다. 따라서: DB는 변경됐는데 Event가 사라짐 상태를 막을 수 있다. ✅ 11. Outbox Worker 별도의 Worker가: PENDING Outbox 를 찾는다. 그리고: Queue / Event Bus Publish 를 수행한다. 성공하면: PUBLISHED 로 바꾼다. ✅ 12. 전체 흐름 Business Transaction ↓ DB 변경 + Outbox Insert ↓ COMMIT ↓ Outbox Worker ↓ Queue Publish ↓ Consumer 가 된다. ✅ 13. 주문 예시 관리자 주문 상태 변경 ↓ Transaction Order WAITING → COMPLETED AuditLog INSERT OutboxEvent ORDER_STATUS_CHANGED ↓ COMMIT 이후: Outbox Worker ↓ Notification Queue ↓ Notification Worker 로 진행한다. ✅ 14. 기존 Outbox를 이미 일부 사용한다면 확장한다 Outbox는 새로운 거대한 시스템을 만드는 것이 아니다. 기존에: Order Update + Audit + 후속 Job 같은 구조가 있다면 후속 Job Trigger를 Outbox로 안정화하는 것이다. ✅ 15. OutboxEvent 기본 모델 예: model OutboxEvent { id String @id @default(cuid()) eventType String aggregateType String aggregateId String payload Json status String @default("PENDING") correlationId String? causationId String? attemptCount Int @default(0) nextRetryAt DateTime? publishedAt DateTime? createdAt DateTime @default(now()) updatedAt DateTime @updatedAt @@index([status, nextRetryAt]) } ✅ 16. aggregateType / aggregateId Event가 어떤 Domain 객체에서 발생했는지 나타낸다. 예: aggregateType ORDER aggregateId order_123 이다. ✅ 17. eventType 예: ORDER_CREATED ORDER_STATUS_CHANGED CONSULT_CREATED EXPORT_REQUESTED 처럼 명확한 이름을 사용한다. ✅ 18. Payload는 최소화한다 나쁜 예: { "customerName": "...", "phone": "...", "address": "...", "wholeOrder": {} } 이렇게 전체 객체를 복사하지 않는다. ✅ 19. 필요한 정보만 넣는다 예: { "orderId": "order_123", "previousStatus": "WAITING", "newStatus": "COMPLETED" } 정도로 둔다. 필요한 최신 정보는 Consumer가 DB에서 다시 조회할 수 있다. ✅ 20. Payload Snapshot이 필요한 경우도 있다 항상 최신 DB를 조회하는 게 정답은 아니다. 예: “상태 변경 당시의 가격” 이 필요하다면 Event에 Snapshot 값을 포함할 수 있다. 핵심은: 현재값이 필요한가? 당시값이 필요한가? 를 구분하는 것이다. ✅ 21. Event도 Version을 가진다 시간이 지나면서 Payload 구조가 바뀔 수 있다. 예: { "version": 1, "orderId": "order_123" } 이후: { "version": 2, "orderId": "order_123", "newStatus": "COMPLETED" } 처럼 바뀔 수 있다. ✅ 22. Event Version이 없으면 오래된 Consumer가 깨질 수 있다 Queue에 오래된 Event가 남아 있거나 재처리할 경우: 현재 코드가 예상하는 Payload ≠ 과거 Payload 가 될 수 있다. 그래서 Event Schema 변경은 신중해야 한다. ✅ 23. Outbox Worker의 Claim Worker가 여러 개라면 같은 OutboxEvent를 동시에 처리할 수 있다. 따라서: PENDING → PROCESSING 을 Atomic하게 Claim해야 한다. ✅ 24. 예 UPDATE outbox_events SET status = 'PROCESSING' WHERE id = $1 AND status = 'PENDING'; affected rows가 1인 Worker만 실제 Publish를 수행한다. ✅ 25. Outbox Worker도 Crash할 수 있다 예: PROCESSING ↓ Queue Publish SUCCESS ↓ DB status 업데이트 전에 Worker Crash 하면 DB에는: PROCESSING 으로 남는다. 하지만 Queue에는 이미 Event가 들어갔다. ✅ 26. 그래서 Consumer도 중복을 견뎌야 한다 Outbox만으로: Event 정확히 한 번 전달 을 완전히 보장하지 않는다. Worker가 재실행하면 같은 Event가 다시 Publish될 수 있다. ✅ 27. Outbox는 주로 At-Least-Once Delivery 구조가 된다 즉: Event가 누락되는 것보다 중복 전달될 수 있도록 허용 하고 Consumer가 중복을 방어한다. ✅ 28. 그래서 Outbox와 Inbox가 함께 나온다 Producer는: Outbox 로 Event 누락을 막고, Consumer는: Inbox 로 중복 처리를 막는다. ✅ 29. Inbox Pattern Consumer가 Event를 받으면 바로 Business Logic부터 실행하지 않는다. 먼저: 이 Event를 이미 처리했는가? 를 확인한다. ✅ 30. InboxEvent 예: model InboxEvent { id String @id @default(cuid()) eventId String consumer String eventType String status String receivedAt DateTime @default(now()) processedAt DateTime? errorCode String? @@unique([eventId, consumer]) } ✅ 31. 왜 consumer까지 Unique에 넣는가? 같은 Event라도 여러 Consumer가 각각 처리해야 할 수 있다. 예: ORDER_COMPLETED 를: NotificationConsumer AnalyticsConsumer CRMConsumer 가 각각 처리할 수 있다. 따라서: eventId + consumer 를 기준으로 중복을 막는다. ✅ 32. Consumer 처리 흐름 Event 수신 ↓ Inbox INSERT ↓ 이미 존재? YES → Skip NO → Business Logic ↓ Inbox PROCESSED 이다. ✅ 33. Inbox INSERT와 Business 변경도 Transaction으로 묶는다 예: ORDER_COMPLETED Event ↓ BEGIN Inbox Insert NotificationJob Insert COMMIT 로 처리한다. 그래야: Business 변경은 됐는데 Inbox는 실패 같은 문제가 줄어든다. ✅ 34. 단 외부 API를 Inbox Transaction 안에서 호출하지 않는다 예: BEGIN Inbox Insert Kakao API 호출 30초 대기 COMMIT 같은 구조는 좋지 않다. DB Transaction을 너무 오래 잡기 때문이다. ✅ 35. Inbox Consumer는 또 다른 Job을 만드는 형태가 좋다 예: Event 수신 ↓ Transaction Inbox 기록 NotificationJob 생성 COMMIT 후: Notification Worker ↓ 외부 API 를 호출한다. ✅ 36. Outbox → Inbox 흐름 전체 구조: Producer DB Business Change + Outbox Event ↓ Outbox Publisher ↓ Queue ↓ Consumer ↓ Inbox ↓ Consumer Transaction ↓ Next Job / State Change 이다. ✅ 37. 이 구조의 장점 다음 문제들을 각각 방어한다. DB 성공 + Event 누락 → Outbox Event 중복 전달 → Inbox Consumer Crash → Inbox 상태 + Retry 외부 Side Effect 불명확 → Idempotency + Reconciliation ✅ 38. Outbox와 Idempotency는 다른 역할이다 Outbox: Event를 잃지 않도록 함 Idempotency: 같은 Event/Action이 여러 번 실행돼도 결과가 중복되지 않도록 함 둘 다 필요하다. ✅ 39. Inbox 역시 Business Idempotency를 완전히 대체하지 않는다 예: Event ID는 다르지만 실제 업무는 동일 할 수도 있다. 예: evt_1 ORDER_COMPLETED evt_2 ORDER_COMPLETED 가 실수로 두 번 생성됐다. Inbox는 Event ID가 다르므로 둘 다 처리한다. ✅ 40. Business Idempotency Key 따라서 Consumer Side Effect에도: notification:order_123:completed 같은 업무 기준 Idempotency Key가 필요할 수 있다. ✅ 41. Event 중복과 Business 중복 구분 같은 Event ID 재전달 → Inbox로 차단 서로 다른 Event지만 같은 업무 → Business Idempotency로 차단 이다. ✅ 42. Event ID는 Producer가 생성한다 Event를 처음 만들 때: eventId 를 생성하고 이후 Publish/Retry에서도 유지한다. Retry마다 새로운 Event ID를 만들면 Inbox 중복 방지가 의미가 없어진다. ✅ 43. Attempt ID와 Event ID를 구분한다 eventId 논리적 Event attempt Publish 시도 횟수 이다. ✅ 44. Correlation ID와 Event ID도 다르다 예: Correlation cor_123 Request req_1 Outbox Event evt_1 Notification Event evt_2 여러 Event가 하나의 Correlation 안에 포함될 수 있다. ✅ 45. Causation ID 다음 Event가 어떤 Event 때문에 발생했는지도 기록할 수 있다. 예: ORDER_STATUS_CHANGED evt_1 ↓ NOTIFICATION_REQUESTED evt_2 이면: evt_2.causationId = evt_1 이다. ✅ 46. Event Chain을 추적할 수 있다 HTTP Request req_1 ↓ ORDER_STATUS_CHANGED evt_1 ↓ NOTIFICATION_REQUESTED evt_2 ↓ PROVIDER_RESULT evt_3 전체가: correlationId = cor_1 을 가진다. ✅ 47. Eventual Consistency란? 이 구조를 사용하면 모든 시스템의 상태가 동시에 바뀌지는 않는다. 예: 10:00:00 Order = COMPLETED 10:00:01 NotificationJob 생성 10:00:03 알림톡 Provider 접수 몇 초 동안 상태 차이가 존재한다. ✅ 48. 이것이 Eventual Consistency다 즉: 모든 시스템이 즉시 같은 상태가 되는 것은 아니지만, 시간이 지나면 최종적으로 일관된 상태에 도달한다. ✅ 49. Strong Consistency와 비교 Strong Consistency: Transaction 끝나는 순간 모든 관련 상태가 확정 Eventual Consistency: 핵심 상태 먼저 확정 ↓ 후속 상태가 비동기로 따라옴 이다. ✅ 50. 모든 업무를 Eventual Consistency로 만들 필요는 없다 예: 주문 상태 변경 + Audit Log 가 같은 DB라면 Transaction으로 즉시 일관성을 맞추는 것이 좋다. ✅ 51. Eventual Consistency가 적합한 영역 예: 알림톡 Analytics 검색 인덱스 Notion Report 외부 CRM Webhook 후속 처리 처럼 즉시 동기화될 필요가 없는 기능이다. ✅ 52. 주문 생성과 알림톡을 분리하는 이유 주문 성공 여부가: 알림톡 Provider 상태에 의존하면 안 된다. 좋은 구조: 주문 Transaction COMMIT ↓ Outbox ↓ Notification 이다. Provider 장애가 발생해도 주문은 정상 저장된다. ✅ 53. 이게 장애 격리와도 연결된다 외부 Provider 장애: Notification 영향 은 있지만: Order API 정상 을 유지할 수 있다. 0924의 Bulkhead/Resilience와 연결된다. ✅ 54. Eventual Consistency를 사용자 UI에서 고려해야 한다 예: 주문 상태 완료 인데 바로 아래: 알림톡 상태 대기 중 일 수 있다. 이것은 꼭 오류가 아니다. ✅ 55. UI에서 중간 상태를 표현한다 예: 주문 처리 완료 고객 안내 발송 처리 중 처럼 별도 상태로 보여준다. 모든 상태가 즉시 완료될 것처럼 UI를 만들면 사용자 혼란이 생긴다. ✅ 56. 관리자 화면에서도 상태를 분리한다 예: Order Status COMPLETED Notification PENDING 처럼 본다. ✅ 57. 모든 후속 실패 때문에 원본 상태를 FAILED로 되돌리지 않는다 예: Order COMPLETED Notification FAILED 라고 해서: Order를 WAITING으로 되돌림 은 잘못된 경우가 많다. 후속 기능의 상태를 별도로 관리한다. ✅ 58. Business Source of Truth를 정해야 한다 예: 주문 상태 → orders table 알림톡 발송 상태 → notification_jobs Event 전달 상태 → outbox_events 각 상태의 책임을 명확히 한다. ✅ 59. Event는 Source of Truth가 아닐 수도 있다 현재 구조에서는: Order Table = 현재 업무 상태 Event = 어떤 변화가 발생했는지 전달/기록 정도로 사용하면 충분하다. Event Sourcing까지 갈 필요는 없다. ✅ 60. Outbox Polling 가장 단순한 Outbox Publisher는: 1초마다 PENDING Outbox 조회 한다. 예: SELECT * FROM outbox_events WHERE status = 'PENDING' AND ( next_retry_at IS NULL OR next_retry_at <= now() ) ORDER BY created_at LIMIT 100; 이다. ✅ 61. Polling Interval 너무 짧으면: DB Query 증가 하고, 너무 길면: Event 전달 지연 이 커진다. 현재 규모라면 초 단위 Polling으로도 충분할 수 있다. ✅ 62. Batch Claim 100개 Event를 한 번에 Claim할 수도 있다. 단: 한 Worker가 너무 오래 잠금 을 잡지 않도록 주의한다. ✅ 63. FOR UPDATE SKIP LOCKED PostgreSQL에서는 여러 Worker가 Queue처럼 DB Row를 가져갈 때 활용할 수 있다. 개념적으로: SELECT ... FOR UPDATE SKIP LOCKED 를 사용하면 다른 Worker가 잡은 Row를 건너뛸 수 있다. ✅ 64. 현재 ORM 구조에 맞춰 구현한다 무조건 Raw SQL을 고집할 필요는 없다. 기존 Prisma 구조에서 Atomic Update 방식이 더 이해하기 쉽다면 그 방식을 써도 된다. 핵심은: 동일 Outbox Event를 두 Worker가 동시에 Publish하지 않는 것 이다. ✅ 65. Publish 성공 후 상태 변경 PROCESSING → PUBLISHED 하고: publishedAt 을 기록한다. ✅ 66. Publish 실패 Retryable이면: PENDING 또는 RETRY_PENDING 으로 되돌리고: nextRetryAt 을 지정한다. ✅ 67. 영구 실패 예: Invalid Event Payload Unsupported Event Version 처럼 Retry로 해결되지 않는 경우: DEAD_LETTER 로 보낸다. ✅ 68. Outbox DLQ Outbox 단계에도 DLQ가 필요할 수 있다. 예: evt_123 eventType ORDER_COMPLETED error UNSUPPORTED_EVENT_VERSION attempt 5 status DEAD_LETTER 이다. ✅ 69. Outbox DLQ는 조용히 묻히면 안 된다 중요 Event가 DLQ에 들어갔다는 것은 후속 업무가 누락됐다는 뜻일 수 있다. 예: 주문은 완료 Notification Event는 DLQ 이므로 운영자에게 보여야 한다. ✅ 70. Inbox 처리 실패 Consumer에서도: RECEIVED PROCESSING PROCESSED FAILED DEAD_LETTER 같은 상태가
velog
(출처: arXiv:2609.36136, Figure 1) Xiaomi-OCR-0 Technical Report 저자: Xin Chen, Anan Du, Feng Feng, Pei Fu, Jian Luan, Longwei Xu, Shaojie Zhang, Hang Li, Heng Qu, Cheng Tan (SeerRay Team) 공개일: 2026년 9월 28일 (arXiv v1, cs.CV) arXiv: https://arxiv.org/abs/2609.36136 코드: https://github.com/SeerRay-Lab/Xiaomi-OCR-0 모델: https://huggingface.co/SeerRay-Lab/Xiaomi-OCR-0 (Apache-2.0) 데모: https://huggingface.co/spaces/SeerRay-Lab/Xiaomi-OCR-0 분류: OCR Document Parsing Vision-Language Model Reinforcement Learning 🔖 TL;DR (한눈에) 0.8B 파라미터 단일 모델 로 문서 파싱(레이아웃·텍스트·표·수식 구조화)과 OCR 기반 이해(VQA·핵심정보추출)를 함께 처리한다. 베이스는 Qwen3.5-0.8B-Base. 핵심은 모델이 아니라 데이터 엔진 이다. 8개 전문 OCR 모델의 합의(consensus)로 라벨을 만들고, 합의가 낮은 샘플은 라벨을 다시 이미지로 렌더링해 원본과 눈으로 비교 하는 방식으로 교정해 약 1억 7천만 샘플을 자동 구축했다. 학습은 3단계다. 텍스트를 쓰면서 그 위치까지 같이 맞추게 하는 Q-Mask 텍스트 앵커링 → 지속 사전학습(CPT) → 파싱과 이해를 섞어 돌리는 Mix-RL (검증 가능한 보상 기반 강화학습). OmniDocBench v1.6 96.83 , Real5-OmniDocBench 95.24 , Wild-OmniDocBench 87.94 . OCR VQA 5종 평균 83.2 로, 같은 0.8B 베이스 모델(72.9)보다 +10.3, 8B급 MiniCPM-V-4.5(82.6)보다도 높다. 흥미로운 발견: 이해(understanding) 데이터는 파싱 실력이 어느 정도 올라온 뒤에야 파싱에 도움이 된다. 학습 초기에 섞으면 오히려 파싱 점수가 떨어진다(-0.330). 한 줄 요약 : 0.8B라는 작은 몸집으로 문서 파싱과 문서 이해를 동시에 잡아낸 기술 보고서이며, 그 비결은 "렌더링해서 눈으로 검증하는" 자동 데이터 엔진과 파싱·이해를 함께 돌리는 혼합 강화학습이다. 📄 초록(Abstract) 완역 소형 OCR 전용 비전-언어 모델(VLM)은 강력한 문서 파싱 성능을 보이지만, 값비싼 지도(supervision)에 의존하고 주로 시각-텍스트 재구성에만 초점을 맞추는 경우가 많다. 우리는 문서 파싱과 OCR 중심 이해를 위한 통합 0.8B 모델 Xiaomi-OCR-0를 제안한다. 우리는 전문가 합의(expert consensus), 렌더링 기반 검증(render-based verification), 표적 합성(targeted synthesis)을 결합한 자동 데이터 엔진을 사용해 약 1억 7천만 샘플 규모의 OCR 중심 코퍼스를 구축한다. Qwen3.5-0.8B에서 출발하여, 우리의 점진적 학습 레시피는 Q-Mask 기반 텍스트 앵커링, 지속 사전학습, 그리고 혼합 과제 강화학습(Mix-RL)을 결합한다. Xiaomi-OCR-0는 Real5-OmniDocBench에서 95.24, OmniDocBench v1.6에서 96.83, Wild-OmniDocBench에서 87.94를 달성하며, 5종의 OCR 중심 VQA 벤치마크에서 평균 83.2점에 도달한다. 또한 어블레이션 실험은 파싱 학습이 충분히 이루어진 뒤에는 OCR 중심 이해 지도가 문서 파싱에도 추가적인 이득을 제공함을 보여준다. 초록이 말하는 바는 세 가지다. 첫째, 기존 소형 OCR 모델들은 "이미지의 글자를 다시 텍스트로 옮기는" 재구성 과제에 최적화되어 있고 그 라벨을 얻는 비용이 크다. 둘째, 이 논문은 사람의 라벨링 대신 여러 전문 모델의 합의와 렌더링 기반 자동 검증으로 대규모 코퍼스를 만들고, 위치 정보까지 함께 학습시키는 3단계 레시피로 0.8B 모델을 끌어올렸다. 셋째, 파싱과 이해를 섞어 학습하는 것이 늘 좋은 것은 아니며 순서와 타이밍이 중요하다 는 실험적 관찰을 덧붙인다. 🧩 왜 이 문제가 중요한가 문서를 다루는 실무에서 필요한 작업은 보통 두 갈래로 나뉜다. 하나는 파싱 이다. PDF나 스캔 이미지를 받아 제목·본문·표·수식·읽기 순서를 구조화된 마크업으로 복원하는 일로, RAG 파이프라인의 전처리 단계가 대표적이다. 다른 하나는 이해 다. "이 영수증의 총액은 얼마인가", "이 차트에서 가장 높은 막대는 어느 분기인가"처럼 문서를 읽고 질문에 답하거나 필드를 뽑아내는 일이다. 문제는 이 둘이 보통 다른 모델로 운영된다는 점이다. 파싱은 OCR 전용 소형 모델이, 이해는 범용 VLM이 맡는다. 모델 두 벌을 서빙해야 하고, 파싱 결과가 틀리면 이해 단계가 그 오류를 그대로 물려받는다. 하나의 작은 모델이 두 일을 모두 해내면 서빙 비용과 오류 전파가 동시에 줄어든다. 그런데 통합은 쉽지 않다. 파싱은 이미지를 빠짐없이 글자 단위로 옮기는 정밀한 전사 능력을 요구하고, 이해는 맥락을 잡아 추론하는 의미 파악 능력을 요구한다. 작은 모델에서 두 능력은 제한된 파라미터를 두고 경쟁한다. 게다가 파싱 학습에 필요한 고품질 라벨(표 구조, 수식 LaTeX, 읽기 순서)은 사람이 달기에 가장 비싼 종류의 라벨이다. 이 논문은 라벨 비용 과 능력 경쟁 두 문제를 각각 데이터 엔진과 학습 레시피로 공격한다. 🔬 방법론 1. 데이터 엔진: 합의하고, 렌더링해서 확인하고, 모자란 곳을 합성한다 (출처: arXiv:2609.36136, Figure 2) 약 1억 7천만 샘플의 코퍼스는 모두 이미지 - 지시문 - 응답 형식으로 통일되어 있고, 텍스트·표·수식을 잘라낸 영역 단위(region-level) 샘플과 전체 문서를 다루는 페이지 단위(page-level) 샘플로 구성된다. 이 코퍼스를 만드는 장치가 세 부분이다. (a) 앙상블 삼중 합의 (Ensemble Triplet Consensus) 서로 계보가 다른 8개의 공개 OCR 전문 모델 — PaddleOCR-VL-1.6, MinerU2.5-Pro, GLM-OCR, dots.ocr, HunyuanOCR-1.5, TeleOCR, OvisOCR2, Qianfan-OCR — 이 같은 영역을 각자 읽는다. 그 다음 절차는 이렇다. 각 전문가 $i$의 평균 일치도를 구한다: $C_i = \frac{1}{N-1}\sum_{j \neq i} S(y_i, y_j)$ 점수가 높은 상위 3개 전문가 만 골라 삼중 조합 $T^*$를 만든다 그 삼중 조합 내부의 일치도 $a(x)$를 계산한다 최종 의사 라벨은 삼중 조합의 메도이드 , 즉 나머지 둘과 가장 많이 일치하는 예측으로 정한다 여기서 유사도 $S$는 모달리티마다 다르게 쓴다. 텍스트는 $1-\text{NED}$(정규화 편집거리의 보수), 표는 TEDS, 수식은 CDM이다. 직관은 단순하다. 서로 다른 구조의 모델 여러 개가 같은 답을 내놓으면 그 답은 믿을 만하고, 제각각이면 그 영역은 어렵다는 신호다. 그래서 일치도 구간별로 처리를 갈라 놓는다: 0.9 이상은 그대로 채택 , 0.6~0.9는 렌더링 기반 교정으로 보냄 , 0.6 미만은 교정 또는 사람 검수 . (b) 렌더링 기반 교정-판정 (Render-Guided Refine-and-Judge) 이 논문에서 가장 재미있는 장치다. 교정 담당은 전문가 풀에 의도적으로 포함시키지 않은 별도의 큰 모델 Qwen3.5-122B다. 상위 2개 전문가의 예측을 초기값으로 받아 최대 3라운드 동안 다음을 반복한다. 현재 후보 라벨 $\hat{y}^{(t)}$를 다시 이미지로 렌더링 해($r^{(t)} = R(\hat{y}^{(t)})$) 원본 이미지 조각과 나란히 놓고 비교한 뒤, 수정 제안 $\delta^{(t)}$를 받는다. 렌더링 대상 포맷은 텍스트와 표는 HTML, 수식은 LaTeX다. 3라운드로도 결론이 안 나면, 그간의 검증 기록 $H$ 전체를 보여주고 "반복적으로 틀리는 지점이 무엇인가"를 묻는 2차 비평 단계로 넘긴다. 교정된 후보는 다시 전문가 풀로 돌아가 재합의를 거치고 , 거기서 높은 일치도를 받은 것만 최종 코퍼스에 들어간다. 왜 렌더링인가. 표의 셀 병합이 틀렸거나 수식의 괄호 범위가 어긋난 오류는 HTML/LaTeX 문자열만 들여다봐서는 잡기 어렵지만, 그려서 원본과 겹쳐 보면 눈에 띈다 . 사람이 조판 교정을 볼 때 하는 일을 그대로 자동화한 셈이다. (c) 다요인 샘플 마이닝과 표적 합성 샘플마다 세 가지 신호를 기록한다. 전문가 일치도 $a_i$, 모델이 같은 입력을 여러 번 풀었을 때의 자기 일관성 $u_i$, 그리고 Qwen3-VL-Embedding 특징을 K-Means로 묶은 의미 클러스터 $k(i)$다. 샘플링 확률은 $$P(i|k) \propto (a_i + \epsilon)^{f_a/\tau} \cdot (1 - u_i + \epsilon)^{f_u/\tau}$$ 로 두어, 라벨은 믿을 만하지만($a_i$ 높음) 모델이 흔들리는($u_i$ 낮은 일관성) 구간을 하드 샘플 로 집중 수집한다. 학습/검증 분할은 출처 문서 단위 로 나누고, 검증 분할은 합성 데이터의 입력에서 완전히 배제해 누수를 막았다 — 기술 보고서치고 꼼꼼한 부분이다. 합성은 두 방향이다. 커버리지 기반 합성 은 샘플이 적은 클러스터를 겨냥해 긴 표, 복잡한 헤더, 병합 셀 템플릿과 저자원 문자·폰트·배경을 변형해 채운다. 실패 기반 합성 은 하드 검증셋에서 실제로 틀린 사례를 진단하고, 그 난이도를 유지한 채 템플릿·폰트·레이아웃·열화 조건만 바꿔 증식한다. 그렇게 만든 합성 데이터를 기존 학습 데이터에 섞어 고정된 하드 검증셋 으로 재평가한 뒤, 효과가 있을 때만 레시피를 채택한다. 2. 점진적 학습 레시피 (출처: arXiv:2609.36136, Figure 3) 1단계 — Q-Mask 텍스트 앵커링. VLM 위에 질의 조건부 마스크 디코더 를 하나 더 얹어, 모델이 텍스트를 토큰으로 생성하는 동시에 그 텍스트가 이미지의 어디에 있는지를 가리키는 마스크 까지 예측하게 한다. 손실은 $$\mathcal{L} {SSA} = \lambda {txt} \cdot \mathcal{L} {NTP} + \lambda {seg} \cdot (\mathcal{L} {Dice} + \mathcal{L} {CE})$$ 로, 일반적인 다음 토큰 예측 손실에 마스크에 대한 Dice 손실과 픽셀별 교차엔트로피가 더해진다. 효과는 분명하다. 글자를 받아쓰면서 그 위치를 함께 짚어야 하므로, 전체 페이지 파싱을 배우기 전에 내용과 좌표 사이의 정렬이 먼저 몸에 익는다. 이 단계에는 TextAnchor-26M과, 기존 문서 파싱 샘플을 같은 Q-Mask 형식으로 변환한 데이터를 쓴다. 2단계 — 지속 사전학습(CPT). 마스크 디코더는 떼어내고 비전-언어 백본만 이어받는다. 손실은 다음 토큰 예측에 베이스 모델이 이미 갖고 있는 다중 토큰 예측(MTP) 헤드 를 함께 학습시키는 항을 더한 형태다. $$\mathcal{L} {CPT}(\theta) = -\mathbb{E}\Big[\sum_t \log \pi_\theta(y_t \mid y {<t}, I, c)\Big] + \lambda_{MTP}\mathcal{L}_{MTP}(\theta)$$ 코퍼스는 문서 파싱을 주축으로 하되 OCR 기반 이해, OCR 캡셔닝, 장면 텍스트·손글씨·서예, 그리고 화학식·차트 같은 롱테일 과제를 섞는다. 모델 카드 기준으로 이 단계는 파싱 데이터의 9% → 29% → 50%를 쓰는 3개 하위 단계로 나뉘며, 뒤에 나오는 "초기/중기/후기" 전이 분석이 바로 이 구간에 대응한다. 3단계 — Mix-RL. GRPO 위에 DAPO 계열 의 기법을 얹은 정책 최적화다. 토큰 단위 손실 집계, clip-higher, 동적 샘플링을 쓰고, 참조 정책에 대한 명시적 KL 페널티는 두지 않는다 . 보상 분산이 0인 롤아웃 그룹은 버린다. $$\mathcal{L} {GRPO}(\theta) = \mathbb{E}\Big[\frac{1}{\sum_i |o_i|}\sum_i \sum_t \min\big(r {i,t}(\theta)\hat{A} i,\ \text{clip}(r {i,t}(\theta), 1-\epsilon_{low}, 1+\epsilon_{high})\hat{A}_i\big)\Big]$$ 이름의 "Mix"는 문서 파싱(텍스트·표·수식·전체 페이지)과 OCR 이해(VQA·KIE)를 한 번에 섞어 돌린다 는 뜻이다. 보상은 전부 검증 가능한 규칙 기반 이고 학습된 리워드 모델을 쓰지 않는다. 과제 보상 신호 텍스트 파싱 편집 유사도(edit similarity) 표 파싱 TEDS 수식 파싱 CDM 전체 페이지 파싱 $R_{doc} = w_{text}s_{text} + w_{table}s_{table} + w_{formula}s_{formula}$ (가중치는 정답 내 문자 비중) VQA ANLS KIE JSON 유효성 → 필드 매칭 → 필드 값의 정규화 편집 유사도 (누락 필드는 0점) 파싱 불가·형식 오류·길이 초과 출력은 일괄 0점 이다. RL 프롬프트는 2절의 하드 샘플 마이닝 결과를 다시 필터링하고 더 큰 언어모델과 사람이 검수해 만들었다. 비교군으로 등장하는 MOPD 는 multi-teacher on-policy distillation, 즉 파싱 교사와 이해 교사(각 4B) 두 명을 두고 증류하는 방식이다. 저자들은 Mix-RL을 이 MOPD와 나란히 놓고 비교한다. 📊 실험 결과 문서 파싱 모델 크기 OmniDocBench v1.6 ↑ Real5 ↑ Wild ↑ Xiaomi-OCR-0 0.8B 96.83 95.24 87.94 TeleOCR 1.2B 96.87 — 88.53 OvisOCR2 0.8B 96.58 92.29 87.91 PaddleOCR-VL-1.6 0.9B 96.33 93.19 87.36 MinerU2.5-Pro 1.2B 95.75 88.94 87.33 GLM-OCR 0.9B 95.22 90.32 85.08 표를 과장 없이 읽으면 이렇다. 표준 벤치마크인 OmniDocBench v1.6(96.83)과 야외 문서인 Wild(87.94)에서는 1.2B인 TeleOCR이 각각 96.87, 88.53으로 오히려 앞선다. Xiaomi-OCR-0의 분명한 우위는 Real5-OmniDocBench의 95.24 로, 차순위 PaddleOCR-VL-1.6(93.19)보다 +2.05 다. Real5는 촬영·재스캔 같은 실제 획득 조건에서의 강건성을 보는 벤치마크이므로, 이 격차가 가장 실무적인 의미를 갖는 숫자다. 즉 "모든 지표 1위"가 아니라 0.8B라는 크기에서 획득 강건성을 크게 끌어올린 모델 로 보는 편이 정확하다. 한편 논문의 Table 1은 소형 OCR 전용 모델뿐 아니라 범용 대형 VLM도 비교군에 올려두는데, 확인된 행만 보면 Ovis2.6-30B-A3B가 93.70, Gemini 3 Pro가 92.91이다. 문서 파싱이라는 좁은 과제에서는 0.8B가 30B급과 프런티어 API 모델을 앞설 수 있다 는 익숙한 그림이 여기서도 반복된다. OCR 기반 이해 (VQA 5종) 모델 크기 DocVQA InfoVQA ChartQA OCRBench TextVQA 평균 Xiaomi-OCR-0 0.8B 93.1 75.1 84.6 84.6 78.6 83.2 Qwen3.5-0.8B 0.8B 88.5 60.3 69.5 77.9 68.3 72.9 Qwen3.5-2B 2B 92.4 72.4 77.0 85.9 76.9 80.9 Qwen3.5-4B 4B 94.4 80.4 82.4 86.6 80.8 84.9 MiniCPM-V-4.5 8B 84.9 69.6 87.4 89.0 82.2 82.6 여기가 이 논문의 가장 설득력 있는 구간이다. 같은 베이스인 Qwen3.5-0.8B의 평균 72.9에서 83.2로 +10.3 이 올랐고, 2.5배 큰 Qwen3.5-2B(80.9)와 10배 큰 MiniCPM-V-4.5(82.6)를 모두 넘었다. 4B 모델(84.9)에는 1.7점 뒤지지만 파라미터는 1/5이다. 벤치마크별로는 DocVQA가 93.1로 가장 강하고, ChartQA·OCRBench·TextVQA에서는 8B 모델이 여전히 우위다. 문서 중심 과제에 특화된 향상이라는 뜻이다. 어블레이션: CPT → MOPD → Mix-RL 파싱(OmniDocBench v1.6): 설정 Overall ↑ Text Edit ↓ Formula CDM ↑ Table TEDS ↑ Table TEDS-S ↑ Reading Order Edit ↓ 4B 파싱 교사 96.9745 0.0308 98.4102 95.5932 97.5050 0.1228 0.8B CPT 96.4739 0.0332 98.3444 94.3973 96.6835 0.1221 0.8B MOPD 96.7417 0.0314 98.4677 94.8975 97.1579 0.1223 0.8B Mix-RL 96.8277 0.0313 98.5044 95.1087 97.1929 0.1221 이해(VQA 5종): 설정 Overall ↑ DocVQA InfoVQA ChartQA OCRBench TextVQA 4B VQA 교사 88.1 95.9 84.4 87.1 88.3 84.8 0.8B CPT 78.1 92.2 72.5 83.4 80.6 62.0 0.8B MOPD 82.7 93.1 74.8 84.2 83.9 77.5 0.8B Mix-RL 83.2 93.1 75.1 84.6 84.6 78.6 0.8B Mix-RL 행의 96.8277이 초록의 96.83과 맞아떨어진다. 즉 출시된 Xiaomi-OCR-0가 곧 0.8B Mix-RL 설정 이다. 두 표에서 읽히는 것은 세 가지다. 첫째, 파싱에서 Mix-RL은 CPT(96.47) → MOPD(96.74) → Mix-RL(96.83)로 올라가며 4B 교사(96.97)와의 격차를 0.15로 좁힌다. 파싱은 작은 모델로도 교사를 거의 따라잡을 수 있는 과제라는 뜻이다. 둘째, 이해에서는 78.1 → 82.7 → 83.2로 +5.1 이 오르는데, 특히 TextVQA가 62.0 → 77.5 → 78.6으로 +16.6 이라는 가장 큰 폭의 개선을 보인다. 다만 4B 교사(88.1)와는 여전히 4.9점 차이가 남는다. 셋째, 그래서 저자들의 결론이 나온다. 파싱은 0.8B로 충분하지만 이해는 파라미터를 더 요구한다. 0.8B → 4B로 키우면 VQA는 약 4.9점 오르는데 파싱은 0.15점밖에 오르지 않는다. 전이의 타이밍 가장 인용할 만한 분석 결과는 이해 데이터를 언제 섞느냐에 따라 파싱 점수의 변화 방향이 바뀐다는 것이다. 이해 지도를 추가한 시점 파싱 점수 변화 CPT 초기 -0.330 CPT 중기 +0.639 CPT 후기 +0.0749 초기에는 해가 되고, 중기에 가장 크게 도움이 되고, 후기에는 효과가 작아진다. 멀티태스크 학습을 "데이터를 다 섞으면 좋다"로 접근하는 관행에 대한 구체적인 반례다. 학습 동역학 측면에서는 MOPD가 더 적은 연산으로 빠르게 수렴하는 반면, Mix-RL은 학습을 길게 가져갈 때 두 능력 모두에서 더 높은 정점에 도달한다고 보고한다. 🚧 한계 이 논문은 산업계 기술 보고서 형식이라 독립된 "Limitations" 절을 두지 않는다. 아래는 본문 분석에서 저자들이 스스로 드러낸 제약과, 리뷰어로서 짚고 싶은 부분이다. 이해 능력의 파라미터 천장. 저자들이 직접 보여준 대로 0.8B는 4B 이해 교사에 4.9점 뒤진다. 차트 추론처럼 추론 깊이가 필요한 과제라면 이 격차가 실사용에서 체감될 수 있다. 과제 혼합의 민감성. 이해 데이터의 전이 효과가 -0.330에서 +0.639까지 흔들린다는 것은, 이 레시피를 다른 도메인에 옮길 때 혼합 비율과 타이밍을 다시 찾아야 한다 는 뜻이기도 하다. 재현 비용이 낮지 않다. 데이터 엔진이 교사 모델 풀에 의존한다. 의사 라벨의 상한은 결국 8개 전문 모델이 공통으로 잘하는 범위에 묶인다. 공개 OCR 모델들이 모두 약한 영역(희귀 문자 체계, 특수 도메인 조판)에서는 합의가 곧 공통된 오류일 수 있고, 렌더링 검증도 렌더러가 표현할 수 있는 것만 검증한다. 벤치마크 1위가 아
velog
GPT-6.1 Sol이 일주일 만에 나왔다 — 6.0은 왜 이렇게 빨리 교체됐을까 성능은 Astra에 가까워졌지만, 5.6보다 느리다는 말이 나오는 이유 2026년 9월 22일 OpenAI가 GPT-6 Sol을 공개했습니다. 그리고 불과 7일 뒤인 9월 29일 GPT-6.1 Sol 이 나왔습니다. 보통 모델 세대에서 6.0 → 6.1 이 일주일 만에 넘어가는 경우는 흔하지 않습니다. 더구나 OpenAI도 6.1을 단순한 작은 수정이 아니라 GPT-6 Sol의 큰 업그레이드 라고 표현했습니다. Coding, Computer Use, 전문 업무 전반에서 성능이 크게 올라갔고, 여러 평가에서는 Astra에 상당히 가까워졌습니다. 그런데 실제 Codex 사용자 반응을 보면 조금 복잡합니다. 성능은 확실히 좋아졌다. 6.0보다 훨씬 낫다. 그런데... 느리다. 생각하는 시간이 길다. 5.6 Sol이 오히려 편한 작업도 있다. 라는 평가가 동시에 나오고 있습니다. 그래서 이번 6.1은 단순히: GPT-6 Sol보다 좋은 모델이 나왔다. 로 끝낼 모델은 아닙니다. 성능, Token 비용, 실제 Token 사용량, 그리고 작업 시간은 서로 따로 봐야 합니다. 1. GPT-6 Sol은 나온 지 일주일 만에 6.1이 됐다 날짜를 놓고 보면 상당히 빠릅니다. 2026.09.22 GPT-6 Sol GPT-6 Luna ↓ 7일 ↓ 2026.09.29 GPT-6.1 Sol GPT-6 Sol 자체도 작은 모델은 아니었습니다. OpenAI는 당시 GPT-6 Astra에서 사용한 Training과 Alignment 개선을 보다 빠르고 저렴한 모델로 가져온 것이 Sol이라고 설명했습니다. 가격도 GPT-5.6 Sol 대비 절반 수준으로 낮췄습니다. 그런데 일주일 만에 다시: GPT-6 Sol ↓ GPT-6.1 Sol 이 등장했습니다. 2. 6.1이 빨리 나온 정확한 이유를 OpenAI가 밝힌 것은 아니다 여기서는 구분할 필요가 있습니다. OpenAI가: GPT-6 Sol에 문제가 많아서 일주일 만에 6.1을 만들었다. 라고 발표한 적은 없습니다. 따라서 이걸 사실처럼 말하면 안 됩니다. 공식적으로 확인되는 건: 6.1은 GPT-6 Sol의 큰 업그레이드 Coding 크게 개선 Computer Use 개선 전문 업무 개선 Instruction / Alignment 개선 비용 효율 개선 정도입니다. 하지만 출시 직후 상황을 보면 6.0에 손볼 곳이 적지 않았다는 사실도 보입니다. GPT-6 Sol에서는 실제 문제가 있었다 3. 출시 사흘 뒤 Image Understanding 버그가 수정됐다 GPT-6 Sol 출시일은 9월 22일입니다. 그런데 9월 25일 OpenAI Release Note에 이런 수정이 올라왔습니다. GPT-6 Sol과 Luna의 Image Encoding 문제 때문에 이미지 이해 성능이 떨어지는 버그가 있었고 이를 수정했다 는 내용입니다. Codex와 Computer Use의 Visual Task에도 영향을 줬습니다. 즉 적어도 이 부분은 사용자 추측이 아니라 공식 확인된 문제입니다. GPT-6 Sol 출시 ↓ Image Encoding 문제 ↓ Visual Understanding 저하 ↓ 3일 뒤 수정 Computer Use를 중요하게 내세운 GPT-6 모델에서 꽤 민감한 문제였습니다. 4. Coding 쪽에서는 다른 불만도 빠르게 나오기 시작했다 이쪽은 공식적으로 확인된 버그와는 다릅니다. OpenAI Developer Community와 Codex 사용자 커뮤니티에서는 출시 직후 다음과 같은 경험담이 올라왔습니다. 간단한 작업이 너무 오래 걸린다. 계획만 세우다 시간이 많이 지나간다. 지시 범위를 벗어난다. 명확한 요청을 놓치는 경우가 있다. 5.6 Sol보다 작업이 답답하다. OpenAI Developer Community에는 평소 몇 분 걸리던 작업이 수십 분에서 한 시간 이상 걸렸다는 사례도 올라왔습니다. 한 사용자는 GPT-6 Sol 작업이 평소보다 10~20배 길어졌다고 보고했습니다. Reddit에서도 동일한 작업을 GPT-6 Sol과 5.6 Sol에 각각 맡겼을 때 5.6이 훨씬 빨리 진행됐다는 경험담들이 나왔습니다. 다만 이런 자료는 통제된 Benchmark가 아니라 사용자 경험이라는 점은 반드시 감안해야 합니다. 5. 그런데 공식 Benchmark에서 GPT-6 Sol은 5.6보다 좋았다 재미있는 부분입니다. OpenAI가 발표한 평가에서는 GPT-6 Sol이 GPT-5.6 Sol보다 분명히 좋아졌습니다. 특히 실제 Repository에서: 코드 수정 Test 품질 수정 범위 Coding Style Repository 규칙 준수 까지 평가하는 FrontierCode에서 개선됐습니다. 게다가 API 가격은: GPT-5.6 Sol Input $4 Output $20 ↓ GPT-6 Sol Input $2 Output $10 으로 절반이 됐습니다. 즉 공식적으로 보면: 성능 ↑ 가격 ↓ 였습니다. 그런데 실사용에서는: 작업 시간 ↑ ? 생각하는 시간 ↑ ? 체감 집중력 ↓ ? 이라는 불만이 일부 나온 겁니다. 이게 이번 모델을 이해할 때 중요한 부분입니다. 6. 그리고 6.1에서 성능이 다시 크게 뛰었다 GPT-6.1 Sol은 단순히 6.0의 작은 Patch가 아닙니다. OpenAI의 공식 평가를 보면 차이가 상당합니다. DeepSWE v1.1에서는 GPT-6 Sol의 최고 점수를 6.4%포인트 넘으면서도 더 낮은 Reasoning Effort와 비용 을 사용했습니다. AutomationBench에서도 같은 Reasoning 설정의 GPT-6 Sol보다: +4.8%p 높았습니다. Computer Use를 평가하는 OSWorld 2.0에서는 최대 Reasoning 설정 기준: GPT-6 Sol 대비 +7%p 올라갔습니다. Terminal-Bench Science에서는 6.0의 점수를 2배 이상 으로 끌어올리면서 작업당 비용은 절반 이하였습니다. 일주일 차이 모델치고 변화 폭이 꽤 큽니다. 7. 그래서 이름도 단순 GPT-6 Sol Refresh가 아니라 6.1이다 결과적으로: GPT-6 Sol → 저렴한 GPT-6 GPT-6.1 Sol → Astra에 가까운 실전 고성능 모델 로 성격이 조금 달라졌습니다. OpenAI도 6.1을: Near-Astra performance 라고 표현합니다. 1.05M Context와 128K 최대 Output은 그대로지만 모델의 실제 문제 해결 능력이 Astra 쪽으로 이동했습니다. 8. 특히 Coding에서 Astra와 상당히 가까워졌다 OpenAI가 6.1에서 가장 강조하는 영역도 Agentic Coding입니다. DeepSWE에서는 GPT-6.1 Sol이 약 5분의 1 비용으로 Astra와 비슷한 수준 까지 올라왔습니다. 구조적으로 보면: GPT-6 Astra 가장 높은 성능 가장 어려운 문제 ↓ GPT-6.1 Sol Astra에 가까운 성능 훨씬 낮은 비용 ↓ GPT-6 Luna 대량 작업 낮은 비용 이 훨씬 명확해졌습니다. 9. Computer Use도 6.1의 큰 변화다 Coding만 좋아진 것도 아닙니다. OSWorld에서 6.1은 6.0보다 크게 향상됐고, 최대 Reasoning에서는 Astra와의 차이가 2.1%포인트까지 줄었습니다. 그런데 작업당 비용은 Astra의 약 7분의 1 수준이었습니다. 그래서 6.1의 용도는: 코드 작성 Browser 사용 GUI 조작 문서 처리 Business Workflow Agent 작업 을 묶어서 오래 수행하는 쪽에 가깝습니다. 10. Multi-Agent도 6.1부터 붙었다 GPT-6.1 Sol에는 또 하나 중요한 변화가 있습니다. Responses API에서 Multi-agent Beta 를 지원합니다. Root Agent가 작업을 나눠 Subagent에게 넘길 수 있습니다. 예를 들어: GPT-6.1 Sol │ ┌───────┼───────┐ ↓ ↓ ↓ Agent Agent Agent 탐색 구현 Test 같은 구조가 가능합니다. 단순 모델 성능 향상보다 Agent Runtime에서 쓰기 위한 변화가 더 많아지고 있습니다. 그런데 여기서 문제가 하나 있다 11. 6.1도 여전히 느리다는 이야기가 많다 GPT-6.1이 나온 뒤 첫 반응 중 가장 많이 보이는 말 중 하나가: 좋긴 좋은데 정말 느리다. 입니다. 현재 Codex 커뮤니티에서는: 6.0보다는 훨씬 좋다. 결과물도 괜찮다. 사용 한도도 적게 줄어드는 것 같다. 그런데 작업 시간이 너무 길다. 는 경험담이 반복적으로 나오고 있습니다. 일부 사용자는 5.6 Sol보다 Token 생성 속도가 체감상 2~3배 느리다고 측정했고, 긴 Coding 작업에서 몇 분간 눈에 띄는 진행이 없는 경우도 보고하고 있습니다. 이는 서버 부하나 계정·처리 Tier에 따라 달라질 수 있는 커뮤니티 측정값이지 공식 성능 수치는 아닙니다. 12. 이건 ‘Token이 싸다’와 전혀 다른 문제다 AI 비용 이야기를 할 때 세 가지를 구분해야 합니다. Token 가격 Token 사용량 Wall-clock Time 입니다. 셋은 같은 개념이 아닙니다. 예를 들어: 모델 A 10,000 tokens 30초 $1 모델 B 8,000 tokens 3분 $0.50 이라면 모델 B는: Token 효율 ↑ 가격 효율 ↑ 일 수 있지만, 시간 효율 ↓ 입니다. 현재 GPT-6.1 Sol에서 보이는 현상도 이 구분으로 보는 게 좋습니다. 13. API 가격만 보면 6.1은 5.6보다 훨씬 싸다 현재 표준 짧은 Context 기준 가격을 보면: GPT-5.6 Sol GPT-6.1 Sol Input $4 $2 Cached Input $0.40 $0.10 Cache Write $5 $2.50 Output $20 $10 100만 Token 기준입니다. GPT-5.6 Sol의 현재 가격은 프로모션 가격이고, OpenAI는 최소 2026년 11월 21일까지 이를 유지한다고 안내하고 있습니다. 단가만 보면: Input 50% 감소 Output 50% 감소 Cache Read 75% 감소 입니다. 특히 Cache는 차이가 큽니다. 14. Repository를 계속 읽는 Agent라면 Cache 차이가 상당하다 Coding Agent는 매 요청마다 완전히 새로운 Context만 처리하지 않습니다. 계속 반복되는 내용이 많습니다. System Prompt AGENTS.md Tool Schema Repository Context Architecture 문서 이전 작업 내용 이런 부분이 Cache에 들어가면: GPT-5.6 Sol $0.40 ↓ GPT-6.1 Sol $0.10 입니다. Agent가 오래 실행될수록 이 차이는 꽤 커집니다. 6.1이 비용 기준으로 효율이 좋다 고 OpenAI가 강조하는 이유 중 하나입니다. 15. 그런데 Token을 실제로 덜 쓰는지는 별개의 문제다 여기서는 주의해야 합니다. OpenAI는: GPT-6.1 Sol은 항상 GPT-5.6 Sol보다 몇 퍼센트 적은 Token을 사용한다. 같은 일반적인 수치를 공개하지 않았습니다. 작업마다 완전히 다릅니다. 오히려 복잡한 Agent 작업에서는: 더 긴 Reasoning 더 많은 탐색 더 많은 Tool Call 더 긴 작업 지속시간 이 생길 수도 있습니다. 따라서: 6.1이 싸다 = 무조건 Token을 적게 쓴다 는 아닙니다. 16. 특히 Reasoning 설정에서 5.6과 중요한 차이가 있다 GPT-5.6 Sol은: none low medium high xhigh max 를 지원합니다. 반면 GPT-6.1 Sol은: low medium high xhigh max 이고, none 과 minimal 을 지원하지 않습니다. 이건 작은 차이처럼 보이지만 일상 Coding에서는 꽤 중요할 수 있습니다. 17. 5.6은 아예 ‘생각하지 말고 빨리 실행’이 가능하다 예를 들어 작업이: 버튼 이름 변경 문자열 수정 간단한 View 추가 정해진 Pattern대로 파일 생성 처럼 명확하다면 긴 Reasoning이 필요하지 않습니다. GPT-5.6 Sol은: reasoning.effort = none 으로 이런 작업을 처리할 수 있습니다. 하지만 6.1은 최소가: low 입니다. 따라서 구조적으로도 6.1은 어느 정도 Reasoning을 항상 수행하는 모델 에 가깝습니다. 단순한 작업에서 5.6이 더 빠르고 가볍게 느껴질 수 있는 이유 중 하나로 볼 수 있습니다. 이건 OpenAI가 공식적으로 “5.6이 더 빠른 이유”라고 설명한 것은 아니지만, 두 모델의 설정 차이에서 자연스럽게 예상할 수 있는 부분입니다. 18. Medium이 기본이라는 것도 중요하다 GPT-6.1 Sol의 기본 Reasoning Effort는: medium 입니다. Coding 작업에서 아무 설정 없이 실행하면 어느 정도의 Reasoning이 기본적으로 들어갑니다. 그리고: high xhigh max 로 올릴수록 일반적으로 더 오래 생각하고 더 많은 Reasoning Token을 사용할 가능성이 높아집니다. 그래서 단순한 Coding 작업까지 무조건: 6.1 Sol Max 로 돌리는 건 좋은 사용법이라고 보기 어렵습니다. 19. 6.1은 ‘빠르게 대답하는 모델’보다 ‘끝까지 해결하는 모델’에 가깝다 GPT-5.6 Sol을 사용할 때 만족도가 높았던 작업 중에는 이런 것이 많습니다. 정확하게 요청한 것만 수정 빠르게 코드 작성 짧은 반복 작업 즉각적인 피드백 반면 6.1이 목표로 하는 영역은 조금 다릅니다. 복잡한 Repository 긴 Coding 작업 Computer Use 여러 Tool 사용 전문 업무 Multi-Agent Long-horizon Workflow 입니다. 따라서 사용 경험 자체도 달라질 수밖에 없습니다. 20. 문제는 개발자는 Benchmark보다 기다리는 시간을 먼저 느낀다는 것 공식 Benchmark에서: +6.4%p +7%p 2배 이상 같은 개선이 있어도, 개발자가 실제로 보는 화면이: Thinking... Thinking... Tool... Thinking... 이라면 체감은 좋지 않을 수 있습니다. 특히 Coding은 대화형 작업입니다. 수정 ↓ 확인 ↓ 추가 요청 ↓ 수정 ↓ Build 을 반복합니다. 한 번의 결과가 조금 더 정확해도 매번 기다리는 시간이 길어진다면 생산성이 반드시 좋아지는 건 아닙니다. 21. 그래서 ‘효율’을 하나의 숫자로 보면 안 된다 GPT-6.1 Sol과 GPT-5.6 Sol을 비교하면 이렇게 보는 게 훨씬 정확합니다. 기준 GPT-5.6 Sol GPT-6.1 Sol API Token 단가 높음 낮음 Cache 비용 높음 매우 낮음 복잡한 Agent 성능 좋음 더 강함 Astra 근접 성능 낮음 높음 reasoning:none 가능 불가 짧은 수정 체감 유리할 수 있음 Reasoning Overhead 가능 긴 복잡한 작업 좋음 유리 현재 체감 속도 빠르다는 사용자 많음 느리다는 보고 많음 마지막 줄은 공식 Benchmark가 아니라 현재 사용자 경험을 정리한 것입니다. 22. 재미있는 건 ‘느린데 사용량은 잘 안 줄어든다’는 반응도 많다는 것 6.1 사용자 반응은 조금 이상하게 갈립니다. 한쪽에서는: 너무 느리다. 한 작업에 너무 오래 걸린다. 라고 하고, 다른 쪽에서는: 몇 시간 사용했는데 Weekly Usage가 거의 안 줄었다. 라고 합니다. 이 두 이야기는 동시에 사실일 수 있습니다. 왜냐하면: 사용 한도 소모 ≠ 실제 작업 시간 이기 때문입니다. 구독 서비스의 Usage Meter 역시 단순 Raw Token 숫자만 보여주는 지표라고 볼 수 없습니다. 23. 그래서 ‘6.1은 Token을 적게 쓴다’고 단정하는 것도 아직 이르다 지금 커뮤니티를 보면: 사용량이 거의 안 줄었다 는 사람도 있고, 긴 작업 하나에 사용량이 크게 줄었다 는 사람도 있습니다. Processing Tier, Effort, Context 크기, Tool 사용량, 작업 종류에 따라 결과가 크게 달라집니다. 따라서 지금 시점에서 가장 안전한 표현은: 6.1은 API 단가와 공식 작업당 비용은 매우 낮아졌지만, 실제 Token 소비량과 구독 사용량은 작업마다 크게 달라진다. 입니다. 24. 반대로 OpenAI의 공식 ‘작업당 비용’ 결과는 상당히 좋다 단순 Token 가격 말고 실제 Benchmark 작업 하나를 끝내는 비용을 보면 6.1이 상당히 강합니다. Terminal-Bench Science 최대 Effort에서 OpenAI가 발표한 평균 작업 비용은: GPT-6.1 Sol $5.47 였습니다. 비교 대상으로 제시된: Claude Opus 5.5 $23.21 GPT-6 Astra $23.80 보다 75% 이상 낮았습니다. 즉 복잡한 작업에서는 오래 생각하더라도 문제를 실제로 해결하는 데 들어가는 금액은 낮을 수 있습니다. 25. 그래서 Token Efficiency와 Time Efficiency를 나눠서 봐야 한다 정리하면 이렇습니다. 비용 효율 6.1 Sol ★★★★★ API 가격과 Cache는 확실히 좋아졌습니다. 복잡한 문제 해결 효율 6.1 Sol ★★★★★ 공식 Benchmark에서는 6.0과 5.6보다 확실히 강합니다. 짧은 작업의 반응 속도 5.6 Sol이 더 편한 경우가 있음 특히 빠르게 수정하고 결과를 보는 작업입니다. 긴 Agent 작업 6.1 Sol이 더 적합 한 번 맡긴 뒤 오래 실행시키는 작업입니다. 26. 5.6이 아직도 좋은 이유도 여기에 있다 새 모델이 나왔다고 5.6 Sol의 장점이 갑자기 없어지는 건 아닙니다. 5.6은 꽤 오랫동안 실제 개발자 Workflow에서 다듬어졌습니다. 그리고 사용 방식도 단순합니다. 요청 ↓ 빠르게 이해 ↓ 수정 ↓ 결과 특히 사용자가 원하는 범위가 명확할 때 좋은 경험을 주는 경우가 많습니다. 현재 커뮤니티에서도: 6.1의 결과는 좋지만 빠른 반복 작업은 5.6이 더 편하다. 는 반응을 쉽게 볼 수 있습니다. 27. 그렇다고 5.6이 더 좋은 모델이라고 볼 수도 없다 반대도 마찬가지입니다. 공식 평가에서는 6.1이: Agentic Coding Computer Use 전문 문서 Business Workflow 과학 작업 Alignment 대부분에서 6.0을 크게 앞서고 Astra에 접근합니다. 보안 평가에서도 일부 항목은 5.6보다 크게 향상됐고, Chain-of-Thought 제어 능력 역시 5.6보다 높아졌습니다. 따라서: 5.6 → 빠른 반복에 좋은 모델 6.1 → 더 큰 일을 해결하는 모델 정도로 보는 게 지금은 가장 자연스럽습니다. 28. 실제 Codex에서는 작업에 따라 나눠 쓰는 게 좋다 예를 들어 이런 작업이라면 5.6이 여전히 편할 수 있습니다. 간단한 UI 수정 이름 변경 작은 Bug Fix 정해진 Pattern 반복 짧은 Refactoring 빠른 질문 / 확인 반면 6.1은 이런 작업에서 매력적입니다. Architecture를 이해해야 하는 수정 복잡한 Bug 추적 대규모 Refactoring Repository 전체 탐색 Computer Use 여러 Tool을 사용하는 작업 오래 걸리는 Coding Agent 작업 29. 6.1에서는 Medium부터 쓰는 게 더 중요해졌다 6.1이 강하다고 처음부터: High XHigh Max 만 쓰면 기다리는 시간이 상당히 길어질 수 있습니다. 따라서 일반 Coding에서는: Medium 부터 시작하는 게 좋습니다. 문제가 잘 해결되지 않을 때: Medium ↓ High ↓ XHigh 순서로 올리는 편이 낫습니다. Max 는 정말 복잡한 작업을 장시간 맡길 때 쓰는 쪽이 자연스럽습니다. 30. 그리고 긴 작업은 오히려 밤새 맡기는 방식이 잘 맞는다 6.1에 대한 현재 사용자 반응 중 재미있는 표현이 있습니다. Overnight task에 좋다. 즉: 개발자와 계속 대화하는 모델 보다 큰 작업을 맡겨놓고 나중에 결과를 보는 모델 에 더 잘 맞는다는 의미입니다. Codex가 점점 Background Agent 쪽으로 가고 있다는 걸 생각하면 이상한 방향도 아닙니다. 31. 속도가 중요하다면 결국 Fast와 Ultrafast가 있다 OpenAI 역시 속도를 별도의 제품 축으로 만들고 있습니다. GPT-6.1 Sol에는 향후 Ultrafast 가 제공될 예정이며, OpenAI는 Standard 대비 최대 8배 빠른 Token 생성을 예고하고 있습니다. DevDay 기준으로 Codex에서는 최대 약 30
Score: 57Confidence: 54%
Score: 54.4Confidence: 49%
Score: 54.4Confidence: 49%
Score: 54.4Confidence: 49%
Score: 54.4Confidence: 49%
Score: 54.4Confidence: 49%