ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

个人开发者LLM全流程实践:从基座选型到QLoRA微调与RAG部署

个人开发者LLM全流程实践:从基座选型到QLoRA微调与RAG部署 有没有想过这样一个问题LLM 这条路真的只有大厂和高校实验室才能走通吗我见过太多个人开发者手里攥着不错的 idea一听到“预训练”三个字就先自己劝退了自己。可实际情况是如今开源社区把一个 7B 模型的预训练权重直接怼到你面前你不需要从零训一个万亿参数的怪兽也能把一个通用模型掰成自己业务需要的形状。再加上 QLoRA 这种把微调门槛砍掉一大截的技术个人开发者完全可以从“调 API”升级到“改模型”这个段位。这篇文章就是我自己的全流程实践复盘从预训练阶段需要理解的底层逻辑、基座模型选型到领域适配、RAG 知识库整合再到推理部署和业务系统集成把每一个环节里真正走通的关键点都摊开来讲。这不是一篇概念科普而是一份可以照着做的工程笔记。如果你手头正好有一个垂直领域的场景不管是做法律问答、医疗辅助、工业文档检索还是给内部 ERP 加一个智能助手这篇文章都值得你读完再动手。1. 先把范围说清楚个人开发者为什么要碰“全流程”我一直觉得“全流程”这个词容易吓到人。一提到 LLM 全流程很多人脑子里浮现的是几千张 A100 组成的集群、上 TB 的清洗数据、几十人的算法团队。但个人开发者的“全流程”完全是另一套玩法核心不是从零复现 GPT-4而是把预训练产物、开源权重、微调技术和 RAG 缝合起来形成一条自己能掌控的链路。1.1 从“用模型”到“改模型”的临界点我在早期项目里也走过纯调 API 的路子。说实话ChatGPT 出来之后的那段时间个人开发者最舒服的状态就是接 API几行代码就能把智能对话接入产品。但用着用着就会发现几个绕不开的问题第一是成本。API 按 token 计费一旦业务量起来每个月账单看着心疼。第二是数据隐私。很多垂直场景尤其是医疗、金融、企业内部知识库数据根本不允许出内网你连 API 都不敢接。第三是效果天花板。通用 API 对你这个特定领域的术语、行话、内部流程一无所知你问它你们公司的 SKU 编码规则它会一本正经地编一个答案给你。当这三个问题同时出现的时候就是你需要“改模型”的临界点了。而改模型的第一步不是一头扎进模型结构里而是搞清楚你手里拿到的预训练权重到底是怎么回事。1.2 个人开发者的资源边界与路线选择我得先泼一盆冷水个人开发者不要试图从零预训练一个大模型这不现实也不划算。预训练需要的数据量、算力小时数和调参周期远超个人能承受的极限。你真正该做的是站在前人的肩膀上把开源预训练模型当作“毛坯房”然后通过领域适配来“装修”。我在实践中把全流程拆成了四个阶段选基座从开源社区挑选一个合适尺寸、合适语言、合适协议的预训练模型。域适配通过继续预训练、指令微调、LoRA/QLoRA 等低成本手段把通识模型变成领域模型。补记忆引入 RAG检索增强生成和知识库让模型能查到私有的、动态更新的知识。落部署通过推理优化、量化、ONNX 导出、网关封装等手段把模型真正跑进生产环境。这个路线图里预训练阶段个人的参与方式是“理解”和“挑选”而不是“训练”。你不需要会写 Transformer 的前向传播但你必须看得懂一个预训练模型的 Tokenizer 长什么样、训练数据配比大概是什么、上下文窗口有多大否则后面适配时你会抓瞎。以我自己跑过的项目为例我最常用的路线就是“一套开源基座 QLoRA 微调 向量数据库 本地推理框架”整套链路跑下来的硬件成本甚至可以控制在几万块以内。这不是什么黑科技就是把每个环节的工具选对、参数调对。2. 预训练视角下个人开发者必须吃透的三个底层问题虽然我们不亲手做大规模预训练但预训练产物的“脾性”直接决定了你后面适配工作的成败。我踩过不少坑之后才意识到做领域适配之前先花几天时间去读懂你的基座模型这笔时间投入绝对值得。2.1 数据配比与 Tokenizer比模型结构更影响适配效果很多人关注模型结构、参数量、注意力头数却忽略了 Tokenizer 和训练数据的配比。其实对于领域适配来说这两个因素才是最该摸清的。Tokenizer 直接决定模型怎么“切词”。中文场景尤其明显一个在英文语料上训练的模型它的分词器对中文的支持往往很糟糕一个成语可能被切成七八个毫无意义的片段。这会导致两个问题一是有效上下文长度被浪费二是模型对中文语义的学习效率低下。所以选基座时我第一件事就是看这个模型的中文 Tokenizer 词表覆盖率跑几个领域句子看一眼切分结果。数据配比则是预训练模型“气质”的来源。代码模型和对话模型的风格差异、通用模型和专业模型的倾向差异本质都是预训练语料配比不同。领域适配的时候你是在这个已经形成“气质”的模型上做增量调整而不是推倒重来所以必须清楚你的基座原本擅长什么、不擅长什么。这里分享一个我常用的验证方法拿基座模型直接跑一批你领域的典型问题观察它在没有任何适配时的表现。如果它连领域术语都认不全说明你需要重点做继续预训练或者至少是深度的指令微调如果它理解语义但回答笼统那 RAG 就能解决大部分问题。这个诊断结果会直接帮你决定后面的精力分配。2.2 损失函数与训练动态判断基座质量的“体检表”预训练阶段的标准目标是交叉熵损失简单说就是让模型学会预测下一个 token。但这里有个有意思的现象预训练损失降得很低的模型并不一定是你做领域适配的好起点。因为预训练追求的是“对海量文本的压缩能力”而你的垂直场景追求的是“遵循指令、调用工具、精准引用知识”这两者之间存在一个 gap。我习惯在做微调之前先观察基座模型的 loss 曲线上是否有异常。比如如果你用一份领域数据做继续预训练loss 在初始阶段如果出现明显反弹说明基座模型和你的数据分布差异太大这时候需要调低学习率、增加预热步数或者先在数据侧做更充分的清洗和格式统一。另外一个值得关注的是困惑度Perplexity指标。虽然它不能完全等同于模型质量但在同一批测试集上对比基座模型和微调后模型的困惑度变化能帮你判断适配是否真的让模型“更懂”这个领域了。2.3 预训练模型的“通用世界知识”如何迁移预训练模型真正有价值的地方不是它背下了多少文本而是它在海量数据中学会了推理、常识、语法、逻辑这类可迁移的能力。你做领域适配时要保住这些能力同时叠加新的领域知识。但这里有个矛盾追求领域能力的提升往往会导致通用能力的下降。这个现象被称作“灾难性遗忘”。我见过不少人把全量参数继续预训练跑了一轮领域效果确实好了但模型突然变得不会聊天了连基本的指令遵循都出了问题。怎么规避我的经验是领域适配时优先选 LoRA 这类参数高效微调方法把对原始权重的改动限制在低秩子空间内如果想做更充分的适配再考虑混合训练也就是领域数据和通用指令数据按一定比例混合避免模型把老本行忘光。这个比例一般在 1:1 到 3:1 之间需要自己实测调优。理解了这三个底层问题你再回头看基座模型选型眼光会完全不一样。你不再是“哪个模型火选哪个”而是“哪个模型的脾性适合我的场景”。3. 基座模型选型从一堆预训练权重里挑出能用的那个选基座这件事我做过的对比测试不下十次。这里我不想直接说“用某某模型”因为场景不同结论会变。我想给你一套自己的筛选框架配合一些我实测过的结论帮你少走弯路。3.1 开源基座模型的参数规模与硬件匹配先看参数量。7B、13B、34B、70B这几种主流规模对硬件的要求天差地别。模型规模显存需求FP16 推理显存需求4bit 量化推理可运行硬件示例7B约 14GB约 6GB消费级 3090/4090甚至 4060 Ti 16GB13B约 26GB约 8-10GB4080 16GB / 3090 24GB34B约 68GB约 16-20GBA6000 / 双卡 309070B约 140GB约 35-40GBA100 / 双卡 A6000 / 多卡方案这张表是挺保守的估算实际还会受上下文长度、并发请求数影响。个人开发者的甜点区我觉得是 7B 到 13B原因很简单你做领域适配要反复实验一卡能跑完的实验效率远超多卡并行。以我自己的环境为例一张 4090 24GB 显卡跑 7B 模型的 QLoRA 微调毫无压力13B 模型配合 4bit 量化也能跑得动。训练完成后做 4bit 推理还能在单机上开一个小服务给团队内部用完全够。3.2 量化方案4bit 和 8bit 到底怎么选量化是把模型权重从 FP16 压到更低精度换取显存和推理速度。但很多人只知道量化能省显存不知道量化方案的选择对效果影响很大。我实际测试下来的结论是如果是做推理部署8bit 量化对模型质量的损伤几乎是可感知但很小的4bit 量化则需要配合好的量化方法。如果是做微调训练QLoRA 的 4bit 量化是可行的但要额外注意量化误差对梯度的影响实操中我通常会把 LoRA 的秩稍微调大一点来补偿。这里还要提一个重要细节量化不是越低越好。当上下文窗口拉到 8K 以上时KV Cache 占用的显存会急剧膨胀此时 4bit 权重省下来的显存很大程度会贡献给长上下文的 KV Cache。3.3 预训练权重下载与完整性校验接着说一个很多人忽视的环节——预训练权重的获取渠道。热词榜上常年能看到“yolo预训练模型下载”“resnet预训练模型下载”“roberta中文预训练模型”这些词可见大家都习惯了直接下载现成的权重。LLM 也是一样的直接从 Hugging Face 或 ModelScope 下载开源权重比自己训练靠谱得多。但下载不等于拿到就能用我提醒你注意三件事第一看协议。有些模型权重仅供研究商用需要单独申请授权你拿去接商业项目之前务必确认 License 允许你的用途。第二看 SHA256 校验。大文件在传输过程中有概率损坏我遇到过下载完加载报错最后排查发现是权重文件不完整。下载后先用官方给的哈希值校验一下能省掉后面排错的几个小时。第三看配套文件。一个完整的开源模型仓库应该包含 config.json、tokenizer 相关文件、权重文件。缺了 tokenizer 的模型你根本没法跑除非你自己用 SentencePiece 重新训练一个那个成本就高了。选基座还有一个溢价项生态成熟度。一个被社区广泛使用的模型往往有大量现成的量化版本、微调脚本、部署工具、踩坑文档。选一个生态好的模型你的全流程实践会顺畅很多。这也是为什么我建议个人开发者优先考虑那些社区热度高、迭代活跃的模型家族而不是追求最新的小众模型。4. 领域适配的三种主流路径继续预训练、指令微调与知识库外挂领域适配是整个全流程里最见功夫的部分。我把它拆成三条路线它们并不互斥实际项目里往往组合使用。4.1 继续预训练什么时候值得做继续预训练Continue Pretraining通俗说就是让模型在大量领域无标注文本上再“读一遍书”。目的不是教会模型回答问题的格式而是让它熟悉这个领域的词汇、表达方式和背景知识。但我要明确告诉你个人开发者别轻易碰全量继续预训练。原因我在前面说过显存、时间、灾难性遗忘每一项都是坑。我见过太多人拿着几 MB 的公司文档去做继续预训练跑了几个小时后发现效果几乎没变化。因为继续预训练需要的数据量通常是以 GB 计的而且是高度多样化的领域语料不是几篇文档就能糊弄的。那什么时候需要继续预训练我的判断标准是当你的领域术语在通用模型里根本不存在或者 Tokenizer 切词结果惨不忍睹时才值得考虑。这时候更稳的做法是采用领域语料与通用语料混合继续预训练同时用 LoRA 来约束参数的改动范围能明显降低灾难性遗忘的风险。4.2 指令微调与 LoRA个人开发者的主力武器如果你想让模型学会“怎么回答问题”而不是单纯“熟悉领域”那就应该做指令微调。做法是准备大量指令-回答对让模型学会将用户的问法映射到你期望的回答格式上。传统全量微调即使在 7B 模型上也要 70GB 以上的显存对个人开发者并不友好。而 LoRA 和 QLoRA 把微调门槛断崖式拉低。LoRA 的原理可以这么理解它不修改原始权重矩阵而是在旁边加一个低秩的旁路矩阵训练时只更新这个旁路。旁路的参数量通常是原始模型的 0.1% 到 1%所以显存和算力需求都大幅下降。QLoRA 更进一步先把基座模型量化到 4bit再在低秩旁路上做反向传播让它能在 24GB 的消费级显卡上微调 13B 模型。我常用的 QLoRA 关键参数如下供你参考量化配置4bit NF4Double Quant 开启。LoRA 秩rank8 到 64 之间通用任务取 8-16领域深度适配取 32-64。LoRA 作用模块一般同时作用于 q_proj、k_proj、v_proj、o_proj部分场景把 gate_proj、up_proj、down_proj 也加进去。学习率1e-4 到 2e-4 是比较稳妥的区间太高会导致灾难性遗忘。训练轮数2 到 4 轮。我踩过的坑是超过 4 轮后模型会开始“背答案”遇到没见过的问法就崩。训练数据质量方面我要多强调一句指令微调的效果不是取决于数据量而是取决于数据质量和覆盖度。我见过精调运营同学花一周整理出来的 500 条高质量指令数据效果比从网上爬的 5 万条垃圾数据好得多。4.3 RAG 与知识库把“记忆”外置减少对微调的依赖如果你只是想给模型补充一些私有的、会频繁更新的知识那么 RAG 是性价比最高的方案。RAG 的核心思路是不把知识塞进模型参数里而是塞进一个外部知识库。每次提问时先检索相关内容然后把检索结果和问题一起喂给模型让模型基于检索到的内容来回答。热词里频繁出现的 llm wiki 知识库、rag graphrag llm wiki、本体rag 等本质上就是围绕 RAG 延伸出来的不同实现思路。我自己的实践里llm wiki知识库这类结构化文档确实非常适合做 RAG 的语料来源因为它天然有清晰的标题层级和段落结构切分出来 chunk 的质量很高。RAG 的实现流程我把它拆成四步文档解析与清洗把 pdf、word、markdown 转为纯文本去掉页眉页脚、链接、重复内容。文本切分按章节或固定窗口切块保留上下文重叠。切块大小影响检索粒度太小则信息不全太大则噪声太多。我常用 300-500 字重叠 50 字。向量化入库用 Embedding 模型把文本块转成向量存入向量数据库。检索与合成问答时将用户问题向量化检索 Top-K 相关文本块合并成提示词上下文交给 LLM。这里有个重要的取舍到底该做 RAG 还是该做微调我的经验是知识密度高、答案需要严格来自已知材料的场景首选 RAG对话风格、行为模式、推理能力需要调整的场景首选微调两者叠加才是完整方案。如果你想让 RAG 的检索质量更进一步可以尝试 GraphRAG 的路线。传统向量检索的问题在于它只做语义相似度匹配不理解实体之间的关系。GraphRAG 把知识库中的实体和关系抽出来构建知识图谱检索时同时走“向量召回”和“图结构召回”两条路径最后合并。这个方案对“多跳问题”和“跨文档关联问题”的效果提升非常明显。不过我要提醒你GraphRAG 的构建成本比传统 RAG 高不少光实体关系抽取就需要额外的 LLM 调用。如果项目刚起步先用传统 RAG 把链路跑通再迭代到 GraphRAG 也不迟。5. 让模型真正用起来推理部署与工程化落地模型训练完只是开始“用起来”才是全流程的终点。这个环节最容易翻车的地方在于训练时好好的模型部署到生产环境后性能、并发、延迟全都不对劲。我从推理框架、模型导出、系统集成三个层面讲。5.1 推理框架选型不同场景用不同武器推理框架决定你模型跑的速度和能支撑的并发。我常被问“哪个推理框架最好”其实没有最好只有最合适。框架最佳场景我的实测印象vLLM高并发在线推理、多请求批处理吞吐量很强支持 PagedAttention显存利用率高TensorRT-LLM单卡极致性能、低延迟延迟最低但模型编译时间长生态相对封闭llama.cpp个人电脑、CPU 推理、边缘设备部署简单支持量化格式 GGUFCPU 也能跑ONNX Runtime跨平台、多后端、与传统服务集成生态标准适合接入已有 C/Java/.NET 服务如果是搭一个面向团队或小规模用户的在线服务我首选 vLLM它处理并发请求时的吞吐优势明显。如果是做一个本地小工具跑在自己的笔记本上llama.cpp 足够。如果要把模型嵌入到现有业务后端的服务网格里ONTNX Runtime 的跨语言兼容性会省你不少事。说一句踩坑经验不同推理框架支持的量化格式是不同的。llama.cpp 走 GGUFvLLM 对 AWQ/GPTQ 支持较好TensorRT-LLM 甚至有自己的专用量化流程。一定要在选框架之前确定量化方案否则后面发现格式不兼容转换权重又要耗掉一天。5.2 ONNX 导出与边缘部署细节热词里“onnx部署llm模型”热度不低说明不少人在做这件事。我实际走通一次之后觉得ONNX 路线最大的价值是脱离 Python 生态的束缚你可以在 C# 后端、Java 中间件、C 桌面端直接跑模型推理。导出流程大概是先把 PyTorch 模型转成 ONNX 格式再通过 ONNX Runtime 加载推理。但 LLM 和普通神经网络不太一样它有动态的序列长度和 KV Cache 状态导出时需要对输入维度、状态张量做大量显式声明过程相当繁琐。我的建议是除非你确实需要脱离 Python 环境否则别为了“用 ONNX”而用 ONNX。个人开发者最舒服的部署路径还是跑 Python 推理服务再通过 HTTP 接口暴露给其他语言调用。5.3 业务系统集成模式从简易 RAG 到内部 ERP 助手热词里有一个很具体的场景“本地erp rag llm 产品检索 semantic kerner 实例”。这基本上就是我说的业务系统集成——把 LLM 嵌入到既有业务流程里。我做过的一个内部工具是产品检索助手底层是商品数据库 向量检索 LLM给销售同事用。最初我直接用 LangChain 搭了一个简易链路但把 LLM 接进 ERP 系统时发现一个关键问题直接让 LLM 生成 SQL 去查 ERP 数据库非常危险模型一旦生成带副作用或语法错误的 SQL轻则查询失败重则影响线上数据。后来我引入了函数调用Function Calling模式LLM 不直接摸数据库而是只负责理解用户的自然语言意图然后输出一个结构化的调用意图由代码真正去执行数据库查询。比如销售问“有多少库存大于 50 的 SKU”LLM 输出search_sku(min_stock50)的参数代码去执行只读查询返回结果再交给 LLM 组织成自然语言回答。这种“LLM 负责语义理解代码负责确定性操作”的架构是我强烈推荐的安全边界。另外如果你用的是 .NET 技术栈可以关注一下 Semantic Kernel 这个框架它把函数调用、提示词模板、规划器都封装了一层和微软生态集成非常顺滑。我在这个环节最大的体会是LLM 全流程的工程化落地重点根本不全是模型本身而是确定哪些环节让模型干、哪些环节不让模型干。把确定性交给代码把灵活性交给模型系统才能既聪明又可靠。6. 从零到一的全流程案例一个法律咨询小助手的实战复盘理论讲了这么多我来复盘一个真实做过的项目把从数据准备到部署上线的完整链路走一遍。这个项目的目标产品是一个面向普通民众的民事法律咨询小助手。6.1 第一步领域数据采集与清洗法律领域的公开数据很多比如裁判文书、法条库、法律咨询问答。采集容易清洗难。我的清洗管道包含几个固定操作清除页眉页脚、统一法条编号格式、将长段落按逻辑切分、去重。法律文档还有一个特殊之处——时效性极强旧版法条如果不标注生效状态模型会拿过期法条误导用户。所以我在每一条入库的法条上都加了生效/失效标签这个元信息后来在 RAG 检索排序时起到了关键作用。6.2 第二步基座选择与两路并行适配基座我选了一个 7B 的中文指令模型量化之后在单张 4090 上可以跑 QLoRA 微调。我做的是双管齐下一方面用约 1 万条高质量的法律问答对做指令微调让模型学会法律领域的问答格式和推理方式另一方面构建一个法律知识库包含法条和典型案例通过 RAG 在推理阶段提供精准引用。这个组合的效果非常有意思微调负责让模型“像法律助手一样说话”RAG 负责让模型“说出来的话有依据”。缺少任何一个体验都不完整。没有微调模型的回答语气过于通用不像专业助手没有 RAG模型的法条引用经常编造条文号可信度大打折扣。6.3 第三步评估与迭代领域模型的评估是我觉得最容易被糊弄过去的环节。很多人微调完只看几个 demo 就说“效果不错”然后上线被用户打脸。我建立了一套自己的评估集包含三类问题一是从知识库里能直接检索出答案的事实型问题二是需要多步推理的复杂问题三是没有标准答案的开放型问题。每次微调迭代后我都在同一套评估集上对比回答看正确率和引用规范性是否提升。一个印象深的案例第一版微调模型在开放型问题上回答得像模像样但事实型问题经常张冠李戴。后来我把指令微调数据里的“不确定就说不知道”类样本比例从 5% 提到 15%模型的胡编乱造明显变少。这种结论不跑评估集光靠肉眼看不出来。7. 常见问题排查与避坑实录自己做 LLM 全流程一定会遇到各种“疑难杂症”。我把踩过的坑整理成一份排查表希望你能直接照着查。7.1 显存相关训练跑不完部署撑不住症状QLoRA 微调刚开始显存直接 OOM。排查先确认模型确实转成 4bit 了再把 LoRA 作用范围缩小先只改 q_proj 和 v_proj最后把批次大小调成 1梯度累积开起来。经验7B 模型 24GB 显存很富余但如果你把最大序列长度拉到 8192显存瞬间暴涨。领域数据就是长文居多的话先做一下长度分析没必要一上来就撑到最大上下文。7.2 微调效果不理想模型不听话或者变傻了症状一微调后模型答非所问明显“背题”。原因训练轮数过多或数据里指令多样性不够。解法降低轮数到 2-3扩充指令数据的问法多样性。症状二领域能力长了通用能力没了。原因灾难性遗忘LoRA 秩太大或学习率太高。解法降低学习率加入通用指令数据混合训练控制 LoRA 秩在合理范围内。7.3 工具调用与结构化输出异常热词里有一个非常典型的报错llm request failed: provider rejected the request schema or tool payload。这种问题多发生在让 LLM 做函数调用的时候通常是函数声明格式不合法或者工具返回的数据结构与模型预期的 schema 不一致。排查思路是先把工具声明精简到只有一个参数跑通后再逐步增加定位是哪个字段不匹配同时检查工具描述里是否写了模型不能识别的类型比如把array错写成list。这类报错明确告诉你一件事LLM 的所谓“函数调用”本质还是文本生成它对 schema 的遵循能力是概率性的不是确定性的。所以代码侧必须做返回校验和重试不能假设模型每次都输出合法结构。7.4 幻觉问题模型一本正经地胡说八道再强的微调也无法彻底消灭幻觉因为生成式模型的本质是概率预测不是数据库查询。应对幻觉的工程手段我的排序是RAG 强制引用 提示词约束 低温度采样 输出校验。法律场景里我用的提示词约束是“回答必须基于给定的知识片段知识片段中没有的信息明确回答不知道”。同时我把温度降到 0.3 以下减少随机的胡编。效果比单纯微调明显得多。7.5 可靠性问题从“能跑”到“可信赖”热词里有一个词我很喜欢——reliable llm。这其实是 LLM 工程化里最容易被个人开发者忽略的维度。模型在测试集上表现好不代表生产环境可靠。生产环境的输入千奇百怪你必须在服务外层加上输入校验、敏感信息检测、降级策略和日志追踪。我自己的线上服务会做一层兜底如果 LLM 连续两次返回结构非法的内容或者置信度极低我就直接返回一个预设的兜底话术并记录日志而不是让用户看到一串乱码。这种“让模型优雅地承认自己不会”的设计对用户体验的提升比模型本身提升几个百分点的准确率更有效。其实做到这里你会发现全流程实践走到后期已经不是在跟模型较劲了而是在跟系统设计较劲。模型效果的天花板很早就摸到了但系统的可靠性、可维护性和用户体验才是个人开发者真正拉开差距的地方。我最后想说的是这条路不难走但信息量很大。从预训练基础认知、基座选型、领域适配到部署落地的完整链路每一步都有大量可以深入的技术细节。但换个角度看正因为开源社区把门槛降到了这个程度个人开发者才第一次有机会在 LLM 领域做出真正属于自己的产品和积累。你先按我这条链路把流程跑通一遍再根据具体场景去深挖每一环会比一开始就陷在某个技术细节里高效得多。如果读完你对某个环节有疑问或者在手头的项目里遇到了具体问题不妨带着问题再来重新看一遍这篇文章。很多我当时百思不解的问题都是在第二遍、第三遍实践中才真正想透的。
返回列表