2025-11-30

在疯狂动物城之后

去看了疯狂动物城2.

动机算是为了碟醋吃了盘饺子.

在时间线上看到有人发了个彩蛋的图.
一个胡萝卜核弹状的录音笔,加上小不点的中翻称呼,结合最近的中日关系,不免有迷之微笑.
想着,这私货塞的有点手眼通天.

虽然最终看下来多少有点自娱自乐.
但也不妨碍这确实是夹带私货的续作.

社交媒体上还有一段关于蛇这个造型和任务引入的一些争议.

从文化上来说,尤其是基督底蕴的西方宗教里面,蛇确实不算事一个很好的角色图腾.
尤其在片中,它也并不像坏蛋联盟里的蛇一样,做一些温和化的外观处理.

依然保留了獠牙,毒性,甚至于跟恶魔图腾有着亲密联系红眼.

所以选择这么一个动物形象作为一个被banish的故事背景的种族,多少有些奇特.
毕竟,选择任何一种其他动物,可能也不太影响故事结构的变化.

如果说是要强调偏见这个故事线索的合理性的话,像狐狸本身在上一集里也已经采用过了.
同类的有负面形象的动物也不少.

于是,这个决定就显得额外地费解.

同样的有些奇怪,但相对合理的是作为犹太隐喻的反派猞猁.

金色鬃毛的表演系人格马市长作为deep state的象征倒算是没什么争议.
甚至那个伴随台词之后的动作,也与现任总统的招牌舞姿有着某种内在的借鉴.

但是,为什么用猞猁作为犹太象征这个还是有些费解.

于是尝试关联了下相关的词条组合搜索.
除了在形象上跟恶魔有点关系之外,也没找到明显的支持跟犹太/以色列关联上的部分.

不过其中倒是意外地把蛇形象的某种正当性联系了起来.

希伯来圣经中有一段关于以色列人和蛇的渊源.
大致是耶和华降下火蛇惩罚以色列人.

以及由此衍生的,以色列人铸造铜蛇作为解毒的一系列渊源.

到这里,大致就能解释为什么选择这个奇怪的动物作为线索之一的.
尤其里面一个重要元素是腹蛇的识火能力.

而火这个元素,在看的时候,也有一些联想.
尤其是接近尾声的时候,在沙漠的那个音乐节.

当时第一反应就是这次巴以冲突的导火索的那个音乐节事件.
因为印象中好像也是跟火有关的.

所以当时看的时候,觉得还挺大胆的.
把最后的冲突场景放在这个设定上.

不过后来根据印象查证了下,发觉可能是跟火人节搞混了.
因为当时记得火人节也是闹了一阵子的争议的.

虽然往火人节上挂钩也不算牵强就是了.

一个是地理位置.
一个是文化定位.

而说到文化,这片有另外一个比较有意思的点就是把篇幅大量地放在了第三世界文化上.

从出逃的路线选择的墨西哥味道,甚至于面临领土兼并情况的状态也是非常amigo的.

事实上,美国现在的新墨西哥州和其他一部分土地就是通过最终购买的方式并入美国的.

而开始逃亡进入沉船的那个场景大致能挂钩上东南亚文化.

最后的沙漠场景和骆驼也大致就是中东地区了.

所以形式上来说,剧情地理动线是从美国到拉美到东南亚到中东这么一个转移过程.

除了这个传统的第三世界视角之外,另外就是俄罗斯和一些东方大国的影子了.

开场助逃的加长豪华轿车和白熊基本就是俄罗斯的好莱坞stereotype了.

黑手党鼠鼠教父,以及亲吻戒指这个明显的致敬不谈的话.
比较有意思的就是手下的这个奢侈品加工工厂了,和鼠妇人浮夸的审美了.

尤其考虑到仓鼠这种繁衍性极强的生物.
大致也算好莱坞的stereotype基因了.

而且看有人提出另外一个有趣的点也是这个工厂的一句话评价.
屏幕上一群踩缝纫机的小粉红.

这个就更是会心一笑了.

尤其联想最近的某App的显示IP纷争.

坐实了某种功能切实的stereotype了.

另外一个stereotype就是那个西班牙拉美风的歌手了.

感觉在近年来,弗拉明戈风格好像很喜欢被拿来凑元素.
不管是电影还是剧,甚至日本的动漫也有相当是拿来做风格化元素的.

不过也确实有种原始野性的节奏驱动.
尤其这里的比较洗脑的类动物嚎叫的zoo-o-o.

不过这片虽然参杂了诸多的元素,尤其是各种非西方传统价值观的颠覆性元素,而且故事上也在讲世界和而不同,命运共同体之类的概念.

但实际上给出的方案确实很别扭的按照生态隔离的方式.

