RAG技术与参数高效微调剖析
1. 相关面试真题1.1.请说明RAG与PEFT的核心区别,并结合业务场景说明如何在两者之间做技术选型RAG与PEFT是大模型应用中解决两类正交问题的核心技术,定位和适用场景存在本质差异。RAG是外部知识注入技术,相当于让大模型"开卷考试",专门解决静态知识截止和私有领域知识获取问题;PEFT是模型行为定制技术,相当于训练大模型的"答题习惯",用于解决输出格式不稳定、领域风格不匹配的问题。两者核心维度对比如下:技术选型遵循以下核心原则:✅ 频繁变化、需要审计、需要精确引用的事实性信息,优先用RAG。✅ 稳定的输出格式、行为模式、领域表达风格,考虑用PEFT。✅ 生产环境主流采用"RAG提供实时事实 + PEFT规范输出行为"的组合架构。❌ 绝对不要用PEFT注入事实知识,这是最常见的架构反模式。1.2.请对比2-Step RAG、Agentic RAG、Hybrid RAG三种架构的优缺点,并说明各自的适用场景。三种RAG架构代表了从简单到复杂的演进路径,在可控性、灵活性和延迟之间做出了不同权衡,没有绝对的优劣,只有是否适合业务需求。2-Step RAG是最基础也最可靠的生产基线,遵循固定的"先检索后生成"流程。它的优势是行为完全可预测、延迟稳定、成本最低、最容易建立自动化测试体系;缺点是灵活性有限,无法处理多步推理问题。最适合FAQ、内部文档助手、政策查询等需要强可控性的标准化场景。Agentic RAG将检索封装为标准工具,由Agent自主决定调用时机。它的优势是灵活性极高,能处理开放式研究、多工具协作等复杂任务;缺点是行为不可预测、调试难度大、成本波动明显。更适合研究助手、数据分析等对灵活性要求高于可控性的场景。Hybrid RAG介于两者之间,结合了多种检索策略和中间验证步骤。通过向量检索与关键词检索的互补提升召回鲁棒性,同时引入检索验证和回答校验环节保障质量。虽然系统复杂度更高,但能满足对召回率和准确性有较高要求的场景,特别是包含专有名词、编号、代码片段等精确匹配需求的查询。架构选型核心原则:永远从最简单的2-Step RAG开始,建立基线。只有当2-Step明确无法满足需求时,再逐步增加复杂度。避免过早引入Agentic RAG,大多数业务场景2-Step或Hybrid足够。复杂度的增加必须带来可量化的业务价值提升。1.3.生产环境中RAG系统最常见的问题是幻觉,请问你会从哪些方面系统性地解决这个问题?幻觉不是单一环节的缺陷,而是RAG全链路多个因素共同作用的结果,必须采用分层治理的系统性方案,不能只靠优化提示词解决。1. 数据层(基础)确保数据源本身的准确性和完整性,建立定期清洗和更新机制。优化文档切分策略,保证每个chunk的语义独立性,避免关键信息被拆分。完善元数据管理,为每个文档块添加来源、版本、可信度等信息。2. 检索层(核心)采用混合检索策略,结合向量检索的语义匹配和关键词检索的精确匹配。合理调整top-k和相似度阈值,在召回率和噪声之间取得平衡。高要求场景引入重排序(Reranker)模型,对初筛结果进行二次排序。3. 生成层(关键)严格的提示词约束,明确要求"只基于上下文回答,不知道就说不知道"。强制模型引用来源,要求回答中的每个事实标注对应的文档ID。使用低temperature(0-0.3),减少生成过程中的随机性。4. 验证层(兜底)实现回答自一致性检查,让模型自己验证是否与上下文一致。引入LLM-as-judge进行自动化事实一致性评估。高风险场景建立人工审核兜底机制。5. 整体解决原则预防优先:从数据和检索环节减少幻觉产生的可能。分层治理:每个环节都要有对应的质量控制措施。闭环迭代:建立用户反馈机制,收集错误案例持续优化。合理预期:接受幻觉无法100%消除,重点是将其控制在可接受范围内。2. 大模型应用的核心架构约束所有大模型应用架构设计都必须围绕以下两个不可突破的约束展开:有限上下文窗口:模型只能处理固定长度的输入序列,无法一次性摄入完整知识库。静态知识截止:模型知识固化于训练完成时刻,无法获取实时信息与私有领域知识。这两个约束决定了:试图通过增大模型规模或延长上下文窗口来解决所有问题的方案,在工程上是不可行的。2.1.两种主流解决方案针对上述约束,业界演化出两条正确的技术路线:2.2. 核心架构边界:事实与行为分离所有频繁变化、需要可追溯、需要审计的事实性信息,必须通过RAG系统注入。所有稳定的、可复用的、与领域风格相关的行为模式,可以通过PEFT固化。2.3.验证案例:学生信息查询系统我们将以学生信息查询系统贯穿整个课程,对比两种技术路线的优劣:RAG方案:将学生数据存储在CSV文件中,运行时检索并注入上下文。PEFT方案:训练模型学会"根据给定上下文回答问题,信息不足时拒答"的行为模式。最优架构:RAG提供实时学生数据,PEFT确保输出格式与行为一致性。3. RAG 模块化检索流水线3.1. RAG的核心设计哲学RAG的本质是将知识从模型参数中解耦出来,构建独立的外部记忆系统。这种解耦带来了三个关键的架构优势:知识可独立更新:无需重新训练模型即可更新知识库。来源可追溯:所有回答都可以追溯到原始文档。系统可水平扩展:检索系统与生成系统可以独立扩容。3.2. 两条独立流水线一个生产级RAG系统由两条完全解耦的流水线组成:1.离线索引流水线数据源 → 文档加载器 → 标准化Document → 文档切分器 → 嵌入模型 → 向量数据库架构特性:批量执行,对延迟不敏感。计算密集型,适合离线调度。幂等操作,支持增量更新。2.在线服务流水线用户查询 → 查询嵌入 → 向量检索 → 上下文聚合 → 提示词模板 → 大模型 → 回答架构特性:实时执行,对延迟敏感。IO密集型,需要高并发支持。无状态设计,支持水平扩展。3.3. 七大核心组件的职责边界LangChain官方将RAG系统抽象为七个标准组件,每个组件都有明确的职责与替换接口:架构原则:所有组件都应该面向接口编程,替换任何一个组件都不应该影响其他组件的逻辑。3.4. 最小RAG系统实现// src/shared/knowledge-base.ts import { CSVLoader } from "@langchain/community/document_loaders/fs/csv"; import { RecursiveCharacterTextSplitter } from "@langchain/textsplitters"; import { OpenAIEmbeddings } from "@langchain/openai"; import { MemoryVectorStore } from "langchain/vectorstores/memory"; /** * 构建学生知识库向量存储 * 实现了离线索引流水线的完整逻辑 */ export async function createStudentVectorStore() { // 1. 数据加载: 异构数据源标准化 const loader = new CSVLoader("data/students.csv"); const documents = await loader.load(); // 2. 文档切分: 语义块划分 const splitter = new RecursiveCharacterTextSplitter({ chunkSize: 200, chunkOverlap: 50, separators: ["\n\n", "\n", " ", ""], }); const splits = await splitter.splitDocuments(documents); // 3. 向量索引: 语义空间映射 const embeddings = new OpenAIEmbeddings({ model: process.env.RAG_EMBEDDING_MODEL || "doubao-embedding-vision", }); // 返回标准Retriever接口 return MemoryVectorStore.fromDocuments(splits, embeddings); }这段代码不是一个简单的示例,而是生产级RAG系统的核心骨架。它完美体现了RAG的模块化设计思想:​​​​​替换 CSVLoader 可以接入任何数据源 。调整 TextSplitter 参数可以适配不同文档类型。替换 OpenAIEmbeddings 可以使用任何嵌入模型。替换 MemoryVectorStore 可以使用任何向量数据库。4. 知识库构建:离线索引流水线设计4.1.文档对象标准化LangChain定义了标准的 Document 接口,这是整个RAG系统的数据契约:interface Document { pageContent: string; // 文档的纯文本内容 metadata: Recordstring, any; // 文档元数据 }metadata 是RAG系统可观测性与可追溯性的基础。生产环境中必须至少包含以下字段:source:文档来源标识。last_updated:最后更新时间。document_id:唯一文档ID。chunk_id:块在文档中的序号。4.2. 文档切分策略设计文档切分是RAG系统中最影响检索效果的环节,也是最容易被忽视的环节。1.切分粒度的权衡过粗:单个块包含过多无关信息,增加模型噪声。过细:语义完整性被破坏,单个块无法独立表达完整含义。2.通用切分参数指南3. RecursiveCharacterTextSplitter工作原理/