你的 AI 应用是否过度设计?7 个迹象与破解之道

原文7 Signs You’re Over-Engineering Your AI App (and How to Stop) | 作者:James Anderson | 日期:2026-08-24

📝 摘要

本文指出 AI 应用失败很少是因为选错模型或框架,而是因为盲目堆叠架构层次。作者列举了 7 个过度设计的典型迹象:过早引入向量数据库、把单一提示词包装成多智能体、用微调教模型记事实、添加无人需要的记忆系统、让提示词长出自己的一套框架、没有评估却堆砌架构、为不存在的规模做优化。最后给出避免过度设计的实践清单,核心原则是「从能解决问题的最小技术栈开始」,每一层架构都应当靠「解决了某个可观察的具体问题」来挣得自己的存在。

📋 术语表

英文中文说明
over-engineering过度设计为尚未出现或不存在的问题提前引入不必要的复杂度
vector database向量数据库存储和检索向量嵌入的数据库,用于语义相似度搜索
embedding嵌入将文本映射为高维向量的表示方式,用于语义检索
multi-agent orchestration多智能体编排由多个智能体通过图结构协作完成任务的架构模式
fine-tuning微调在预训练模型上针对特定任务或风格继续训练
memory layer记忆层为跨会话或跨用户保存上下文的系统
retrieval检索从外部知识源获取相关信息再喂给模型
reranker重排器对初步检索结果重新排序以提升相关性的组件
evals评估用带标注的测试集量化模型或系统质量的机制
exponential backoff指数退避重试失败请求时逐次成倍延长等待时间的策略
sharding分片将数据或负载拆分到多个节点以扩展容量的手段

正文(双语对照)

There’s a very specific kind of AI project that looks incredibly impressive in the architecture diagram and does almost nothing a simple version couldn’t do better.

有一种非常典型的 AI 项目:它的架构图看起来极其唬人,但实际做的事,一个简单版本反而能做得更好。

It has a vector database. It has a multi-agent orchestration graph. It has a fine-tuned model, a memory layer, custom tool wrappers, three retries with exponential backoff, and a couple of “future-proof” abstractions nobody’s actually using yet. The agent at the center is simple. The scaffolding around it is a cathedral.

它有向量数据库,有多智能体编排图,有微调过的模型,有记忆层,有自定义工具封装,有三重带指数退避的重试,还有几个「面向未来」却根本没人用的抽象。核心的智能体其实很简单,而围绕它的脚手架却像一座大教堂。

Here’s the uncomfortable truth most teams learn the hard way: AI apps rarely fail because someone picked the wrong model or framework. They fail because layers got added before anyone could name the problem each layer was supposed to solve. The biggest mistake in building AI apps isn’t starting too small — it’s starting too big.

这是大多数团队用惨痛教训换来的、令人不舒服的真相:AI 应用失败,很少是因为谁选错了模型或框架。它们失败,是因为在还没人能说清每一层到底要解决什么问题之前,层次就被加了进去。构建 AI 应用最大的错误,不是起步太小,而是起步太大。

So here are 7 signs you’ve crossed into over-engineering, the simpler thing to do instead, and — at the end — a practical playbook for not falling into the trap in the first place. See how many feel a little too familiar.

所以下面就是你已经陷入过度设计的 7 个迹象、对应的更简单的做法,以及——在最后——一份从一开始就避免掉坑的实用清单。看看有几个会让你觉得「有点太熟悉了」。

1. You reached for a vector database before you needed one

1. 你在真正需要之前就上了向量数据库

“First, set up your vector database” became the default opening line of every AI tutorial — so teams spin up Pinecone or Chroma reflexively, before they’ve confirmed they even have a retrieval problem that requires embeddings.

「首先,搭好你的向量数据库」成了每篇 AI 教程默认的开场白——于是团队条件反射般地拉起 Pinecone 或 Chroma,甚至还没确认自己到底有没有一个需要用到嵌入的检索问题。

The plot twist of the last year is how often that’s overkill. Some of the most capable coding agents around quietly dropped vector search in favor of plain tool-driven search — grep, reading the file tree, asking for files by name. In one widely-cited case, ripping out the embedding pipeline and replacing it with grep reportedly outperformed the vector setup, by a lot.

过去一年最大的反转是:这常常是杀鸡用牛刀。一些最强的编程智能体悄悄放弃了向量搜索,改用朴素的工具驱动搜索——grep、读取文件树、按名字要文件。在一个被广泛引用的案例里,拆掉嵌入流水线、换成 grep,据说效果远超向量方案,而且是大幅领先。