这个可能也是主创自己没有想明白怎么表达的东西.

或者说,虽然知道自己是白左,有些想法不现实,但是拿不出更好的方式.

这个大概就是为什么分和两场戏的关于正义和努力的台词少有的显得没有那么白左的原因.

在明知伪善只是某种虚荣驱动的情况下,伪善也是善的意义的存废性讨论.

但可惜的是疑问并不代表着结论的存在.

故事的结尾本质上也还是解决显见的问题.
而忽略不被关注的点.

就像谁又曾问过冰雪区是不是真的不需要扩建.
以及蛇的新家是占了谁的土地呢.

所以本质上来说,问责是一种显而易见的容易被滥用的权力.

毕竟政治正确性本身是一种宗教信仰,存在着一种道德上的无上权威性.
在其没有越过某种红线之前.

2025-11-23

再聊聊集采

昨晚因为一些事情查了下艾斯奥美拉唑镁肠溶片这个东西.
然后发觉可能有一些可以展开的东西.

先是被告知说网上买贵,然后去医院开的话便宜.
于是就看了眼京东的价格.

第一眼是一两百的样子,想了想,确实有点贵.
然后就翻了下聊天记录,找到了发的医院买的截图.

然后看到商标名和公司,反应过来这个应该是集采国产替代/仿制药.

抱着好奇心用商标名和公司名在京东搜了下.
倒是没找到.

Google按照公司名字找到子公司倒是跟商标名有点像.

拿着这个名字回京东组合了几次,也还是没找到.
于是作罢.

因为知道可能是原研和仿制药的价格差异,于是就过滤了下带原研字样的其他国产替代.

看了下倒确实便宜,30几.
不过跟描述的医院只要十几块貌似也对不太上.

想想,即便集采,差价应该也不至于那么大.

于是又仔细看了下,发觉是剂量不一致.
京东的大概片数是医院版的两倍.

这么一算,大致对上了.

于是有了这个价格基准之后,回头看了看原研药.
想着是不是也是因为剂量的问题导致的价格差异.

然后发现不是.

用前面的单片剂量单价换算原研药的价格的话,大概是6倍左右.

到这里就开始有点意思了.

查了下这个药.
大致是阿斯利康在2000年在瑞典首发的,2014年专利过期,其后开始有仿制药,在2021年进集采.

看研报数据,即使在14年专利过期之后的2019年,全国16亿的销售额中,大概99%都是阿斯利康的.
只有在21年进集采之后,国产用量才占到80%.

这里要注意的是,一个是销售额一个是用量/销量.

2019年销售额是16亿,销量是1.48亿,单片差不多10块钱.
2021年阿斯利康销售额4.5亿,销量0.5亿,还是差不多9~10块.
而此时对应的国产替代是2.6亿,销量2亿,差不多但片1.3块.

这个数据要解读角度就多了.

单纯从销售额来说的话,说是断崖式暴跌也过分.
而且从阿斯利康的角度来说,也是量价齐跌.

所以,如果从阿斯利康的角度来说,这市场基本属于严重萎缩状态.

而故事的另外一个角度则是,集采之后,药的是用量增长了1.3倍.
同时费用差不多打了9折.

这两个叙事都是同时成立的.

但是只有这两种叙事么.

第三个角度是药企为了进集采牺牲了9成的利润.

这个也是成立的.
因为在专利过期,进入集采之前,国产替代也是按照差不多阿斯利康的价格在卖的.
这个可以从万分之几的销售额和市场占比里换算回来验证.

于是,在进集采中后,即使是国内药企,也是面临90%以上的让利的.
这个说法,也是一种alternative fact.

除此之外,还有另外一个角度就是给予国产药企的市场空间.
16亿时代差不多是万分之五,也就是100w左右的年市场份额.

集采之后则是总体2.6亿的市场规模.

于是,从这个角度来说,又是给予了国内药企巨大的市场空间.

到这里,大概就只能会心一笑了.

为了进一步验证或者说看看猜测对不对,拉出Gemini/千问/ChatGPT跑DeepResearch.
让跑了下集采等几个关键点前后的各个药品销量变化.

基本上也都是符合这几个角度的.

另外还有一些可能更有意思或者实际的是,翻千文的thinking的时候看到达格列净在25年10月进了第十一批集采.
这个也是阿斯利康的,也同样的,选择不进集采,而转入院外渠道.

然后顺手看了2024年的财报.
全球总收入大概500亿美元,其中31%是达格列净.
按地区其中中国占据12%.
如果平行换算的话,国内2024年的达格列净的销售额应该在160亿人民币左右.

当然,这个是简单粗暴的换算.
实际上,阿斯利康的达格列净在2024年总销售额是68亿.
这么算的话差不多是中国收入的15%左右.

