在近两年的技术面试与认证体系中,“AI助手考试” 已成为衡量开发者是否具备智能应用开发能力的关键环节。这类考试不仅考察对大模型API的调用熟练度,更深入检验底层原理、工程落地与问题排查能力。很多学习者能跑通示例代码,却说不清RAG与微调的本质区别,导致笔试或现场问答时失分严重。本文将从技术演进痛点出发,围绕核心概念、代码示例、底层支撑及高频面试题,帮你建立完整的AI助手知识链路。后续还将推出AI助手工程化系列,覆盖Agent、函数调用等进阶主题。
一、痛点切入:为什么需要重新理解AI助手技术

传统实现方式下,开发一个问答型AI助手通常采用关键词匹配 + 规则引擎或早期序列到序列模型。以下是一个极简的规则匹配示例:
传统规则匹配式问答def simple_qa(question): if "天气" in question: return "今天晴天,25℃" elif "新闻" in question: return "获取新闻接口暂不可用" else: return "我不知道你在说什么"
缺点分析:
耦合高:每增加一个意图,就要硬编码if-else
扩展性差:无法处理未预见的问法,用户说“明天热不热”就无法匹配“天气”
维护困难:规则数量爆炸,冲突与遗漏频发
无上下文记忆:无法实现多轮对话
这些痛点促使业界转向基于大语言模型(LLM,Large Language Model)的AI助手架构,其中两个最核心的实现路径便是RAG与微调。
二、核心概念讲解:RAG(检索增强生成)
RAG全称 Retrieval-Augmented Generation,中文为检索增强生成。其核心思想是:在用户提问时,先从外部知识库中检索相关片段,再将这些片段与问题一起提交给LLM生成答案。
生活化类比:RAG就像开卷考试。你(LLM)拿到考题(用户问题)后,允许翻阅指定参考书(知识库),找到相关章节(检索),然后结合书本内容和自己的理解写出答案。
作用与价值:
让AI助手能回答私有、实时或长尾的知识(如公司内部文档、最新新闻)
显著降低幻觉(hallucination)概率,答案有据可查
无需重新训练模型,更新知识库即可刷新能力
三、关联概念讲解:微调(Fine-tuning)
微调是指在预训练好的大模型基础上,使用特定领域或任务的数据集继续训练,更新模型的部分或全部参数,使模型更适配目标场景。
它与RAG的关系:
RAG是一种推理时的知识注入方式(不修改模型参数)
微调是一种训练时的行为改变方式(永久修改模型参数)
对比差异:
| 维度 | RAG | 微调 |
|---|---|---|
| 是否需要训练 | 否 | 是 |
| 知识更新速度 | 实时(更新向量库即可) | 慢(需重新训练) |
| 对外部知识依赖 | 强 | 弱(知识融入参数) |
| 实现成本 | 低(无GPU训练) | 较高(需标注数据+GPU) |
简单示例说明运行机制:
微调就像让一个通用大学生(基座模型)去专门学习三个月法律,之后他成为法律专家,但考物理可能反而变差了。而RAG是这位大学生考试时允许带法律课本,考完课本收回。
四、概念关系与区别总结
一句话概括:RAG是检索先行、按需取用的外挂知识库;微调是潜移默化、改变本体的内生训练。
强化记忆对比:
RAG:不改模型,问啥现查 → 灵活、可溯源
微调:改变模型,知识内化 → 风格统一、低延迟
二者并非互斥,实际生产常组合使用:先用微调让模型学会特定语气或格式,再用RAG接入动态知识。
五、代码示例:极简RAG实现(使用LangChain + FAISS)
以下示例展示最简RAG流程,突出核心逻辑:
需要预先安装:pip install langchain faiss-cpu openai from langchain.embeddings import OpenAIEmbeddings from langchain.vectorstores import FAISS from langchain.chat_models import ChatOpenAI from langchain.chains import RetrievalQA 1. 准备知识库(模拟公司内部文档) documents = [ "AI助手考试包含RAG和微调两大知识点。", "RAG通过检索外部知识来增强生成。", "微调需要准备高质量标注数据集。" ] 2. 向量化并存入FAISS向量库 embeddings = OpenAIEmbeddings() vector_store = FAISS.from_texts(documents, embeddings) 3. 构建检索式问答链 llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0) qa_chain = RetrievalQA.from_chain_type( llm=llm, retriever=vector_store.as_retriever() ) 4. 提问 answer = qa_chain.run("AI助手考试中,RAG需要什么?") print(answer) 输出将基于检索到的"RAG通过检索外部知识..."生成
关键步骤标注:
FAISS.from_texts:文本分块并向量化存储RetrievalQA:自动完成“检索 → 拼接提示 → 调用LLM → 返回”retriever:默认按相似度召回Top-K文档
对比传统方式:传统规则无法处理“RAG需要什么”这种开放式问法,而RAG方式能根据语义检索并生成答案。
六、底层原理与技术支撑点
RAG与微调的底层依赖了多项基础技术:
| 技术点 | 支撑作用 | 关联概念 |
|---|---|---|
| 向量嵌入与相似度计算 | 将文本转为稠密向量,通过余弦相似度快速检索 | 适合面试追问:为什么用余弦而非欧氏距离? |
| Transformer注意力机制 | LLM能够关注输入中的检索片段与问题的相关性 | 面试常考:Self-Attention如何实现长距离依赖? |
| 参数高效微调(PEFT) | 如LoRA,只更新极少参数即可达到全量微调效果 | 技术前沿:如何用1%参数微调千亿模型? |
| 提示工程(Prompt Engineering) | RAG依赖精心设计的模板将检索内容与问题融合 | 易错点:检索内容过长会超出上下文窗口 |
这些底层知识是后续进阶的基石,本文不展开源码,但建议读者额外掌握倒排索引、BM25、HNSW等检索算法原理。
七、高频面试题与参考答案
1. 请简述RAG和微调的区别,以及各自适用场景
参考答案:
RAG不修改模型参数,通过检索外部知识增强生成,适合知识频繁更新、需要可溯源的场景(如客服、实时新闻)。
微调修改模型参数,使模型学习特定风格或知识,适合输出格式固定、需要低延迟且知识相对稳定的场景(如特定行业术语、角色扮演)。
踩分点:是否提到“参数是否变化”、“知识更新成本”、“幻觉抑制方式”。
2. 实现一个AI助手时,如果用户问的问题知识库中没有怎么办?
参考答案:
检索阶段设置相似度阈值,低于阈值则返回“无相关知识点,请补充问题或联系人工”。
利用LLM自身通用知识进行兜底生成,并在回复中明确告知“以下为通用知识,非参考内部文档”。
进阶:加入主动学习流程,记录未命中问题,定期用于微调或扩充知识库。
3. 解释RAG中的“检索”为什么常用向量数据库,而不是传统数据库的like查询?
参考答案:
向量数据库支持语义相似度,能匹配“同义不同词”的查询;而like查询只能做字面匹配。
向量检索通过嵌入模型将文本映射到高维空间,距离近表示语义相近,对拼写错误、口语化表达鲁棒性高。
踩分点:提到“语义鸿沟”、“嵌入模型”、“近似最近邻(ANN)”。
4. 微调会导致灾难性遗忘(Catastrophic Forgetting)吗?如何缓解?
参考答案:
会,当微调数据与预训练数据分布差异大且微调参数过多时,模型可能遗忘原有通用能力。
缓解方法:①使用PEFT(如LoRA)仅更新少量参数;②混合通用数据与领域数据联合训练;③弹性权重巩固(EWC) 等正则化技术。
八、结尾总结
回顾全文核心知识点:
RAG = 检索 + 生成,开卷考试,知识外挂,实时可溯源
微调 = 继续训练,闭卷内化,风格统一,适合稳定场景
关键对比维度:是否修改参数、知识更新速度、实现成本
底层依赖:向量检索、注意力机制、PEFT等
易错提醒:面试时切忌只背定义,要能结合实际场景分析选型理由
下一篇预告:AI助手工程化进阶——函数调用(Function Calling)与多Agent协作原理与代码实战,敬请期待。