That doesn’t mean vector DBs are dead — they’re still a strong fit for large, stable knowledge bases (product docs, FAQs, glossaries) with a good reranker. But if your data is small enough to fit in context, or searchable with keywords and filters, you may be maintaining an entire embedding-and-migration pipeline to solve a problem grep or a SQL WHERE clause already solves.

这并不是说向量数据库已经死了——对于大型、稳定的知识库(产品文档、FAQ、术语表)再配一个好的重排器,它们依然是绝佳选择。但如果你的数据小到能塞进上下文,或者用关键词和过滤器就能搜到,那你可能正在维护一整条嵌入与迁移流水线,去解决一个 grep 或一句 SQL WHERE 子句早已解决的问题。

Instead: Start with the dumbest retrieval that works — keyword search, a filter, or just stuffing the relevant docs into the prompt. Add embeddings only when that measurably falls short.

替代做法:从最笨但能用的检索开始——关键词搜索、一个过滤器,或者干脆把相关文档塞进提示词。只有当这些可测量地不够用时,才加嵌入。

2. You built an “agent” that’s really a single prompt in a trenchcoat

2. 你造了一个「智能体」,其实不过是披着大衣的单一提示词

Multi-agent systems are exciting. A planner agent, a researcher agent, a critic agent, a synthesizer agent, all passing messages around a graph — it feels like real engineering.

多智能体系统很令人兴奋。规划智能体、调研智能体、评审智能体、合成智能体,它们在一张图里来回传消息——这感觉像在做真正的工程。

But a huge share of “agentic” apps are doing something a single well-structured prompt (or a short, linear sequence of two or three calls) would handle more reliably, more cheaply, and with far less to debug. Every extra agent multiplies your failure surface: more places to hallucinate, more handoffs to break, more latency, more cost, more nondeterminism.

但很大一部分「智能体化」应用做的事,一个结构良好的单一提示词(或两三次调用的短线性序列)就能更可靠、更便宜、更省调试地完成。每多一个智能体,你的故障面就成倍扩大:更多可能产生幻觉的地方、更多可能断掉的消息交接、更多延迟、更多成本、更多不确定性。

If you can’t clearly state what each agent does that a single call couldn’t, you don’t have a multi-agent system. You have one prompt wearing several hats and charging you for each.

如果你说不清每个智能体做了哪些「单次调用做不了」的事,那你就没有一个多智能体系统。你只有一个戴了好几顶帽子、还每顶都收费的提示词。

Instead: Build the single-call version first. Only split into agents when you hit a concrete wall — a genuinely distinct sub-task, a real need for parallelism, or a step that must be independently verifiable.

替代做法:先做单次调用的版本。只有当你撞上一堵具体的墙时才拆成多智能体——比如一个真正独立的子任务、对并行的真实需求,或者一个必须能被独立验证的步骤。

3. You fine-tuned a model to teach it facts

3. 你用微调去教模型「记事实」

Fine-tuning sounds like the serious, grown-up move — like you’ve graduated from “just prompting.” So teams fine-tune a model on their company data expecting it to reliably know that information afterward.

微调听起来像是严肃、成熟的进阶之举——仿佛你从「只会写提示词」毕业了。于是团队在公司数据上微调模型,指望它之后能可靠地掌握那些信息。

This is one of the most common expensive mistakes in the space. Models memorize facts poorly and forget them unpredictably; fine-tuning on factual data is almost always the wrong tool. Facts belong in a retrieval layer you can update in seconds, not baked into weights you have to retrain to change. Fine-tuning is for shaping behavior — tone, format, task-alignment — not for storing knowledge.

这是这个领域里最常见、代价最高的错误之一。模型记事实记得很差,还会不可预测地遗忘;拿事实数据去微调几乎永远是错的工具。事实应该放在一个几秒钟就能更新的检索层里,而不是烤进你必须重新训练才能改动的权重里。微调是用来塑造行为的——语气、格式、任务对齐——而不是用来存储知识的。

Instead: If you want the model to know things, retrieve them (or just put them in the prompt). Reserve fine-tuning for when you need consistent style or structure that prompting can’t reliably produce.

替代做法:如果你想让模型知道某些东西,去检索它们(或者直接放进提示词)。只有当提示词无法稳定产出你需要的统一风格或结构时,才动用微调。

4. You added a memory system nobody asked for

4. 你加了一个没人要的记忆系统

“AI that remembers you” is a compelling pitch, so persistent memory layers, temporal knowledge graphs, and cross-session state get bolted on early — often to apps that are fundamentally single-shot.