如果套用艾斯奥美拉唑镁肠溶片的数据,少个75%的话.
那么集采之后全球收入要少个1.2%左右.

倒影响不如预期的大.

当然,这个只是单地区单品类的变量.

而且也难说出个什么新概念/药,还能增长一些.




2025-11-16

反之亦然

最近看到一个冲绳独立的慕容复策略.
于是稍微查了下,感觉还蛮有意思的.

它的法理依据是旧金山和约中将冲绳置于联合国托管领土框架内.
这个框架的设定主要是为了解决殖民地问题.

传统意义的二战主要限定在欧洲战场.
太平洋战场从西方认知上来说,并不太属于第二次世界大战的范围.
所以狭义地来说,欧洲战场才是西方视角的二战.

将日本投降和太平洋战场纳入的逻辑在于日本属于协约国成员.
而且日本跟欧洲的在太平洋确实存在冲突,只不过角度上来说,是殖民地争夺.

当时的世界框架视角是东亚和太平洋是个共享殖民地.
包括中国在内的所有领土和武装冲突本质上是殖民势力之间的火拼.

所以在战争结束,日本和协约国投降之后的处置问题就涉及到这些殖民地/战利品的归属去留问题.
于是,形式上来说,这个托管框架是对原有宗主国作为战败国之后的某种功能形式的主权剥离手段.

也就是日本版本的冲绳地位未定论.

但它跟其他殖民地不同的点在于后面有一个日美冲绳返还协定.
将主权治理从美国手上移交回日本,从而确立的现状.

这里的瑕疵在于,在联合国框架下,管理冲绳的实体应该是前面提到的托管框架.
而美国是作为实际的管理负责人的占有执行.
所以在法理上,美日签订的这个协议是否能够代表托管框架,这点是存在瑕疵的.

但是如果要以这点作为反击手段的话,那么形式上就需要承认旧金山和约.

旧金山和约的问题在于,中苏并没有参与以及签字.
这就导致了其他涉中海域和岛屿的地位问题.

形式上来说,和约中涉及的台湾澎湖以及西沙南沙群岛也属于托管框架范围.
也还并不明确属于当时的中华民国.

另外这里还有一个更具有争议性的中日和约.

中日和约是在旧金山和约签订之前,单独与中华民国签订的.
内容包括对上述涉中海域和岛屿的归属权确认问题.
明确废除了清朝以来的不平等条约,也就是实际上对上述岛屿和海域进行了确权.

形式上来说,这几个地方和几个小时后签署的旧金山和约共同构成了一房两拍的现象.

也就是在当时的时间点,这两个文件的签署对这这几个地方的归属权是互相冲突的.

那么从当前中国的角度来看的话,又是怎么样的呢?

先从没有争议或者说较少争议内容的中日联合声明说起.

这个是以明确的中华人民共和国身份签订的.
声明约束了日本对台湾的地位确认,以及补充性的追认波茨坦公告关于日本领土的声明.

这里有趣的地方有几个.

一个是对中日和约地位的问题.
中日双方并没有能够在这方面达成成文协议.
但是日方外长以官方身份做了口头的补充性说明,明确中日和约的终结.

终结这个词汇从结论上来说,是承认了中日和约的有效性,但废除了有效性.

所以从路径上来说,跟旧金山和约的互斥性是消除了.

隐含的就是合法性问题应该顺着旧金山和约往下延伸.

另一个有趣的地方是正式确认日本对台定位定论.

这个如果是延续中日和约的话,这个没什么争议.
因为联合声明确认了中华人民共和国的外交地位.
加上前一年的联合国2758号决议中华人民共共和国的代表权的恢复.

所以如果单从这个角度看,中日和约是对中日对台问题的100%确权.

但是它的问题是签订时间是在1952年.
如果承认签约主题的法理适格性,那么就必然跟中华人民共共和国的主权法理产生冲突.

所以从中华人民共和国的角度来说,也只能否认这个和约.

那么回到旧金山和约.

因为这个和约比中日和约签订还晚,并且本身无论哪个实体都没有参与签订.
所以这里又产生了新的分叉点.

一方面,作为联合国的实体代表,以及后续追认的代表延续性.
理论上来说是可以追认旧金山和约的有效性的.

但是这样也解决不了主权争议.
因为形式上来说,依然属于托管框架内.
加之这个框架本身就是争议来源之一.

另一个方面来说,日方后来的中日联合声明在台湾问题上的声明就面临适格性挑战.
因为既然日方主权没有变更,那么形式上来说,其对旧金山和约的内容依然具有履约性.
那么,实际上在无效化了中日和约的同时,也就意味着回退到托管框架的范畴.

