[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"learning-part-7-rag":3,"learning-all":13},{"id":4,"slug":5,"title":6,"description":7,"level":8,"topic":9,"url":10,"content":11,"sortOrder":12},5,"part-7-rag","Part 7 · RAG 检索增强生成","这一站是\"能落地\"的关键：让模型回答**你的私有知识**。","INTERMEDIATE","RAG",null,"# Part 7 · RAG 检索增强生成\n\n\n---\n\n## Section 1 · 为什么需要 RAG（概念日）\n\n**Subsection 1 · 亲眼看到 LLM 的缺陷**\n用你的 `llm_client.py` 问 DeepSeek 两个问题：\n1. `我们公司2025年发布的《内部差旅报销制度》里，超标住宿怎么处理？`\n2. `我昨天在会上说的那个项目代号是什么？`\n- ✅ 预期看到：模型一脸懵，或者编一个答案（这就是**幻觉**）。\n- 💡 记住：**LLM 只记得训练数据截止时间之前的事，且可能胡说。RAG 就是来解决这个的。**\n\n**Subsection 2 · 记 RAG 定义**\n备忘录写：\n```\nRAG（Retrieval-Augmented Generation，检索增强生成）\n= 先\"检索\"相关资料 → 把资料拼进 Prompt → 让模型\"只依据资料\"回答\n结果：能答私有知识 + 能引用来源 + 少幻觉\n```\n\n**Subsection 3 · 画整体流程**\n画：\n```\n文档 → 切块 → 转成向量 → 存进向量库\n                                   ↓ 用户提问 → 把问题转成向量 → 搜出最相关的几块\n                                   ↓ 把这几块 + 问题 拼进 Prompt → 模型回答\n```\n\n**过关**：能复述 RAG 流程 = Section 1 完成。\n\n---\n\n## Section 2 · RAG 三大范式 + 三大部件（概念日）\n\n**Subsection 1 · 记三大范式**\n```\nNaive RAG     朴素版：索引→检索→生成（先学这个）\nAdvanced RAG  进阶版：检索前后加优化（Part 8 学）\nModular RAG   模块版：检索组件可插拔组合（Part 8 学）\n```\n\n**Subsection 2 · 记三大部件**\n```\nRetriever 检索器   负责从知识库找出相关文本（向量搜索\u002F关键词）\nGenerator 生成器   就是 LLM，负责根据检索结果写答案\nAugmentation 增强   把检索结果\"加工\"成更好的上下文（重排\u002F压缩）\n```\n\n**Subsection 3 · 过关自测**\n能说出：① 三范式名字 ② 三大部件各干嘛 = Section 2 完成。\n\n---\n\n## Section 3 · 搭 RAG 环境（装 4 个库）\n\n**Subsection 1 · 装库**\ncmd 依次输入：\n```\npip install chromadb\npip install sentence-transformers\npip install -U langchain-community\npip install beautifulsoup4\n```\n- ✅ 每一条预期看到 `Successfully installed ...`\n- ❌ 慢：每条命令后加 ` -i https:\u002F\u002Fpypi.tuna.tsinghua.edu.cn\u002Fsimple`\n\n**Subsection 2 · 准备测试资料**\n- 在 `ai-lab` 里建一个文件夹 `rag_data`\n- 在里面新建 `company.md`，粘上你自己的内容（至少 5 段），比如：\n```\n# 公司制度手册（示例）\n## 考勤\n员工每天 9:30 前打卡上班，迟到 3 次以上扣发当日补贴。\n## 报销\n单笔 500 元以下凭发票直接报销，以上需附审批单。\n...\n```\n- ⚠️ 这段内容是你自己写的\"私有知识\"，RAG 就是让它能回答这些。\n\n**过关**：4 个库装好 + 资料文件建好 = Section 3 完成。\n\n---\n\n## Section 4 · 文档加载与分块（RAG 第一步）\n\n**Subsection 1 · 跑加载 + 分块代码**\nVS Code 新建 `rag_step1_load.py`：\n```python\nfrom pathlib import Path\n\n# 1. 读文件\ntext = Path(\"rag_data\u002Fcompany.md\").read_text(encoding=\"utf-8\")\nprint(\"文档总字符数:\", len(text))\n\n# 2. 简单分块：按空行分\nblocks = [b.strip() for b in text.split(\"\\\n\\\n\") if b.strip()]\nprint(\"分成\", len(blocks), \"块\")\nfor i, b in enumerate(blocks):\n    print(f\"[块{i}] {b[:40]}...\")\n```\n- 运行\n- ✅ 预期看到：文档被拆成若干块，每块是一小段。\n- 💡 分块大小很讲究：**太大**→命中不准（夹带无关内容）；**太小**→上下文割裂。你现在先按空行分，后面实验对比。\n\n**Subsection 2 · 过关自测**\n能说出\"为什么不能把整篇文档直接丢给模型\"（因为超出上下文\u002F检索不准\u002F浪费 token）= Section 4 完成。\n\n---\n\n## Section 5 · 把文字变成向量（Embedding）\n\n**Subsection 1 · 跑向量化**\nVS Code 新建 `rag_step2_embed.py`：\n```python\nfrom sentence_transformers import SentenceTransformer\n\n# 加载中文向量模型（第一次运行会下载，约 100MB，稍等）\nmodel = SentenceTransformer(\"BAAI\u002Fbge-small-zh-v1.5\")\n\nsentences = [\"员工每天9点半前打卡\", \"单笔500元以上报销需要审批单\"]\nvectors = model.encode(sentences)\n\nprint(\"每句话变成一个向量，维度:\", vectors.shape)   # (2, 512)\nprint(\"第一句的向量前8位:\", vectors[0][:8])\n```\n- ✅ 预期看到：`(2, 512)` 和一段小数数组。\n- 💡 关键理解：**意思相近的句子，向量就越\"接近\"（余弦相似度接近1）**。这就是能\"语义搜索\"的原因。\n\n**Subsection 2 · 验证相似度**\n在文件末尾加：\n```python\nfrom sentence_transformers import util\na = model.encode([\"我今天迟到了\"])\nb = model.encode([\"员工考勤规定\"])\nc = model.encode([\"今天天气不错\"])\nprint(\"迟到↔考勤 相似度:\", round(util.cos_sim(a, b).item(), 3))\nprint(\"迟到↔天气 相似度:\", round(util.cos_sim(a, c).item(), 3))\n```\n- ✅ 预期看到：第一个相似度明显比第二个高。\n\n**过关**：跑通并验证\"语义相似度\" = Section 5 完成。\n\n---\n\n## Section 6 · 存进向量数据库（Chroma）\n\n**Subsection 1 · 跑入库代码**\nVS Code 新建 `rag_step3_store.py`：\n```python\nimport chromadb\nfrom pathlib import Path\nfrom sentence_transformers import SentenceTransformer\n\n# 加载模型 + 分块（复用 Section 4\u002F5 的成果）\nmodel = SentenceTransformer(\"BAAI\u002Fbge-small-zh-v1.5\")\ntext = Path(\"rag_data\u002Fcompany.md\").read_text(encoding=\"utf-8\")\nblocks = [b.strip() for b in text.split(\"\\\n\\\n\") if b.strip()]\n\n# 建一个持久化向量库（存到本地文件夹）\nclient = chromadb.PersistentClient(path=\"chroma_db\")\ncollection = client.get_or_create_collection(\"company_rules\")\n\n# 向量化 + 入库（id 用序号，metadata 存原文）\nvectors = model.encode(blocks).tolist()\ncollection.upsert(\n    ids=[f\"doc{i}\" for i in range(len(blocks))],\n    embeddings=vectors,\n    documents=blocks,          # 存原文，方便取回\n    metadatas=[{\"source\": \"company.md\"} for _ in blocks],\n)\nprint(\"已入库\", collection.count(), \"条\")\n```\n- ✅ 预期看到：`已入库 N 条`\n- 💡 Chroma 是本地零配置向量库，最适起步。生产可用 Milvus\u002FFAISS\u002FQdrant（Part 8 提）。\n\n**过关**：入库成功 = Section 6 完成。\n\n---\n\n## Section 7 · 检索（把问题变成向量去搜）\n\n**Subsection 1 · 跑检索代码**\nVS Code 新建 `rag_step4_search.py`：\n```python\nimport chromadb\nfrom sentence_transformers import SentenceTransformer, util\n\nmodel = SentenceTransformer(\"BAAI\u002Fbge-small-zh-v1.5\")\nclient = chromadb.PersistentClient(path=\"chroma_db\")\ncollection = client.get_or_create_collection(\"company_rules\")\n\n# 把用户问题向量化，去库里搜最接近的\nquestion = \"迟到会怎么样？\"\nq_vec = model.encode([question]).tolist()\n\nresult = collection.query(query_embeddings=q_vec, n_results=2)\nfor i, doc in enumerate(result[\"documents\"][0]):\n    print(f\"命中{i}: {doc[:60]}...\")\n```\n- ✅ 预期看到：两条和\"迟到\"相关的原文被搜出来。\n- 💡 这就完成了 RAG 的\"R\"（Retrieval 检索）。\n\n**过关**：能搜出相关原文 = Section 7 完成。\n\n---\n\n## Section 8 · 第一个完整 RAG（检索 + 生成闭环）\n\n**Subsection 1 · 写完整 RAG**\nVS Code 新建 `rag_full.py`：\n```python\nimport chromadb\nfrom dotenv import load_dotenv\nfrom openai import OpenAI\nfrom sentence_transformers import SentenceTransformer\nimport os\n\nload_dotenv()\nmodel = SentenceTransformer(\"BAAI\u002Fbge-small-zh-v1.5\")\nclient = chromadb.PersistentClient(path=\"chroma_db\")\ncollection = client.get_or_create_collection(\"company_rules\")\n\nllm = OpenAI(api_key=os.getenv(\"DEEPSEEK_API_KEY\"), base_url=\"https:\u002F\u002Fapi.deepseek.com\")\n\ndef ask(question: str):\n    # 1. 检索：找最相关的 3 块\n    q_vec = model.encode([question]).tolist()\n    result = collection.query(query_embeddings=q_vec, n_results=3)\n    context = \"\\\n\\\n\".join(result[\"documents\"][0])\n\n    # 2. 拼 Prompt：把资料给模型，并要求\"只依据资料\"\n    prompt = f\"\"\"请根据以下资料回答用户问题。\n如果资料里没有答案，就老实说\"资料中没有相关内容\"，不要编造。\n\n【资料】\n{context}\n\n【问题】\n{question}\n\"\"\"\n    # 3. 生成\n    resp = llm.chat.completions.create(\n        model=\"deepseek-chat\",\n        messages=[{\"role\": \"user\", \"content\": prompt}],\n    )\n    return resp.choices[0].message.content\n\nif __name__ == \"__main__\":\n    while True:\n        q = input(\"提问（输入 exit 退出）：\")\n        if q == \"exit\":\n            break\n        print(\"回答:\", ask(q), \"\\\n\")\n```\n- 运行，连续问：`迟到会怎么样`、`报销有什么规定`、`公司食堂在哪`（最后这个资料里没有）\n- ✅ 预期看到：前两个回答引用了资料内容；最后一个回答\"资料中没有相关内容\"——**这就是 RAG 防幻觉的表现**。\n\n**过关**：能跑通\"资料外问题不乱编\" = Section 8 完成。🎉 你已经做出第一个 RAG 了。\n\n---\n\n## Section 9 · 实验：不同 chunk 大小对比\n\n**Subsection 1 · 跑对比实验**\n新建 `experiment_chunk.py`：\n```python\n# 目的：同样一个问题，不同的\"切块大小\"检索效果差多少\n# 用 langchain 的文本切分器做两种分块\nfrom langchain_text_splitters import RecursiveCharacterTextSplitter\nfrom pathlib import Path\n\ntext = Path(\"rag_data\u002Fcompany.md\").read_text(encoding=\"utf-8\")\n\nsmall = RecursiveCharacterTextSplitter(chunk_size=50, chunk_overlap=10).split_text(text)\nbig = RecursiveCharacterTextSplitter(chunk_size=300, chunk_overlap=50).split_text(text)\nprint(\"小块数量:\", len(small), \"| 大块数量:\", len(big))\n\n# 看看\"迟到\"在哪几块里被提到\nfor label, blocks in [(\"小块\", small), (\"大块\", big)]:\n    hits = [b for b in blocks if \"迟到\" in b]\n    print(f\"{label} 命中'迟到'的块数: {len(hits)}\")\n```\n- 运行\n- ✅ 预期看到：小块命中更多、更精准；大块命中少但上下文更全。\n- 💡 结论写进笔记：**块小→准，块大→全，折中一般 200~500 字 + 少量重叠（overlap）**。\n\n**过关**：能说出块大块小的取舍 = Section 9 完成。\n\n---\n\n## Section 10 · 实验：TopK 和相似度算法\n\n**Subsection 1 · 跑 TopK 对比**\n修改 `rag_step4_search.py`，把 `n_results` 分别设为 1、3、5，各打印命中内容。\n- ✅ 预期看到：K 越大，带进来的资料越多，回答可能更全但也可能混入噪音。\n- 💡 一般 TopK=3~5 够用。\n\n**Subsection 2 · 换相似度算法**\nChroma 默认用余弦距离。看官方文档把 `collection.query` 加参数 `distance=\"l2\"` 试试（欧式距离）。\n- 对比两次检索结果是否变化，写一句心得。\n\n**过关**：能说出 TopK 影响和两种距离的区别 = Section 10 完成。\n\n---\n\n## Section 11 · 中文向量模型选型（bge 家族）\n\n**Subsection 1 · 记选型表**\n```\n英文\u002F通用   OpenAI text-embedding-3-small 等\n中文        百度文心 Embedding-V1、智谱 embedding-2、阿里 text-embedding-v2\n开源中文     BAAI\u002Fbge-large-zh-v1.5（强但大）、bge-small-zh-v1.5（快，你在用）\n```\n- 💡 你现在的 bge-small 已够学习用；生产更追求效果就换 bge-large 或厂商 API。\n\n**Subsection 2 · 验证中文效果**\n在 Section 5 的代码里，用 `bge-large-zh-v1.5` 再跑一次相似度对比，感受差别（可能更准但更慢）。\n\n**过关**：能说出\"中文场景选什么 Embedding\" = Section 11 完成。\n\n---\n\n## Section 12 · 把 RAG 重构成可复用工具\n\n**Subsection 1 · 重构**\n新建 `rag_tool.py`（把整个 RAG 打包成类，方便以后到处用）：\n```python\nimport chromadb, os\nfrom dotenv import load_dotenv\nfrom openai import OpenAI\nfrom sentence_transformers import SentenceTransformer\n\nload_dotenv()\n\nclass RagKB:\n    \"\"\"一个简单的知识库问答工具\"\"\"\n    def __init__(self, db_path=\"chroma_db\", collection=\"company_rules\"):\n        self.model = SentenceTransformer(\"BAAI\u002Fbge-small-zh-v1.5\")\n        self.client = chromadb.PersistentClient(path=db_path)\n        self.collection = self.client.get_or_create_collection(collection)\n        self.llm = OpenAI(api_key=os.getenv(\"DEEPSEEK_API_KEY\"), base_url=\"https:\u002F\u002Fapi.deepseek.com\")\n\n    def add_document(self, file_path: str):\n        from pathlib import Path\n        text = Path(file_path).read_text(encoding=\"utf-8\")\n        blocks = [b.strip() for b in text.split(\"\\\n\\\n\") if b.strip()]\n        vectors = self.model.encode(blocks).tolist()\n        self.collection.upsert(\n            ids=[f\"doc{i}\" for i in range(len(blocks))],\n            embeddings=vectors,\n            documents=blocks,\n            metadatas=[{\"source\": file_path} for _ in blocks],\n        )\n        return len(blocks)\n\n    def ask(self, question: str, top_k: int = 3):\n        q_vec = self.model.encode([question]).tolist()\n        result = self.collection.query(query_embeddings=q_vec, n_results=top_k)\n        context = \"\\\n\\\n\".join(result[\"documents\"][0])\n        prompt = f\"请根据以下资料回答，资料没有就说'资料中没有相关内容'。\\\n【资料】\\\n{context}\\\n【问题】\\\n{question}\"\n        resp = self.llm.chat.completions.create(model=\"deepseek-chat\", messages=[{\"role\": \"user\", \"content\": prompt}])\n        return resp.choices[0].message.content\n\nif __name__ == \"__main__\":\n    kb = RagKB()\n    print(\"入库条数:\", kb.add_document(\"rag_data\u002Fcompany.md\"))\n    while True:\n        q = input(\"提问（exit退出）：\")\n        if q == \"exit\":\n            break\n        print(\"回答:\", kb.ask(q))\n```\n\n**过关**：重构跑通，能 add 能 ask = Section 12 完成。\n\n---\n\n## Section 13 · 用 FastAPI 把它变成 Web 接口\n\n**Subsection 1 · 装 FastAPI**\ncmd：`pip install fastapi uvicorn`\n\n**Subsection 2 · 写 API 服务**\n新建 `rag_server.py`：\n```python\nfrom fastapi import FastAPI\nfrom pydantic import BaseModel\nfrom rag_tool import RagKB\n\napp = FastAPI()\nkb = RagKB()\n\nclass AskReq(BaseModel):\n    question: str\n\n@app.post(\"\u002Fask\")\ndef ask(req: AskReq):\n    return {\"answer\": kb.ask(req.question)}\n```\n- cmd 运行：`uvicorn rag_server:app --port 8000`\n- ✅ 预期看到：`Uvicorn running on http:\u002F\u002F127.0.0.1:8000`\n- 浏览器打开 `http:\u002F\u002F127.0.0.1:8000\u002Fdocs` → 能看到接口文档 → 试一次 \u002Fask\n- 💡 你已把一个\"知识库问答\"变成了标准 Web API——这是后面所有产品的底座。\n\n**过关**：能通过浏览器 \u002Fdocs 调通接口 = Section 13 完成。\n\n---\n\n## Section 14 · 综合测试与问题排查\n\n**Subsection 1 · 列 10 个测试问题**\n用 rag_tool.py 测 10 个问题，覆盖：资料内有答案 \u002F 资料内没有 \u002F 模糊问法 \u002F 长问题。\n- 记录每个回答是否：准确 \u002F 引用资料 \u002F 没乱编。\n\n**Subsection 2 · 记常见坑**\n在备忘录写：\n```\n问题1 答非所问 → TopK 太小 or chunk 太大，调大 K \u002F 调小 chunk\n问题2 资料有却答不出 → 检索没召回，检查 Embedding 语言是否匹配（中文要中文模型）\n问题3 幻觉\u002F乱编 → Prompt 里\"资料没有就说没有\"写死\n问题4 速度慢 → bge-large 换 small；或加缓存\n```\n\n**过关**：10 题测试完 + 常见坑写进笔记 = Section 14 完成。\n\n---\n\n## Section 15 · 站 5 验收\n\n**勾选**\n- [ ] 能说出\"为什么需要 RAG\"和完整流程\n- [ ] 能说出三大范式、三大部件\n- [ ] 跑通加载→分块→向量化→入库→检索（Section 4~7）\n- [ ] rag_full.py 完整闭环，资料外问题不乱编（Section 8）\n- [ ] 做完 chunk 大小实验，能说取舍（Section 9）\n- [ ] 做过 TopK 对比，知道影响（Section 10）\n- [ ] 能说出中文 Embedding 选型（Section 11）\n- [ ] rag_tool.py 封装成类（Section 12）\n- [ ] FastAPI 接口调通（Section 13）\n- [ ] 10 题测试 + 常见坑笔记（Section 14）\n\n**写 300 字Part 5 总结**：RAG 完整链路 + 你踩过的坑。\n\n**全勾选 = Part 7 通过** → 进入下一站 Part 8 · RAG 优化与评估，10 天：三大范式 + 重排 + RAGAS 打分）。+",7,[14,21,27,33,39,44,50,51,56,62,68,75,81,87,93,99,105,111,117,123,129],{"id":15,"slug":16,"title":17,"description":18,"level":19,"topic":20,"url":10,"content":10,"sortOrder":15},1,"part-1-llm-basics","Part 1 · 大模型基础认知","小白零基础友好。这一站不写代码，只建立\"大模型到底是什么\"的骨架。","BEGINNER","大模型认知",{"id":22,"slug":23,"title":24,"description":25,"level":19,"topic":26,"url":10,"content":10,"sortOrder":22},2,"part-2-llm-principles","Part 2 · 大模型原理 · 入门实操","这一站不卷数学，只把\"理解模型所需的知识\"讲透。；站 2A 解决\"理解模型\"，站 2B 解决\"面试能答\"。；这一层是\"有余力再做\"，不做也不影响你进入站 3。","大模型原理",{"id":28,"slug":29,"title":30,"description":31,"level":19,"topic":26,"url":10,"content":10,"sortOrder":32},100,"part-3-llm-principles-deep","Part 3 · 大模型原理 · 面试深入","数学基础、机器学习、神经网络、词向量、思维链等面试必考原理",3,{"id":34,"slug":35,"title":36,"description":37,"level":8,"topic":26,"url":10,"content":10,"sortOrder":38},101,"part-4-llm-principles-advanced","Part 4 · 大模型原理 · 进阶可选","从零写迷你模型、RLHF、PPO、分布式训练实操等进阶内容",4,{"id":32,"slug":40,"title":41,"description":42,"level":19,"topic":43,"url":10,"content":10,"sortOrder":4},"part-5-prompt-engineering","Part 5 · Prompt 提示词工程","从这里开始，你每天都要真的调大模型 API。","提示工程",{"id":38,"slug":45,"title":46,"description":47,"level":19,"topic":48,"url":10,"content":10,"sortOrder":49},"part-6-llm-api","Part 6 · 大模型 API 调用","站 3 你已经调通了 API。这一站把\"调用\"做成专业水准：","API 工程",6,{"id":4,"slug":5,"title":6,"description":7,"level":8,"topic":9,"url":10,"content":10,"sortOrder":12},{"id":49,"slug":52,"title":53,"description":54,"level":8,"topic":9,"url":10,"content":10,"sortOrder":55},"part-8-rag-optimization","Part 8 · RAG 优化与评估","站 5 你做出了\"能跑\"的 RAG。这一站把它做到\"能打\"：",8,{"id":12,"slug":57,"title":58,"description":59,"level":8,"topic":60,"url":10,"content":10,"sortOrder":61},"part-9-langchain","Part 9 · LangChain 框架","目标：用 LangChain 把\"模型、提示词、检索、记忆、工具\"串成可复用的链和 Agent。","LangChain",9,{"id":55,"slug":63,"title":64,"description":65,"level":8,"topic":66,"url":10,"content":10,"sortOrder":67},"part-10-agent","Part 10 · Agent 基础","让模型从\"会聊天\"变成\"能干活\"：自己拆任务、调工具、看结果、再行动。","Agent",10,{"id":61,"slug":69,"title":70,"description":71,"level":72,"topic":73,"url":10,"content":10,"sortOrder":74},"part-11-multi-agent","Part 11 · 多 Agent 与 Agent IDE","从\"单个 Agent\"升级到\"多 Agent 协作\"，并掌握 AutoGen \u002F LangGraph \u002F GPTs \u002F Coze \u002F Dify 五个工具。","ADVANCED","多 Agent",11,{"id":67,"slug":76,"title":77,"description":78,"level":72,"topic":79,"url":10,"content":10,"sortOrder":80},"part-12-llamaindex","Part 12 · LlamaIndex","站 5~7 你用了 LangChain 做 RAG。LlamaIndex 是另一条专攻\"数据 + LLM\"的路线。","LlamaIndex",12,{"id":74,"slug":82,"title":83,"description":84,"level":72,"topic":85,"url":10,"content":10,"sortOrder":86},"part-13-transformer","Part 13 · Transformer 深入","站 2A 建立了直觉，这一站把手写代码跑通——从\"懂概念\"到\"写得出\"。","Transformer",13,{"id":80,"slug":88,"title":89,"description":90,"level":72,"topic":91,"url":10,"content":10,"sortOrder":92},"part-14-open-models","Part 14 · 开源模型与私有化部署","目标：把主流开源模型在本地\u002F服务器跑通，理解服务化工程（显存、量化、并发）。","模型部署",14,{"id":86,"slug":94,"title":95,"description":96,"level":72,"topic":97,"url":10,"content":10,"sortOrder":98},"part-15-finetuning","Part 15 · 模型微调 Fine-Tuning","目标：理解\"什么时候必须微调、怎么选基座、怎么备数据\"，并完整跑通一次业务微调。","微调",15,{"id":92,"slug":100,"title":101,"description":102,"level":72,"topic":103,"url":10,"content":10,"sortOrder":104},"part-16-peft-lora","Part 16 · PEFT 参数高效微调","重点吃透 **LoRA**：用极少量可训练参数微调大模型（消费级显卡就能跑）。","PEFT\u002FLoRA",16,{"id":98,"slug":106,"title":107,"description":108,"level":72,"topic":109,"url":10,"content":10,"sortOrder":110},"part-17-quantization","Part 17 · 模型量化","目标：理解\"为什么量化、主流算法各自思路\"，能动手量化并评估效果。","量化",17,{"id":104,"slug":112,"title":113,"description":114,"level":72,"topic":115,"url":10,"content":10,"sortOrder":116},"part-18-data-evaluation","Part 18 · 训练数据与模型评估","数据决定模型上限，评估决定你\"能不能交付\"。","数据与评估",18,{"id":110,"slug":118,"title":119,"description":120,"level":72,"topic":121,"url":10,"content":10,"sortOrder":122},"part-19-multimodal","Part 19 · 多模态应用","让 AI 同时\"看得懂图、听得了音、说得出话\"。","多模态",19,{"id":116,"slug":124,"title":125,"description":126,"level":72,"topic":127,"url":10,"content":10,"sortOrder":128},"part-20-projects-career","Part 20 · 项目实战 + 求职备战","把 0→1 到 1→100 学到的全部收敛成**能展示、能讲、能面试**的项目。","项目与求职",20,{"id":130,"slug":131,"title":132,"description":133,"level":72,"topic":134,"url":10,"content":10,"sortOrder":135},102,"extra-2026-ai-tech","额外篇 · 2026 年 AI 应用开发必学的 5 项成熟技术","从近半年爆发的技术里，挑出已经过了尝鲜期、能真正用在项目里的 5 项：推理模型、MCP、多模态、GraphRAG、AI 编程工具链，每项都给到能跑通的代码。","AI 工程实践",21]