「记得你的 AI」是个很有吸引力的卖点,于是持久记忆层、时序知识图谱、跨会话状态很早就被硬装上去——而且常常是装在本性上「一次性」的应用上。

Memory is a real and increasingly important layer for agents that genuinely span sessions and users. But it’s also a whole system that has to decide what to keep, what to age out, and what to resurface — and if your app answers a question and moves on, that machinery is pure overhead. Worse, half-baked memory actively hurts: stale or wrongly-recalled context makes answers worse, not better.

对于真正跨越会话和用户的智能体来说,记忆是一个真实且日益重要的层次。但它同时也是一整套必须决定「保留什么、淘汰什么、重新浮现什么」的系统——而如果你的应用答完一个问题就走人,那套机制纯粹是额外负担。更糟的是,半吊子的记忆会主动造成伤害:过时或被错误召回的上下文会让答案变得更差,而不是更好。

Instead: Ask whether the task actually needs continuity across turns. If not, skip it. If it does, start with the simplest thing — a summary of the conversation passed forward — before reaching for a dedicated memory engine.

替代做法:先问问这个任务是否真的需要跨轮次的连续性。如果不需要,就跳过它。如果需要,就从最简单的东西开始——把对话摘要往后传——而不是一上来就上专门的记忆引擎。

5. Your prompts have grown their own framework

5. 你的提示词长出了自己的一套框架

It starts reasonably: a system prompt, a couple of examples. Then someone adds a templating engine, then conditional prompt-assembly logic, then a prompt “router,” then a library of forty partials stitched together at runtime — and now understanding what the model actually receives requires running a debugger.

一开始还蛮合理:一个系统提示词,几个示例。然后有人加了模板引擎,接着是条件式提示词拼装逻辑,再是一个提示词「路由器」,然后是四十个在运行时拼起来的片段库——到了这一步,要搞清楚模型到底收到了什么,你得去跑调试器。

Complexity in the plumbing around the prompt is still complexity. When the assembled prompt becomes something no human can read in one sitting, you’ve traded a legibility problem you could see for one you can’t.

提示词周边管道里的复杂度,仍然是复杂度。当拼装出来的提示词变得没有人能一口气读完时,你就把一个「看得见」的可读性问题,换成了一个「看不见」的问题。

Instead: Keep prompts as flat and readable as you can for as long as you can. When you do need dynamic assembly, log the final rendered prompt and read it regularly — if you can’t follow it, the model’s job is harder than it needs to be too.

替代做法:尽可能久地把提示词保持扁平、可读。当你确实需要动态拼装时,把最终渲染出来的提示词记录下来并定期读一读——如果连你都看不明白,那模型的任务也被不必要地搞难了。

6. You have no evals — but you have a lot of architecture

6. 你没有评估——却有一大堆架构

This is the tell that ties all the others together. Teams pour weeks into retrieval pipelines, agent graphs, and memory layers, and measure quality by vibes — clicking around, eyeballing outputs, shipping when it “feels good.”

这是把所有其他迹象串起来的那个「破绽」。团队在检索流水线、智能体图、记忆层上砸了好几周,却靠「感觉」来衡量质量——点点看看、肉眼扫一眼输出、觉得「感觉不错」就上线。

That’s backwards. Skipping evaluation is one of the most common and dangerous mistakes in production AI. Without evals you can’t answer the only questions that matter: Is it improving? Did that change break something? Does it behave consistently across inputs? Every layer you added was justified by an assumption — and without evals, not one of those assumptions has been tested. You could very likely delete half the architecture with zero quality loss and never know.

这完全是本末倒置。跳过评估是生产级 AI 里最常见、也最危险的错误之一。没有评估,你就无法回答那些唯一重要的问题:它在进步吗?这次改动搞坏了什么吗?它在不同输入下表现一致吗?你加的每一层,都是靠一个「假设」来站住脚的——而没有评估,这些假设一个都没被验证过。你极有可能删掉一半架构、质量零损失,却永远不知道。

Instead: Build a small, high-quality labeled test set early — even 30-50 examples. Measure before and after every architectural change. Let evals, not aesthetics, tell you which layers earn their keep. (Bonus: evals usually reveal that your problem is retrieval quality or prompt clarity, not the thing you were about to build.)

替代做法:尽早构建一个小的、高质量的带标注测试集——哪怕只有 30 到 50 个示例。每次架构改动前后都测量一遍。让评估、而不是审美,来告诉你哪些层次值得留下。(彩蛋:评估通常会揭示,你的问题其实是检索质量或提示词清晰度,而不是你正准备去造的那个东西。)