而托管框架的前提是日方放弃了对台权力,移交给托管框架.
这个跟中日联合声明的主权性声明是冲突的.

那么,同样的,即使回到波茨坦公约,日方的视角也是放弃了对涉及岛屿和海域的主权确认.
归属性问题依然存在分歧.

所以,从中国的角度来说,可以确认的只有波茨坦公告和中日联合声明.

在这个角度下的切片就是另外一个比较有意思的观点了.

也就是所谓的战争状态问题.

因为在中日双方都无争议的这两个文件下面,形式上来说,中华人民共和国这个实体跟日本是还没有签订停战协定的.

形式上来说,中日联合声明只是放弃了战争赔款,以及在不侵犯领土的五项原则基础上的不诉诸武力.

这个在有新的停战协议,且新协议不涉及战争赔款的话,对这两个文件的有效性是不构成变化的.

于是理论上来说,这里就存在一种让托管框架实效的方式.

因为归属问题争议是建立在托管框架下的.
而托管框架的依据是旧金山和约.

既然中日依然处于战争状态,并且中方的盟军地位属于可以追认确立的.
那么,旧金山和约就存在托管框架方面的瑕疵.

因为在各方都明确无争议的波茨坦公告只约定了各个未定论.
但是对于实际的确权并没有不冲突的签字文件存在.

也就是说,托管框架的适格性可以会退到盟军对日方投降条款的未取得一致性上.

这个状态本身同样是能够支持未定论的.
但是这里存在一个中日新停战协议明确托管执行方为中方的路径.

而确认这个路径的话,那么问题就相对简单和清晰了.

如果日美可以就冲绳达成合规性协议.
那么同样的,中日也可以彻底解决争议性问题.

反之亦然.





2025-10-19

一些猜想

下午偶然翻到篇Google的论文.
大意是能对LLM直接更新某些参数来达到控制输出了.

这个放开了想,大致就相当于能定位到某些功能所实际激活/需要的部分.
医学上的等价理解就是知道脑部的特定区域的作用影响了.

工程上来说,一旦变得实际可行就有可能大规模地减少参数和算力需求.

从这点看,还是蛮promising的.

顺着一些引用往前翻是这篇论文的一个基石.
谈LLM emerging能力的.
理论框架是用来解释LLM为什么能具有context这个东西.

也就是说,比如给定一个prompt/问题.
形如问LLM需要的flops以及电量关系,然后project下需求这种问题.

context在这里的意思就是,LLM不单是能够简单的predicate和填充下一次词进行扩展,还能真大围绕着这个主题不断迭代计算下去.

所以怎么能够解释context的产生/来龙去脉/成因/作用方式,某种程度上是相当有意义的.

这个引用propose的解释框架是存在某种context block.
也就是某些比较关键的参数部分.

context的在这里的作用方式是对上一层的input做一个简单的线性shift,然后project到下一层.
intuition地理解就是类似先cluster到某个当前维度集合,然后再统一project到下一个dimension space.
这样一层层嵌套之后,形式上就类似于做了一个类似决策树的routing.
而每一层的分支理念上就类似于一个context space.

所以后面的那篇就基于这个算是做了某种程度的验证和控制实验.
从结论上来说,貌似是对的.

当然,实际对不对也没去看就是了.

不过如果假设这个是正确的话,这里其实还有个比较有趣的implication.
那就是既然context的演变是某种简单的cascading的线性shift叠加形成的.
那么理论上来说,层数或者说参数量是可以大幅度或者至少相当程度上减少的.

因为这些计算形式上是一个线性的关系.
也就是因为着可能可以以某种形式合并.

这样的话,之前DNN时代关于deep还是wide的争论可能又要拿出来再捋捋了.

凑巧的是刚好这时候看到另一篇谈high dimension calibration的.

初始的出发点看着也是想以某种方式拟合/裁剪模型,以实现较小计算代价的同等能力.
基于这个衍生的另一篇论文是关于这个方式的理论上下限的.

然后得出的结论是某层参数的增加在跟层数相关的一个系数范围内,模型的能力是可以保持不变的.

这个翻译一下其实就是前面说的,在给定条件下,存在增加每层参数,然后减少层数的方式,保持模型的表达能力.

这个在当前transformer的框架下,减少一层就意味着减少大量qkv,从而减少大量的算力需求.

再有一篇也是可能类似结论的.
谈back propagation的,在比较宏观的视角看待forward和backward pass在training过程中,对convergence的影响.
结论看着是forward pass在某种情况下,对最终stationary的影响并不直接.
主要还是backward pass的贡献.

这个初看起来有点废话的感觉,毕竟拟合本身靠的就是backward的gradient decent.

