我这一年有个很深的体会:无论是看别人演示AI产品,还是自己动手做项目,见到的所谓"新花样"越来越多,但拆开之后几乎都长一个样。聊天机器人、知识库问答、Agent工作流、联网搜索、多模态识别、各种垂直小工具,表面千差万别,底层其实都是同一副骨架在转。这副骨架就是我常说的"大模型三层架构":模型层负责能力底座,输入处理层决定"你往模型里塞了什么",输出处理层决定"模型吐出来的东西怎么变成能用的结果"。把这三层想明白之后,看再多的AI新花样都不会乱,拿到一个新需求也知道该往哪使劲。
这篇文章我打算把这副骨架彻底掰开揉碎,把每一层里能做的文章、常见的坑、以及我实际项目里摸索出来的经验,一次讲清楚。不管你是刚入门想搞懂AI产品原理,还是已经做了几个项目想找更高效的优化思路,都应该能从中找到对你有用的东西。
1. 模型层是那个"定死的发动机":应用层创新绕不开它,也动不了它
很多人一上来就聊模型层,聊参数、聊训练、聊对齐,好像做AI应用的人都得先懂预训练。但作为实际做产品、做工具的人,我反而建议先把模型层放到一个合适的位置:它是整条链路的底座,也是你最动不了的那一部分。
1.1 模型层到底包含什么
模型层指的是大模型本身的全部能力边界,包括预训练阶段学到的知识、指令跟随能力、上下文窗口长度、原生多模态感知(能不能直接看图片、听音频)、对工具的调用能力(是否有原生的Function Calling能力),以及最基础的推理水平。
在应用开发时,这堆东西对你来说就是一个"定死的容器":你没法临时改它的内部权重,也没法让它突然具备一个它本身不具备的能力。你能选择的只是——用哪一个容器、以什么方式部署这个容器。换句话讲,同一个输入进去,某个模型能答好,另一个模型答不好,这是模型层差异;但你的应用创新根本不发生在这一层,而是发生在你往容器里放了什么、以及容器倒出来的东西你怎么接住。
1.2 为什么说应用开发者基本动不了模型层
先不说预训练的成本和门槛,单说收益。业内对"炼大模型"这件事的投入产出已经很清楚:靠堆数据和算力强行提升模型能力的边际收益,远不如把已有模型的输入输出用对来得快。对绝大多数团队来说,在模型层能做的最多也就是两件事:一是选型,选一个在效果、速度、成本上最匹配当前需求的现成模型;二是微调或量化部署,用业务数据让模型行为更贴合场景。
但微调这件事我也得泼一盆冷水。很多人把微调当成"让模型变聪明"的万能药,实际上微调更多是改变模型的说话风格、输出格式、领域知识覆盖,它对模型本身的推理天花板几乎没有提升。更关键的是,微调一旦做了,你的迭代周期就从"改一段提示词跑一次"变成了"训练一个版本跑一轮评估",灵活性大幅下降。所以我的经验是:模型层尽量用现成的,把它当固定容器来选,而不是当橡皮泥来捏。
打个比方,模型层就像一台发动机的排量,输入处理层是你踩油门的深度和进气量,输出处理层是传动和转向系统。发动机排量定了,车跑多快不完全由它决定,会踩油门、会换挡的人开同一台车能开出完全不同的效果。市面上那些"同样一个模型,两家产品体验天差地别"的情况,原因十有八九不在发动机,而在那两层。
1.3 理解模型层边界,能帮你少花冤枉钱
我见过不少团队,效果一不好就喊着要换"更强的模型",或者要自己训练一个。结果换了模型之后问题还在,因为问题压根不在模型层。把这三层分开看,最大的好处就是:当效果不好时,你第一反应不是"它是不是不够聪明",而是"我喂进去的信息对不对、它吐出来的东西我有没有接好"。
模型层的存在意义反而很直接:你只需要知道它支持什么、不支持什么。比如某个模型支持较长上下文,你就可以放心在输入层做长文本拼接;某个模型支持结构化输出模式,你就能在输出层减少很多解析工作;某个模型对某些指令格式特别敏感,你就得在输入层适配它的"脾气"。说白了,模型层不是用来创新的,是用来被适配的。
2. 输入侧的十八般武艺:Prompt、RAG、Agent规划,本质都是"把信息塞得更聪明"
标题里那句"输入什么"绝对不是一句废话。大模型自己不会主动去翻资料、不会记住上周的对话、也不会自动理解你的业务术语,它只能看到你喂给它的所有信息。所以输入处理层做的所有事情,翻译过来就一句话:决定上下文窗口里到底放哪些内容、以什么顺序放、用什么格式放。
2.1 输入侧能塞的东西比你想的多得多
很多人一提输入就想到"写提示词",其实提示词只是输入的一部分。一段完整的输入可能包含:
- 系统提示词:给模型设定角色、任务边界、全局规则。
- 用户消息:当前这轮用户真正想问的问题。
- 少样本示例:给模型几个"照着做"的标准答案样例。
- 检索片段:RAG流程里从知识库捞出来的相关文档。
- 工具说明书:Agent场景下可用工具的清单、参数、适用场景。
- 历史对话:把之前的聊天记录当作上下文拼回来。
- 多模态内容:图片、音频转换后的输入token,甚至文档解析后的文本。
这每一类东西都是输入侧的"变量",也都是你能优化的抓手。我见过一个特别典型的产品:同一个底层模型,A公司做出来像个认真又啰嗦的助手,B公司做出来像个惜字如金的工具。两者差的不是模型,而是系统提示词里那几百字的设定差异。
2.2 逐个拆解:这些"新花样"其实都是输入功夫
先说RAG。很多人觉得RAG是"让模型联网查资料",其实RAG的核心理念是把外部知识变成输入的一部分。它做的事情是:根据用户问题去知识库里检索出相关片段,然后把片段和问题拼在一起送给模型,并告诉模型"请基于以下材料回答"。模型本身并没有变,它只是"看"到了本来看不到的资料。所以你优化RAG时,优化的是检索质量、片段排序、拼接方式,这些全是输入处理层的事。
再说Agent。Agent看起来特别高级:模型会自己规划任务、调用工具、等待结果、继续下一步。但你拆开一看,Agent的第一轮动作其实就是输入侧注入了一份"工具使用手册"——模型看到的是一大段描述,说清楚有哪些工具、每个工具能干什么、参数长什么样。模型输出"我想调用工具A,参数是X",系统再去真正执行这个工具。这里面模型负责的部分仍然只是"输入-输出",真正的工具执行是在模型之外的代码里完成的。
还有思维链。让模型"一步步思考"看起来像是解锁了隐藏能力,实际上它也是输入侧的咒语。你只是在输入里加了"请按步骤推理"这一句话,改变了模型next token的生成分布,让它不急着给结论而是先生成推理过程。推理过程本身占用了输出token,却显著提高了答案质量。这是输入侧低投入高回报的典型例子。
2.3 上下文窗口是稀缺资源,怎么分配是门手艺
输入侧最容易犯的错就是"塞得越多越好"。上下文窗口虽然越来越大,但它是有限的,而且每一寸都花钱、花时间。塞满之后,模型对关键信息的注意力会被稀释,回答质量反而下降。
我自己做知识库问答时踩过这个坑。一开始为了让模型"充分理解",我把整份文档都塞进上下文,结果它回答起来啰嗦且抓不住重点。后来改成:先检索,再把命中的段落按相关度截断、重排,只保留最相关的一两个片段,并明确告诉模型"只基于这些片段回答,不知道就承认不知道"。效果立刻提升一大截,成本和时延还降了。
输入侧的设计原则我总结成三条:
- 相关性优先:宁可少给,也不要给无关内容稀释注意力。
- 指令明确:告诉模型"你是谁、要做什么、输出格式、禁忌是什么"。
- 示例胜过说教:与其描述"要简洁",不如给一个"简洁的标准答案"让它模仿。
2.4 实操示例:一个会议纪要助手的输入设计
假设你要做一个"会议纪要助手",输入侧的第一次设计大致是这样的:
- 系统提示词:你是会议纪要助手,负责把口语化的会议录音转成结构化纪要。你要提炼决策、行动项、负责人和截止时间,不要添加原文没有的信息。
- 用户消息:以下是一次项目周会的录音转写文本……
- 少样本示例:给一个"从文本到纪要"的完整示例,展示输出结构。
- 约束:如果某个行动项没有明确负责人,标记为"待确认"。
这样一套输入下来,即使底层模型没变,输出的稳定性和可读性也会明显变好。如果还不行,再检查是不是录音转写文本太长导致中间关键信息被稀释,考虑分段处理或先摘要再整理。你看,这些优化全都在"输入什么"这个筐里。
3. 输出侧的硬功夫:模型吐出来的只是Token流,离"可用结果"还差十万八千里
输入侧的活儿做完了,模型会吐出一串文本。如果直接把这段文本当结果用,那你就浪费了输出侧这片巨大的优化空间。我说句实话:很多AI产品最后拼的不是谁的模型好,而是谁把模型输出接得漂亮。
3.1 解析是第一步:模型给的JSON不一定是合法JSON
现在开发应用,大家几乎都会让模型输出JSON,因为好解析、好对接。但实际跑起来你会发现,模型经常给你一个"看起来像JSON但其实不合法"的东西:多了逗号、少了括号、里面混了markdown代码块标记、或者它自己在JSON外面加了一句解释。
我的处理方式是永远不信任模型的原始输出,一律走一层解析容错:把输出里的markdown代码块剥掉,再用"牺牲一点精度换成功率"的策略做修复。比如用一个简单的剥离函数先处理,再丢给解析器,如果失败就做轻量修正(去尾逗号、补全括号),最后实在失败就丢弃这轮结果走重试。
import json import re def extract_and_parse(raw): # 去掉可能的 ```json ... ``` 包裹 cleaned = re.sub(r"```(?:json)?", "", raw).strip() # 如果删除后仍不是以 { 或 [ 开头,尝试截取第一个 { 到最后 } start, end = cleaned.find("{"), cleaned.rfind("}") if start != -1 and end != -1: cleaned = cleaned[start:end+1] try: return json.loads(cleaned) except json.JSONDecodeError: return None这套逻辑看着简单,但在生产环境里能救你很多次。你要是直接拿裸输出去做下一步操作,时不时就会被一个多余的逗号搞崩整个流程。
3.2 输出侧最常见的几种"接法"
第一是Function Calling的执行。前面说过,Agent里模型输出的只是"我想调用哪个工具、传什么参数"的JSON,真正的工具执行、网络请求、数据库读写都在模型之外的代码里完成。执行完之后要把结果重新作为输入喂回模型,让模型根据工具返回信息生成下一步动作或最终答复。这就是"输出变输入"的循环,光这一层就能玩出无数产品形态。
第二是结构化校验与兜底。比如你让模型生成一个招聘JD的结构化字段,你得校验它有没有把薪资填进去、字段类型对不对、枚举值合不合法。不合法就触发重试,重试还不行就给默认值,或者转人工兜底。这些逻辑不复杂,但能把系统的故障率从"看运气"变成"可预期"。
第三是多候选策略。遇到重要输出时,可以让模型同一句话生成多次(每次稍微调高temperature,或者随机扰动其中的表达),然后投票选最优,或者用规则挑最合理的。这个思路在常识推理类任务上相当管用,本质上是用输出侧的成本换取稳定性。
第四是让模型自己检查自己。简单说就是多跑一轮:先生成初版答案,然后在输入里加一句"请检查上面的答案有没有错误,并输出修正版"。很多推理错误在这种"反思循环"里能被纠正。注意,这已经涉及输出侧和后一轮输入侧的联动,再次证明三层之间是循环而非单向管道。
3.3 输出侧实操示例:翻译工具的后处理管线
我自己做过一个翻译工具,最初真以为"模型翻译能力强"就万事大吉,后来发现用户骂得最多的恰恰是输出侧:
- 模型的译文里偶尔出现HTML标签错位,必须用规则把标签先占位、翻译完再还原。
- 产品要求某些专有名词不允许翻译,必须在输出侧做术语替换和还原检验。
- 模型可能输出半句话就停止,需要检测并触发"续写模式"或重试。
- 流式输出时,片段切在半个词中间可能导致前端渲染抖动,需要buffer一小段再平滑输出。
这些工作没有一个是"让模型更聪明",全是输出侧的整理、校验、修复和渲染。但它们共同决定了用户感受到的产品质量。一个模型能力相同但输出管线精细的产品,和一个直接展示裸输出的产品,用起来完全是两个体验。
3.4 输出侧不能干什么
把输出侧捧得太高也会出问题。它只能做整理、校验、筛选、循环调用,它不能无中生有地提升模型的智力上限。如果模型根本没理解任务,你后处理写得再花哨也只是在包装错误答案。所以我的判断标准是:先看输入侧有没有把信息给够,再看输出侧有没有把模型的能力真正接住,最后才考虑是不是模型层天花板的问题。
4. 把最近流行的AI玩法全放进这个框架走一遍,几乎没有例外
光讲抽象概念容易飘,我拿现在市面上常见的几种AI应用玩法逐一拆给你看。拆完你会发现,所谓"新花样",确实就是标题那句话:只在输入什么、输出怎么处理。
4.1 一张表看穿主流玩法
| 玩法 | 输入侧到底做了什么 | 输出侧到底做了什么 |
|---|---|---|
| 知识库问答(RAG) | 检索相关文档片段,拼进上下文,要求基于片段作答 | 把回答按引用要求格式化,校验引用来源是否真实存在 |
| Agent自动任务流 | 注入工具清单、目标描述、历史步骤,让模型选择下一步 | 解析"想调用哪个工具"的结构化JSON,执行工具,把返回结果重新喂回 |
| 复杂推理(思维链) | 要求模型先逐步推理再给结论 | 从输出中截取最终答案,或让模型检查上一步结果并修正 |
| 多智能体辩论 | 把上一个模型的输出作为下一个模型的输入,设定不同角色立场 | 汇总多个输出内容,用投票或评分选出最优结果 |
| 陪伴/闲聊类产品 | 把角色人设、性格、记忆片段写进系统提示词 | 流式返回聊天文本,做安全过滤、敏感词拦截、话题兜底 |
| 多模态识别 | 把图片、音频转成多模态token拼进输入序列 | 把识别结果转成自然语言描述或结构化坐标JSON |
你看,每一行都逃不出"输入处理+输出处理"这个循环。唯一看起来比较特殊的模型侧,也就是模型本身的多模态能力和推理能力,实际在你开发应用时也是被当作固定容器来用的。
4.2 现在很多"组合玩法"也是同一套循环
有人可能会说,现在好多产品是RAG+Agent+思维链+多模型投票一起上,复杂得很,单看这张表是不是太简化了?确实复杂,但你把它拆成一环一环的看:输入层决定每一轮喂什么,模型层一次性处理,输出层决定这一轮结果怎么解析、要不要触发下一轮。下一轮开始时,上一轮输出又成了这一轮输入的一部分。
这就是为什么我会跟团队里的人说,不要被名词吓住。你看到一个新AI功能,别先看PPT上的架构图,先问两句话:它往模型里塞了什么以前没塞过的信息?它把模型吐出来的东西做了什么以前没做过的处理?这两个问题问完,90%的功能你已经知道怎么实现了。
4.3 所谓"提示词工程师"和"AI产品经理"的差别,也在这两层
懂输入的人只会写Prompt,懂输出的人会搭一套完整的解析、校验、循环调用管线,两者结合才是合格的AI应用开发者。市面上有些团队特别会写Prompt,产品demo看着惊艳,但一上生产就崩——因为输出侧没做兜底,模型的随机性直接暴露在用户面前。另一些团队把输出管线搭得很稳,但输入侧粗糙,用户问法稍微绕一点就答非所问。真正做得好的产品,一定是输入输出两侧都在抠细节。
5. 实际做AI功能时,按这三层定取舍:先动哪一层收益最大
我遇到过很多次这样的对话:产品经理跑过来说"模型的输出不够好,要不要换个模型",或者"能不能多训练一版"。我一般会先拦住他,然后带着他把问题按三层过一遍。这样做的好处是,大部分问题根本不需要换模型,甚至不需要动模型层的任何东西。
5.1 我的决策顺序几乎固定
接到一个"效果不好"的反馈时,我会按这个顺序排查:
- 第一步,检查输入侧。任务描述是否清晰?有没有给足上下文?输出格式有没有约定清楚?有没有给示例?如果模型"不知道该干什么"或者"抓不住重点",八成是输入侧的问题。
- 第二步,检查输出侧。原始输出有没有被正确解析?有没有校验?失败重试了吗?如果模型理解对了但"交出来的东西没法用",那是输出侧的问题。
- 第三步,再考虑模型层。输入输出都做到位了还是差,才考虑换更强模型、微调、或者换一个更适合任务的模型系列。
这个顺序背后是成本逻辑。改输入侧几乎零成本,改输出侧是工程成本,换模型是集成成本加可能的API费用上升,微调是训练成本加后期维护成本。按这个顺序来,每一步都能快速验证,不会一上来就把自己逼进高风险高成本的选项里。
5.2 一个真实的取舍案例
我之前做过一个"格式化写作助手",用户给一段随笔,要求改写成某个固定格式的公众号文章。第一版上线后,bad case集中在两个地方:一是改写后偏离原文事实,二是输出偶尔不是要求的格式。
我先把bad case分成两类:偏离事实的问题,多数发生在输入侧——用户给的文章很长,模型注意力被中间几段带偏了。解决方式是改成分段处理:先把全文按段落拆开,做关键信息抽取,把抽取结果和核心论点作为输入喂给模型,而不是把整篇原文直接塞进去。格式不对的问题,则落在输出侧:我让模型先输出JSON,再由前端渲染成文章,但模型偶尔会输出非法的JSON。解决方式是加了解析容错和超时重试,并在渲染前做一次scheman校验。
一轮改下来,bad case明显减少,而且整个过程没有换模型、没有微调,只动了输入侧的组织方式和输出侧的管线。这种案例在我项目里反复出现,基本成了标准动作。
5.3 怎么量化判断"改有效果"
很多团队优化都是凭感觉,我建议建立一套最简单的评估集:收集50到100个典型bad case,每次改动后跑一遍,记录"通过率"。改输入、改输出、换模型,都用这同一套测试集对比。这样一来,哪个层的改动带来多少提升,一目了然。
我自己习惯给每个bad case打标签:"理解错误"(输入没给清楚)、"格式错误"(输出没接好)、"能力不足"(模型真的不会)。标签比例决定了该往哪一层使劲。如果"理解错误"占八成,那你去换模型就是浪费钱;如果"能力不足"占八成,你再优化输入输出也只是隔靴搔痒。
5.4 两个容易走极端的坑
一个是提示词万能论。有些人疯狂堆提示词,把各种规则、例子、负面清单全塞进系统提示词,结果上下文被塞满,模型反而变笨。提示词优化是有天花板的,到一定程度后边际收益趋近于零,这时候去做输出侧结构化、去做检索优化,比继续堆字有效得多。
另一个是把后处理当拐杖。后处理能修复格式错误、能补默认值、能多轮重试,但它盖不住模型理解跑的偏。如果你发现大多数bad case都被后处理"打补丁"打过去了,那其实是在用工程复杂度掩盖输入侧的根本问题,迟早会出事。
6. 三层框架的边界:哪些AI创新不在这张棋盘上,以及归来之后我还是这么用
把这套三层框架说得这么顺,我也得讲讲它的边界,免得有人把它当成解释一切的工具。毕竟我自己刚想明白这个框架时,也曾经试图用它解释所有现象,碰了几次壁才搞清楚哪些东西确实不在这个棋盘里。
6.1 模型层内部的创新,不属于应用层这个棋盘
最典型的就是大模型本身的代际跃迁:预训练技术改了、数据规模涨了、模型架构换了、对齐方法变了,这些会让模型凭空变聪明,跟输入输出处理没有直接关系。如果你做的是基座模型训练、微调、对齐这类工作,那三层框架帮不上你太多忙,你所在的层级本身就是它的底座。
但对绝大多数做应用、做产品、做工具的团队来说,模型层的改变属于"外部环境变化",不是自己可控的优化抓手。你只需要跟上选型,不需要在这层纠结。
6.2 上下文工程会是下一阶段的主战场
随着模型能力越来越强,反而是输入输出两侧的处理方式会变得越来越精细。我最近在琢磨的方向是"上下文工程":怎么用最少的token装下最多的有效信息,怎么做上下文压缩和记忆分层,怎么在长会话里动态决定哪些历史该留、哪些该丢。这个方向本质上还是输入输出层的学问。
比如长对话机器人,记忆管理就是个很典型的输入侧问题。你不能把全部历史都塞进去,得提炼出"用户偏好""最近聊的话题""还没办完的事"这些硬信息,其余细节丢掉或摘要化。模型自身并没有变,但用户的体验差异会非常大。
6.3 常见误区:框架不是万能钥匙,但它是很好的第一反应
我一再强调,这个三层框架不是用来吹牛的,是用来快速定位问题的。它最大的价值在于,逼着你在说"模型不行"之前,先去检查自己"有没有喂好、有没有接住"。在实际项目里,这种第一反应直接决定了优化效率。
有一次我的小团队要做涉猎多领域的智能客服,一开始总是挨骂说"回答不专业"。大家第一反应都是"换个更强的模型"。我拦住了,先看输入侧:我们把几十篇业务文档的片段按原样塞进上下文,没有做归纳和优先级处理,模型经常被无关段落带跑。改成检索后先做摘要再拼接、并且明确指定每段文档的适用范围,效果立刻改观。这就是一个特别朴素的例子:问题根本不在模型层,而在于输入材料组织得不够好。
6.4 最后说点实际的
如果你现在正被某个AI功能的效果问题折磨,我的建议是:别急着否定模型,先画一张三层草图。左边写"输入侧做了什么",中间写"用的哪个模型",右边写"输出侧做了什么"。关键看输入侧和输出侧是否真的做到了当前能做的极限。大多数情况下你会发现,要么输入没喂好,要么输出没接住,真正轮到换模型的反而没几个。
把每个AI功能都想成"输入管道+模型+输出管道"三个组件,你的迭代速度、成本控制、团队沟通效率都会明显上一个台阶。我自己就是靠这套思路,一次次从"效果玄学"里爬出来的。希望这篇拆解对你也有同样的用处。