7. You optimized for scale you don’t have

7. 你为并不存在的规模做了优化

Sharding, elaborate caching tiers, multi-region failover, a queue system, autoscaling GPU inference — for an app with a few dozen daily users and a roadmap that’s mostly hypothetical.

分片、精心设计的多层缓存、多区域容灾、队列系统、自动扩缩容的 GPU 推理——为一个日活只有几十个、路线图基本靠想象的应用。

Premature scaling is classic over-engineering wearing an AI costume. You’re paying — in build time, complexity, and cognitive load — for traffic that may never arrive, and every one of those systems is now something you maintain and debug instead of improving the actual product. The irony is that scaling problems are good problems; they mean people are using the thing. Build the thing first.

过早扩展就是披着 AI 外衣的经典过度设计。你在为可能永远不会到来的流量买单——花的是构建时间、复杂度和认知负荷——而且这些系统每一个现在都成了你要维护和调试的东西,而不是让你去改进真正的产品。讽刺的是,扩展问题其实是好问题;它意味着有人在用你的东西。先把这个东西做出来。

Instead: Build for roughly 10x your current load, not 1000x. Make it easy to change. When real usage strains it, you’ll know exactly which part to scale — and you’ll scale the right one, because reality told you which it was.

替代做法:按当前负载的约 10 倍来构建,而不是 1000 倍。让它易于改动。当真实用量把它压到极限时,你会清楚地知道该扩展哪个部分——而且你会扩展对的那一个,因为是现实告诉了你它是什么。

How to Not Over-Engineer in the First Place

如何从一开始就不过度设计

Recognizing the signs is half the battle. Avoiding them from day one is the other half. Here’s the practical playbook — habits that keep an AI app lean without keeping it underpowered.

识别这些迹象只赢了一半。从第一天起就避开它们,是另一半。下面这份实用清单,是让 AI 应用保持精简、又不至于功能不足的习惯。

Start with the boring baseline and beat it. Before any architecture, build the crudest version that could possibly work: one prompt, the docs pasted in, no retrieval, no agents. Measure how good it actually is. That number is now your baseline — and every layer you consider has to beat it to justify existing. You’ll be surprised how often the boring baseline is already good enough to ship.

从无聊的基线开始,然后打败它。在任何架构之前,先做一个「能跑就行」的最粗糙版本:一个提示词,文档贴进去,没有检索,没有智能体。测测它到底有多好。那个数字就是你的基线——之后你考虑的每一层,都得超过它才有资格存在。你会惊讶于,这个无聊的基线有多少次已经好到可以直接上线。

Make “why” a required field. Adopt a simple rule for your team: no new layer goes in without a one-sentence answer to “what specific, observed problem does this solve?” “It might be useful later” and “the tutorial had one” don’t count. If you can’t name the failure it fixes, you don’t have evidence you need it yet — you have a hunch. Hunches go in the backlog, not the codebase.

把「为什么」设成必填项。给团队定一条简单规则:任何新层次进来,都必须能用一句话回答「它解决了哪个具体的、已经被观察到的实际问题?」「以后可能有用」和「教程里有这个」都不算数。如果你说不出它要修的那个故障,你就还没有证据证明你需要它——你只有一个直觉。直觉进待办清单,不进代码库。

Write the eval before the feature. Flip the usual order. Before building the fancy retrieval pipeline, write the test that would prove it’s better. If you can’t define what “better” looks like measurably, you’re not ready to build it — and if you can, you’ll often discover a far simpler change moves the number just as much.

先写评估,再造功能。把常规顺序颠倒过来。在造那条花哨的检索流水线之前,先写出那个能证明「它更好」的测试。如果你无法用可测量的方式定义「更好」长什么样,那你就还没准备好去造它——而如果你能定义,你往往会发现,一个简单得多的改动,能让那个数字动得一样多。

Add one layer at a time, and measure each. Never add three improvements at once. You’ll have no idea which one helped, which did nothing, and which quietly made things worse. One change, one measurement, keep-or-revert. This alone prevents most accidental complexity, because layers that don’t earn their keep get caught and removed immediately instead of calcifying.

一次加一层,每一层都测量。永远不要一次性加三个改进。那样你根本不知道哪个有用、哪个没用、哪个悄悄把事情搞得更糟。一次改动,一次测量,留下或回滚。仅这一条就能挡住大部分「意外的复杂度」,因为那些不挣口粮的层次会被立刻抓住并移除,而不是慢慢钙化。