但是它尝试用这个来解释实践中加normalized layer的必要性以防止层数过身深导致的难收敛问题.

这个倒某种形式上跟前面shift的解释对得上了.

因为normalize形式上是把值约束在某个特定范围内.
变相地也就构成了某种cluster作用,使得后一层所需要需要区别开的dimension space的project function数值上可能不需要变得太过于复杂,从而影响收敛的难度.

而且这个结论的另外一个启发就是对于diffusion model.
因为diffusion本质上来说就是类似纯backward驱动的.

所以如果能从控制context block上发展出什么思路,再结合backward pass的这个结论,有可能在training的时候某种形式的去掉forward pass.
直接靠context block diffusion到最终结果.
而不是类似目前transformer的一个个吐的低效形式.

毕竟形式上来说,当前的transformer就是个bubble sort...

不过就目前来说,可能更直接的验证/摸索方式是构造一些相对小的模型充当这种理想化可控可预期的context blcok,然后搞另外一个专门模型去同步地聚合输出生成最终结果.

当然,MoE形式上就是前半部分.

只不过构成上还是传统的大力出奇迹,一步到位的训练.

从这种省事的方式回退到要某种形式的人工拆分结构再训练,可能不管学术还是工业上来说,都有点难度.

毕竟按照目前的算力规模来说,也不是随便给予尝试的.

不过Google既然能发出来,那么根据经验,要么就是已经验证出了下一代/N代架构.
要么这个已经是废案了.

到底是哪个,可能看后面发布模型有没什么特别的地方了.






2025-09-14

人类本质是LLM

最近看到一些比较有意思的新词.
比如苹果小区.

还有一些就是比较热点的话题.
比如预制菜.

然后发散了下,想到了解构主义这个词.

本质上来说,之前的所谓互联网黑话体系,其实也是某种解构主义.
甚至往大了说,短视频以及互联网本身都是依靠某种形式的解构主义支撑的.

用某种冲击性,或者说新鲜的词/话语形式去尝试高度覆盖某种更大范围的事物和现象.

就像现在正在做的,用 解构主义 一词去试图概括和定性一种现象.

它的问题在于,容易把一些事情简单标签化.

诚然,从语言进化的角度来说,确实需要并且必然也会存在新词和以一种新的抽象形式概括总结某类现实的形式.
但反过来说,也不能说所有的简化抽象都是合适的.

就像预制菜,某种语境下是充满negative含义的.
而苹果小区,则是跟某种形式的高级感混合在一起.

从体验上来说,一听到词出现基本上就定下了整个表述的氛围和立场.

但实际上来说,什么是预制菜,什么是苹果小区,这是一个比较虚无/undefined.
或者说其实是没有一个相对准确严格的定义去区分的.

它更多的是表达了某种预期中的情绪和意图.

这就有点像LLM的hallucination了.

你根据一个词汇predicate出来的东西,其实从第一开始就决定了基调.

而反过来,形式上的,既然首词或者说关键词决定了一个人对某种表述或者某种食物的情感变化的话.
技术上来说就能通过rephrase去控制影响甚至是构造植入观点.

比如当用计划经济开头描述一项措施,和以市场驱动开头描述一项政策.
听众的情绪反应和接受程度可能从前几个词就决定了对于后续的具体措施的认可/反对程度了.

而同样地,如果先叙述细节,再加上冠词定性.
那么听众可能就对条目本身更为中立,转而对提出人的立场存在区分质疑了.

更复杂的情况在于.
当你吃的一个东西的时候,对于食物本身的判断可能就被迁移了焦点.
从是否喜欢是否好吃等更纯粹具体的地方,转移到一个可能定义不明确,但是有着明显正负情绪印象的点上.

以及由此延伸的对于关联词汇的情绪和接受程度变化.

所以从这个角度来说,如果说之前社会的被影响程度更多源于信息差造成的不对称,或者说不全面的话.
现代社会的意识形态更多的是这种相对复杂的植入形式.

或者说源于某种信息过剩之后的,出于自保也好,效率也罢的一种对digest需求造成的某种依赖性引发的misleading.

因为信息的多元化和巨量话,选择一种高度概括的,或者信息浓缩程度足以覆盖大部分话语场景的词汇,去处理和应用某种立场表达.

与其花两个小时看一部电影,不如花五分钟看剪辑加上评论,快速地吸收.
然后迫不及待地奔赴下一个需要处理的条目.

至于吸收了什么,反倒不是什么特别值得注意的重点.

从这个角度来说,各种女权或者说社会意见群体的割裂,归根到底可能还是接受信息流派的差异.
毕竟个体上来说,数量特征上决定吸收的核心思想是类似的.

