从执行到决策:矛盾论视角下的 AI 工程实践
AI 时代每天冒新名词——Agent、RAG、MCP、thinking_budget、tool_choice……追新名词永远追不完。但如果你能识别新名词背后对应哪个老规律,你就不再是被动学习者,而是主动判断者。这篇文章做一件事:用《矛盾论》这套完整的思维框架,重新解释我们每天都在做的 AI 工程决策。
TL;DR
■ ReAct 循环 ≈ 《实践论》:算法语言和哲学语言,表达了同一条规律——知行统一
■ 矛盾论六概念全部映射到 AI 工程:普遍性(矛盾是天生内置)、特殊性(参数没有最佳值)、主要方面(场景定权重)、同一性(找第三条路)、斗争性(矛盾推动范式跃迁)、对抗性区分(调参 vs 改架构)
■ 核心命题:AI 能列 trade-off、能给最优参数、能写代码,但判断”这一次哪边更重要”、发现”框架本身是问题”、区分”结构问题还是参数问题”——是人的主场
开篇:ReAct ≈ 《实践论》
ReAct(Reasoning + Acting)循环——思考→行动→观察→再思考——和 1937 年《实践论》的”实践→认识→再实践→再认识”几乎是同一套逻辑。
| ReAct 论文批判 | 实践论批判 | 本质 |
|---|---|---|
| Reason-only(只推理不行动)→ 幻觉 | 教条主义 | 脱离实践的认识是空洞的 |
| Act-only(只行动不思考)→ 盲目乱试 | 经验主义 | 缺乏理论指导的实践是盲目的 |
| 核心命题:reason to act + act to reason | 知行统一观 | 认识和实践的辩证统一 |
论文作者没引用《实践论》,但他们引用的维果茨基学派受马克思主义认识论深刻影响。同一个底层规律,1937 年用哲学语言表达,2023 年用算法语言表达。
这个洞察引出一个方法论:新名词会越来越多,但底层规律没变。下面逐条用矛盾论的六个概念,对照真实工程决策。
矛盾论全景地图
| # | 概念 | 一句话 | AI/工程映射 |
|---|---|---|---|
| 1 | 矛盾的普遍性 | 矛盾无处不在,是事物的本质特征 | AI 系统天然内置矛盾,不是 bug |
| 2 | 矛盾的特殊性 | 每个矛盾都有特殊性,要具体分析 | 同一参数不同场景需要不同值 |
| 3 | 主要矛盾 & 矛盾主要方面 | 抓主要矛盾,抓矛盾的主要方面 | 安全场景可控性优先,创意场景自主性优先 |
| 4 | 矛盾的同一性 | 对立面互相依存,一定条件下互相转化 | 好的设计让对立双方互相促进 |
| 5 | 矛盾的斗争性 | 对立面斗争是发展的动力 | 矛盾张力推动系统迭代优化 |
| 6 | 对抗性 vs 非对抗性 | 不同质的矛盾用不同质的方法解决 | 有些是调参问题,有些必须改架构 |
再加三组每天都在碰的工程矛盾:
| # | 矛盾 | 日常工程映射 |
|---|---|---|
| 7 | 快速上线 vs 安全合规 | 先跑通再合规,还是先合规再上线? |
| 8 | 快速验证 vs 工程复用 | 先交付原型,还是先抽象通用组件? |
| 9 | 安全兜底 vs 业务不中断 | 覆盖率重要还是稳定性重要? |
概念 1:矛盾的普遍性——AI 系统的矛盾是天生的
“矛盾存在于一切事物的发展过程中,每一事物的发展过程中存在着自始至终的矛盾运动。”
RAG 检索天生矛盾:召回率(多召回不遗漏)和精确率(少召回不干扰)永远互斥。检索 Token 预算设大→答案发散,设小→遗漏关键信息。
Agent 自主性天生矛盾:LLM 越自主越容易幻觉,越约束越无能。Tool Call 节点即使没配工具,LLM 依然会尝试调用——它天生有”想干活”的倾向,会幻觉出不存在的工具名 → Tool not found → 无限重试。
thinking 质量天生矛盾:思维链越长推理越深,但延迟越高、成本越大。thinking_budget 是硬截断——达到上限直接掐断,不管你推理完没完。
Scaling Law 天生矛盾:模型越大能力越强——GPT-2(1.5B)到 GPT-3(175B)到 GPT-4,每次膨胀都带来智能跃迁。但训练成本从几万美元涨到几亿美元,推理延迟从毫秒涨到秒级。能力增长和成本增长是同一枚硬币的两面,从 Scaling Law 提出那天就注定了。
给 AI 写约束也是天生矛盾——规则的无限递归:你加约束 A(别幻觉工具名)→ 发现有工具时也得限制白名单,加 A1 → 发现不同模型对约束响应不一样,加 A1.1 → 发现 prompt 层不够还要 API 层兜底,加 B。每条规则都在暴露下一条规则的缺失——你以为在”完善规则”,实际是沿着矛盾的无限递归往下挖。矛盾不可能在规则层面被终结。
日常工程也一样:快速上线和保证质量永远互斥,安全合规和开发效率永远互斥。
启发:
第一句话对自己说:认知到这是客观规律,降低焦虑——矛盾不是你的系统做坏了,是这类系统本来就是如此。
第二句话对团队说:当出现”为什么参数不生效”时,可能不是谁错了——是系统各层的行为不一致,需要有人站出来翻译。AI 告诉你”这个参数没透传”,人告诉团队”这不是谁的错,是各层行为不一致,需要对齐”。前者是诊断,后者是翻译。诊断 AI 能做,翻译需要担当。这个翻译者就是决策者。这是人的主场。
概念 2:矛盾的特殊性——同一参数,不同场景需要不同值
“尤其重要的,成为我们认识事物的基础的东西,则是必须注意它的特殊点。”
thinking_budget 六档配置:
| 场景 | thinking_budget | 为什么是这个值 |
|---|---|---|
| 闲聊 | 500 | 不需要深度推理 |
| RAG 检索 | 2K | 靠外部知识回答,推理浅 |
| RAG + MCP | 8K | 工具调用需要推理链 |
| 多智能体规划 | 16K | Agent 拆解步骤需深度思考 |
| 极深推理链 | 32K | 复杂多步逻辑推理 |
| 不确定 | 不限制 | 让模型自己判断 |
没有”最佳值”。 不能拿着一组参数到处套。RAG 场景设 32K = 浪费;多智能体场景设 500 = 不够。每个场景的矛盾特殊性不一样——闲聊场景质量和延迟的矛盾不尖锐,多智能体场景这个矛盾就非常突出。
同一类问题,也可以有不同答案——AI Agent 需要记忆,但”怎么记”没有标准答案:
| 策略 | 机制 | 适用场景 |
|---|---|---|
| RAG | 提问时检索,向量召回相关内容塞进 Prompt | 海量文档(百万级)、高并发查询 |
| LLM Wiki | 录入时由模型归纳、链接,生成可读知识页面 | 团队知识沉淀(几十到几百篇)、低频查询 |
RAG 解决”海量文档快速检索”,LLM Wiki 解决”团队知识持续积累”。不是替代,是互补。 小团队知识库跟风上 RAG + 向量数据库就是杀鸡用牛刀——纯 Markdown + LLM Wiki 可能更聪明、更低成本。
同样的逻辑,Transformer 同一个架构分化出三条路:BERT(Encoder-only)专攻理解、GPT(Decoder-only)专攻生成、T5(Encoder-Decoder)专攻翻译。没有”最好”的架构,只有”适合你场景”的架构。
就连”把文本变成向量”这一个操作,Embedding 也没法通用:代码场景用 CodeBERT 或 text-embedding-3-large、中文语义用 bge-large-zh、多语言用 multilingual-e5。选错了模型,RAG 召回率直接掉一半——不是模型不好,是你的场景特殊性决定了该用哪一个。
启发:
警惕”最佳实践”陷阱。AI 领域今天出一个最佳实践明天就被打脸。具体场景具体分析——说起来简单,做到需要你真正理解”这个场景的特殊性在哪”。
面试时我常考察”你用过什么优化手段”——重要的不是手段本身,而是在什么场景下、为什么选这个。
AI 给你的是统计意义上的最优解——“大多数人在大多数场景下这样选”。你判断的是具体场景下的适配解——“我们这个场景有什么特殊性,为什么大多数人的选择不适用”。前者来自数据,后者来自判断。这是人的主场。
概念 3:主要矛盾与矛盾的主要方面——判断”这一次哪边更重”
“在复杂的事物的发展过程中,有许多的矛盾存在,其中必有一种是主要的矛盾。””矛盾着的两方面中,必有一方面是主要的,他方面是次要的。”
Demo 1:ToolCall 的自主性 vs 可控性
场景:Agent 没配工具,LLM 自己编了一个工具名去调用 → Tool not found,无限重试。
跨栈碰撞:产品说 Agent 越灵活越好,能自主判断调什么工具;后端说幻觉工具名导致线上报错,必须兜底。
判断矛盾主要方面——不同场景,主要方面不同:
| 场景 | 矛盾主要方面 | 理由 |
|---|---|---|
| 无 MCP 工具 | 可控性 | 没工具可用,自主性是假的,幻觉就是纯损失 |
| 有 MCP 工具 | 自主性为主,可控性兜底 | 列出白名单即可,不需要全禁 |
| 安全敏感场景 | 可控性压倒自主性 | 宁可不调工具,不能调错工具 |
具体解法:双层约束,按场景分强度——提示词层注入禁用声明(覆盖面广,弱约束)+ API 层 tool_choice: 'none' 强制禁用(精确打击,强约束)。两层都做,因为单层扛不住所有模型行为。
Demo 2:先跑通再合规——快速交付是主要矛盾
场景:分析工作台急着交付,SSO 认证接入卡住了。决策:先删除所有登录模块,免认证直接上线,认证改造代码完整存档。2 天交付,后续恢复 SSO,登录回归零损失。
关键判断:P0 阶段,快速交付是主要矛盾,合规认证是次要方面。”先跑通再合规”是刻意的策略选择,不是偷懒。认证是加回来容易的(可逆的),但业务跑不通才是真问题(不可逆的)。
Demo 3:rkhunter 替换 ClamAV——矛盾主要方面在实践中翻转
初始决策:等保要求恶意代码防范,全服务器部署 ClamAV 全量扫描。
矛盾暴露:ClamAV 加载 360 万病毒库需 1-2GB 内存,资源紧张的服务器触发 OOM Killer——扫着扫着容器被杀了。加了 --memory 限制后 oom_score_adj 反而更高、更容易被杀,因为 Docker 认为”你设了限制就是愿意被杀的”。
矛盾的主要方面在实践中翻转:
| 阶段 | 主要矛盾 | 矛盾主要方面 | 决策 |
|---|---|---|---|
| 最初 | 覆盖率 vs 资源消耗 | 覆盖率(等保要求全覆盖) | ClamAV 全量部署 |
| OOM 后 | 可部署性 vs 覆盖率 | 可部署性(服务器不能挂) | 换成 rkhunter |
为什么是 rkhunter 而不是 chkrootkit:chkrootkit 2014 年停更、现代内核误报高、等保审计风险,否决;rkhunter 30MB 内存、活跃维护、白名单支持、等保认可,选定。
最终架构——两者不是替代,是互补:全量服务器部署 rkhunter 做日常 rootkit 巡检(覆盖”入侵防范”)+ 保留 ClamAV 带内存限制作为等保材料(覆盖”恶意代码防范”)+ 某台真有感染时单台用 ClamAV 查杀——不作为日常扫描,作为按需武器。
判断:等保要的是”证据”不是”天天跑”。日常轻量扫描 + 按需深度查杀 = 两个矛盾的同一性。不是”选 A 还是选 B”,是”让它们各自做最擅长的事”。
Demo 4:行业的战略转型——主要矛盾变了
2023 年之前行业信条只有一个:堆参数、追能力(概念1 讲的 Scaling Law 矛盾就是它——能力越强成本越高)。GPT-4 之后能力够了,矛盾的主要方面悄然转移——不再是”能不能”,而是”贵不贵、快不快”。GPT-4o mini、Claude Haiku、DeepSeek 这批”小而强”模型成新战场,蒸馏技术把大模型能力压进小模型。
同一个行业,2023 年主要矛盾是”智能”,2025 年是”效率”。你要识别的不是”哪个模型好”,是这一年的主要矛盾是什么。
启发
做决策时先问自己:”在这个场景下,矛盾的主要方面是什么?” 不是永远站在固定的一端。P0 交付阶段速度优先,稳定运营阶段合规优先——上一轮的次要矛盾,换一个场景可能变成主要矛盾。 去年追 1.8T 参数是对的,今年追蒸馏小模型也是对的——因为主要矛盾变了。
AI 能帮你列出所有 trade-off——“速度 vs 安全、成本 vs 精度、覆盖率 vs 稳定性”。但它不会说”这一次,速度更重要,安全可以暂时让步”。优先级排序不只是逻辑,是对时机、压力、后果的综合感知。这是人的主场。
概念 4:矛盾的同一性——不是零和,是互相成就
“矛盾着的双方,依据一定的条件,各向着其相反的方面转化。”
Demo 1:自主性增强了,可控性反而更高
直觉上,Agent 越自主越难控制。实际上:
- 自主性不够时:thinking_budget 设 500,推理不充分 → 规划质量差 → 人工频繁纠正 → 用户失去信任、绕过系统 → 可控性其实丧失了
- 自主性给够时:设 16K,充分推理 → 自主规划正确 → 减少人工介入 → 系统更可靠 → 可控性反而增强了
这不是理论推导——线上 Agent 的 thinking_budget 从一刀切改为分档配置的过程,本质上就是在找”给多少自主性才能最大化可控性”的平衡点。
结论:自主性和可控性不是零和博弈。限制自主性来追求可控性,反而可能把系统推向更不可控的方向。好的设计让它们互相促进。
Demo 2:RAG + Fine-tuning——看似对立,实则互补
“该用 RAG 还是 Fine-tune 注入领域知识”?这个争论本身是伪命题:
| 看似 | 实则 |
|---|---|
| RAG 管检索,Fine-tune 管训练,二者互斥 | Fine-tune 给模型领域直觉(”这大概是什么类型的回答”),RAG 给模型实时数据(”具体这条信息是什么”) |
| 选了 RAG 就不用 Fine-tune | 1+1>2:Fine-tune 过的模型更懂怎么用 RAG 召回的结果 |
真正的矛盾同一性:两个看起来互斥的方案,组合使用能达到单方案达不到的效果。不是”选哪个”,是”怎么让它们互相成就”。
启发
不要只盯着对立面,要找同一性。好的设计方案经常是”看起来加了东西,实际上整体更简单了”。
AI 很难做到这一点:AI 擅长在给定框架内优化——“要快,给你最快的方案;要安全,给你最安全的方案”。但”两个都要”的第三条路,不是优化,是重新定义问题。这是人的主场。
概念 5:矛盾的斗争性——矛盾是进化的动力
“矛盾的斗争贯串于过程的始终,并使一过程向着他过程转化。”
Demo 1:Agent 通信进化——矛盾推动的范式跃迁
| 阶段 | 做法 | 矛盾 |
|---|---|---|
| Prompt 夹带 | 工具描述拼进提示词,靠 LLM 自己理解 | 理解力够强 vs 输出不稳定、不可靠 |
| Function Calling | API 原生支持,输出结构化 JSON | 各家 Schema 不统一(OpenAI/Google/Anthropic 各搞各的) |
| MCP 协议 | 标准化接口,Agent 和 Tool 之间的”USB-C 插座” | 统一标准 vs 生态迁移成本 |
每代方案的矛盾被解决后,新的矛盾又冒出来。 Prompt 夹带的”不可靠”被 Function Calling 解决了,立即暴露”各家不互通”;MCP 解决了互通,现在又面临”生态迁移”。
这不是坏循环——是进化。矛盾永远不会消失,只会升级。你的价值就是识别当前阶段的矛盾在哪、推动它往下一阶段走。
Demo 2:深度学习架构演化——每次跃迁都是旧矛盾的爆发
| 架构 | 主要矛盾 | 为什么被淘汰 |
|---|---|---|
| RNN | 序列建模强 vs 无法并行(必须等上一步) | 训练慢到不可接受,长序列直接跑不动 |
| LSTM | 解决短序列遗忘 vs 长距离依赖仍衰减 | 门控加了复杂度但没根本解决 |
| CNN | 局部特征好 vs 看不到全局关系 | 堆很多层才能扩大感受野,效率低 |
| Transformer | 并行计算 + 全局注意力 | 当前霸主,但 O(n²) 面对超长序列已是新矛盾 |
每次”淘汰”都是矛盾的质变:RNN 的并行矛盾 → LSTM 缓解未根治 → Transformer 用 Attention 彻底推翻。Transformer 现在的 O(n²) 矛盾,正在催生 Mamba、RWKV 等下一代架构。
没有终极架构,只有当前矛盾的暂时平衡。
启发
出问题不是坏事——是系统在告诉你矛盾在哪。运维的本质不是”灭火”,是让矛盾的张力推动系统迭代。 每次故障都是矛盾暴露的时刻,也是系统进化的机会。
AI 能帮你定位问题、生成修复方案——“这个报错改这行代码就好”。但它不会判断”这次故障是修完就完,还是该顺势推动架构升级”。AI 擅长回答”怎么修”,人决定”修完之后系统该往哪走”。这是人的主场。
概念 6:对抗性 vs 非对抗性——调参解决不了的要改结构
“不同质的矛盾,只有用不同质的方法才能解决。”
| 类型 | AI 工程例子 | 解决方式 |
|---|---|---|
| 非对抗性 | RAG 召回率 vs 精确率 | 设计层面平衡(Token 预算、ReRank) |
| 非对抗性 | thinking 质量 vs 延迟 | 场景分级配置 |
| 对抗性 | LLM 幻觉本质(概率生成 vs 确定性要求) | 调参解决不了,必须改架构(双层约束、外部校验) |
| 对抗性 | SSE 长连接 vs 网关超时(502) | 不能靠”优化网络”,要改连接管理(状态机+重试+指数退避) |
| 对抗性 | Context Window”永远不够长” | 从 4K→128K→1M,但用户永远会塞更多。扩窗口是调参;催生 RAG、MemGPT 等外部记忆方案才是改架构 |
Demo 1:CallerRunsPolicy 的教训
线程池拒绝策略从 CallerRunsPolicy 改为 AbortPolicy 后,偶然发现 Token 写入阻塞——CallerRuns 让调用线程自己执行被拒绝的任务,表面上”不丢任务”,实际上把慢调用线程堵死了。
判断:丢任务(Abort + 落补偿记录)vs 堵线程(CallerRuns 静默阻塞)——后者看起来”不丢数据”,实际是对抗性矛盾,调线程池大小解决不了,必须改策略。
Demo 2:AI 编程的新型屎山——调 prompt 解决不了
传统屎山是”一看就知道该重构了”;AI 写的代码单独看每个文件都很漂亮,但二十个文件放一起:同一个功能三种实现,同一个概念四个名字。这不是 prompt 问题,是结构性的——AI 的本质是”每次从零开始理解上下文”,等于 100 个只见过你一面的人轮流给你写代码:三天前的会话叫 event,今天的会话叫 eventNameEn,各自”局部最优”,拼起来就是命名漂移。
三类 AI 特有屎山:会话失忆型(同一概念在不同会话被赋予不同名字,局部都合理,全局精神分裂)、叠兼容补丁型(不修根因,在消费端一层层打兼容补丁,堆成大型 if-else)、无主代码型(代码有了,但”为什么这么写”的决策信息随窗口关闭丢失)。
为什么是对抗性:prompt 写得再好也解决不了跨会话一致性——AI 没有跨会话记忆。解法不在代码层在流程层,跟 ESLint 一样:流程硬约束——新建类前先 grep 已有命名、禁止兼容补丁优先统一源头、必须写”为何”注释。
Demo 3:AI 记忆系统为什么也救不了——“没有银弹”
有人问:Claude Memory、Agent 记忆、RAG 长期记忆,不能解决跨会话问题吗?能缓解,不能根除——和 Brooks 1986 年”No Silver Bullet”完全同构:记忆系统消除得了偶然复杂性(上次用了什么命名、选了哪个方案),消除不了本质复杂性(在那个时刻、面对那些约束、排除那些方案后,为什么是这个决定)。记忆存”纪要”,心智模型要”经历过”——纪要读一百遍,替代不了亲身参会的认知深度。
流程硬约束才是正解:不是让 AI 记住更多,是让人类能快速重建心智模型。
启发
判断力就体现在这里:你面对的问题是调参/改 prompt 能解决的(非对抗性),还是必须改架构/改流程的(对抗性)?把对抗性矛盾当非对抗性调——永远调不出来,因为路走错了。把非对抗性矛盾当对抗性改——过度设计,路走偏了。
这恰恰是 AI 替代不了程序员的地方:AI 能写代码、能生成方案,但它分不清当前面对的是偶然复杂性还是本质复杂性。它会用”再加一个兼容补丁”来应对命名漂移——因为它在自己的认知范围内找到了”最优解”。但人知道那是技术债。人的价值不是写代码比 AI 快,是知道什么时候代码背后的问题不是代码能解决的。 AI 看到 if (event == null) event = eventNameEn 会认为这是合法的防御性代码,人看到同一行会皱眉。皱眉不是能力,是问题意识——一种不请自来的警觉。这是人的主场。
收束:矛盾论给你的不是答案,是五个追问
每次面对决策时,问自己:
1 | |
程序员的不可替代性,不在写代码,在做判断
AI 能写代码、能生成方案、能替代大量”怎么做”。但——
判断矛盾的主要方面、找到场景化的平衡点、区分调参问题和结构问题、验证全链路实际生效——这些事,AI 替代不了。不是”暂时替代不了”,是结构上替代不了。
这不是智力差距。AI 的推理能力在持续进化,今天的”做不到”明天可能就能做到。但决策的前提不在模型参数里:
- 你判断矛盾主要方面时,调用的不只是逻辑——是对这个系统线上历史的了解、对团队能力的评估、对业务压力的感知
- 你找到第三条路时,用的不只是推理——是跨领域的经验迁移、对”看起来加了东西实际上更简单”这种反直觉路径的敏感
- 你看到兼容补丁皱眉时,触发的不是模式匹配——是长期维护积累的审美直觉,一种不请自来的问题意识
这些输入源——现实感知、跨域经验、责任承担、主动探知——不在 AI 的上下文窗口里。不是 AI “不够聪明所以没有”,是结构上就没有。AI 只处理你描述的问题,人感知尚未被描述的问题。
没有银弹。 不管是 Brooks 1986 年的论断,还是今天的 AI 记忆系统——本质复杂性不会被任何单一技术消灭。矛盾的识别、权衡、转化、验证,需要人持续深入参与,发挥主观能动性。AI 可以写出代码,但写不出”面对这个矛盾,我选择站在这一边,因为——“后面的那个句号。
“等任务、听安排”的习惯,在职责面越来越宽的时代,是最大的职业风险。每个人都需要自己的决策思维。”会做判断”的人,AI 永远替代不了。
参考文献
- 毛泽东《矛盾论》《实践论》(1937)
- Yao et al., ReAct: Synergizing Reasoning and Acting in Language Models(2023)
- Kaplan et al., Scaling Laws for Neural Language Models(2020)
- Fred Brooks, No Silver Bullet — Essence and Accident in Software Engineering(1986)
本篇为整理稿,底稿形成于 2026-09 内部分享《从执行到决策——矛盾论视角下的 AI 工程实践》。