Prefer boring, deletable tools. Given two options, pick the one that’s easier to rip out. A plain function call is easier to delete than a framework. Keyword search is easier to delete than a vector store. Reversible decisions let you move fast because mistakes are cheap. Save the hard-to-undo commitments for the few places you’re genuinely certain.

偏好无聊、可删除的工具。两个选项摆在面前时,选那个更容易拆掉的。一个普通函数调用比一个框架更容易删。关键词搜索比向量存储更容易删。可逆的决策让你跑得快,因为犯错成本低。把那些难以撤销的承诺,留给你真正确定的那少数几个地方。

Optimize for the reader, not the résumé. A lot of over-engineering is really engineers building the impressive version for themselves. Ask instead: could a new teammate understand this system in an afternoon? Could you, six months from now, at 2 a.m., during an incident? Simple systems aren’t less skilled — restraint is the harder skill. The senior move is usually the smaller one.

为「读者」优化,而不是为「简历」优化。很多过度设计,本质上是工程师在给自己造那个「看起来厉害」的版本。反过来问问:一个新同事能在一个下午内看懂这套系统吗?六个月后的你,凌晨两点、正处理事故时,能看懂吗?简单的系统并不代表技术更差——克制,才是更难的那门手艺。高级工程师的动作,往往是更小的那一个。

Delay the irreversible. Some choices are easy to change later (a prompt, a filter, a model swap). Some are painful (a database schema, an agent framework you’ve wired everything into, a fine-tuned model in your pipeline). Make the cheap, reversible choices freely and early. Delay the expensive, irreversible ones as long as you responsibly can — by then you’ll actually know if you need them.

推迟那些不可逆的决定。有些选择以后很容易改(一个提示词、一个过滤器、一次模型更换)。有些则很痛苦(一个数据库 schema、一个你把所有东西都接进去的智能体框架、一个已经进了你流水线的微调模型)。便宜、可逆的选择,尽管早做、大胆做。昂贵、不可逆的选择,能拖多久就拖多久——到那时你就真正知道是否需要它们了。

The One Rule Underneath All of It

所有这一切底下的一条规则

If there’s a single principle here, it’s this:

如果这里只有一条原则,那就是:

Start with the smallest stack that solves the problem. Add a layer only when something specific and observable breaks.

从能解决问题的最小技术栈开始。只有当某个具体的、可观察的东西坏掉了,才加一层。

Not “when a layer might be nice someday.” Not “when the tutorial included one.” When something breaks, in a way you can name and measure.

不是「哪天这一层可能会派上用场」,也不是「教程里包含这个」。而是当某个东西坏掉了,坏的方式你能说得清、测得出。

This isn’t an argument for building sloppy or ignoring real complexity — plenty of AI apps genuinely need vector search, agents, memory, and scale. It’s an argument for earning each layer. The best AI apps aren’t the ones with the most impressive architecture diagram. They’re the ones where every box on the diagram is there because something would break without it.

这不是在为「粗糙地构建」或「无视真实复杂度」辩护——确实有很多 AI 应用真正需要向量搜索、智能体、记忆和规模。这是在主张「让每一层都挣得自己的位置」。最好的 AI 应用,不是架构图最唬人的那些,而是图上每一个框都在那里、因为少了它就有东西会坏掉的那些。

Complexity is easy to add and brutally hard to remove. Every layer you don’t build is a layer you don’t have to debug at 2 a.m.

复杂度加进去很容易,拆掉却极其困难。每一层你没去造的,都是你凌晨两点不用去调试的一层。

Instead of asking “what could I add to make this more capable?” ask “what could I remove and still have it work?” Ship that version. Let reality tell you what to build next.

不要问「我能加点什么让它更强大?」,而要问「我能删掉什么、它照样能跑?」上线那个版本。让现实告诉你接下来该造什么。

Which of these have you been guilty of? I’ll admit to #3 and #7 — I’ve fine-tuned a model to “know” things it promptly forgot, and scaled an app for a stampede that was really about four people. Confess yours in the comments.

这几条里,你犯过哪条?我先认领第 3 条和第 7 条——我曾微调过一个模型去「知道」一些它转头就忘掉的事,还为一个其实只有四个人的「人潮」去扩展过一个应用。在评论区招认你的吧。


译者注:本文发表于 2026 年 8 月 24 日,正值 AI 应用工程化高速迭代期。文中「过度设计」的反思对正在用 Claude Code / Codex / Gemini CLI 等智能体工具做开发的工程师尤其有共鸣——尤其是第 6 条「没有评估却堆架构」和第 7 条「为不存在的规模优化」,是日常搭建 MVP 时最容易踩的坑。