观点冲突立场对立的不过是因为不同宗门而已.

大多数不过是被某种关键词注入的观点表达.

形式上来说,可能就像一个巨大的诈骗园区.
不同隶属的团体有着各自固定的话术范本,互相套路着对方.

这么一想的话,人类本质是复读机这个解构主义的注释可能还是颇合时宜的.

或者相应地,可以说人类本质是LLM.


2025-08-02

何乐不为

去看了长安的荔枝.

前半段还可以,尤其像荔枝林里不知道是笑还是哭的几个镜头表演算是相当出色了.
结合人物背景的那种对目标的绝望与对当下人际环境的希望的交叉矛盾心理.

后半段就有些过滤潦草了.

如果说整片是对于一骑红尘妃子笑,无人知是荔枝来的解构的话.
带入民生潦倒涂炭这点是没问题的.

尤其前半段路上驿站的桥段和蓄奴的设定,以及荔枝林老板娘的对城人陈见等都是一种很自然的侧写.
不过分渲染,点到而已.

后半段的砍荔枝林虽然说表演和镜头问题比较多,过多地用了一种新闻摄影聚焦肢体冲突的拍法.
但是作为一种层层加码和举国体制的滚滚车轮的描写来说,剧情上还是有必要的.

但是对后面逃驿的问题,加上刻意的仰望苍天的片段就有些刻意和浪费剧情空间了.

这里更好的侧写可能还是保留后勤支持不足的设定,然后插播几个经过凋零村落的镜头即可.
因为这里可以在最后和杨国忠的对话里,再回扣回来.
用成本压力导致的各级执行虽然遵守,但不坚决来反衬用度的荒淫.

这点也和前期的办公室政治化氛围是契合的.
部门之间即使动员,但是在涉及到自身利益的时候,多少还是执行上会有一亩三分地的考虑的.

毕竟生存和服从也是分级别和尺度的.

从这个角度来说,刘德华的杨国忠交出刻字金牌说出 流程那种东西是强者不必遵循的规矩 这句话的时候,本片的含金量就到了一个阶段性高点了.

形式上来说,这是一个简单的权倾朝野的权力叙述.
也很容易,或者说没办法避免滑入到对权力滥用,以及最后对值不值得这一句的衍生思路.

但本质上来说,剧本本来可能更想倾向于落到权责上面的.
毕竟道具上采用的刻有名字的金牌,以及金牌所代表的令行禁止的各种特权.

本质上来说,这属于一个用名字背书的项目.

从前段段各部门踢皮球,到利益均沾的点播,以及杨国忠夜访认可.
用前半段的办公室政治来说,这就是简单的有了一个总体拍版负责的最高负责人.

所以到这里,各个层级的决策点已经不是这个项目风险高,不能入坑,变成了纯粹的执行而已.
责任解耦,各个层级的决策层本身退化回了执行节点.

这也是觉得后面召集人员发细节号令穿插执行镜头的存在的必要性了.

按照这个思路的话,杨国忠这个角色的塑造就应该是有点亦正亦邪的设定的.

所以后面看的时候,其实蛮期待最后的对话的.

尤其相关的镜头上,多处和佛像以及夜叉交叉,从手法上算是某种角色定位暗示.

在看到场景是在佛堂以及高低层设计的时候,也是蛮惊艳的.
甚至在最初的值不值的讨论上,也算是可圈可点没有落入俗套.

但可惜的是剧本没有让刘德华有机会塑造这么一个角色.

一个题外话就是感觉刘德华还是挺适合这种有争议性的亦正亦邪角色的.
感觉可能这个也是无间道成功的一点.
人物气质选的好.

回到剧情上.

不满意的在于杨国忠居然没有反驳的设定.
直接恼羞成怒地杖击,从而使得后面一连串的演出的剧情越来越浅薄公式化.

设想的场景里本来觉得会想和珅反问纪晓岚一样,问李善德知道这个浪费行为能养活多少人么之类的问题.

尤其本来白客那个商人角色在这里也可以插入亦正亦邪设定的.
毕竟一方面有着被大哥压制的梗,二来确实有想翻身的欲望.
如果剧本上植入白客反骨砍了荔枝林,但是自己生意也靠这个做成了的话,倒也可以加入到杨国忠的这个论战论据里.

一个设定升华两个人物.

另外一个没有用好的是那个同是献上来的贡品绿李.

杨国忠的那句也不过那样可以在李善德吃了绿李,按照耿直人设说出不好吃的时候,再把这句台词抛出来.
最后在值不值的问题论证的时候,把这个也曾经是荔枝的背景交待出来.

毕竟,形式上来说,皇家贡品认证某种程度上来说,确实属于一种经济模式.

