AI 系统设计的四个可迁移哲学:从 7 个开源项目中提炼
元认知:工具会过时,思想不会 #
AI Week Report 三期报告覆盖 18 个项目。大部分 AI 工具文章的做法是:列出项目 → 转述 README → 说”这个项目能做 X”。这种写法的问题是:工具会过时,但工具背后的思想不会。
OmniRoute 的 Token 压缩技术(RTK + Caveman)两年后可能被更好的分词器取代。codebase-memory-mcp 的纯 C 实现可能被 Rust 重写。但”在处理之前压缩输入”和”返回结构而非内容”这两个思想,十年后仍然成立——因为它们不依赖具体技术,依赖的是信息处理的底层规律。
本文从 7 个真优化项目中,提炼出四个可迁移到方方面面的设计哲学。每个哲学不讲”哪个项目用了它”,讲”它为什么有效、怎么迁移、什么时候别用”。
四个哲学一览 #
| 哲学 | 来源项目 | 一句话 | 迁移到哪里 |
|---|---|---|---|
| 返回结构,而非内容 | codebase-memory-mcp | 不要给 LLM 整本书,给它目录 | RAG、API、知识库、日志分析 |
| 约束优于自由 | ponytail | 限制输出格式比放开更能激发创造力 | AI 生成、代码规范、写作 |
| 优化在处理之前 | headroom | 在数据进入流程前压缩,而非之后 | 数据管线、提示工程、缓存 |
| 确定性做确定性的事 | open-code-review | 规则能解决的不要用概率 | 代码审查、安全检查、数据验证 |
这四个哲学不是平行关系,它们构成一个完整的 AI 系统设计流程:
1 | |
下面逐个剖析。
哲学一:返回结构,而非内容 #
原理 #
LLM 的上下文窗口是稀缺资源。每塞进去一个 Token,都在消耗三样东西:
- 金钱:按 Token 计费
- 注意力:LLM 的注意力机制对所有 Token 一视同仁,冗余 Token 稀释关键信息
- 窗口空间:塞满了就装不下新内容
传统做法把”内容”塞进上下文,让 LLM 自己找答案。索引做法把”结构”塞进上下文,让 LLM 决定要不要读具体内容。
1 | |
这个区别可以用一个比喻理解:
传统做法 = 把整本书递给图书馆员,说”帮我找第三章”
索引做法 = 把目录递给图书馆员,说”帮我找第三章”
目录只有一页,但包含了整本书的结构。图书馆员(LLM)看完目录就知道第三章在哪,然后自己去翻。
为什么有效 #
这个哲学的有效性建立在一个底层事实上:人类处理信息的方式,和 LLM 处理信息的方式,有根本性的不匹配。
人类习惯”先看摘要,再决定要不要深入”——因为人类的注意力是串行的,看完全文太慢。LLM 被迫”先看全文,再找答案”——因为 LLM 的注意力是并行的,理论上可以同时处理所有 Token。
但”理论上可以”不等于”实际效果好”。LLM 的注意力机制对所有 Token 一视同仁,当上下文里充满冗余内容时,关键信息被稀释了。这就像在一个嘈杂的房间里,虽然你能听到所有人的声音,但你听不清任何一个人的话。
索引范式弥合了这个不匹配:给 LLM 一个”目录”而非”全文”,让 LLM 的注意力集中在结构上,而非被内容淹没。
迁移场景 #
| 场景 | 传统做法(返回内容) | 索引做法(返回结构) |
|---|---|---|
| RAG 系统 | 检索 5 个文本块塞进上下文 | 返回”相关段落在文档 X 第 Y 节”,AI 按需读取 |
| API 设计 | 返回完整 JSON 对象 | 返回字段引用 + 按需加载 |
| 知识管理 | 搜索返回全文 | 搜索返回摘要 + 来源定位 |
| 代码审查 | 返回整个文件 | 返回”第 42 行有潜在 NPE” |
| 日志分析 | 返回 1000 行日志 | 返回”3 个异常 + 时间戳 + 调用栈” |
| 文档检索 | 返回 10 页 PDF | 返回”第 5 页第 2 段回答了你的问题” |
| 数据库查询 | SELECT * | SELECT id, name WHERE … |
| 人类沟通 | “我给你讲个故事…” | “结论是 X,依据在 Y” |
边界:什么时候别用 #
不是所有场景都适合”返回结构”:
- 需要全文理解的场景(如翻译、摘要):必须返回内容,结构无法替代
- 结构不明确的场景(如创意写作):没有”结构”可返回
- LLM 需要上下文才能理解的场景(如代码补全):需要返回周围代码
判断标准:如果 LLM 可以通过”知道在哪里”来找到答案,就返回结构;如果 LLM 必须”看到内容”才能回答,就返回内容。
哲学二:约束优于自由 #
原理 #
LLM 生成代码的过程是:给定上下文,预测下一个 Token 的概率分布,采样,重复。如果上下文里有大量”详细实现”的示例,LLM 会倾向于生成详细实现。如果上下文里有大量”极简实现”的示例,LLM 会倾向于生成极简实现。
LLM 的输出不是”自由创作”,是”上下文的概率延伸”。 你给什么样的上下文,就得到什么样的输出。
约束生成的原理是:在上下文中注入约束信号,引导 LLM 的概率分布向期望方向偏移。
1 | |
为什么有效 #
这个哲学的有效性建立在一个反直觉的事实上:约束不是限制创造力,约束是创造力的前提。
没有约束的 AI 生成,倾向于”覆盖所有可能性”——因为 LLM 的训练数据里充满了”完整实现”的示例。你让它写个函数,它会写参数校验、错误处理、日志记录、文档注释、单元测试……因为训练数据里”好代码”就是这样的。
但”好代码”不等于”适合当前场景的代码”。你只是想要一个快速验证想法的原型,不需要企业级的健壮性。约束的作用是告诉 LLM “当前场景不需要什么”。
这和人类创作的原理一致:
莎士比亚写十四行诗,约束是 14 行、特定的韵脚和节奏。正是这些约束,让十四行诗成为一种独特的艺术形式。如果给他一张白纸说”随便写”,他可能写不出任何东西。
迁移场景 #
| 场景 | 无约束(放开) | 有约束(限制) |
|---|---|---|
| AI 代码生成 | “实现登录功能” | “用 20 行以内实现登录,不写抽象层,必须有输入验证” |
| AI 写作 | “写一篇关于 AI 的文章” | “写 500 字,不用’赋能’’闭环’等 buzzword,第一句必须是问句” |
| API 设计 | “设计一个用户接口” | “最多 5 个端点,每个端点最多 3 个参数,返回 JSON” |
| 数据格式 | “给我数据” | “给我 CSV 格式,第一行是表头,日期用 ISO 8601” |
| 需求文档 | “描述你要什么” | “用用户故事格式:作为 X,我想 Y,以便 Z” |
| 代码规范 | “写好代码” | “函数不超过 50 行,圈复杂度不超过 10,必须有单元测试” |
边界:什么时候别用 #
- 探索性任务:你不知道要什么,需要 AI 帮你探索可能性,约束会限制探索范围
- 创意任务:写诗、写故事、设计 logo,过度约束会扼杀创意
- 学习场景:初学者需要看到”完整实现”来学习,约束会隐藏关键细节
判断标准:如果你知道”不要什么”,用约束;如果你不知道”要什么”,不用约束。
哲学三:优化在处理之前 #
原理 #
传统的优化思路是”处理完再看结果好不好,不好再优化处理过程”。前置优化的思路是”在数据进入处理流程之前,先优化数据本身”。
1 | |
这个哲学的底层原理是:垃圾进,垃圾出(GIGO)。 如果输入的数据质量差,处理过程再好也没用。
在 AI 场景中,”处理”= LLM 推理,”输入”= 上下文。前置优化的意思是:在数据进入上下文窗口之前,先压缩、过滤、结构化。
为什么有效 #
这个哲学的有效性建立在一个经济学原理上:边际成本递增。
LLM 的推理成本不是线性的。上下文从 1000 Token 增加到 2000 Token,成本翻倍但质量可能只提升 10%。上下文从 10000 Token 增加到 20000 Token,成本翻倍但质量可能只提升 1%。
原因是注意力机制的稀释效应:上下文越长,每个 Token 获得的注意力权重越分散,关键信息越容易被淹没。
前置优化的逻辑是:在成本翻倍之前,先删掉不必要的内容。 删除 50% 的冗余内容,成本减半,但质量几乎不变——因为删掉的是 LLM 根本不看的内容。
迁移场景 #
| 场景 | 后置优化(处理后再改) | 前置优化(处理前先改输入) |
|---|---|---|
| RAG 系统 | 检索 10 个文档 → LLM 回答 → 答案太长,截断 | 检索 10 个文档 → 压缩为摘要 → LLM 回答 |
| 代码审查 | AI 审查整个文件 → 输出 500 行报告 → 人工筛选 | 过滤掉测试文件和配置文件 → AI 只审查核心代码 |
| 日志分析 | 把 10000 行日志全给 AI → AI 分析 → 结果不准确 | 先用规则过滤出 ERROR 级别 → AI 只分析 100 行 |
| 数据处理 | 加载 1GB 数据 → 处理 → 内存溢出 | 先采样 100MB → 处理 → 快速验证 |
| 提示工程 | 写一个 2000 字的 prompt → LLM 回答 → 回答偏离重点 | 先写 200 字的核心指令 → LLM 回答 → 回答精准 |
| 缓存设计 | 每次请求都查数据库 → 慢 → 加缓存 | 请求先查缓存 → 缓存没有再查数据库 |
边界:什么时候别用 #
- 输入数据量本来就不大:压缩的开销可能大于收益
- 需要完整数据才能做判断的场景:如法律审查、医疗诊断,不能过滤掉任何信息
- 前置优化的成本高于后置优化:如果过滤逻辑本身很复杂,不如直接处理
判断标准:如果输入数据有明显的冗余,前置优化;如果输入数据已经很精炼,不需要前置优化。
哲学四:确定性做确定性的事 #
原理 #
LLM 是概率系统——同一段代码,问两次可能得到不同的审查意见。但有些问题的检测规则是明确的:NPE 就是空指针,SQL 注入就是拼接了用户输入,XSS 就是没转义 HTML 字符。
这些问题不需要”理解”代码语义,只需要模式匹配。 模式匹配是编译器技术的强项——AST 解析 + 数据流分析,成熟且稳定。
混合架构的原理是:确定性问题用确定性方法,不确定性问题用概率方法,两者分工。
1 | |
为什么有效 #
这个哲学的有效性建立在一个分工原理上:工具应该匹配问题的性质。
用 LLM 检测 NPE,就像用 microscope 锤钉子——能锤,但不是最佳工具。锤钉子应该用锤子(规则引擎),显微镜(LLM)应该用来看细胞(语义理解)。
混合架构的优势:
- 稳定性:确定性管道的检测结果 100% 可重现,不受 LLM 随机性影响
- 成本:确定性管道不消耗 Token,只有 LLM 部分消耗 Token
- 精确性:确定性管道基于 AST 能给出精确行号,LLM 给出的行号经常偏移
- 互补性:确定性管道做”已知模式检测”,LLM 做”未知模式推理”
迁移场景 #
| 场景 | 纯 LLM(全用概率) | 混合架构(确定性 + 概率) |
|---|---|---|
| 代码审查 | LLM 审查所有问题 | 规则引擎查 NPE/SQL注入/XSS,LLM 审查命名/逻辑/架构 |
| 安全检查 | LLM 检查安全漏洞 | 规则引擎查已知 CVE,LLM 分析未知攻击模式 |
| 数据验证 | LLM 验证数据格式 | 正则验证格式,LLM 验证语义合理性 |
| 内容审核 | LLM 审核所有内容 | 关键词过滤敏感词,LLM 判断上下文是否违规 |
| 测试生成 | LLM 生成所有测试 | 规则生成边界值测试,LLM 生成语义测试 |
| 文档生成 | LLM 生成完整文档 | 模板生成骨架,LLM 填充描述 |
边界:什么时候别用 #
- 问题本身不确定:如创意写作、情感分析,没有”确定性”部分可分离
- 规则不明确:如果连人都说不清”什么是好代码”,规则引擎无法编码
- 开发成本高:确定性管道需要开发规则集,如果规则经常变,维护成本高
判断标准:如果问题可以写成 if-else 规则,用确定性方法;如果需要”理解”才能判断,用 LLM。
四个哲学的协同 #
这四个哲学不是孤立的,它们可以组合使用,构成一个完整的 AI 系统设计流程:
1 | |
一个具体案例:设计一个 AI 代码审查系统
- 前置压缩:过滤掉测试文件、配置文件、第三方库,只保留核心代码
- 返回结构:不把整个文件给 LLM,先解析 AST,返回”函数列表 + 调用关系 + 复杂度”
- 确定性分工:用规则引擎检测 NPE/SQL注入/XSS,用 LLM 检测命名/逻辑/架构
- 约束生成:限制 LLM 输出为”问题列表 + 行号 + 修复建议”格式,不输出分析过程
这四步组合的效果:Token 消耗降低 90%,检测准确率提升,输出可直接用于 CI/CD。
缺陷与批判:哲学的局限 #
这四个哲学不是银弹,每个都有其局限:
| 哲学 | 局限 | 什么时候会失效 |
|---|---|---|
| 返回结构 | 丢失细节 | 需要全文理解的场景(翻译、摘要) |
| 约束优于自由 | 扼杀创意 | 探索性任务、创意任务 |
| 优化在处理之前 | 过度优化 | 输入数据量本来就不大的场景 |
| 确定性分工 | 规则不明确 | 问题本身不确定(情感分析、创意写作) |
更深层的问题:这四个哲学都隐含一个假设——你知道要什么。
- 返回结构:你得知道什么结构是重要的
- 约束生成:你得知道什么约束是合理的
- 前置优化:你得知道什么内容是冗余的
- 确定性分工:你得知道什么规则是确定的
如果你不知道要什么,这四个哲学都不适用。这时你需要的是探索,不是优化。
总结:为什么这四个哲学可以迁移到方方面面 #
这四个哲学之所以可迁移,是因为它们不依赖具体技术,依赖的是信息处理的底层规律:
| 哲学 | 底层规律 |
|---|---|
| 返回结构 | 注意力是稀缺资源,结构比内容更节省注意力 |
| 约束优于自由 | 输出是输入的概率延伸,约束输入就约束了输出 |
| 优化在处理之前 | 边际成本递增,在成本翻倍前减少输入 |
| 确定性分工 | 工具应该匹配问题的性质,确定性用规则,不确定性用概率 |
这些规律不随技术演进而改变。LLM 变成什么模型、Token 怎么计费、上下文窗口多大——都不影响这些规律的有效性。
一句话总结:
工具是思想的载体,思想是工具的灵魂。工具会过时,思想不会。当你理解了”返回结构而非内容”的原理,你不需要 codebase-memory-mcp 也能设计出高效的 RAG 系统;当你理解了”确定性做确定性的事”的原理,你不需要 open-code-review 也能设计出可靠的混合架构。
这四个哲学,是 AI 时代的工程设计基本功。
参考资料:
- AI Week Report: https://github.com/lca1rus01/ai-weekly-report
- codebase-memory-mcp: https://github.com/DeusData/codebase-memory-mcp
- ponytail: https://github.com/DietrichGebert/ponytail
- headroom: https://github.com/headroomlabs-ai/headroom
- open-code-review: https://github.com/alibaba/open-code-review