从LLM基础到工程实践:RAG、Agent与MCP如何串起学习主线
最近整理收藏夹时,又翻出了一个熟悉的 GitHub 项目:datawhalechina/happy-llm。说实话,第一眼看到这个项目名时,我以为又是某个 LLM 资料汇总。毕竟现在关于大语言模型的教程、路线图、仓库已经多到让人麻木,新人往往不是在找资料,而是在海量资源里迷失方向。但把这个项目放到 Datawhale 社区一贯的开源学习方式里看,就会发现它真正想解决的问题,不是“再给你一份资料清单”,而是帮你建立一条学习 LLM 的主线。
这也是我最近反复确认的一个判断:LLM 学习这件事,资源早就不再稀缺,稀缺的是把基础理论、应用开发和工程落地串成一条可执行路径的能力。如果你也在收藏了无数链接之后不知道下一步该做什么,这篇文章就是写给你的。我不会把某个开源仓库夸成万能钥匙,而是会结合实际场景,拆解一段从入门到工程化的可行路线,顺便聊聊那些最容易踩坑的地方。
1. 为什么 LLM 资料越收集,越不知道学什么
1.1 收藏夹里的 100 个链接,不等于一条学习路径
很多人的学习过程是这样的:先搜“LLM 是什么”,然后看到一篇科普文章;再搜“LLM 框架”,又看到几个项目;接着刷到“LLM Agent 教程”,顺手收藏;最后发现还有 RAG、MCP、微调、量化、推理引擎等一堆概念。收藏夹越来越长,真正认真读完的却很少。
问题不在于资料质量,而在于资料之间没有结构。比如,你看到了“FP16、BF16 精度问题详解”,也看到了“Spring AI 整合 MCP、RAG、Agent”的教程,但如果不知道精度问题属于部署优化层,也不清楚编排框架属于应用层,这些知识就会变成孤岛。孤岛积累再多,也无法形成解决问题的能力。
所以我在训练营或带新人时,最常说的不是“再给你一份必读清单”,而是“先停下来,把自己要解决的具体问题写出来”。很多时候,问题一旦被写清楚,需要学什么就立刻清楚了。
1.2 开源学习项目提供的不是一个仓库,而是一条主线
datawhalechina/happy-llm 这类社区项目,和普通技术仓库不太一样。它更像是“学习路线图 + 实战任务 + 社区讨论”的组合。Datawhale 社区通常会把一个主题组织成多个章节,每章包含概念解释、代码示例和练习任务,并通过组队学习的方式让参与者互相推进。
这种方式解决的核心问题,就是“不知道下一步做什么”。因为课程设计者已经把复杂的 LLM 学习拆成了台阶,你只需要顺着台阶往上走。当然,具体章节会随仓库迭代而变化,所以不要把它当成一本固定教材。落地使用时,先看仓库 README 的章节结构和目标,再决定按顺序学,还是按需跳着学。
这引出一个更重要的经验:开源项目真正的价值,不是让你“看完它”,而是帮你“启动自己的实践”。哪怕只看完第一个最小示例,并把它改成自己的数据,也比收藏十个完整项目有价值。
2. 从 LLM 基础到工程实践,我推荐这样一条主线
2.1 先别急着啃模型结构,先把输入输出和 API 跑通
很多新手一上来就看 Transformer 论文、注意力机制、位置编码,结果两周后还在概念里打转。我并不否定理论,但如果你最终目标是应用和开发,第一优先级应该是理解 LLM 的“输入输出形态”。
一个成熟的 LLM 应用,最基础的样子其实很简单:把文本请求发给模型服务,拿到生成的文本。这里的核心概念不多,但每个都值得动手验证:
- 输入:任务指令、上下文、用户问题组成的 prompt;
- 输出:模型根据概率生成的 token 序列;
- 参数:temperature 控制随机性,max_tokens 控制最大输出长度;
- 上下文窗口:模型一次能处理的 token 数量。
以常见的 API 调用为例,代码结构大致是:
# 示意代码:实际 SDK 以你使用的模型服务为准 from openai import OpenAI client = OpenAI( api_key="your-api-key", base_url="your-endpoint-url", ) response = client.chat.completions.create( model="your-model-name", messages=[ {"role": "system", "content": "你是一个简洁的技术助手。"}, {"role": "user", "content": "用三句话解释什么是 RAG。"}, ], temperature=0.3, max_tokens=500, ) print(response.choices[0].message.content)先把这个流程跑通,比看十篇架构分析都管用。因为你会在真实环境里遇到 API 地址不对、密钥权限不足、返回格式不一样、上下文超长等问题。处理完这些问题,你对 LLM 应用的理解会立刻具体化。
2.2 精度问题不是性能调优,而是能不能跑起来的前提
在部署和本地推理阶段,FP16、FP32、BF16 这几个词会频繁出现。它们不是炫技,而是直接决定模型能不能在当前显卡上运行。
简单来说:
- FP32 是单精度浮点,数值表示最稳,但显存占用最大;
- FP16 是半精度浮点,显存占用减半,但表达范围小,容易在训练或推理时出现数值问题;
- BF16 是 Brain Floating Point,显存占用和 FP16 一样少,但保留了更大的数值范围,在很多大模型训练和推理场景下更稳定。
下面是一个常见的对比表格:
| 精度类型 | 位宽 | 显存占用 | 特点 | 常见场景 |
|---|---|---|---|---|
| FP32 | 32 位 | 高 | 精度高,数值稳定 | 小模型调试、CPU 推理 |
| FP16 | 16 位 | 中 | 速度快,但可能溢出 | 支持良好的 GPU 推理 |
| BF16 | 16 位 | 中 | 范围大,稳定性较好 | 大模型训练、大规模推理 |
实际落地时,建议先确认你的推理框架默认使用哪种精度,再看模型权重的原始精度。如果模型权重是 FP16,你却用 FP32 加载,显存可能直接翻倍;如果框架做了自动转换,也要观察推理结果是否有明显质量下降。
注意:不要一上来就追求低精度。在模型、框架、硬件都还不熟悉时,优先用默认配置跑通,再逐步尝试不同精度,观察速度、显存和生成质量的变化。
2.3 从 API 到本地部署:“必须在同一台电脑”是个伪命题
很多人看到 ComfyUI 里的 LLM 节点,会问一个经典问题:LLM 必须和 ComfyUI 装在同一台电脑上吗?答案是不一定。
常见的部署模式有两种:
- 本地一体化模式:模型和调用方在同一台机器,适合离线可用和隐私要求高的场景,但对硬件要求高。
- 客户端/服务端分离模式:调用方(比如 ComfyUI、Web 应用)通过网络 API 访问远端模型服务,本地只负责流程编排。
后者更常见,也更灵活。真正需要关心的不是“同不同机”,而是服务地址、端口、模型名称、鉴权方式、超时时间,以及路径配置。比如 ComfyUI 中要调用外部模型服务时,需要确认模型服务地址可访问、API 密钥正确、返回格式与插件兼容。
至于“最佳 Mac LLM 推理引擎”这类问题,我一般不直接给固定答案,因为推理速度和模型版本、量化程度、内存大小、引擎优化都强相关。正确做法是先确认你的模型格式(如 GGUF、MLX、PyTorch)支持哪些引擎,再跑一个小模型的 benchmark。先跑通,再做对比。
3. 为什么 LLM 应用需要编排框架,以及 MCP、RAG、Agent 如何串起来
3.1 编排框架解决的是“模型不可控”和“流程必须可控”的矛盾
一个裸的 LLM API 能回答单轮问题,但很难完成一个多步骤任务。比如“读取网页内容,提取摘要,再结合本地知识库生成报告”,如果只用一次模型调用,结果往往不稳定。
这时就需要编排框架。它做的事情是:决定调用模型多少次、先调用哪个工具、如何把前一步输出作为后一步输入、出错时如何重试。你可以把它理解成项目里的“流程控制层”。
很多讨论把 LangChain、Spring AI 等框架当成万能层,但真正的价值不是“用了框架就高级”,而是它帮你把问题拆成可管理的节点。对学习者来说,一开始不需要追求复杂框架,可以先手写一个 if/else 流程,再逐步引入框架,这样才能理解框架解决的痛点。
3.2 RAG:让模型学会查资料,而不是背资料
RAG(检索增强生成)是当前 LLM 应用里最实用的模式之一。它的核心思路很简单:在模型生成之前,先从一个外部知识库中检索和用户问题相关的内容,把这些内容拼进上下文,再让模型基于这些内容生成答案。
这样做的好处是:
- 缓解模型“幻觉问题”,因为它有了具体来源;
- 支持私有知识库、实时网页内容、动态数据;
- 比频繁微调成本更低,更新知识只需要更新检索库。
实际项目里,RAG 的难点反而不在模型,而在检索质量:文档怎么切分、向量怎么存储、TopK 怎么设置、召回结果怎么重排。很多人跑通 demo 后效果很差,往往不是模型问题,而是数据清洗没做好。
如果你看到“实现抓取网页内容功能”这样的需求,本质上也是在做 RAG 的数据源准备。网页抓回来之后,清洗、结构化、分块、入库,每一步都会影响最终答案质量。
3.3 Agent:从回答问题到执行任务
如果说 RAG 是给模型加了一个“知识库外挂”,Agent 则是给模型加了“执行工具包”。 Agent 不再是简单地返回文本,而是在一个循环里反复做决策:当前任务是否完成?需要调用哪个工具?调用结果是否合理?下一步该做什么?
一个典型的 Agent 循环可以简化成:
- 接收用户任务;
- 模型决定需要工具或不需要工具;
- 执行工具,获取结果;
- 把结果返回给模型;
- 模型决定继续还是输出最终结果。
这种模式适合“任务型”场景,比如查天气、订日程、操作数据库、调用内部 API。但它对流程管理要求更高,因为你必须处理工具调用的异常、模型决策偏差、循环超时等问题。过度授权还会带来安全风险,所以生产环境里一定要对 Agent 可访问的工具和权限做严格限制。
3.4 MCP 与 Spring AI:工具接入正在被标准化
最近大量讨论围绕“Spring AI + MCP + RAG + Agent”这个组合展开。这里面的 MCP(Model Context Protocol)本质上是为模型访问外部工具和上下文提供统一协议。它让一套工具接口可以被多个模型客户端复用,减少“每个项目都要写一套工具适配层”的重复劳动。
从工程角度看,这套组合背后是一种分层思路:
- Spring AI 负责统一模型访问和编排;
- RAG 提供知识检索能力;
- Agent 负责任务决策与工具调用;
- MCP 负责把数据库、文件系统、网页抓取等外部能力接入进来。
对普通开发者来说,不需要一下子把四层全部引入。更稳妥的顺序是:先单独跑通 Spring AI 调用 LLM,再加一个 RAG 检索,然后加一个简单工具调用,最后再考虑完整 Agent 编排。每加一层都要验证层与层之间的输入输出,否则出了问题会很难定位。
4. 学 LLM 时最常见的误区与排查思路
4.1 误区一:一上来就本地跑大模型,而不是先跑通 API
本地部署确实有吸引力,尤其是隐私和成本方面。但对新手来说,一上来就部署 70B 大模型,大概率会卡在显存、量化、依赖冲突上,而不是学到 LLM 应用的开发逻辑。
我更建议的顺序是:先用免费或低成本的 API 跑通一个最小应用,理解输入输出和参数;再尝试用开源小模型在本地推理,理解硬件的限制;最后才是大模型部署和性能调优。本地部署本身是一项能力,但不应该是 LLM 学习的第一步。
4.2 误区二:单次调用成功,就直接进入批量任务
很多人发现 API 能返回正常结果后,马上把数据量从 1 条扩到 1000 条,结果发现速度慢、报错多、输出格式不稳定。
单次调用成功,只能说明“流程没有断”,不能说明“流程足够稳定”。批量使用前,至少要考虑:
- 并发数:同时发多少请求不会触发限流或超时;
- 错误重试:网络抖动、服务端错误如何处理;
- 输出校验:模型输出是否符合预期格式;
- 成本控制:token 消耗是否在预算内。
最好的做法是先跑 10 条数据,观测成功率和耗时;再跑 50 条;最后再上规模。每一步都记录日志,不要直接摸黑跑大任务。
4.3 排查链路:先看现象,再看输入、环境、参数,最后找工具边界
我在处理 LLM 应用问题时会按照固定顺序排查,这样可以避免在很多变量里乱猜。
| 排查顺序 | 检查内容 | 具体问题 |
|---|---|---|
| 1 | 现象 | 报错、卡住、无输出、输出乱码、速度慢 |
| 2 | 输入 | prompt 格式、上下文长度、编码、文件路径、字段是否有遗漏 |
| 3 | 环境 | Python 版本、依赖版本、API 地址、端口、密钥、系统差异 |
| 4 | 参数 | 并发数、batch size、超时、temperature、max_tokens |
| 5 | 工具边界 | 模型是否支持该能力、框架版本是否兼容、是否有已知限制 |
比如,如果你的 RAG 系统返回结果为空,先不要怀疑模型。第一步看检索阶段有没有召回内容,第二步看文档切分是否合理,第三步看向量库连接是否有问题,最后才是模型生成。很多时候,问题出在最基础的数据层,而不是高深的推理层。
注意:遇到问题先记录日志,日志是你的第一线索。没有日志时,不要急着调参,先想办法把输入、输出、中间结果都打印出来。
5. 把 LLM 学习沉淀成自己的知识系统
5.1 用 wiki 的方式整理知识,而不是继续囤资料
前面提到,LLM 领域新概念层出不穷。如果靠收藏链接来管理知识,一周后就找不到了。更可持续的方式是把知识转写成自己的笔记,并按 wiki 的方式组织起来。
“LLM wiki”这个想法近几年越来越流行,核心就是:不要被动接收内容,而是主动维护一张知识网络。每个概念一个页面,页面之间通过链接关联,比如“RAG”页面链接到“向量数据库”和“文档切分”,“Agent”页面链接到“工具调用”和“MCP”。
很多笔记工具都支持双向链接,Obsidian 也常被用来做这类知识库。但工具只是表面的东西,真正重要的是你开始用自己的话解释概念,并记录下实践中的坑。一个只有链接没有理解和实践记录的知识库,依旧只是收藏夹的高级形态。
5.2 建立最小闭环:文档、代码、运行结果、故障记录
在跟着开源项目或教程学习时,我建议为每个专题建立一个最小知识闭环。这个闭环至少包含四部分:
- 专题目标:这个专题解决了什么问题;
- 最小代码:能跑通的示例,标注环境和依赖;
- 运行结果:输出样例,包括成功和失败两种情况;
- 故障记录:遇到的报错、原因和解决方式。
有了这个闭环,你就不再是“看过别人的项目”,而是在“运行和改造别人的项目”。比如学 RAG 时,可以记录:文档用 500 token 切分,TopK 设为 3,召回合格但生成内容还是偏泛。这样一条记录,比一句“我了解 RAG”更有价值。
长期来看,这套笔记还会变成你后续开发的参考手册。遇到类似问题时,先搜自己的笔记,往往比重新搜教程更快。
5.3 持续关注开源社区,但保持自己的主线
类似 happy-llm 这样的开源项目会不断更新,新的模型、框架、方法论也会持续出现。面对这种变化,最容易做到的策略是:把社区项目当作“随堂练习”,把自己建立的专题笔记当作“主线教材”。
具体来说,可以每季度回顾一次自己关心的主题,看仓库有没有新增章节、有没有新的最佳实践;但主线始终是那几个核心问题:你的应用场景是什么?你的数据从哪里来?你的流程如何控制?你的成本和质量如何平衡?
这比追每一个新模型更有效,因为模型会迭代,但解决真实问题的能力不会过时。
最后说回这个项目名
第一次看到 happy-llm,我以为是“快乐学习 LLM”的玩笑。但深入了解社区学习模式后,我觉得这个名字其实很准确:当学习不再是被几十个陌生概念追着跑,而是一条可以被拆解、被反复验证的路径时,学习才会真正有掌控感。资料列表只能带来收藏的快乐,按步骤跑通一个项目、记录一个故障、改进一个流程,才会带来持续的快乐。
如果你是刚开始接触 LLM,我建议先不要继续囤资料。打开一个开源项目,把第一个示例跑通,再把它改成你自己的问题。这个过程,才是从“知道 LLM”走向“会用 LLM”的开始。