这样两相来回就可以把问题螺旋到一个新的未定状态.
而不是简单的劳民伤财的结论.

然后后面流放岭南,能回到荔枝林也不会显得太突兀.
毕竟真多成贡品了,扩产荔枝园给老板娘带来切实利益也能呼应回跟杨国忠的对话.

进一步考虑价值问题.

甚至和最初的懵懂长漂青年到中年到狱中的和光同尘,再到最后的偏居岭南形成一个逻辑上的进化通道.
也就是常说的质疑理解成为的下一阶段注解.

现在剧情结尾一下转到和解以及白客成才就有点闲的无厘头了.

而且使得最后在荔枝树下的日啖荔枝三百颗圆梗变成了没有支撑点的哀国眼泪.
因为你很难解释他哭的是什么.

为百姓已经哭过了.
为长安为圣人就有点说不过去了.

未兴百姓苦亡百姓苦就更说不过去了.
毕竟,从行为上来说,他自己就是为了自保的推手之一.
并且,整部剧的设定也没有忏悔自己成为洪流一份子的剧情,所以谈不上某种复杂的自责和怜悯心理.

但如果按照前面的杨国忠设定走的话.
这里就可以转化为一种对价值问题的释然和放下.

毕竟不管杨国忠怎么做,做不做,长安还是在燃烧.
一种历史宿命的滚滚车轮感,结合自己送荔枝到如今吃荔枝吃到吐的现状的一种荒谬冲击.

回闪到当初荔枝林到分不清苦笑到镜头,然后结束就可以了.

这样连日啖荔枝三百颗这个梗也某种程度上上升到了一种入世又出世的了然感.

何乐不为.




2025-07-26

理解成为

最近写个Presto的UDF,发现点比较有趣的地方.

因为功能上需要运行时访问外部数据,做个类似缓存的读写动作.
所以形式上来说,这是一个带状态的函数.

在SparkSQL里的话,这个处理比较简单.
由于整个execution pipeline是基于序列化的,所以只要能够提供一个某种程度上determinist的初始状态,那么各个executor是可以有一致的表现的.

当然,这个有一些前提.
主要是class版本的一致性.
这个主要是由于kyro本身的问题.

但总得来说是比较straightforward的.

但是presto不太一样.
它采取了一些可能从设计上来说,比较学院派或者说不是那么实用主义的设计.

从架构上来说,它的udf主要通过一种plugin机制扩展.
而为了比较好地.或者说便于udf的作者提供更flexible的实现,所以采用了一个独立的plug classloader的方式加载对应的实现.

这个从工程上来说,也是一个可能容易被选择的方案.
因为弱化了实现的库版本依赖的约束,允许plugin作者选择自己prefer的各种其他库.

这里它为了比较好地解决不同classloader同名类不兼容的问题,主要也是plugin spi类的可cast问题,在plugin classloader里面做了个白名单机制.
是的SPI的类从同一个classloader加载,避免隔离机制造成的互相不兼容.

不过这里形式上也提供了一种调用主classloader的实现的一些方式.
毕竟已知的白名单类可以得到app classloader,自然也就有办法使用到所有的类.

不过这算classloader这种sandbox机制的某种特性吧.
毕竟形式上来说,这也是JVM的claasloader sanbox对立统一的一面.

而且整个udf runtime和execution pipeline的执行某种程度也是依靠这种leakage来实现的.

因为它不像SparkSQL是依靠序列化传递函数实现,而是靠比较轻量的某种执行计划描述在个节点节点重构调用链的.
所以形式上来说,可能各个节点运行的版本并不严格一致.
因为jar包可能不一样.

不过这在实际场景下可能不是一个大问题.
尤其如果是用容器方式运行的话.

这里的主要问题在于它对udf函数的初始化处理.

大体上来说,是比较标准的依赖注入的思路.
扫描类的annotation来生产udf的描述信息和运行时绑定方式.

这里比较tricky的是对udf的绑定是通过method handler实现的.

这个大概率可能是一种基于性能借口的炫技.

因为对于一个generic的udf来说,入参数量和返回值是不确定的.

像SparkSQL就索性采用了一个透明的类Object/Any方式.
好处是SPI接口简单.
坏处也显而易见,不能简单地知道入参出参的类型.

Presto形式上来说也可以采用这样的方式.
而且实际上来说,如果采用这种方式的话,可能更有利于vectorize.
毕竟本身就内部pipeline的传递的page/block就是某种batch data.

但显然作者没有采用这种实用主义的手法.
而是用了method handler以便能够在udf的声明上就清晰函数的定义.
把heavy lifting的事情放在method handler的参数绑定上.

