尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

大模型工程实战:推理部署、性能优化与RAG应用

大模型工程实战:推理部署、性能优化与RAG应用 最近一两年的 AI 大模型行业已经明显进入了一个“快速出牌、快速淘汰”的阶段。从开源模型到闭源 API每隔几周就会有新的版本发布不少团队费时几个月训出来的模型可能很快就被新的开源基座模型在效果上超越。更有意思的是过去大家比拼的是“谁能训出更大的模型”现在比拼的则是“谁能把模型更低成本地部署上线、更快地被业务场景用起来”。这种变化让很多做模型应用、做 AI 工程的团队产生了一种强烈的紧迫感如果不快速跟上技术迭代不把工程效率提上去模型能力再强也可能在落地环节被拖垮。这篇文章我不会去讨论具体的行业竞争格局也不会做宏观意义上的商业分析而是回到一名后端开发者、AI 应用工程师的视角把“如何在 AI 模型快速迭代的浪潮里保持竞争力”这个抽象问题拆成一整套可以照着做的 AI 工程实践从模型选型、环境搭建、推理部署到 API 服务上线、RAG 集成、性能优化和常见问题排查全部覆盖。无论你是刚接触大模型的初学者还是已经有一定经验的后端开发者都可以把本文当作一份可复用的实战笔记。1. 背景与核心概念大模型落地的“淘汰区”到底指什么1.1 模型能力的“保质期”越来越短在深度学习早期一个经典的图像分类模型可以统治领域很多年因为训练一个高质量模型的门槛太高算力、数据、调参经验都集中在少数研究机构手里。但大语言模型时代完全不同。开源社区的迭代速度极快今天记录在论文或技术报告里的 SOTA 效果可能在几周内就被新的模型刷新。对普通开发团队来说自己从零预训练一个大模型既不现实也没必要——更务实的路径是站在开源基座模型的肩膀上快速做出业务可用的产品。这种快速迭代带来一个直接的工程问题当基座模型更新时测试、部署、监控、回滚的整个链路都要跟着动。如果一个团队的模型服务架构非常笨重每次升级都要停机数小时那它大概率会被快速迭代的浪潮甩在后面。我所说的“淘汰区”本质上是工程效率与模型迭代速度之间的落差。1.2 竞争焦点从“训练”转移到“工程化”早几年大家讨论 AI 时重点往往是模型结构、参数量、训练数据集。但今天打开任意一家云厂商的 AI 服务页面看到的关键词都是推理加速、模型量化、弹性伸缩、RAG 增强、Agent 服务编排。这说明行业已经默认了一个前提模型能力很重要但在模型能力差距不断缩小的背景下谁能更快、更稳、更便宜地把模型能力交付给用户谁才有真正的竞争优势。从技术角度看这意味着开发者需要掌握的能力清单发生了变化会调用模型 API 不够了还要懂得如何自建推理服务。会微调模型不够了还要知道怎么评估模型效果、怎么做灰度发布。会写提示词不够了还要理解 RAG、向量检索、Agent 等工程化手段。1.3 本文的核心技术范围为了避免文章变成一篇泛泛的行业观察我先把本文的技术边界划定清楚。后面所有内容围绕以下几个方面展开大模型推理服务的本地环境搭建与配置。开源模型的量化与部署方案。以 vLLM 和 Ollama 为代表的推理引擎使用。模型 API 的封装与调用以及和 RAG 流程的集成。部署中的显存、延迟、并发、幻觉等高频问题的排查思路。面向生产环境的工程最佳实践。也就是说本文是一篇偏“模型工程应用”的实战文章不会涉及模型训练算法细节也不会去评判某家公司或某个模型的优劣。2. 环境准备与版本说明2.1 硬件环境运行大语言模型推理CPU 也能运行只是速度会比较慢。如果希望达到可交互的体验建议准备一块 NVIDIA GPU显存至少 8GB 以上。不同显存规模可以运行的模型参数量大概可以参考下表显存规模可运行的模型参数范围量化后适用场景8GB7B~9BINT4/INT8个人开发调试、轻量应用16GB7B~14BINT4/INT8小团队内部工具、低并发服务24GB14B~32BINT4/INT8生产环境基础服务40GB 以上32B~70B量化或并行高质量生产服务如果你本地没有 GPU也可以使用云服务器。需要注意云主机的选择要考虑显存、CPU 内存和带宽的平衡。当前 AI 推理比较常见的组合是 4 核 CPU 32GB 内存 24GB 显存起步具体规格根据自己的业务并发量来决定。总之版本和配置需要根据你的实际环境来调整本文示例以常见环境为例重点演示配置思路。2.2 软件环境本文涉及的关键软件如下操作系统Ubuntu 20.04 / 22.04或者其他主流 Linux 发行版。Windows 也可以运行大部分工具但推荐使用 WSL2 或 Docker 环境。Python建议 3.10 或 3.11不要使用太旧的版本部分依赖库对新版本 Python 支持更好。CUDA建议 11.8 或 12.1 以上具体版本要与 PyTorch 对应。PyTorch2.x 版本。推理引擎vLLM、Ollama、llama.cpp。模型格式Hugging Face 权重格式、GGUF 格式。向量数据库可选择 Chroma、Milvus、Qdrant 等。2.3 项目目录结构后面的实战部分我会围绕一个简单的“模型 API 服务 RAG 问答”项目来展开。项目目录结构如下ai-serving-demo/ ├── app/ │ ├── main.py # FastAPI 服务入口 │ ├── rag.py # RAG 检索逻辑 │ └── config.py # 配置项 ├── models/ # 本地模型存放目录 ├── data/ # 知识库文件 ├── scripts/ │ ├── download_model.py │ └── test_api.py ├── requirements.txt └── README.md这个结构只作为参考实际项目中可以根据团队规范调整。3. 核心原理拆解从模型文件到可用服务3.1 模型推理的基本流程先来看一次最简单的模型推理请求会经历哪些步骤。当用户输入一段文本后模型服务需要完成将文本转换为 token 序列也就是把自然语言拆分成模型可以处理的子词单元。将 token 输入模型经过多层 Transformer 计算。生成下一个 token 的概率分布。按采样策略选出下一个 token。循环执行上述过程直到输出终止符或达到最大长度。对用户来说这是一次“输入-输出”的过程但对服务端来说这是一个逐 token 生成、延迟叠加的过程。这也是为什么大模型接口的响应时间通常比传统 API 更长。理解这一点后就会明白为什么 KV Cache、连续批处理这些推理优化技术如此重要。3.2 模型量化显存不够时的关键手段量化是当前部署大模型中非常实用的一类技术。简单理解量化就是把模型权重从高精度数值比如 FP16转换为更低精度比如 INT8 或 INT4从而减少模型体积和显存占用。例如一个 7B 参数模型以 FP16 存储权重大约需要 14GB 显存。如果转换为 INT4 精度权重体积可以压缩到约 4GB。这样可以显著扩大可部署模型的规模或在同样的显存下提高并发能力。量化方式常见的有GGUF / llama.cpp 方案主要用于 CPU 或混合推理使用简单。GPTQ一种面向 GPU 的量化方案在显存占用和效果之间做了平衡。AWQ同样面向 GPU在量化时关注重要权重通道效果更好一些。需要注意的是量化会带来一定程度的精度损失。任务简单、对输出要求不高时这种损失几乎可以忽略但在代码生成、数学推理等对精度要求较高的场景中要谨慎选择量化位数。3.3 推理加速引擎vLLM 为什么快如果只是本地个人使用Ollama 或 llama.cpp 就够了。但如果是多用户并发的生产服务推荐考虑 vLLM。vLLM 的核心优化包括PagedAttention借鉴操作系统虚拟内存的分页思想把 KV Cache 分块管理减少显存碎片。Continuous Batching不需要等待一个请求完全结束再处理下一个请求而是动态地把新请求加入正在执行的批次中大幅提升 GPU 利用率。预分配显存策略避免频繁申请和释放显存。使用 vLLM 之后在相同硬件条件下推理吞吐量通常可以提升数倍这是生产环境部署很关键的一点。3.4 RAG弥补模型知识滞后的问题大模型训练数据存在截止时间模型对训练之后发生的事情一无所知。另外模型可能会因为“自信地编造”而输出错误内容这种情况被称为“幻觉”。RAGRetrieval-Augmented Generation检索增强生成就是针对这些问题的一种工程方案。RAG 的核心思路是在模型回答用户问题之前先从外部知识库中检索出与问题相关的文本片段然后把用户问题和这些检索片段一起交给模型让模型基于检索内容生成回答。这样做的好处是知识可以实时更新不需要重新训练模型。回答可以被约束在特定的知识范围内减少幻觉。数据来源明确每条回答更容易追溯到依据。后面实战部分会给出一个最简单的 RAG 示例。3.5 微调与 LoRA什么时候需要微调RAG 解决的是“知识不够”的问题但有些业务场景需要模型“说话方式”更符合特定风格或者需要掌握特定格式的输出。这时可以考虑微调。全参微调成本高、周期长普通团队通常使用 LoRA 这类参数高效微调方法。LoRA 的思想是冻结原模型参数在模型的线性层旁路引入低秩矩阵只训练这些新增的小矩阵。这样一来训练参数量大幅减少训练所需显存也下降很多。不过需要提醒的是微调并不是一切问题的万能解法。如果只是想让模型知道某个领域的知识RAG 通常是更快速、更可控的方案。微调更适合改变模型的行为方式和输出格式。4. 完整实战部署一个本地大模型 API 服务接下来进入实操。我会通过两个部署路径来实现一个可调用的模型 API 服务先介绍最简单的 Ollama 方案然后介绍面向生产的 vLLM 方案。4.1 创建基础环境先创建一个项目目录并准备虚拟环境mkdir ai-serving-demo cd ai-serving-demo python3 -m venv venv source venv/bin/activate依赖文件 requirements.txt 可以先写成这样fastapi uvicorn openai langchain langchain-community chromadb requests安装依赖pip install -r requirements.txt这里要注意如果要在本地使用 vLLM还需要根据 CUDA 版本安装对应的 PyTorch 和 vLLM。vLLM 的安装方式在不同版本中可能变化建议直接参考官方文档。安装时重点关注版本兼容性。4.2 路径一Ollama 快速部署Ollama 是一个非常方便本地运行大模型的工具它对开发者很友好命令简单支持 GGUF 格式模型。安装 Ollama 后拉取一个模型ollama pull qwen2.5:7b启动服务ollama serve然后测试一下接口curl http://localhost:11434/api/generate -d { model: qwen2.5:7b, prompt: 用一句话介绍什么是大语言模型, stream: false }返回结果中会包含模型生成文本。Ollama 适合做本地调试和快速验证但它的多用户并发能力相对有限生产环境复杂场景下需要评估。4.3 路径二vLLM 启动 OpenAI 兼容服务面向生产环境时我更推荐 vLLM。安装 vLLM 之后可以用一条命令启动一个兼容 OpenAI 接口的推理服务python -m vllm.entrypoints.openai.api_server \ --model Qwen/Qwen2.5-7B-Instruct \ --served-model-name qwen2.5-7b \ --host 0.0.0.0 \ --port 8000 \ --gpu-memory-utilization 0.85 \ --max-model-len 8192参数说明--modelHugging Face 上的模型名称或本地模型路径。--served-model-name对外暴露的模型名称调用方用这个名字来指定模型。--host和--port服务监听地址和端口。--gpu-memory-utilization允许 vLLM 使用的 GPU 显存比例建议保留部分显存给其他进程。--max-model-len模型最大上下文长度设置过大会增加显存占用。启动成功后日志中会显示Uvicorn running on http://0.0.0.0:8000说明服务已经就绪。4.4 编写模型调用代码启动服务后我们可以用 OpenAI SDK 来调用。这里需要说明一下虽然我们用的是本地服务但接口风格与 OpenAI 兼容所以可以直接使用openai库。# 文件路径app/main.py 中的核心片段 from openai import OpenAI client OpenAI( base_urlhttp://localhost:8000/v1, api_keyEMPTY, ) response client.chat.completions.create( modelqwen2.5-7b, messages[ {role: system, content: 你是一个乐于助人的助手。}, {role: user, content: 介绍一下RAG的基本原理。}, ], temperature0.7, max_tokens512, ) print(response.choices[0].message.content)这里api_key填入任意非空字符串即可因为本地服务通常不校验 key但为了兼容客户端逻辑SDK 要求这个字段不能为空。4.5 添加 RAG 检索能力在实际业务中单靠模型自身的知识是远远不够的。下面用一个非常简化的流程演示 RAG把知识库文档拆分为块存入向量数据库用户提问时先检索相关片段再把片段拼入提示词。# 文件路径app/rag.py from langchain_community.document_loaders import TextLoader from langchain.text_splitter import CharacterTextSplitter from langchain_community.embeddings import HuggingFaceEmbeddings from langchain_community.vectorstores import Chroma loader TextLoader(data/knowledge.txt) documents loader.load() text_splitter CharacterTextSplitter(chunk_size300, chunk_overlap50) texts text_splitter.split_documents(documents) embeddings HuggingFaceEmbeddings(model_nameBAAI/bge-small-zh-v1.5) vectorstore Chroma.from_documents(texts, embeddings)检索相关片段retriever vectorstore.as_retriever(search_kwargs{k: 3}) docs retriever.invoke(什么是模型量化) context \n.join([doc.page_content for doc in docs])把检索结果拼入系统提示词prompt f请根据下面的参考资料回答问题如果参考资料中没有相关内容请如实告知。 参考资料 {context} 问题什么是模型量化 这个流程虽然简单但已经具备了 RAG 的完整链路。实际项目中还需要考虑分块策略、向量化模型选择、相似度阈值过滤、检索结果重排等问题。4.6 用 FastAPI 包装成正式服务为了给前端或者其他后端服务提供统一入口我们通常会把模型调用和 RAG 逻辑包装成 HTTP 接口。这里用 FastAPI 实现一个简单的问答接口# 文件路径app/main.py from fastapi import FastAPI from pydantic import BaseModel from openai import OpenAI app FastAPI() client OpenAI( base_urlhttp://localhost:8000/v1, api_keyEMPTY, ) class QARequest(BaseModel): question: str history: list [] app.post(/chat) def chat(req: QARequest): messages [{role: system, content: 你是一个乐于助人的助手。}] for item in req.history: messages.append({role: user, content: item.get(user, )}) if item.get(assistant): messages.append({role: assistant, content: item[assistant]}) messages.append({role: user, content: req.question}) response client.chat.completions.create( modelqwen2.5-7b, messagesmessages, temperature0.7, max_tokens512, ) return {answer: response.choices[0].message.content}启动 FastAPI 服务uvicorn app.main:app --host 0.0.0.0 --port 9000这样就可以通过http://localhost:9000/chat接口来实现问答功能同时底层已经在复用 vLLM 提供的模型服务能力。4.7 运行与验证全部启动后我们可以用一段测试脚本验证整个链路curl -X POST http://localhost:9000/chat \ -H Content-Type: application/json \ -d {question: 什么是 RAG}预期会返回一个 JSON 对象answer字段中包含模型生成的回答。如果回答内容与 RAG 检索到的资料相关说明链路已经跑通。此时整个项目的服务结构大致是客户端请求 - FastAPI 服务 :9000 - vLLM 推理服务 :8000 - 模型输出 | - 向量数据库检索 - 拼接上下文5. 常见问题与排查思路在实际部署模型服务的过程中遇到问题是非常正常的。下面整理几个高频问题并给出排查思路。问题现象常见原因解决思路启动时显存不足OOM模型体积超过显存容量max-model-len 设置过大GPU显存被其他进程占用检查 GPU 占用使用量化模型调低 max-model-len调低 gpu-memory-utilization首 token 延迟很高模型体积大无 GPU输入 prompt 过长采样参数不合理换更小模型或量化模型启用 GPU 推理压缩输入上下文检查是否有 prompt 缓存并发请求时排队严重推理引擎不具备批处理能力GPU 吞吐不足切换到 vLLM增加副本数缩小模型中文回答效果不理想基座模型中文语料有限提示词不够清晰选择中文能力更强的开源模型优化提示词必要时做中文数据微调模型产生幻觉编造答案知识缺失上下文不足采样温度过高引入 RAG 提供参考资料降低 temperature增加检索阈值过滤量化后输出质量下降明显量化位数过低重要任务不适合强量化选择更高精度量化对关键任务单独部署高精度模型API 返回 404 或 model not found请求中的 model 名称与服务启动时不一致检查 served-model-name 参数确认调用端 model 字段一致排查问题时我建议按“从外到内”的顺序先看网络和接口返回再看服务日志最后看模型配置和显存监控。日志是定位问题最重要的手段部署时一定要把日志规范起来。6. 最佳实践与工程建议6.1 模型选型不能只看参数大小参数越多不代表效果一定更好。选型时要考虑业务场景、部署成本和响应速度。对于绝大多数业务知识问答场景先尝试 7B 到 14B 量级的量化模型是一个务实的选择等确认效果无法满足需求再升级到更大模型。同时要关注模型的上下文长度、训练数据的语言分布、许可证等细节。6.2 引入灰度发布与回滚机制模型升级必须像普通服务升级一样可控。建议在正式切换流量之前先在小比例请求中进行灰度。具体做法可以是按用户维度或流量比例放量对比升级前后的回答质量、延迟、错误率等指标。一旦发现问题能够快速回滚到旧模型。6.3 建立效果评估闭环模型效果评估不能只靠肉眼观察几个例子。建议整理一批固定的评测问题集每次模型升级时都用同一批问题测试并记录输出结果。有条件的话可以引入用户反馈标记机制让用户对回答进行点赞或点踩并定期分析反馈数据来指导优化方向。6.4 安全与合规边界模型服务必须具备内容安全能力。在上线之前要梳理清楚哪些内容不允许模型回答、哪些输入需要过滤、哪些输出需要人工审核。在生产环境建议在模型前后增加内容安全过滤模块同时记录完整的调用日志便于问题追溯。还有一点非常重要不要在未经授权的情况下把企业内部敏感数据、用户隐私数据直接传给外部模型 API。即便是本地部署模型也要在数据进入模型之前做好脱敏和权限校验。6.5 监控与可观测性模型服务和传统 Web 服务最大的不同是指标更丰富等待时间、首 token 时间、生成 token 数、吞吐量、GPU 利用率、显存占用等。建议把关键指标接入监控系统并设置合理告警阈值。例如GPU 显存使用率超过 90% 时告警。首 token 延迟超过 3 秒时告警。请求失败率超过 1% 时告警。6.6 成本控制与资源管理模型推理是资源密集型服务不建议长期固定大量 GPU 机器等待低峰流量。在私有化部署场景中可以评估使用弹性扩缩容在允许的合规范围内把低峰流量切换到更小的模型或者使用按量计费的方式降低成本。需要说明的是不同云服务商的部署方案差异较大实际操作时按自己所用平台的规则来。6.7 提示词工程与缓存策略不少场景的问题是可以被缓存的。对于重复度高的高频问题可以引入语义缓存用向量相似度判断用户问题是否与历史问题语义一致。如果一致直接返回缓存答案这样能显著降低推理压力。提示词工程也不是一次性工作。系统提示词要作为独立配置管理方便随时调整。调整提示词后建议先小范围测试而不能直接推到全量。7. 总结与学习建议这篇文章从 AI 模型快速迭代带来的工程压力切入梳理了一整套模型落地的技术路径。核心收获可以总结为三点第一模型能力虽然是基础但工程化能力才是决定业务是否能跑起来的关键。模型选型、量化部署、推理加速、RAG 增强这些环节每一个都会直接影响最终效果和成本。第二部署和优化是一个持续迭代的过程不要指望一次部署就能一劳永逸。要建立模型评估的基准让每次升级都有数据支撑并且做好灰度发布和回滚方案才能在大模型快速迭代的环境中稳定前行。第三对于刚入门的朋友建议的学习路径是先熟练使用开源模型的 API 和 Ollama 这类工具理解提示词工程的基本玩法然后自己动手部署一次 vLLM 服务搞清楚模型加载、参数配置和调用方式接着把 RAG 接入项目解决知识滞后问题最后再根据业务需要研究 LoRA 微调和推理性能优化。每一步都有大量细节但走完这条路径之后你会对“如何让模型在业务中真正可用”有一个完整的认知。动手实践是最好的学习方式。找一台有 GPU 的机器选一个开源模型从最简单的本地问答开始然后逐步叠加 RAG、Agent、性能优化这些能力很快你就能建立起自己的 AI 工程体系。如果在部署过程中遇到其他问题也欢迎在评论区留言讨论我会根据大家的反馈继续补充排查案例。
返回列表