ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

后端转大模型应用开发:RAG、Agent、微调、向量库与LLM部署全攻略

后端转大模型应用开发:RAG、Agent、微调、向量库与LLM部署全攻略 很多后端同学在准备大模型应用岗秋招时都会遇到同一个问题网上资料非常多但知识点零散今天看到一个 RAG 教程明天刷到一个 Agent 项目后天又发现微调才是重点学到最后感觉什么都看过面试时却答不出系统性的内容。本文围绕“后端转大模型”这条学习主线把 RAG、Agent、微调、提示词、向量库、LLM 部署六个核心板块串起来讲清楚每个方向解决什么问题、面试官会问什么、动手项目该怎么做。内容覆盖完整适合正在准备秋招面试的应届生也适合想转岗 AI 应用开发的后端工程师。1. 背景与知识全景1.1 为什么后端开发者适合转大模型应用开发大模型应用开发与传统后端开发有一个非常重要的区别传统后端更多是“确定性逻辑”请求进来按照代码分支处理数据返回结果而大模型应用的核心是“LLM 推理 业务逻辑编排”你需要把大模型的能力嵌入到真实业务系统中让模型能读文档、能调用工具、能回答垂直领域的问题。这个过程中后端工程师的工程能力反而是优势熟悉 API 设计、服务部署、数据库使用了解高并发、缓存、异步任务等工程问题有良好的代码规范、模块拆分和测试意识。所以“后端转大模型”并不是从零开始而是把原有工程能力迁移到新的技术栈上再补齐 AI 应用开发特有的知识。1.2 六大核心板块的能力地图在 AI 应用岗面试中面试官通常不会只问模型原理而是会围绕“你怎么把大模型落地到业务里”来提问。这张表基本覆盖了高频考察方向板块解决什么问题面试常见切入点上手难度RAG让模型回答私有知识、减少幻觉切块策略、检索优化、召回率低较低Agent让模型自主规划并调用工具完成任务Agent 框架选型、工具调用机制中等微调改变模型行为、注入特定领域知识LoRA 原理、数据量需求、显存估算较高提示词工程用更少的成本让模型输出更稳定角色设定、思维链、结构化输出低向量库管理文本向量、支撑相似度检索向量库选型、索引类型、混合检索较低LLM 部署让模型真正跑在业务环境中推理加速、量化、并发处理较高这六个板块并不是孤立的。一个完整的 AI 应用项目可能同时用到 RAG Agent 向量库 部署而微调和提示词是优化手段。在准备面试时建议先掌握每个板块的独立知识点再通过项目把它们串联起来。2. 环境准备与工具链2.1 本地开发环境大模型应用开发目前以 Python 为主建议提前把环境准备好操作系统Windows / macOS / Linux 均可但涉及本地部署大模型时 Linux 或 macOS 更顺手Python建议 3.10 或更高版本包管理工具使用 conda 创建独立虚拟环境避免依赖冲突GPU如果你需要跑微调或部署 7B 以上模型建议准备至少 8GB 显存的 NVIDIA 显卡如果没有 GPU可以先用 API 方式学习 RAG 和 Agent微调部分通过云 GPU 或 CPU 推理理解流程。conda create -n llm-app python3.10 conda activate llm-app版本需要根据你的项目实际情况调整这里不写死具体版本号重点是演示配置思路。2.2 常用技术组件在后续实战中会用到以下组件先有一个印象即可到对应章节再看具体用法LLM 推理入口OpenAI SDK、本地推理服务如 llama.cpp、vLLMEmbedding 模型用于把文本转成向量常见有 BGE、M3E、OpenAI 的 text-embedding 系列向量数据库Chroma轻量、FAISS简单高效、Milvus适合生产编排框架LangChain、LlamaIndex、Dify 等后端服务FastAPI轻量且适合快速搭建推理服务。2.3 示例项目结构本文的实战代码会围绕一个“本地知识库问答系统”展开项目结构如下llm-app/ ├── api/ # FastAPI 接口层 │ ├── main.py │ └── schemas.py ├── rag/ # RAG 核心逻辑 │ ├── loader.py # 文档加载 │ ├── splitter.py # 文本切块 │ ├── retriever.py # 检索 │ └── generator.py # 生成 ├── agent/ # Agent 相关代码 │ └── tool_agent.py ├── data/ # 知识库原始文档 └── vectorstore/ # 本地向量库存储后面每个代码文件都会标注路径方便对照。3. RAG 应用开发核心拆解3.1 什么是 RAGRAG 全称 Retrieval-Augmented Generation检索增强生成。核心思路是不直接让大模型回答而是先从外部知识库中检索与问题相关的内容把检索结果作为上下文一起交给大模型由模型基于这些参考内容生成答案。它主要解决两个问题幻觉问题模型可能一本正经地编造不存在的知识RAG 通过给模型提供真实参考资料来降低幻觉知识更新问题模型训练数据有截止时间RAG 不需要重新训练模型只需要更新知识库。常见应用场景包括企业文档问答、客服机器人、私有知识库、法律法规检索、医疗报告解读等。RAG 的完整流程可以拆成两条链路离线链路知识入库加载文档 - 解析文档 - 清理内容 - 文本切块 - 向量化 - 写入向量库在线链路问答检索用户提问 - 问题向量化 - 向量库相似度检索 - 拼接 Prompt - LLM 生成 - 返回答案3.2 文档加载与解析全流程RAG 的效果很大程度取决于“知识库能不能被正确读取”。不同格式的文档需要不同的解析方式。首先是加载 PDF、Word、Markdown 等格式。以 PDF 为例常见做法是先用 PyMuPDF 或 pdfplumber 提取文本再按段落结构切分。# 文件路径rag/loader.py import fitz # PyMuPDF def load_pdf(file_path: str) - str: doc fitz.open(file_path) text for page in doc: text page.get_text() return text if __name__ __main__: content load_pdf(data/company_manual.pdf) print(content[:500])需要注意很多 PDF 是扫描件直接提取不到文本需要 OCR 处理。这类问题在面试中也很常见可以回答“使用 PaddleOCR 等工具先做文字识别再进入后续流程”。文档解析完成后建议做清洗比如删除页眉页脚、水印文字合并被分页截断的段落去除超链接、HTML 标签残留统一全半角符号。3.3 文本切块策略切块是 RAG 里最容易被低估的环节。切小了语义可能被截断切大了向量检索时噪声会变多而且超出模型上下文窗口。常见切块策略有以下几种固定长度切块按字符数或 token 数切分实现简单但容易切断语义递归字符切块优先按段落切其次按句子切最后按字符切能保留更多语义按文档结构切块利用 Markdown 标题、HTML 标签、PDF 章节等结构信息切分父子切块父块用于生成答案上下文子块用于检索命中兼顾语义完整性和检索精度。下面是用 LangChain 的递归切块器做示例from langchain_text_splitters import RecursiveCharacterTextSplitter text_splitter RecursiveCharacterTextSplitter( chunk_size500, chunk_overlap100, separators[\n\n, \n, 。, , , , ] ) chunks text_splitter.split_text(long_text) for i, chunk in enumerate(chunks[:3]): print(f--- chunk {i} ---) print(chunk)chunk_size控制每块长度chunk_overlap控制相邻块重叠长度。重叠的目的是避免切块时把关键上下文正好切在边界上。面试环节如果被问到“切块策略怎么选”可以从三个角度回答文档类型代码用行切论文用段落切网页用标题结构切下游任务问答场景块可以稍大分类场景块可以稍小评估驱动的调整切块没有标准答案应该用召回率和答案质量去评估而不是拍脑袋定参数。3.4 向量化与检索文本切块后需要把每个 chunk 转成向量。Embedding 模型的选择会影响检索效果常见方案有使用智源 BGE 系列模型中文效果好且可以本地部署使用开源 M3E 模型对中文友好使用 OpenAI 的 text-embedding-3-small效果稳定但需要 API key。以本地 embedding 为例from sentence_transformers import SentenceTransformer model SentenceTransformer(BAAI/bge-large-zh-v1.5) vectors model.encode([RAG是什么, Agent是什么]) print(vectors.shape) # (2, 1024)向量化之后写入向量库。最简单的方案是 FAISS它本质是一个本地索引库适合学习和中小规模项目。import faiss import numpy as np # 假设 chunks 是切块后的文本列表 chunk_vectors model.encode(chunks) dimension chunk_vectors.shape[1] index faiss.IndexFlatIP(dimension) faiss.normalize_L2(chunk_vectors) index.add(chunk_vectors) # 保存索引 faiss.write_index(index, vectorstore/index.faiss)检索时查询语句也做同样的向量化然后计算相似度query_vector model.encode([公司年假制度是什么]) faiss.normalize_L2(query_vector) scores, indices index.search(query_vector, k5) for idx in indices[0]: print(chunks[idx])如果希望更进一步优化检索可以引入混合检索向量检索 关键词检索BM25结合再用 Rerank 模型对候选结果重新排序。这是生产级 RAG 的常见方案也是面试加分项。3.5 基于 llama.cpp Qwen2-7B FastAPI 的本地 RAG 思路很多同学担心调用大模型 API 有成本或数据安全问题所以“本地部署 本地 RAG”是一个非常热门的方向。整体思路是用 llama.cpp 加载量化后的 Qwen2-7B 模型启动一个 OpenAI 兼容的 API 服务本地文档经过解析、切块、向量化后存入向量库用户提问时先从向量库检索相关内容把检索内容与问题拼接成 Prompt调用本地模型接口生成答案用 FastAPI 封装成 HTTP 服务供前端或业务系统调用。llama.cpp 的部署命令类似下面这样具体命令以你下载的版本为准llama-server -m qwen2-7b-instruct-q4_k_m.gguf \ --host 0.0.0.0 \ --port 8080 \ -c 8192启动后RN 端可以通过 OpenAI SDK 兼容的方式调用from openai import OpenAI client OpenAI(base_urlhttp://localhost:8080/v1, api_keylocal) resp client.chat.completions.create( modelqwen2-7b, messages[ {role: system, content: 你是一个知识库问答助手请基于提供的资料回答问题。}, {role: user, content: 请根据参考资料回答公司年假制度是什么} ] ) print(resp.choices[0].message.content)这个方案的核心价值在于数据不出内网推理在本地完成适合企业内部知识库场景。面试时如果能讲清楚这一套链路已经超过了大多数只调 API 的候选人。4. Agent 开发核心拆解4.1 Agent 与普通程序的区别Agent 可以简单理解为“能自主思考并执行任务的智能体”。传统程序是预先写好的固定流程而 Agent 由大模型驱动可以根据目标动态决定下一步做什么。一个完整的 Agent 通常包含四个核心模块规划拆解任务目标制定执行步骤记忆保留历史对话和关键状态工具调用外部 API、数据库、搜索引擎、代码解释器等行动根据推理结果执行具体操作。面试中常见的问题之一是“Agent 和 RAG 有什么区别”。RAG 是检索知识Agent 是完成任务。两者也可以结合Agent 在回答过程中按需调用 RAG 检索这就是 Agentic RAG。4.2 Agent 框架怎么选常见的 Agent 开发框架有 LangChain、LlamaIndex、AutoGPT 以及 Dify 等低代码平台。以 LangChain 为例它提供了 Agent 编排能力可以通过工具列表让模型选择调用哪些函数。下面是一个简化示例核心思路是Agent 先分析用户意图再决定是否调用搜索工具。# 文件路径agent/tool_agent.py from openai import OpenAI client OpenAI(base_urlhttp://localhost:8080/v1, api_keylocal) def search_weather(city: str) - str: 查询天气的模拟工具 return f{city}今天晴天气温20-28度 tools [ { type: function, function: { name: search_weather, description: 查询某个城市的天气, parameters: { type: object, properties: { city: {type: string, description: 城市名称} }, required: [city] } } } ] messages [{role: user, content: 北京今天适合出门吗}] resp client.chat.completions.create( modelqwen2-7b, messagesmessages, toolstools ) print(resp.choices[0].message.tool_calls)需要注意的是不同框架的 Agent API 变化很快示例思路如下需按实际版本调整。面试时更重要的是讲清楚背后的原理模型输出结构化工具调用参数程序负责真正执行工具并把执行结果回传给模型。4.3 Agent 开发学习路线很多同学一开始就扎进 LangChain 源码反而学得很痛苦。更推荐下面的递进路线先用 API 方式理解工具调用机制手动实现一个“模型决策 - 执行工具 - 返回结果”的最小 Agent再引入 LangChain / LangGraph 等框架了解框架怎么管理状态和流程最后做一个完整项目比如“个人知识库问答 Agent”让它能检索文档、调用天气 API、查数据库。这里需要提醒Agent 项目在简历上很容易写但面试官一定会追问细节。建议至少能回答这几个问题模型怎么知道该调用哪个工具工具返回结果后怎么让模型继续思考多轮对话中 Agent 如何保持状态如果工具调用失败Agent 怎么处理多个工具都有匹配时Agent 怎么选择5. 大模型微调实战入门5.1 什么时候需要微调微调Fine-tuning是在预训练模型的基础上用标注数据继续训练让模型适配特定任务或领域。面试中经常出现一个经典问题既然有 RAG为什么还要微调这两者的侧重完全不同RAG解决“模型不知道的知识”通过外部检索补充上下文微调解决“模型行为不符合预期”比如输出格式、语气风格、推理习惯、特定领域的表达方式。实际工作中正确的顺序通常先看提示词能不能解决再看 RAG 能不能解决最后才考虑微调。因为微调成本最高而且效果不一定可控。5.2 LoRA 微调原理全量微调需要更新模型所有参数成本非常高。LoRALow-Rank Adaptation的思想是冻结原模型参数在 Transformer 层中注入低秩矩阵只训练这部分新增参数。这样做的好处是训练参数量大幅减少显存需求降低训练成本低可以在消费级显卡上运行每个任务只需要保存一个很小的适配器权重切换方便。如果你在考虑“LoRA 微调需要多少显存”这取决于模型大小、序列长度、batch size 等因素。以 7B 模型为例启用 LoRA 后在 QLoRA4-bit 量化 LoRA方案下10GB 左右显存有一定机会跑通但不同项目差异很大建议以实际环境测试为准。5.3 llama-factory 安装、部署与微调流程现在微调工具已经很成熟了llama-factory 是其中一个比较口碑较高的开源方案支持 LoRA、QLoRA 等多种微调方法也提供了 Web 界面。安装方式pip install llama-factory使用 Web 界面具体命令以官方文档为准llamafactory-cli webui在 Web 界面中需要配置模型名称比如 Qwen2-7B微调方法LoRA 或 QLoRA数据集自定义 JSON 或 alpaca 格式的数据训练参数学习率、epoch、batch size 等。数据集格式alpaca 风格类似下面这样[ { instruction: 请把下面句子翻译成英文。, input: 今天天气很好。, output: Today is a nice day. } ]命令行方式也类似llamafactory-cli train \ --model_name_or_path Qwen/Qwen2-7B \ --dataset training_data.json \ --method lora \ --output_dir output/lora_checkpoint需要注意以上命令是示例思路实际参数以你安装的 llama-factory 版本为准。训练前一定要确认数据集格式与工具要求一致。5.4 数据量少怎么微调很多同学担心自己没有大量数据。这里给出几种思路先做数据增强利用大模型生成同义改写、不同风格的样本但人工审核质量使用更小的 LoRA rank数据量少时rank 可以设置小一些降低过拟合风险控制训练轮数少数据时训练过多 epoch 容易过拟合先尝试 In-Context Learning把几百条示例放到提示词里看能否满足要求。另一个更务实的思路是如果只是拓展垂类应用不一定要微调。你可以通过“提示词 RAG 少量 few-shot 示例”先跑通业务验证有效后再决定是否微调模型。6. 提示词工程与向量库6.1 提示词工程的核心方法提示词工程是成本最低、见效最快的优化手段。面试中通常会有现场写 Prompt 的题目。几个核心方法角色设定给模型一个明确的身份任务拆解把复杂任务拆成清晰的子步骤限定格式明确要求 JSON、Markdown、表格等输出格式思维链让模型逐步推理避免直接给结论Few-shot提供 2-3 个示例让模型模仿。一个比较完整的提示词模板system_prompt 你是一名企业客服助手负责回答员工关于公司制度的问题。 回复要求 1. 只能基于提供的参考资料回答 2. 如果资料中没有答案请直接说“资料中未找到相关内容”不要编造 3. 回答使用中文控制在200字以内 4. 使用Markdown格式输出包含小标题和列表。 参考资料 {context} 用户问题 {question} 这个模板的关键在于“只能基于提供的参考资料”和“资料中未找到时明确说明”两句都是为了降低幻觉。6.2 向量库选型对比面试中经常被问到“向量库怎么选”。可以记住下面这个对比向量库特点适用场景FAISS轻量、本地索引、安装简单学习、原型、中小规模Chroma轻量、自带持久化快速搭建 RAG DemoElasticsearch支持全文检索与向量检索混合已有 ES 技术栈的团队Milvus分布式、功能全、支持大规模生产环境百万级向量pgvectorPostgreSQL 扩展想复用现有 PG 数据库选择时需要综合考虑数据量、并发量、运维成本、是否需要混合检索、团队已有技术栈。如果面试官问“为什么生产环境不用 FAISS 而用 Milvus”可以从并发、持久化、数据更新、监控运维、多机部署等角度回答。6.3 向量检索的优化方向向量检索的效果优化主要有几个方向Embedding 模型选择不同模型对领域文本的表示能力差异很大建议在真实数据上做小规模评测分段策略调整前面讲过的切块策略直接影响召回质量混合检索向量检索 关键词检索各自召回后合并Rerank对召回的 TopK 结果做重排序把最相关的结果排到前面元数据过滤结合时间、来源、部门等字段先过滤再检索减少噪声。这几个点也是面试加分项说明你不只是会调用接口而是真正理解检索质量的关键环节。7. LLM 部署与推理优化7.1 本地部署核心思路LLM 部署可以理解为“把模型跑在一个稳定、高效、可对外提供服务的环境中”。本地部署通常不是直接用模型原生权重而是做量化和推理加速。常见方式对比方式特点适合场景llama.cpp支持 GGUF 量化格式CPU 也能跑本地小模型、边缘部署vLLM高吞吐、PagedAttention 优化GPU 环境、生产服务Ollama开箱即用命令简单快速体验本地模型FastAPI 推理后端自定义接口业务系统集成部署时最容易忽略的是“显存和并发”。模型量化等级越低显存占用越小但效果损失可能越大。7B 模型通常用 Q4 量化可以在 6GB 左右显卡推理但并发量很高时依然可能 OOM。7.2 用 FastAPI 封装推理服务一个成熟的部署方案是把模型服务封装成 REST API。下面是一个 FastAPI 调用本地 llama.cpp 服务的示例# 文件路径api/main.py from fastapi import FastAPI from pydantic import BaseModel from openai import OpenAI app FastAPI() client OpenAI(base_urlhttp://localhost:8080/v1, api_keylocal) class ChatRequest(BaseModel): question: str context: str app.post(/chat) def chat(req: ChatRequest): prompt f请基于以下资料回答问题\n{req.context}\n\n问题{req.question} resp client.chat.completions.create( modelqwen2-7b, messages[{role: user, content: prompt}] ) return {answer: resp.choices[0].message.content}启动服务uvicorn api.main:app --host 0.0.0.0 --port 8000这样业务系统只需要 POST/chat接口就能获得模型能力前后端彻底解耦。8. 面试高频问题与答题框架8.1 用结构化方式回答问题面试中很多问题并没有标准答案面试官考察的是思维方式和工程经验。建议采用“背景 - 方案对比 - 选型理由 - 注意事项”的结构来回答会比直接抛结论更好。举例回答“RAG 和微调怎么选”先说明问题背景RAG 适合补充外部知识、需要快速更新的场景微调适合改变模型行为和输出风格。然后做对比RAG 成本低、更新灵活但检索效果影响较大微调效果好但成本高、数据要求高。最后给出选型建议先提示词再 RAG最后微调如果两者结合通常用 RAG 提供知识用微调固定输出风格。这样回答的信息量远超简单的一句“RAG 好”或“微调好”。8.2 高频面试题清单下面这份清单可以作为自查表每个问题你都要能用自己的话解释清楚RAG 全流程是什么每个环节如何优化切块有哪些策略如何评估切块好坏向量检索和关键词检索有什么区别什么是混合检索为什么需要 RerankAgent 的工作原理是什么如何管理多轮状态LangChain 和直接调用 API 有什么区别LoRA 的原理是什么QLoRA 为什么能降低显存微调数据需要多少条才有效提示词工程有哪些常用方法本地部署大模型有哪些方案如何做并发优化模型推理速度慢如何优化这些题目并没有标准答案关键是你在准备时真正跑过相关代码能把自己的理解和踩坑经验讲出来。9. 常见问题与排查思路问题现象常见原因解决思路RAG 回答质量差切块不合理或检索召回不相关调整切块策略加入 Rerank检查 embedding 模型向量检索结果为空embedding 维度不匹配或索引未保存好确认模型维度一致检查索引文件加载Agent 不调用工具模型参数没开启工具调用能力使用支持 tool 的模型检查工具定义格式llama-factory 训练报错数据集格式不匹配检查 JSON 字段是否与 alpaca 格式一致本地部署加载模型慢模型文件大或未做量化使用 GGUF 量化版调整线程数内存溢出上下文过长或并发过高降低 max_length限制并发使用流式输出排查问题时建议先定位是“数据问题”还是“模型问题”。RAG 调优时可以先单独测试检索环节确认检索结果是否正确再检查生成环节。如果检索结果本身就不相关改提示词是没有用的。10. 学习路线与最佳实践10.1 后端转大模型应用开发路线如果你正在准备秋招可以按照下面的主线推进先掌握提示词工程这是最基础的能力能用提示词解决很多需求动手做一个 RAG 项目自己爬取或找一份 PDF 文档完成切块、向量化、检索、生成全流程学习向量库和检索优化尝试混合检索和 Rerank记录效果变化了解 Agent 开发先手动实现工具调用再引入框架掌握微调核心原理用 llama-factory 跑一次 LoRA 微调理解参数含义最后做 LLM 部署用 llama.cpp 或 vLLM 部署本地模型用 FastAPI 封装接口。10.2 工程实践中的几点建议在实际项目中有几条经验值得记住不要盲目上大模型先判断普通规则和数据库查询能否解决问题成本更低、更可控RAG 项目先把文档解析做好解析质量决定了知识库上限检索效果要量化记录召回率、准确率、答案相关性评分不要凭感觉调整提示词要版本化每次修改 Prompt 都记录效果线上出问题可以快速回滚本地部署要提前测试显存和并发上线前压测而不是上线后发现 OOM所有涉及生产环境的变更先在测试环境验证并保留回滚方案。如果计划系统准备面试可以按“RAG - Agent - 微调 - 部署”的顺序学习每一块都配套一个小项目。很多培训机构或开源课会给出几十集的覆盖式教学但关键在于自己动手输出而不是只看视频。能把项目细节、踩坑经历和方案选型讲清楚面试中的竞争力自然会上去。
返回列表