甚至炫技的地方还不单在这种类curry的functional化上.
甚至还允许函数声明根据参数类型做specialize,一定程度上做着类似template specialized的事情.
对特定类型的参数可以提供统一但优化的实现和声明.

这个炫技本身倒没什么.
只不过从实际实现上来说,它引入了一个隐性约束.
就是这个函数的implementaion部分必须是static的.

因为这样才可能在早期绑定确定的method handler.

虽然看实现上也支持非static method的绑定.
但对于hosting class的constructor有一定的限制.

而且本质上来说,这个hosting instance也是once bounded的.
作用上就是一个static的singleton.

所以没办法从这个角度去让某个udf调用带有状态.

于是要带状态的话,一种思路是把状态相关的部分作为参数inject到udf的入参里.

这个的问题主要是在explain语句的时候,会有一些可能或干扰或敏感或意义不明的部分让人confuse,或者说知道了不必知道的实现细节.

当然,这个通过override某些函数是可以redacted的.
但是总的来说,不是很便利.

另外一点就是late binding的问题.

有时候udf入参的一部分并不需要立即evaluate,而是需要在udf实现里根据情况决定是否做eval.

这个在SparkSQL因为expression是可以自定义哪些需要eval的.
不管是eval模式还是codegen模式,自主性都比较flexible.

而presto的因为前面method handler的那些magic,基本上generate出来的bytecode都是实际eval出来的结果再入参的.
也就是说,在这方面的可控性并不如SparkSQL.

如果将这些late binding需求的部分作为原始string传入,再再udf里编译的话,有几个问题.

一个是这个compile流程不算友好.
如果bytecode模式的话,需要处理多个class loader的问题.

因为前面也说了,plugin本身的class是在一个半isolated的class loader.
而bytecode generate因为使用了method handler这个builtin class,所以形式上可以不管实现,在一个独立的mini classloader就可以完成code gen.
而卒后执行的时候又是在main classloader里执行.

所以在运行时,或者说函数的调用逻辑里需要毕竟明确的知道会触发class loading的点和确保bind了正确的classloader.

而如果是interpreter模式的话同样有类似的问题.

并且除了这个问题之外,还有怎么构造compiler/interpreter也是跟问题.

因为整个presto是按照guice的inejctor构造的.
而plugin的接口和loading方式又缺乏引入injector从而获得相关依赖服务构造对应compiler/interpretor的方式,所以实际上也不太可行.
即使是强行构造了一些等价接口的话,在覆盖率上也是有所差异的.

这使得即使构造成功,可能运行时的表现也不尽如人意.

再就是即使构造成功,处于性能考虑,如何对整个compile结果缓存也是个问题.

因为前面所说的method invoke是无状态的.

不过因为本身表达式是string形态,所以缓存这方面倒相对来说更直接一点.

而如果不走这种compile/interpretor方式的话,presto倒是提供了一种间接或者说直接late binding的方式.
那就是presto sql的lambda expression.

这个倒是解决了按需evaluate的问题.
并且不需要复杂的compile/interpreter,甚至于都不需要做method handler的缓存.
意味本身就已经是bindable了的,在函数声明里就是个通用的明确的functional interface.

但这里也回到了缓存状态的问题上.

针对一个udf的调用,形式上是根据某些特定的入参生成一个确定的cache key以帮助查找的.
但是如果同时有late binding的需求的话,那么因为functional interface本身不太cache sensitive.

也就说,很难说两个functional interface是否具有相同的逻辑,从而增加了缓存的难度.

而这里因为前面说的bytecode codegen的classloader是个不关心/aware plugin classloader的.
所以实际上它接收的functional interface只能是jdk builtin的interface.
无法通过扩展的方式,使得运行时能从这个入参里得到一些比较显著的信息.

能想到的方式只能是walkaroud地再inject一个足够distinguish的比如原始expr的string参数,同时想办法在explain等场景里给它屏蔽/不显示干扰.

总的来说,核心问题可能还是在于Presto整体设计有些学院派.
不像SparkSQL更多的是秉持某种能用就行.

虽然比较讽刺的是Presto本身是Facebook这种喊出move fast break things的工程实用主义的公司搞出来的.

不过想想自己也是.

曾几何时倒也是看不太起Spark+Scala这种到处又不是不能用哲学组合的产品.

现在却是走到了理解成为的阶段.

在疯狂动物城之后

去看了疯狂动物城2. 动机算是为了碟醋吃了盘饺子. 在时间线上看到有人发了个彩蛋的图. 一个胡萝卜核弹状的录音笔,加上小不点的中翻称呼,结合最近的中日关系,不免有迷之微笑. 想着,这私货塞的有点手眼通天. 虽然最终看下来多少有点自娱自乐. 但也不妨碍这确实是夹带私货的续作. 社交...