做了这么多年 RAG 项目,我越来越确定一件事:Demo 和真正能上线的企业级系统之间,隔着的不是模型效果,而是工程化差距。 很多团队在本地跑通了一个 rag 知识库,就觉得大功告成,结果一接真实业务数据就四处碰壁——权限管不住、检索老召回不该召回的内容、测评只能靠人工一条条看、向量化流程乱成一团。这篇是企业级 RAG 完整项目的拆解,我尽量把从架构设计到落地运维的每个关键环节都讲透,适合那些已经跑通过 rag 增强检索、准备把系统推向生产环境的团队做参考。
企业的 RAG 系统从来不是“文档进、答案出”这么简单。它背后涉及数据接入层、向量化流程、多路召回策略、embedding 与 rerank 的排序链路、权限卡控、评估体系,甚至要和现有业务系统做集成。这一篇我会围绕一个虚构但非常典型的“企业知识库助手”项目来展开,把每个模块为什么这么设计、哪里容易踩坑、怎么评估效果,都按实际项目的推进节奏讲清楚。
1. 企业级 RAG 不是“大号 Demo”:架构层面的核心差异
1.1 从单机问答到多环境服务的质变
很多入门教程教你的 RAG 是这样一个链路:加载文档 → 切分 → embedding → 存入向量库 → 用户提问 → 向量检索 → 拼接 Prompt → 调 LLM → 返回答案。这个链路本身没错,但它在企业环境里只能算“最小可行模型”。
真实的企业级 RAG 项目,一开始就要处理几个单机 Demo 永远不会遇到的问题:数据分散在多个业务系统里,格式五花八门;不同部门的人对同一份文档的可见范围不同;检索结果需要保证时效性,新文档入库后要能立刻被检索到;系统上线后谁来监控效果,出了问题怎么回溯。
我参与过的项目里,最典型的场景是一个集团型企业的知识库,涉及制度文件、产品手册、项目文档、客服话术四类数据源,用户有三种角色,每种角色能看的数据范围不一样。如果只是简单地把所有文档切块、向量化、丢进同一个 collection,那上线第一天就会出安全事故——基层员工可能检索到薪酬制度里的敏感附件。
1.2 企业 RAG 必须拆解的六大模块
以一个标准的企业级 rag 知识库项目为例,我通常会把系统拆成六个模块,每个模块独立部署、独立迭代:
| 模块 | 核心职责 | 关键技术点 |
|---|---|---|
| 数据接入层 | 对接不同数据源,拉取增量数据 | 定时任务、消息队列、API 集成 |
| 文档预处理 | 格式解析、去重、切分 | 多格式解析器、版面分析、语义切分 |
| 向量化与存储 | 生成 embedding,写入向量库 | embedding 模型选型、向量索引参数 |
| 检索层 | 多路召回、粗排、精排 | dense vector search、关键词检索、rerank |
| 生成层 | 基于检索结果构造 Prompt,调用 LLM | Prompt 模板管理、上下文压缩 |
| 评估与运维 | 评测效果、监控链路、权限管理 | 评测集、追踪日志、权限中间件 |
这六个模块里,前两个决定了 RAG 系统的“食材”质量,中间两个决定了“找菜”的能力,最后两个决定了“上桌”的体验。很多项目在检索和生成上反复调优,效果却始终上不去,回头一看,问题出在文档切分和 embedding 选型这些最基础的地方。
我在规划模块拆分时有一条经验:每个模块都要能单独做单元测试和效果评估。 数据接入层能不能拿到增量文件,预处理层的切分结果是否符合业务语义,检索层的召回率是多少,生成层的答案忠实度如何——每个环节都应有明确的量化指标。这样才能在效果出问题时快速定位瓶颈,而不是靠猜。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 数据底座:知识库构建的质量决定检索天花板
2.1 文档接入与切分策略
很多团队在文档切分上栽过跟头,包括我自己。早期项目里,我们直接按固定字符数(比如 500 字符)切分 PDF,结果一份合同被拦腰截断,条款的“如果……则……”关系被切断,检索时召回的是半句话,LLM 自然给不出完整答案。
后来我们才彻底明白一个道理:切分不是“分块”,而是“保持语义完整性的最小存储单元设计”。 切分粒度太粗,单块内容过长,向量检索时语义被稀释,召回精度下降;切分粒度太细,上下文被割裂,Retriever 召回的块缺少必要的背景信息。
比较靠谱的做法是按“结构 + 语义”双重规则切分。具体来说:
- 先用版面分析(Layout Analysis)识别出标题、段落、表格、页眉页脚;
- 以标题层级作为天然的切分边界,优先保证同一小节的内容完整;
- 对过长的小节(比如超过 1500 字),再在句子边界做二次切分,并保留一小段上下文重叠(overlap 控制在 50-100 字左右);
- 表格数据尽量单独提取,按“表头 + 行内容”的方式转成 Markdown 格式再切分,别让表格被切得七零八碎。
这里有个很容易忽略的细节:切分策略要和下游的检索方式联动设计。 如果你的检索单位是“小节”,那么存入向量库的应该是小节级别的文本,而不是更细的句子级片段。句子级片段做召回会很准,但拼给 LLM 时往往缺上下文。比较稳妥的做法是“小块召回、大块给全”——向量库里存句子或小段,检索命中后向上回溯到完整的章节再拼接给 LLM。这个模式很多 rag 框架里叫 parent document retriever,属于一种比较推荐的工程实践。
2.2 向量化的工程细节:embedding 模型选型与向量库选型
embedding 选型是 rag 向量化流程里最容易被忽视又最影响效果的一环。一个经验法则是:如果领域性很强,通用 embedding 模型的效果大概率不够。 比如政务领域的文件,里面大量使用“放管服”“一网通办”“双随机、一公开”这类固定表述,通用模型可能把它们编码成比较泛的语义,导致检索时召回顺序偏移。
所以我的建议是分三步走:
- 先用主流的通用 embedding 模型(比如 BGE、M3E、OpenAI 的 text-embedding-3 等)跑一版基线;
- 准备几百条领域内的“问题-相关文档片段”配对数据,做一次小规模评测,看召回率是否达标;
- 如果召回率不满意,优先尝试领域微调 embedding 模型,而不是直接换更大的模型——微调成本可能远小于你的预期(几百条数据就能有明显改善)。
向量库的选择也是一样,先明确需求再选型,别盲目追求分布式能力。 我见过一个团队为了“上企业级”这个面子问题,直接上了分布式向量数据库,结果单机场景下延迟反而更高,运维复杂度也上来了。传统的 ES 结合 dense vector search 功能,或者像 Milvus、Qdrant 这类专用向量库,都值得评估。核心看三点:数据量级、QPS 要求、是否已经存在于你的技术栈中。
这里重点说说索引参数。以 HNSW 索引为例,有两个关键参数直接影响检索效果和资源消耗:
M(每个节点的最大连接数):值越大,召回精度越高,但内存占用和构建时间也增加。一般从 16 开始调,数据量超过千万级再往上加;ef_search(检索时的动态候选集大小):值越大,召回越全,但延迟变高。常见的做法是在召回阶段设一个较大的 ef_search,比如 100-200,保证召回率,再靠后面的精排把精度拉回来。
我在项目里还发现,很多人会忽略 embedding 向量的归一化。如果向量库默认没有做归一化,而你的检索代码又用余弦相似度计算,计算结果是错的。这个问题排查起来非常隐蔽,因为“看起来在跑,只是效果差一点”。建议在向量化流程里显式统一归一化,避免埋雷。
2.3 多路召回:为什么不能只靠向量检索
dense vector search 擅长语义匹配,但它有一个明显短板:对精确的术语、编码、编号不敏感。 用户搜“GB/T 19001 最新版本”,向量检索很可能召回一堆“质量管理体系”相关但不含精确标准号的内容。反过来,关键词检索(BM25 或 ES 的全文检索)能精准命中术语和编号,却对同义改写束手无策。
这就是 rag 多路召回存在的意义。在真实项目里,我们通常会同时跑两到三路召回:
| 召回路 | 原理 | 擅长场景 | 短板 |
|---|---|---|---|
| 向量召回 | 语义相似度 | 自然语言问句、同义表达 | 精确术语、编号不友好 |
| 关键词召回 | BM25 / 全文检索 | 标准号、产品型号、专有名词 | 无法处理同义改写 |
| 元数据过滤 + 向量召回 | 先按业务属性过滤再向量检索 | 有明确部门、文档类型限定 | 依赖元数据质量 |
多路召回的工程实现并不复杂,难点在于各路召回的分数怎么统一、怎么合并。向量相似度是 0 到 1 的浮点数,BM25 分数是没上界的原始分,直接把两路结果混在一起排序没有意义。我们的项目里采用了两段式方案:各路先各自取 Top-N(比如每路 20 条),送入 rerank 模型做统一的精排,最终按精排分数取 Top-K。这样既绕开了跨路分数归一化的问题,也让精排环节有机会纠正召回的误差。
关于召回里的“权限卡控”,我放在后面单独说,因为它是企业级 RAG 和普通 RAG 之间最明显的一道分水岭。
3. 检索优化:从 Top-K 到 Rerank 的排序链路
3.1 粗排:为什么 Top-K 不该拍脑袋定
很多博客里的示例代码直接写 top_k = 5,这纯属偷懒。Top-K 的选择应该基于你对数据分布和用户行为的两点判断:一是单条知识片段能覆盖多少信息量,二是用户提问通常涉及几段知识。
我的经验是,在知识片段平均 300-500 字的场景里,Top-K 通常取 8-15 之间比较合适。太小了,可能漏掉关键信息;太大了,塞进 Prompt 的噪声内容会干扰 LLM 生成质量,还会拉高 token 消耗和延迟。如果你用了“小块召回、大块给全”的模式,向量检索阶段的 Top-K 可以适当调大(比如 20),因为后面还有 rerank 和上下文拼接两道关卡在把关。
粗排阶段还有一个容易被忽略的点:召回分数本身就是一个可用的 debug 信号。 如果用户问一个很明确的问题,但召回的 Top-1 分数只有 0.5,说明 embedding 模型对这个领域问题的区分度不足,或者切分粒度有问题。我习惯在日志里记录每路召回的分数分布,定期观察,低于阈值的问题会暴露出来。
3.2 精排:Rerank 模型怎么选、怎么接入
说个反直觉的结论:在多数企业级 RAG 场景里,加一个 Rerank 模型带来的效果提升,比换更大的 LLM 更明显。 原因是检索阶段的问题和文档片段之间,相似度并不完全等价于“相关”。Rerank 模型专门学习“给定 query,这个 passage 是否真正相关的判断”,是 cross-encoder 结构,没有 embedding 的独立编码过程,精度比双塔结构的召回模型高一个量级。
选型上,目前主流选择包括 BGE-Rerank、Cohere Rerank 等,开源社区也出现了很多针对中文优化的 rerank 模型。我建议在自己的评测集上跑一下,别直接看排行榜——国产模型在公开榜单上的分数看着高,落到你的领域数据上未必更好。
接入的方式有几种:
- 作为独立服务:把 rerank 模型单独部署成一个 HTTP 服务,检索链路通过 API 调用。好处是解耦,模型升级不影响主服务;
- 作为插件:LangChain、LlamaIndex 这类 rag 框架大多内置了 rerank 组件,直接配置即可接入。适合快速验证。
实践里我们还做了一个优化:只在召回结果超过一定数量时才做 rerank,如果某路召回只有 2-3 条,直接全部进 Prompt,不做精排。 这样能节省一部分延迟。注意这里的前提是召回结果都通过了初步的分数阈值,否则可能把噪声带进 Prompt。
3.3 混合检索的权重调优与动态策略
有了多路召回和 rerank 以后,还有一个细节问题:到底以哪一路为准?
有些团队做混合检索时,会给向量召回和关键词召回各设置一个权重,比如 0.7 和 0.3,加权求和后取 Top-K。这个方案简单直观,但在实际项目中有一个很大的坑:权重是静态的,而不同用户、不同问题的偏好完全不同。用户搜“打印机驱动下载”时关键词匹配的价值很高;用户搜“帮我写一份报销流程说明”时又主要依赖语义理解。
所以我更推荐另一种策略:以 rerank 为最终仲裁,各路召回只是候选集的生产者。 权重问题被彻底绕开,你只需要保证每路召回的质量足够好,把“哪条更相关”的判断交给 cross-encoder 的 rerank 模型去做。
这个策略说起来简单,落地时有一个容易踩的坑:如果某一路召回结果特别多,会挤占其他路的候选名额。 所以各路在进入 rerank 前都要设置自己的候选数量上限,比如向量路和关键词路各 20 条,保证 rerank 的输入池里两路来源均衡。
4. 从普通 RAG 到高级形态:Graph RAG、Ontology RAG 与 Agentic RAG
4.1 Graph RAG:实体关系驱动的检索
做一个稍复杂的企业知识库时,普通向量检索就会出现一个尴尬局面:用户想了解的是一个跨文档的“关系网”,不是单篇文档里的一个片段。 比如“我们公司和 A 供应商之间签过哪些框架协议,涉及哪些产品的交付条款”——这个问题要关联合同文档、产品名录、供应商档案三份材料,纯靠向量检索很难把这些信息串联起来。
Graph RAG 的做法是:在离线阶段用 LLM 从文档里抽取实体(公司、产品、条款等)和关系(供应商、签署、包含等),构建一张知识图谱;检索时先通过关键词或向量定位起始实体,然后在图结构上做遍历扩展,把相关的多跳信息一并取回。
我在实际项目中体会到,Graph RAG 不是用来替代向量检索的,而是用来补充“多跳关联”这个向量检索做不好的场景。 架构上,它更像是检索层的一条独立召回路线。用户问单一事实性问题时走向量路,问关系型、汇总型问题时走图路。
Graph RAG 的落地成本不低,核心瓶颈在知识抽取的质量。LLM 抽取的实体关系如果不做人工校验,直接入库,会产生大量错误边,检索时沿着错误的边扩展,结果会很离谱。比较务实的做法是,先限定一个较小的业务子域(比如只抽取“供应商-合同-产品”三类实体和“签署、包含、授权”三种关系),用规则兜底 + LLM 抽取 + 少量人工抽检,把图的质量控制在可接受范围。
4.2 Ontology RAG:领域语义约束的显式建模
Ontology RAG 是 Graph RAG 的一个进阶变体,但它的核心思想不同:Graph RAG 关注“实体间的关系”,Ontology RAG 关注“领域概念的结构化定义”。说人话就是,Ontology 定义了这个领域里有哪些类别的概念、每个概念有哪些属性、概念之间有什么层级关系,相当于给大模型画了一张领域知识地图。
在企业场景里,Ontology RAG 的价值在于约束检索范围,降低意图漂移。 比如政务领域的知识库里,用户问“办事需要什么材料”,如果没有 Ontology 约束,系统可能去召回所有提到“材料”的文档,包括建材采购指南。但如果 Ontology 里定义了“政务服务-办事指南-材料清单”这个语义路径,检索时就能优先沿着这个路径走。
实现上,Ontology 可以是简单的 JSON Schema,也可以是更规范的本体描述语言。最轻量的落地方式是在数据入库时给每个文档打上“域标签”,检索时结合标签做过滤,这本质上就是一种弱化的 Ontology 约束。更进一步,可以用 LLM 将用户问句映射到 Ontology 中的概念节点,再基于映射后的节点去检索对应子图,这是 Ontology RAG 的完整形态。
4.3 Agentic RAG:把检索过程交给 Agent 编排
Agentic RAG 是最近特别火的一个方向,核心区别在于:传统 RAG 的检索链路是“query → 固定检索 → 固定生成”,Agentic RAG 把检索环节交给大模型自主编排——它可以决定先搜什么、要不要改写 query、搜完一版不满意是否再搜一版、是否需要调用外部工具。
我在自己的项目里试了三种典型场景,Agentic RAG 确实有不可替代的优势:
- 复杂多跳问题:比如“对比一下 A 和 B 两套方案的适用场景和成本”,Agent 可以先搜 A,再搜 B,然后做对比分析;
- 信息不全需要补充检索:第一轮召回结果不足以支撑回答时,Agent 可以基于已有信息生成新的搜索词,做二次检索;
- 跨数据源聚合:需要同时查知识库和外部 API(比如查天气、查库存)时,Agent 能做统一的工具调度。
但我也要泼一盆冷水:Agentic RAG 上线前必须做好“检索轨迹”的透明化。 否则用户看到的是一个黑盒——它为什么检索了这几个问题?为什么最后没引用最关键的那份文档?我们项目里要求 Agent 的每一步检索动作都记录到链路日志中,并在前端给用户展示“检索过程”的折叠面板。这样做既是为了排查问题,也是为了增强业务方对系统的信任感。
5. RAG 评测体系:不测准就上线,等于裸奔
5.1 评测指标:召回率、忠实度、答案相关性的量化方法
rag 测评怎么做,这个问题几乎每个团队都会问。我见过最简单粗暴的做法是“扔给业务同事问十个问题,看看回答像不像样”。这种评测方式的随机性太大,换个提问方式效果可能就天差地别。
企业级 RAG 上线前后,我建议至少关注四个维度:
| 维度 | 量化指标 | 衡量方式 |
|---|---|---|
| 检索质量 | Recall@K | 标准答案涉及的知识片段是否出现在检索结果前 K 条中 |
| 答案忠实度 | Faithfulness / Citation Accuracy | 生成的答案是否严格基于检索到的内容,有没有编造 |
| 答案相关性 | Answer Relevance / Useful Rate | 答案是否回答了用户的问题,有没有跑偏 |
| 端到端效果 | 人工打分或 LLM-as-Judge | 综合体验评分,通常用 1-5 分 |
这里重点说两个容易被忽略的细节。
第一个是 Recall@K 的计算需要“答案片段标注”。也就是说,评测集里的每一条问题,都要标注“正确答案来自哪几个知识块”。这个标注工作很费人力,但它是整个评测体系的地基。我们项目里用半自动方式:先用当前系统跑一遍检索,人工挑出被漏掉的知识块,再把这些标注并入评测集,持续迭代。
第二个是 忠实度测评不能只看“答没答对”,还要看“引没引对”。LLM 完全可能用检索到的信息正确回答了问题,却引用了一份不相关的文档。这种情况在人工体验时很难发现,但对“答案可追溯”要求很高的企业场景(比如法务、政务)来说,是致命问题。我们现在的做法是要求生成层必须输出引用来源,并单独评测“引用与回答的一致性”。
5.2 测试集构建与评测工具
测试集不是一次性建完就放着吃灰的。我建议按“分层”的思路来构建:
- 功能层:覆盖基本问答场景,验证系统能不能跑通,大概 100-200 条;
- 边界层:覆盖多跳问题、否定问题、模糊问题、超长问题,大概 50-100 条,专门用来发现系统短板;
- 领域层:覆盖业务方最关心的典型场景,由业务专家提供真实用户问题,100 条左右;
- 回归层:每次迭代后全量跑一遍,确保优化 A 功能没有破坏 B 功能。
评测工具方面,开源社区已经有不错的方案,像 RAGAS(检索评估框架)、TruLens 等,都支持召回率、忠实度、答案相关性等维度的自动评估。但我的经验是:自动评测指标只能做筛选,不能做最终裁决。 尤其在领域性强的场景里,LLM-as-Judge 的评分标准需要先做一轮人工校准,判断它和业务方的人工打分是否一致,否则会出现“机器觉得很好、业务觉得不行”的尴尬局面。
5.3 评测结果如何反哺系统迭代
评测体系真正的价值在于定位问题出在哪个环节。我把这个归因过程总结成一张决策路径供参考:
- 如果 Recall@K 低:问题大概率出在 embedding 模型、切分策略、或召回路数不够多。优先排查这三点,而不是去改 Prompt;
- 如果 Recall@K 正常但 Rerank 后排前的答案不对:问题出在 Rerank 模型或候选池的均衡性上,考虑更换模型或调整各路候选数量;
- 如果 召回对但生成错:问题出在 Prompt 模板、上下文拼接方式或 LLM 本身。这时候再去调生成层的策略;
- 如果 生成不忠实:优先检查 Prompt 里是否允许模型臆测、上下文长度是否被截断、多路召回的噪声是否太多。
这套归因逻辑的核心是:每个环节都有独立的评测信号,别用端到端的“感觉”去指导优化。 否则你永远在凭玄学调参。
6. 企业落地的三个关键工程问题:权限、框架选型与运维
6.1 权限卡控:企业 RAG 无法回避的合规话题
rag 的权限卡控,在企业项目里是硬性需求,但很多团队设计时想得太简单。最粗暴的做法是“按用户角色过滤文档”——用户登录系统,拿到自己的角色,检索时在元数据上加一个 role 过滤条件。这个方案实现很快,但存在一个明显的逻辑漏洞:同一份文档里的不同段落,可能分属于不同的权限范围。
举个例子:一份项目验收报告里,项目概述是全员可见的,但财务明细部分只有项目经理和财务人员能看到。如果整份文档打上“部门保密”的标签,那全员可见的项目概述也搜不到了;如果把标签下放到段落级别,又需要在切分和入库时就把权限信息逐段打标,工程复杂度提升一个量级。
我的经验是,权限设计要前置到数据接入层,而不是在检索层临时补救。具体做法是:
- 在文档预处理阶段,结合业务定义的权限规则,给每个知识块打上细粒度的权限标签;
- 检索时,先从用户的身份系统拿到其权限集合,作为检索的强制性过滤条件;
- 过滤不能只做一次。生成阶段的上下文拼接同样要校验权限,防止通过多路召回绕过过滤条件。
这里还有个很隐蔽的坑:Rerank 阶段。 Rerank 模型的输入是候选集,如果候选集里混入了用户无权查看的内容,即使最终没被选中,也可能通过日志或调试接口暴露出来。所以权限过滤必须放在召回之前,而不是排在 rerank 前。候选集就开始过滤,是权限合规的底线。
6.2 工程实现选型:LangChain、Spring AI、Dify 怎么选
做企业级 rag 项目,框架选型经常引发争论。我的判断标准很简单:看你们团队的背景和系统的核心诉求。
- Java 技术栈为主、系统要嵌进现有 Spring 生态的团队,可以优先评估 Spring AI 2.0。它在最近几个版本里对 Rag、向量库和 Rerank 的支持越来越完善,初学门槛不高,和 Spring 的配置体系衔接顺畅。网上有不少 Spring AI RAG 实例教程可以参考,但要注意版本迭代很快,看官方文档比看博客靠谱;
- 快速验证、业务方需要看到效果的团队,Dify 这类平台型工具值得考虑。我做过一个政务 rag 知识库的实践项目,第一版就是基于 Dify 搭的,数据接入、检索配置、Prompt 调试都有界面化操作,团队几乎不用写代码就能跑通全流程。但它的劣势也很明显:深度定制受限,复杂权限和大规模调优不如自己写代码灵活;
- 对效果和自由度要求都比较高、有一定 AI 工程能力的团队,LangChain 这类框架更适合。它能提供完善的组件抽象,但学习曲线陡,而且版本之间 breaking change 不少,需要团队有人能扛住这类问题。
这里我想额外说一句:框架只是工具,数据底座和评测体系才是企业级 RAG 的核心资产。 你可以第一版用 Dify 快速跑通,再逐步把核心模块迁到自研服务上。项目的演进路径比一步到位的选型更重要。
6.3 从 Demo 到生产:链路监控与迭代节奏
最后聊一聊生产环境的运维问题。企业级 RAG 系统上线后,我建议至少在链路里埋三类日志:
- 调用日志:记录每个请求的完整链路,包括 query 原文、召回内容及分数、rerank 结果、Prompt 全文、LLM 输出。这是排查所有问题的基础;
- 效果日志:记录每个请求对应的检索结果、生成答案、用户后续行为(有没有点“没用”按钮、有没有复制答案),用于持续评测和效果归因;
- 异常日志:记录向量化失败、向量库超时、LLM 限流等异常情况。企业级系统的瓶颈往往不在模型效果,而在这些“基础设施级”的稳定性问题上。
迭代节奏方面,我现在比较推荐“小步快跑 + 定期回归”的方式:每个迭代周期围绕一两个明确指标做优化,改完以后全量回归测试集,用数据说话,而不是“感觉上好像变好了”。RAG 项目的效果优化是一个持续收敛的过程,很少有人能一步到位把各项指标都调到最佳。关键是你要有一个值得信赖的评测体系,然后让它在每次改动时给你一个明确的反馈信号。
企业级 RAG 的完整项目,真正的难点从来不是“接入一个 LLM”,而是把知识库这个数据底座打牢、把检索排序这条链路磨细、把权限合规这张网织密。这篇文章里的很多经验,是我在多个实际项目中踩坑踩出来的,希望能帮团队少走一些弯路。如果你们正在规划自己的 rag 知识库项目,最快的上手方式,就是从本文的六个模块出发,先做一版最小可用系统,再逐步补齐工程细节。
