大模型应用开发面试指南:RAG、Agent、微调与部署全解析

📅 发布时间:2026/8/30 12:45:31
大模型应用开发面试指南:RAG、Agent、微调与部署全解析
大模型应用开发面试和常规后端面试最大的不同是它没有一套官方教材。RAG、Agent、微调、提示词、向量库、LLM部署每一个方向都是独立的知识体系网上资料又经常互相割裂讲RAG的不管Agent讲微调的不讲部署导致很多准备秋招或打算从后端转大模型应用岗的同学学了很久还是串不起来。这篇文章会围绕大模型应用开发面试中最常考的六块内容展开每一块直接讲核心概念、面试回答框架、工程落地要点和常见坑点。你可以把它当成一份“后端转大模型岗位的面试地图”也可以当成一份项目实战前的复习提纲。看完之后你应该能回答清楚RAG的完整链路是怎样的、Agent和RAG的区别在哪里、LoRA微调到底改了什么、向量库怎么选、7B模型部署需要多少显存、提示词工程有哪些真正实用的套路。欢迎收藏备用文中代码示例都可以直接复制到本地跑一遍跑通之后再去准备面试底气会完全不一样。1. 面试第一关先搞清楚RAG知识库这条主线1.1 RAG解决的是什么问题RAG的全称是Retrieval-Augmented Generation检索增强生成。理解它只需要抓住一个核心矛盾大语言模型的知识只停留在训练截止时间而且它不知道自己不知道什么。举个例子你让GPT回答“我们公司内部的请假流程是什么”它不可能知道因为这份文档根本不在训练数据里。你可能会说那我不如直接拿文档去微调模型。但微调的成本很高而且知识更新很慢今天改一条制度明天又要重新微调一次显然不现实。RAG的思路是不把知识塞进模型参数里而是先把知识文档切成片段存进向量库。用户提问时先从向量库里检索出最相关的几个片段再把这些片段和原始问题一起拼成提示词交给大模型生成答案。这样有几个很明显的好处知识可以实时更新只要重新向量化文档即可。答案可以附带引用来源方便审计和排错。不需要对模型本身做任何训练成本低、上手快。所以面试时被问到“RAG和微调有什么区别”核心回答思路就是RAG是把外部知识作为上下文拼进提示词微调是把知识或能力写进模型参数。一个偏外部记忆一个偏内部知识。1.2 RAG的完整链路拆解面试时能画出RAG的完整链路并且讲清楚每个环节的输入输出基本就能拿到基础分。标准RAG流程可以拆成两部分离线索引阶段和在线问答阶段。离线索引阶段文档加载从PDF、Word、Markdown、HTML等格式中提取纯文本。文本切块把长文本按固定长度、句号、章节或语义边界切成多个chunk。向量化用Embedding模型把每个文本块编码成向量。写入向量库存储向量和原始文本构建索引。在线问答阶段问题向量化用同一个Embedding模型把用户问题编码成向量。相似度检索在向量库中查找最相似的Top-K个文本块。重排对检索结果做精排过滤掉不相关片段。构造提示词把用户问题和检索结果拼成prompt。生成回答把提示词交给大模型生成答案。面试时你可以补充一个细节如果项目里用的是中文场景Embedding模型选型很关键很多团队直接用BGE系列或者M3E系列效果比直接套OpenAI的Embedding接口更可控具体看你们项目和模型版本。1.3 一个完整的RAG检索代码示例为了让你对流程有体感下面给一个基于LangChain FAISS的最小RAG检索实现。这个示例使用HuggingFace的Embedding模型你本地要提前安装依赖。pip install langchain pip install langchain-community pip install faiss-cpu pip install sentence-transformers代码中我们直接用HuggingFaceEmbeddings模型选择BGE-small-zh或者M3E按自己网络环境调整。# 文件路径rag_demo.py from langchain_community.document_loaders import TextLoader from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain_community.embeddings import HuggingFaceEmbeddings from langchain_community.vectorstores import FAISS from langchain.chains import RetrievalQA from langchain_community.llms import HuggingFacePipeline # 1. 加载本地文本 loader TextLoader(docs/company_manual.txt, encodingutf-8) documents loader.load() # 2. 文本切块 text_splitter RecursiveCharacterTextSplitter( chunk_size200, chunk_overlap50, separators[\n\n, \n, 。, , , ], ) chunks text_splitter.split_documents(documents) print(f切块数量: {len(chunks)}) # 3. 构建向量库 embedding HuggingFaceEmbeddings( model_nameBAAI/bge-small-zh-v1.5, encode_kwargs{normalize_embeddings: True}, ) vector_store FAISS.from_documents(chunks, embedding) # 4. 构造检索问答链 retriever vector_store.as_retriever(search_kwargs{k: 3}) qa_chain RetrievalQA.from_chain_type( llmHuggingFacePipeline.from_model_id( model_idQwen/Qwen2-7B-Instruct, tasktext-generation, device0, ), retrieverretriever, ) # 5. 查询 query 公司年假政策是什么 answer qa_chain.run(query) print(answer)这里有一个容易踩的坑RecursiveCharacterTextSplitter的separators顺序会影响切块质量中文场景最好把“。”和“”放在前面避免一句话被拦腰截断。还有一个问题是chunk_size不是越大越好太大会导致向量化时语义信息被稀释检索精度下降太小又会丢失上下文。实际项目中200到500之间比较常用具体需要根据文档类型测试。2. 面试第二关Agent应用开发到底在考什么2.1 Agent与普通API调用的区别RAG解决的是“模型不知道”的问题Agent解决的是“模型不会做”的问题。你问一个普通大模型“帮我查一下本周服务器CPU使用率”它会回答“我可以帮你查”但不会真的去调监控API。Agent的做法是让模型自己决定要调用哪个工具、传什么参数、观察返回结果、决定下一步动作。所以Agent本质上是一个“模型 工具 执行循环”的架构。模型是大脑工具是手脚循环是行动路径。面试时被问到Agent的经典回答框架感知识别用户的意图和任务类型。规划把复杂任务拆成多个子步骤。决策决定下一步调用哪个工具或直接回答。执行调用工具函数获取结果。反思根据工具返回结果判断任务是否完成没完成就继续循环。2.2 ReAct模式与Function Calling两个高频考点ReAct和Function Calling。ReAct是一种提示词模式它通过让模型交替输出Thought思考过程、Action调用动作、Observation观察结果来完成任务。这个模式的本质是把“推理过程”和“工具使用过程”交织在一起。Function Calling是OpenAI等模型提供的结构化工具调用接口模型会输出一个JSON格式的工具调用请求而不是直接用自然语言说“我要查天气”。这样做的好处是调用参数结构稳定不容易解析出错。下面给一个伪代码风格的Function Calling调用示例帮助你理解工具调用协议# 文件路径agent_demo.py import json def get_weather(city: str) - str: 模拟天气查询工具 weather_data { 北京: 晴25度, 上海: 小雨22度, 深圳: 多云28度, } return weather_data.get(city, 暂不支持该城市) tools [ { type: function, function: { name: get_weather, description: 查询指定城市的当前天气, parameters: { type: object, properties: { city: {type: string, description: 城市名称} }, required: [city], }, }, } ] # 模拟模型返回的工具调用请求 fake_model_response { tool_calls: [ { function: { name: get_weather, arguments: json.dumps({city: 上海}), } } ] } # 执行工具调用 for tool_call in fake_model_response[tool_calls]: func_name tool_call[function][name] args json.loads(tool_call[function][arguments]) if func_name get_weather: result get_weather(**args) print(f工具返回结果: {result})注意这个示例只是为了演示工具调用协议实际生产项目中你需要用OpenAI SDK或者LangChain的Tool Calling接口不要直接手拆模型输出。2.3 Agent开发常考的工程问题Agent面试最常见的问题还包括Agent和RAG的区别是什么RAG偏知识获取Agent偏任务执行复杂项目通常两者结合先RAG检索知识再通过Agent调用工具完成任务。Agent的Prompt怎么写系统提示词里需要明确角色、可用工具列表、工具参数格式、边界条件和拒绝策略。Agent的工具调用怎么容错工具超时、返回异常时Agent应该把错误信息拼进Observation让模型重新规划而不是直接崩溃。Agent执行卡死怎么办一般会加最大迭代次数、单步超时、人工确认三种机制。关于Agent框架现在比较主流的有LangChain、LangGraph、AutoGen等还有商业化平台Dify、Coze等。面试时可以提一句底层框架不是核心竞争力核心在于你如何设计工具、规划流程、做状态管理。比如有些任务适合“顺序执行”有些任务需要“条件分支”有些需要“人工介入”这些才是真正的难度所在。3. 面试第三关大模型微调与LoRA实战3.1 微调到底改变了什么微调Fine-tuning不是让模型“学会新知识”更多是让模型“适应某种输入输出风格”或“掌握特定任务格式”。举个例子你有一批客服对话数据输入是用户问题输出是标准回答。通过微调模型掌握了客服回答的语气、格式、常用话术和边界。但如果你想让模型知道“公司最新的产品价格”那更应该用RAG因为价格是随时变化的事实性信息写进模型参数里反而容易过期。面试时推荐这样区分知识型需求用RAG。能力型需求用微调。风格型需求用提示词工程或微调。两者结合RAG提供事实上下文微调提供回答姿态。3.2 LoRA与QLoRA原理全参微调需要更新模型所有参数7B模型光存参数就占用约14GB字节训练时优化器和梯度又要额外占空间普通显卡根本扛不住。所以大模型微调的主流方案是参数高效微调。LoRALow-Rank Adaptation的思路冻结原始模型参数在Transformer的注意力层旁路插入低秩矩阵。训练时只更新这些低秩矩阵需要训练的参数量从7B降到几十M级别显存和训练时间都会大幅下降。QLoRA是在LoRA基础上进一步量化把原始模型权重量化到4-bit减少显存占用训练完再合并回正常精度。这个方案让消费级显卡也能微调7B甚至13B模型。面试时会被问到“LoRA训练完怎么部署”方案一合并权重把LoRA权重合并回原始模型导出完整模型文件。方案二运行时动态加载适配器推理服务启动时同时加载基础模型和LoRA权重。方案三生产环境使用vLLM、TGI等推理框架它们原生支持LoRA权重热加载。3.3 用LlamaFactory做一次LoRA微调LlamaFactory是目前比较流行的开源微调工具封装了LoRA、QLoRA等训练流程也支持网页版操作。假设我们要微调Qwen2-7B可以先看命令行流程。安装依赖后准备一份JSON格式的训练数据结构如下[ { instruction: 请根据产品信息回答用户问题, input: 这款手机电池容量是多少, output: 这款手机电池容量为5000mAh支持65W快充。 } ]然后使用LlamaFactory的训练命令llamafactory-cli train \ --model_name_or_path Qwen/Qwen2-7B-Instruct \ --stage sft \ --finetuning_type lora \ --dataset_dir data \ --dataset sft_data.json \ --template qwen \ --output_dir output/qwen2-7b-lora \ --num_train_epochs 3 \ --per_device_train_batch_size 1 \ --gradient_accumulation_steps 8 \ --learning_rate 1e-4 \ --lr_scheduler_type cosine \ --logging_steps 10 \ --save_steps 200 \ --quantization_bit 4注意这里的--quantization_bit 4表示使用QLoRA显存占用会低很多。如果你的显卡显存比较大去掉这行参数直接用LoRA也可以。训练完成后用下面的命令加载llamafactory-cli export \ --model_name_or_path Qwen/Qwen2-7B-Instruct \ --adapter_name_or_path output/qwen2-7b-lora \ --template qwen \ --finetuning_type lora \ --export_dir output/qwen2-7b-lora-merged \ --export_size 4 \ --export_legacy_format false注意这段命令示例以常见开源工作流为准不同版本参数名可能略有差异实际使用时先查看当前版本帮助文档。另外如果输入数据量很小比如只有几百条优先考虑用提示词工程RAG解决不要急着上微调。数据量少时微调很容易过拟合模型会机械背诵训练数据泛化效果反而变差。3.4 微调显存到底怎么算面试经常问“7B模型LoRA微调需要多少显存”这个问题没有固定答案但可以估算。核心影响因素包括模型参数占用。梯度和优化器状态。LoRA适配器参数。batch size和序列长度。是否开启量化。粗略经验值7B模型全参微调需要至少40GB以上显存。7B模型LoRA微调大概需要14GB到20GB。7B模型QLoRA微调8GB左右可以跑起来。13B模型QLoRA微调大概需要16GB到20GB。如果面试官追问“为什么LoRA省显存”重点答因为不需要更新主模型参数也就不需要保存主模型全部梯度和优化器状态。这个思路比死记数字更重要。4. 面试第四关提示词工程与设计模板4.1 提示词工程到底有没有用很多人对提示词工程有误解觉得就是“写几句咒语”。实际上提示词工程是成本最低的模型能力调优方式也是大模型应用开发的基础功。提示词设计有四个核心原则清晰明确告诉模型你希望它做什么、输出什么格式、约束什么范围。提供上下文给出角色背景、知识背景和参考内容。少量示例用一个或几个示例告诉模型期望的输入输出格式。约束边界明确哪些事情不能做、遇到未知内容怎么处理。4.2 一个通用结构化提示词模板下面给一个适合生产环境的提示词模板它会直接提升模型输出的稳定性# Role 你是一名专业的客服助手。 # Task 根据提供的客服知识库内容回答用户问题。 # Rules 1. 只能基于知识库内容回答不能编造事实。 2. 如果知识库中没有相关信息请明确回答“相关知识库中暂无此信息”。 3. 回答使用简体中文保持语气友好、简洁。 4. 回答长度控制在200字以内。 # Knowledge 以下是检索到的知识库内容 {retrieved_context} # User Question {question} # Output Format 请输出 1. 直接回答 2. 知识来源编号这个模板有几个值得注意的点{retrieved_context}和{question}是程序运行时动态填充的变量。Role、Task、Rules、Knowledge分段清晰模型容易理解指令优先级。要求模型“不能编造”可以有效减少幻觉。输出格式拆成两部分一方面方便用户阅读另一方面方便程序解析。4.3 提示词面试常见陷阱面试时容易被追问的问题Few-shot示例应该给几个太少模型掌握不了格式太多会占用上下文长度常见做法是给2到4个高质量示例而不是给很多低质量示例。Chain-of-Thought会带来什么副作用思考链能提升复杂推理任务的准确率但会延长时间和Token消耗而且模型可能“一本正经地错误推理”。提示词被注入攻击怎么办用户在问题中塞入“忽略以上指令”时需要做输入过滤、提示词外层加身份校验、敏感指令采用最高优先级约束。怎么评测提示词效果准备一组验证集对比不同版本提示词的准确率、格式合格率、拒绝率不要只靠个例判断好坏。5. 面试第五关向量库选型与检索优化5.1 主流向量库对比RAG系统的核心存储是向量库。面试时你需要对比主流方案说出各自的适用场景。向量库特点适用场景FAISSMeta开源轻量级纯本地支持CPU和GPU小规模应用、学习演示、离线检索Milvus功能完整支持分布式、云原生生态丰富中大规模生产环境千万级向量检索Chroma轻量、容易上手Python集成度高原型开发、学习项目QdrantRust实现性能好支持过滤条件生产环境对检索精度和过滤要求高PGVectorPostgreSQL扩展能和关系型数据统一管理已有PostgreSQL基础设施的团队Elasticsearch支持向量检索和全文检索混合查询已有ES体系需要混合检索面试时不要只说“我用过Milvus”更推荐说清楚为什么在这个项目里选它、数据量多大、单条向量维度多少、查询QPS要求多少、是否依赖元数据过滤。这些细节才能真正区分你是不是做过项目。5.2 RAG检索优化手段检索是RAG的核心面试被问“RAG效果不好怎么优化”时可以从下面几个方向回答第一优化切块策略。按固定大小切块容易把语义断开可以结合章节、标题、段落边界来切。hierarchical chunking也是一个思路先用小粒度块做精确匹配再把附近的大粒度块作为上下文补充。第二混合检索。向量检索擅长语义相似但有时关键词匹配更准确比如产品型号、人名、编号。混合检索就是同时做向量检索和BM25全文检索再用RRFReciprocal Rank Fusion合并排序。第三重排。向量检索召回Top-50再用重排模型精排到Top-5效果通常比直接取Top-5更好。重排模型有人用BGE-Reranker也有人用Cross-Encoder。第四查询改写。用户原始问题可能口语化且模糊先让模型把问题改写成更清晰、更适合检索的表达再做向量化。比如“那个什么手机挺便宜的”改写成“推荐一款价格在3000元以内的手机”。5.3 一个混合检索思路示例下面是一个混合检索思路的伪代码示例不是完整可运行项目用于面试中描述自己的实现方案# 文件路径hybrid_retrieval_demo.py from rank_bm25 import BM25Okapi def bm25_retrieve(query, documents, top_k10): tokenized_docs [doc.split( ) for doc in documents] bm25 BM25Okapi(tokenized_docs) tokenized_query query.split( ) scores bm25.get_scores(tokenized_query) top_indexes sorted(range(len(scores)), keylambda i: scores[i], reverseTrue)[:top_k] return top_indexes def vector_retrieve(query, vector_store, top_k10): return vector_store.similarity_search_with_score(query, ktop_k) def reciprocal_rank_fusion(vector_results, bm25_results, k60): RRF: score sum(1 / (k rank)) fused_scores {} for rank, doc_id in enumerate(vector_results): fused_scores[doc_id] fused_scores.get(doc_id, 0) 1 / (k rank 1) for rank, doc_id in enumerate(bm25_results): fused_scores[doc_id] fused_scores.get(doc_id, 0) 1 / (k rank 1) return sorted(fused_scores.items(), keylambda x: x[1], reverseTrue) # 索引阶段 documents [员工请年假需要提前三天申请, 病假需要提供医院证明] bm25_results bm25_retrieve(年假怎么申请, documents, top_k2) # 向量检索阶段 # vector_results vector_retrieve(年假怎么申请, vector_store, top_k2) # 融合排序 # final_results reciprocal_rank_fusion(vector_results, bm25_results, k60)这段代码的思路完全可以在面试时展开讲。RRF的优势是不需要调权重不同检索策略的统一性比较好。6. 面试第六关LLM部署与性能优化6.1 本地部署的几种主流方案大模型应用开发岗的面试最后通常会落到部署。部署方案的选择核心是三个问题显存够不够、吞吐量能不能满足、延迟能不能接受。常见的部署方案HuggingFace transformers FastAPI最简单适合原型但吞吐量低。llama.cpp内存占用低支持CPU和GPU混跑适合个人电脑和边缘设备。vLLM高吞吐量推理引擎支持PagedAttention适合生产环境。Text Generation InferenceTGIHuggingFace出的推理服务支持动态批量和量化。TensorRT-LLM英伟达优化方案适合GPU资源固定的场景。面试回答部署问题时一个比较加分的表达是部署方案不是越复杂越好模型量和流量决定了方案选型。个人项目用llama.cpp足够生产环境用vLLM加负载均衡更合适。6.2 基于llama.cpp Qwen2-7B FastAPI部署示例现在越来越多本地知识库项目使用llama.cpp加载量化模型再用FastAPI对外暴露HTTP接口。下面给一个完整示例。先下载llama.cpp并编译然后用它把模型转成GGUF格式或直接下载GGUF量化模型git clone https://github.com/ggerganov/llama.cpp cd llama.cpp make如果你需要自己转换模型先把HuggingFace模型导出成FP16的GGUF格式再做量化。更快的做法是直接下载已经量化好的GGUF文件例如Qwen2-7B-Instruct的Q4_K_M版本。用llama.cpp启动模型做一次测试./llama-cli \ -m models/qwen2-7b-instruct-q4_k_m.gguf \ -p 请用一句话解释RAG是什么 \ -n 256 \ -c 4096参数说明-m指定模型路径-p指定输入提示词-n指定生成的最大token数-c指定上下文长度。然后写一个FastAPI服务将底层调用封装为HTTP接口# 文件路径app/main.py import subprocess import json from fastapi import FastAPI from pydantic import BaseModel app FastAPI() class ChatRequest(BaseModel): prompt: str max_tokens: int 256 class ChatResponse(BaseModel): response: str LLAMA_CLI_PATH ./llama-cli MODEL_PATH models/qwen2-7b-instruct-q4_k_m.gguf app.post(/chat, response_modelChatResponse) def chat(req: ChatRequest): cmd [ LLAMA_CLI_PATH, -m, MODEL_PATH, -p, req.prompt, -n, str(req.max_tokens), --temp, 0.7, --no-display-prompt, ] result subprocess.run(cmd, capture_outputTrue, textTrue, encodingutf-8) return ChatResponse(responseresult.stdout.strip())启动服务uvicorn app.main:app --host 0.0.0.0 --port 8000测试请求curl -X POST http://localhost:8000/chat \ -H Content-Type: application/json \ -d {prompt: RAG和微调有什么区别, max_tokens: 300}这个示例是一个“能跑起来”的最小实现。但面试时你应该指出它的局限每次请求都启动一个进程、无法并发处理多个用户、没有流式输出、没有请求队列。生产环境需要换成一个常驻内存的推理进程比如用llama-cpp-python加载模型或者直接用vLLM作为推理后端。6.3 部署性能怎么看部署完成后要关注四个指标显存占用模型大小加上KV Cache。7B的Q4量化模型大概需要4GB到6GB显存加上上下文和推理开销实际建议预留8GB以上。首Token延迟用户输入问题后多久开始返回第一个字通常应该控制在1到2秒内。Token生成速率每秒能生成多少Token受模型大小和硬件影响很大7B量化模型在消费级显卡上通常能跑到每秒20到50个Token。并发能力多个用户同时访问时的吞吐量和延迟变化vLLM等框架在并发场景下表现更好。面试被问到“7B模型部署需要多大显存”时可以这样答Q4量化后模型权重约4GB加上KV Cache和运行时开销实际部署建议留8GB以上比较稳妥。如果上下文长度很长比如32KKV Cache会显著增加显存容量需要相应提升。7. 大模型应用开发面试答题与学习路线建议7.1 推荐答题结构面试题不管是考RAG还是考微调都可以用一个统一的答题框架第一步先回答“是什么”。用一句话解释概念让面试官确认你理解基础。第二步再回答“解决什么问题”。最好带业务场景比如“我们之前在客服系统里遇到模型无法回答新政策的问题所以用了RAG”。第三步拆解方案细节。讲流程、讲选型、讲数据结构、讲代码实现这才是面试官想听的重点。第四步主动说出坑点和权衡。比如“我们原先用固定长度切块后来发现语义被切断改用按段落切块后准确率提升了”。第五步如果时间允许补充一个可优化的方向。比如“下一步我们打算加入重排模型”。这个框架的好处是不管遇到什么题都不容易卡壳因为它本身就把“理解概念、落地实践、复盘反思”三个阶段串起来了。7.2 三个月学习路线参考如果你是后端转大模型应用开发可以参考下面的路线第一个月打基础熟悉Python、FastAPI、Docker基础。掌握LangChain或LlamaIndex的基本用法。动手跑通一个RAG项目加载文档、切块、向量化、检索、问答。学习提示词工程能写出结构化提示词模板。第二个月深入方向学习Agent开发掌握Function Calling、ReAct、LangGraph练习写一个能调用搜索或天气API的小Agent。学习微调用LlamaFactory对Qwen或者ChatGLM做一次LoRA微调理解数据格式、训练参数、显存占用。学习向量库对比FAISS、Milvus、Chroma理解索引和检索优化。第三个月综合项目与面试冲刺做一个综合性项目例如基于本地知识库的客服Agent具备RAG检索、工具调用、权限过滤能力。写清楚项目的架构图、核心流程、模型选择原因、性能测试结果。梳理面试题集RAG与微调区别、Agent框架原理、向量库选型、LoRA显存计算、部署方案对比、提示词优化方法。7.3 面试高频题快速自查问题核心回答思路RAG和微调有什么区别RAG是外部知识注入上下文微调是模型参数更新RAG检索不准怎么办优化切块、混合检索、加Reranker、查询改写Agent和RAG的区别RAG偏知识获取Agent偏任务执行通常结合使用LoRA为什么省显存冻结原模型只训练低秩适配器不存全量梯度7B模型LoRA微调需要多少显存约14GB到20GBQLoRA下可压到8GB左右向量库怎么选看数据量、QPS、过滤需求、已有基础设施本地部署用什么方案小规模用llama.cpp生产用vLLM或TGI模型幻觉怎么缓解RAG提供准确上下文提示词限制编造输出后校验准备面试时不建议只背结论每个问题都要能结合自己的项目经历展开。比如提到RAG你就要能画出流程图说出你的数据量、切块大小、Embedding模型、检索测试结果以及踩过的坑。大模型应用开发这个方向变化确实很快但底层能力是稳定的数据结构与算法、Python开发基础、LLM原理理解、系统设计思维、快速学习能力。把这篇文章里的RAG、Agent、微调、提示词、向量库、部署六条线都吃透再配上一两个真正动手做过的项目无论面试还是实际开发都会扎实很多。