无论你内心期盼过多少次的春和景明,夏天终归如约而至,春天则不情愿地悄然谢幕。虽未至立夏,可空调、风扇的争相开启,无一不在昭示着春天的形同虚设。西安的春秋季节向来短暂,一场清明时节的沙尘暴,便轻易地带走了我们对春天的全部幻想。踏青赏花、旅行露营,世间美好与你环环相扣。遥想当年,魏晋风流人物,于兰亭集会,引以为流觞曲水,想来不会比此刻更添雅致。可惜,“向之所欣,俯仰之间,已为陈迹”,今人与古人的感慨,竟是如此的不谋而合。第一次读到川端康成那句“凌晨四点钟,看到海棠花未眠”,令我心动的是这个意象中蕴藏着的深邃美感。然而,当我有一天站在真正的海棠花前却认不出它时,我终于意识到自己的浅薄。在一个同样无眠的夜晚,我决定写一篇文章,借以描摹我此刻的心境,以及这一个月以来关于 AI 协同、日本战国历史、 Agent 设计的种种心绪。
新主题
如你所见,我给博客更换了一个新主题,该主题移植自 imsyy 的 vitepress-theme-curve。至此,使用了三年多的 hugo-theme-stack 主题正式宣告退役。当然,我想表达的是,这个移植工作是由我和 Cursor 一起完成的。作为一名后端工程师,当我从 Hexo 切换到 Hugo 时,我曾经做过类似的尝试,可无一例外均以失败告终。所以,除了惊叹于 AI 带来的这种生产力的放大,我实在想不出还有什么更令人叹服的东西,以一言蔽之,接受 AI 比自己强大。
有趣的地方在于,我前面三次尝试让 Cursor 完成这个任务,收获到的是不同程度的失败。例如,移植后主题运行报错、移植后主题没有遵从原主题的结构或样式等,哪怕我使用的是 Cursor 的 Agent 模式。直到第四次的时候,一切开始步入正轨。最终,它变成了你现在看到的这个新主题。如果说第四次尝试有什么魔法的话,那一定是我的脑海中有了一个更详细的移植计划,我开始主导我和 AI 整个会话过程,而不是像一个新手或者小白一样狂按 Tab 键。
首先,一个博客至少需要两种布局,即:文章列表、文章详情。基于这个认知,我开始尝试将原主题中的 Vue 组件与 Hugo 中的 list.html
以及 single.html
对应起来。这种对应并非简单地将其添加到 Cursor 的上下文中,而是提前建好基本的目录结构、同时在提示词里面写清楚相对路径。对于页面中的子组件,我允许 Cursor 先创建一个空白的文件充当占位符。其次,在和 AI 互动的过程中,对于可工作的产物需要及时提交到 Git 中,从而避免程序被 AI 改坏。我认为,这是一个非常重要的技巧,敏捷开发中“可工作的软件”这一理念,得以在这一刻被具象化。
如今,LLM 和人类的注意力都非常宝贵,在和 Cursor 交互的过程中有意识地控制上下文的范围非常重要。正如我们人与人之间交流,上下文并不是越多越好,任何时候你都应该注意,不向对方提供对方不需要的上下文。诚然。Cursor 中的 Codebase 可以自动索引不同的文件,可如果你有机会缩小检索范围,何乐而不为呢?难道大海捞针是一件值得推崇的事情吗?在移植了主要的布局、样式以后,我开始逐个移植其中的子组件,于我个人而言,这其实是一堂面向大模型的沟通课,相比于人类的言不由衷,同大模型交流需要的是足够的真诚,可对人类而言这恰恰是一种稀缺资源。雷总说,“真诚是必杀技”,可我们好像更喜欢不好好说话。情绪价值充满字里行间的时候,信息密度就会低到令人发指,低幼化的语言表达,犹如微小剂量的砷,无形中变成了我们和 LLM 之间的沟通障碍。
随着模型能力的不断升级,现在人们好像随便输入一通,就能得到非常不错的结果。于是,有人开始说,提示工程不存在了,甚至连 Agent 都不存在了。可我始终相信一个经典的理论:Garbage In,Garbage Out,向对方清楚地表达出你的意愿,这并不是什么高标准,而是一个基本要求。可惜,在人类世界里待久了,有喜欢揣摩潜台词的人,就有喜欢模棱两可的人。我始终认为,人类和 AI 在未来应该是一种平等的、合作的关系,我们不该在这种关系中代入类似上下级、老板/员工这样的不对等的关系。要求别人或者 AI 正确地揣摩你的意图,这并不是 NLP 技术或者情感陪伴类产品中的刚需,而是一种隐形的情绪霸凌,因为你本可以选择更清晰的表达方式,可你偏偏没有这样做。
在这个时代,AI 具有化“腐朽”为“神奇”的能力,可首先你需要能正确地写出“腐朽”两个字。AI 并非中世纪的巫术、魔法,相反,其背后是建立在数学和统计基础上的机器学习、神经网络,无论你是否认同这一点,请至少做到清楚地向别人表达你的意愿。有默契、一切尽在不言中、心领神会……固然令人心驰神往,可真正能流传下来的东西,往往是那些经过反复打磨与清晰表达的想法。目前,这个新主题大概率会遇到各种 Bug,欢迎大家给我留言,如果你能描述清楚,我相信我和 AI 一定能帮你修复好它,而这便是我对于世间万物所建立的某种信任。
历史的天空
《刺客信条:影》的发布,于我而言,是一次完善日本战国史的重要契机。为了搞清楚游戏剧情,我花了点时间来阅读各种资料。自此,飞鸟、奈良、平安、镰仓、室町、江户、明治,千百年的时光以一种压缩到极致的形态在眼前展开。鉴真东渡,空海西行,一来一往,辗转腾挪出来个平安京。身在长安,心在洛阳,忽然感觉身体里关于《长安十二时辰》、《妖猫传》 的神经元被再次激活。我想,《浪客剑心:京都大火篇》中,剑心一行人阻止反派志志雄真实火烧京都时,内心定然是不愿意看到这座古老城市付之一炬。
日本是公家、武家的二元政治,天皇作为象征性权威,而幕府将军是实际统治者。对此,美国人有个更形象的比喻,即:菊与刀。其中,菊象征皇室,刀代表武士。我不太清楚,日本皇室的“十六瓣八重表菊纹”,是否源于战国时期的家纹传统。可当你再次回顾这段历史,你会发现它本质上是一个“公家不断被弱化、武家不断被强化”的过程。在经历藤原氏、平氏、源氏的动荡后,源赖朝建立了首个武士政权——镰仓幕府,天皇权力被架空,武家政治正式确立。可惜,源赖朝的冷酷残忍,冥冥中注定了源氏将军的三代而亡。此后历代幕府将军,无一不是北条氏的傀儡。百年后,丰臣秀吉流放外甥丰臣秀次、并命其切腹自尽的时候,不知是否会想起源赖朝、源义经兄弟二人的相爱相杀?
在育碧的世界观中,即使是马西亚夫,依然不能阻止蒙古帝国的入侵。宋元交替之际,忽必烈先后两次对日发动战争,游戏《对马岛之魂》便是在讲述这段历史。尽管镰仓幕府成功抵御蒙古人的侵略,可这个政权同样走到了历史的尽头。此时,代表公家的后醍醐天皇试图夺回权力,先后三次发动倒幕运动,最终推翻幕府统治。历史有趣的地方在于,无论你是否吸取历史的教训,历史总会向着它既定的方向行进。从足利尊氏与后醍醐天皇分道扬镳,到后醍醐天皇被迫让出象征皇权的三神器,历史分分合合、治乱交替,应仁之乱的爆发,象征着日本战国时代的开启。
现在回过头再看《真田丸》,其错综复杂的人物关系,此刻如同抽丝剥茧一般澄澈。在这个“天下英雄如过江之鲫”的乱世,我看到的是潜藏于历史洪流之下的挣扎。甲斐群山间奔腾的赤备骑兵,深得武田信玄“风林火山”战术之要,可依旧抵不过织田信长的“火绳枪”、“三段击”;身着南蛮胴具足的织田信长,高呼“天下布武”,试图用武力统一日本,可最终等来的是本能寺的晨钟,果然“人生五十年,如梦亦如幻”;丰臣秀吉晚年权欲熏心,发动文禄·庆长之役,最终落得一个郁郁而终的下场;德川家康在关原合战中击败石田三成领导的西军,确立霸主地位,自此此开创两百余年江户幕府。许多年后,当末代幕府将军德川庆喜乘军舰逃回大阪时,不知他是否会梦回大阪之阵呢?
英雄们用献血和生命谱写的史诗,是否只是一种螳臂挡车式的悲愿,终难逃脱被历史的车轮无情碾压的宿命?我隐约觉得真田信繁身上有些许姜维的神韵,一个人早早看清自己的命运,这最多算作是智者。可明知不可为而为之,甚至义无反顾地去做这件事情,便不可不谓之“勇”。《真田丸》大结局,上杉景胜眼含热泪称赞真田信繁不愧为“日本第一兵”。也许,在他眼中,信繁比他更像一名真正的武士。因为,相比于被称为“越后之龙”的上杉谦信,他先投靠秀吉,后臣服家康,注定要被父辈的荣光掩盖。可在璀璨夺目的“战国三杰”面前,谁又不是萤火之光呢?唯有信繁这种以凡躯为柴薪的“愚者”,在历史的暗夜里留下了永不熄灭的磷火。原来,比征服更永恒的,是被碾碎时迸发的光芒。这次《刺客信条:影》里的圣殿骑士,可以说是历代作品中最没有存在感的,甚至还不如刺客一揆的隐藏主角䌷结出彩。毕竟,在群雄逐鹿的战国,充满人格魅力的人们,如同皓天星辰一般数不胜数。
我理解的 Agentic
在当今这个信息爆炸的时代,知识被高度碎片化、极限压缩,我们难免陷入一种“知识代糖”的幻觉,甚至主动放弃思考过程,仿佛大模型的推理过程可以替代人类思考。正如苏格拉底所言,“我唯一知道的是我一无所知”。如今,当我们重新审视这句话时,或许会解读出新的含义——因为,比一无所知更可怕的,是一知半解。每当看到媒体对 Agent、MCP、Function Calling 等概念含糊其词时,我常常在思考一个问题:如果你承认人类之间存在认知水平的差异,为什么会相信他人的思维模式能够解决你的问题,尤其是在彼此之间尚未完成对齐的前提下?
AI 行业日新月异,一路走来,CoT、ReAct、Reflection、RFT、MCP、A2A,每天都有新的词汇出现,甚至这些概念从来都只是概念,你从未真正动手实践过。也许你会问:知道这些,对于我使用 AI 有帮助吗?的确如此。但这恰恰是 AI 最具迷惑性的地方,它就像某种代糖,给予你一种“甜”的错觉,让你误以为“获取信息”就等同于“完成思考”。经常看到有人不断放大 Agent 的定义,在我看来,吴恩达老师早已给出了清晰的框架,即:Agent = LLM + Memory + Planning + Execute + Tools。基于这个认知,你就会明白,目前 MCP 最多只是解决了 Execute 和 Tools 的问题,而其中真正困难的部分——Memory 和 Planning,并没有得到实质性的解决。
Manus 以及 OpenManus 出来以后,对我最大的启发是 Planning 和 Execute 分离的设计思路。DeepSeek R1 发布以来,我一直在考虑的方向是基于工具的推理。因为目前推理模型的“思考”,更像是一种自说自话,它并不能在推理过程中调用工具。不过,这个思路怎么看,都更接近一个 Agent 而不是一个模型。于是,有好事者造了一个新词——Agent 模型。其次,从我个人角度,我一直希望将 RAG 升级为 Agentic RAG,这显然符合我过去的认知和观点,即:“RAG 的尽头是 Agent”。我希望 RAG 变成 Agent 中的一个工具,无论它是以本地函数还是 MCP Server 的形式出现。为了实现这一目标,我尝试了下面的基于有向无环图(DAG)的任务编排策略:
如图所示,我们可以将一个任务分解为多个相对独立的子任务。一旦我们将子任务看作节点,子任务间的依赖关系看作边,这样就构成了有向无环图,即:DAG,因为显然子任务不会在经过一系列节点后指向自身。通过拓扑排序,我们可以确定子任务的执行顺序以及执行策略。例如,入度为 0 的节点表示没有任何节点指向该节点,这意味着这类节点没有依赖项,可以并行化处理。对于有依赖项节点,可以结合入度、任务 Id 串行化处理。作为图论领域的核心算法之一,拓扑排序在任务调度、编译器的依赖解析、课程安排等需要处理有序依赖关系的领域中发挥着重要作用。针对 Agent 的任务调度需求,DAG 适逢其时,从 Planning 到 Execute 的整个流程在理论层面完成了闭环。
对于具体的执行层面而言,Function Calling 的根本问题是,工具列表到底以哪种形式告知大模型。对于支持 Function Calling 的模型,可以放在 tools 参数里面;对于不支持 Function Calling 的模型,可以放在提示词里面。所以,在这里我还是准备沿用此前的 ReAct。当然,为了减少 token 的消耗,我选择在规划阶段向子任务提供可用的工具列表,从而减少 Agent 在执行阶段 token 的消耗。这个策略目前来看的话,基本上是可以实施的。问题在于,ReAct 的重试不一定能真正解决问题。与此同时,整个流程缺少一个结果验证的环节。在这种情况下,你会真正并深刻地意识到,决策层与执行层天然存在着某种断层。例如,决策层目光长远、谋定高远,然而细节疏漏;执行层流程娴熟、执行有力,可惜视野局限。如果从这个角度来看,Agent 的设计是否更接近管理学的范畴?
如图所示,我们可以借鉴 OpenManus 或是 Grok 以及 Genspark 实现一个 Planning + Execute 的 Agent。可正如“一千个读者眼里有一千个哈姆雷特”,每个人的心中同样有自己的 Agent 定义。我并不打算参与到这场毫无意义的争论中去,我唯一能做的事情,就是将我心中的 Agent 写出来并分享给你们。
结语
夏日将至,剪完头发走在路上,理清思绪的一刻,我仿佛完成了一次同自己的对话。决策从来不是终点,更像一次冒险的起点。每一个 Agent 任务、每一个被连接的子节点,都像极了我们与世界互动的方式——在不完整中寻找秩序,在混沌中追寻意义。从“凌晨四点的海棠花”到 Agentic RAG 的 DAG 编排,我关心的,从来都不是只有技术,而是技术背后“人之为人”的部分。我始终认为,我们与 AI 的关系,不是驾驭,更不是依附,而是在反复试错、理解与表达中,共同探索一出种新的协作方式。人类的独特之处,不在全知,而在于愿意理解、愿意表达,愿意相信彼此终将理解彼此。Agentic,同样不是工具的堆叠,而是一种基于表达、拆解与信任的协作共识。凌晨四点钟,海棠花未眠,除了那份川端康成式的寂静美学,或许更多的是一种自我唤醒?