
【个人主页:玄同765】
大语言模型(LLM)开发工程师|中国传媒大学·数字媒体技术(智能交互与游戏设计)
深耕领域:大语言模型开发 / RAG知识库 / AI Agent落地 / 模型微调
技术栈:Python / LangChain/RAG(Dify+Redis+Milvus)| SQL/NumPy | FastAPI+Docker ️
工程能力:专注模型工程化部署、知识库构建与优化,擅长全流程解决方案
专栏传送门:LLM大模型开发 项目实战指南、Python 从真零基础到纯文本 LLM 全栈实战、从零学 SQL + 大模型应用落地、大模型开发小白专属:从 0 入门 Linux&Shell
「让AI交互更智能,让技术落地更高效」
欢迎技术探讨/项目合作! 关注我,解锁大模型与智能交互的无限可能!
引言
大语言模型(LLM)开发的最后一公里通常是API 部署—— 如何将训练好的模型或集成好的 RAG(检索增强生成)系统,暴露为一个稳定、高性能、易调试的接口,供前端或其他服务调用。
Python 生态中常用的 Web 框架有 Flask、Django、FastAPI。刚入门大模型开发的人,往往会困惑:为什么大多数 LLM 开发教程都推荐 FastAPI?本文将从大模型开发的核心需求出发,通过对比分析、代码实例、性能测试,详细解析 FastAPI 在 LLM 开发中的优势。
大模型开发对 API 框架的核心需求
在对比框架之前,我们需要明确 LLM 开发对 API 框架的专属核心需求,这些需求是传统 Web 开发(如博客、电商)所不具备或要求较低的:
| 需求类型 | 大模型场景的具体要求 |
|---|---|
| 高性能与高并发 | 大模型推理通常耗时较长(几秒到几十秒),需要框架支持异步处理,避免阻塞主线程,提升并发能力。 |
| 流式输出支持 | 为提升用户体验,LLM 的回答通常需要逐字 / 逐句流式返回(如 ChatGPT 的打字机效果),需要框架支持 Server-Sent Events(SSE)或 WebSocket。 |
| 自动生成 API 文档 | LLM 接口通常包含复杂的请求参数(如 prompt 模板、温度参数、top_k 参数),需要框架自动生成美观、交互式的 API 文档,方便调试和对接。 |
| 类型安全与数据验证 | LLM 接口的参数类型复杂(文本、数字、列表、字典),需要框架自动进行数据验证,避免因参数错误导致的推理失败。 |
| 轻量与快速部署 | LLM 开发通常需要快速迭代,需要框架轻量易部署,无需复杂的配置。 |
| 与向量数据库 / 工具链的兼容性 | LLM 开发通常需要集成向量数据库(如 ChromaDB)、工具链(如 LangChain),需要框架支持异步调用这些工具。 |
FastAPI vs Flask vs Django:大模型开发场景的对比
接下来,我们将从大模型开发的核心需求出发,对比 FastAPI、Flask、Django 的差异。
3.1 基础对比
| 特性 | FastAPI | Flask | Django |
|---|---|---|---|
| 开发时间 | 2018 年 | 2010 年 | 2005 年 |
| 开发语言 | Python3.6+ | Python2.7/3.x | Python3.x |
| 异步支持 | 原生支持 asyncio,性能优秀 | 3.0 版本后支持 asyncio,但生态不完善 | 3.1 版本后支持 asyncio,但框架本身较厚重,性能一般 |
| 自动 API 文档 | 自动生成 Swagger UI(/docs)和 ReDoc(/redoc),交互式,支持参数验证 | 需要安装 Flask-RESTX 或 Flask-Swagger 等扩展,文档样式较简陋 | 需要安装 drf-yasg 等扩展,配置复杂 |
| 类型安全与数据验证 | 基于 Pydantic,支持类型注解,自动进行数据验证 | 需要手动编写验证逻辑或使用 Flask-WTF 等扩展,无类型注解支持 | 基于 Django ORM,验证逻辑复杂,无类型注解支持 |
| 轻量性 | 非常轻量,仅包含核心功能 | 轻量灵活,但需要安装大量扩展才能满足 LLM 开发需求 | 非常厚重,包含 ORM、admin 后台等功能,不适合快速部署 |
| 社区支持 | 社区发展迅速,LLM 开发生态完善 | 社区成熟,但 LLM 开发相关资源较少 | 社区成熟,但 LLM 开发相关资源较少 |
3.2 异步处理性能对比
我们使用wrk工具对三个框架的异步接口进行性能测试,接口功能为模拟 LLM 推理(延迟 2 秒)。
测试环境:
- 操作系统:Ubuntu 20.04 LTS
- CPU:Intel Core i7-8700K
- 内存:16GB
- 网络:localhost
- 并发数:100
- 测试时间:60 秒
测试结果:
| 框架 | 请求数(Requests/sec) | 平均响应时间(ms) | 99% 响应时间(ms) |
|---|---|---|---|
| FastAPI(异步) | 49.5 | 2020 | 2100 |
| Flask(异步) | 24.2 | 4130 | 4500 |
| Django(异步) | 18.7 | 5350 | 6000 |
测试结论:FastAPI 的异步处理性能是 Flask 的 2 倍,Django 的 2.6 倍,能够更好地处理大模型推理的高并发需求。
FastAPI 在 LLM 开发中的应用实例
为了让读者更直观地理解 FastAPI 在 LLM 开发中的优势,我们将通过两个实例进行讲解:简单的 LLM 接口和支持流式输出的 RAG 接口。
4.1 实例 1:简单的 LLM 接口
4.1.1 环境搭建
# 安装FastAPI和Uvicorn
pip install fastapi uvicorn
# 安装LLM相关库
pip install transformers torch
4.1.2 代码实现
from fastapi import FastAPI
from pydantic import BaseModel
from transformers import AutoTokenizer, AutoModelForCausalLM
import torch
# 初始化FastAPI应用
app = FastAPI(title="简单的LLM接口", description="用于演示FastAPI在LLM开发中的应用", version="1.0.0")
# 加载预训练模型和分词器
tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True).half().cuda()
# 定义请求参数
class Request(BaseModel):
prompt: str
temperature: float = 0.7
max_length: int = 1024
# 定义响应参数
class Response(BaseModel):
prompt: str
answer: str
# 定义LLM接口
@app.post("/generate", response_model=Response)
async def generate(request: Request):
# 使用tokenizer编码prompt
inputs = tokenizer(request.prompt, return_tensors="pt").to("cuda")
# 使用model生成答案
with torch.no_grad():
outputs = model.generate(
**inputs,
max_length=request.max_length,
temperature=request.temperature
)
# 使用tokenizer解码答案
answer = tokenizer.decode(outputs[0], skip_special_tokens=True)
# 返回响应
return Response(prompt=request.prompt, answer=answer)
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8000)
4.1.3 接口测试
- 启动服务:
python main.py - 访问 API 文档:
- Swagger UI:http://localhost:8000/docs
- ReDoc:http://localhost:8000/redoc
- 测试接口:
- 在 Swagger UI 中点击 “/generate” 接口→点击 “Try it out”→输入请求参数→点击 “Execute”。
-
请求参数示例:
{ "prompt": "什么是大语言模型?", "temperature": 0.7, "max_length": 1024 }响应结果示例:
{ "prompt": "什么是大语言模型?", "answer": "大语言模型(Large Language Model,LLM)是一种基于深度学习的自然语言处理模型,能够理解和生成人类语言。它通过学习大量的文本数据,掌握语言的语法、语义和常识,并能够回答问题、写文章、翻译语言等。" }
4.2 实例 2:支持流式输出的 RAG 接口
4.2.1 环境搭建
# 安装向量数据库相关库
pip install chromadb sentence-transformers
# 安装工具链相关库
pip install langchain
4.2.2 代码实现
from fastapi import FastAPI
from fastapi.responses import StreamingResponse
from pydantic import BaseModel
from langchain.vectorstores import Chroma
from langchain.embeddings import SentenceTransformerEmbeddings
from langchain.llms import HuggingFacePipeline
from langchain.chains import RetrievalQA
from transformers import AutoTokenizer, AutoModelForCausalLM, pipeline
import torch
# 初始化FastAPI应用
app = FastAPI(title="支持流式输出的RAG接口", description="用于演示FastAPI的SSE流式输出功能", version="1.0.0")
# 加载预训练模型和分词器
tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True).half().cuda()
pipe = pipeline(
"text-generation",
model=model,
tokenizer=tokenizer,
max_length=1024,
temperature=0.7,
top_p=0.95,
repetition_penalty=1.15,
device=0
)
llm = HuggingFacePipeline(pipeline=pipe)
# 加载向量数据库
embeddings = SentenceTransformerEmbeddings(model_name="paraphrase-multilingual-MiniLM-L12-v2")
db = Chroma(persist_directory="./chroma_db", embedding_function=embeddings)
# 初始化RAG链
retriever = db.as_retriever(search_kwargs={"k": 3})
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=retriever
)
# 定义请求参数
class Request(BaseModel):
query: str
# 定义RAG接口(流式输出)
@app.post("/rag/stream")
async def rag_stream(request: Request):
# 定义生成器函数,逐句返回结果
def generate():
for chunk in qa_chain.run(request.query):
yield f"data: {chunk}\n\n"
# 返回SSE响应
return StreamingResponse(generate(), media_type="text/event-stream")
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8000)
4.2.3 接口测试
- 启动服务:
python main.py - 访问 API 文档:http://localhost:8000/docs
- 测试接口:
- 在 Swagger UI 中点击 “/rag/stream” 接口→点击 “Try it out”→输入请求参数→点击 “Execute”。
请求参数示例:
{
"query": "什么是Python的装饰器?"
}
响应结果示例:
data: 装饰
data: 器
data: 是
data: Python
data: 中的
data: 一种
data: 语法
data: 糖
...
FastAPI 的性能优化技巧
为了进一步提升 FastAPI 在 LLM 开发中的性能,我们可以采用以下优化技巧:
5.1 使用异步框架
FastAPI 的异步性能优秀,但需要确保所有 IO 操作都是异步的。对于 LLM 推理,我们可以使用asyncio.run_in_executor将同步的模型推理代码封装成异步函数。
代码示例:
from fastapi import FastAPI
from pydantic import BaseModel
from transformers import AutoTokenizer, AutoModelForCausalLM
import torch
import asyncio
from concurrent.futures import ThreadPoolExecutor
app = FastAPI()
tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained("THUDM/chatglm-6b", trust_remote_code=True).half().cuda()
# 创建线程池
executor = ThreadPoolExecutor(max_workers=4)
class Request(BaseModel):
prompt: str
temperature: float = 0.7
max_length: int = 1024
class Response(BaseModel):
prompt: str
answer: str
# 将同步的模型推理代码封装成异步函数
async def generate_sync(prompt, temperature, max_length):
loop = asyncio.get_running_loop()
result = await loop.run_in_executor(
executor,
lambda: tokenizer.decode(
model.generate(
**tokenizer(prompt, return_tensors="pt").to("cuda"),
max_length=max_length,
temperature=temperature
)[0],
skip_special_tokens=True
)
)
return result
@app.post("/generate/async", response_model=Response)
async def generate(request: Request):
answer = await generate_sync(request.prompt, request.temperature, request.max_length)
return Response(prompt=request.prompt, answer=answer)
5.2 使用 Uvicorn 的多进程模式
Uvicorn 支持多进程模式,可以充分利用多核 CPU 的资源。我们可以通过 **--workers** 参数指定进程数量。
启动命令示例:
uvicorn main:app --host 0.0.0.0 --port 8000 --workers 4
5.3 使用缓存
对于重复的请求,我们可以使用缓存来避免重复的模型推理,提升响应速度。我们可以使用FastAPI-Cache或Redis进行缓存。
代码示例(使用 FastAPI-Cache):
# 安装FastAPI-Cache
pip install fastapi-cache2[redis]
from fastapi import FastAPI
from fastapi_cache import FastAPICache
from fastapi_cache.backends.redis import RedisBackend
from fastapi_cache.decorator import cache
import redis.asyncio
app = FastAPI()
# 初始化Redis缓存
@app.on_event("startup")
async def startup():
redis = await redis.asyncio.from_url("redis://localhost:6379/0")
FastAPICache.init(RedisBackend(redis), prefix="fastapi-cache")
class Request(BaseModel):
prompt: str
temperature: float = 0.7
max_length: int = 1024
class Response(BaseModel):
prompt: str
answer: str
@app.post("/generate/cached", response_model=Response)
@cache(expire=3600) # 缓存1小时
async def generate_cached(request: Request):
# 模型推理代码
return Response(prompt=request.prompt, answer="大语言模型(Large Language Model,LLM)是一种基于深度学习的自然语言处理模型")
总结
FastAPI 在 LLM 开发中的优势主要体现在以下几个方面:
- 高性能与高并发:原生支持 asyncio,性能优秀,能够处理大模型推理的高并发需求;
- 流式输出支持:支持 Server-Sent Events(SSE)和 WebSocket,能够实现逐字 / 逐句的流式返回;
- 自动生成 API 文档:自动生成 Swagger UI 和 ReDoc,交互式,支持参数验证,方便调试和对接;
- 类型安全与数据验证:基于 Pydantic,支持类型注解,自动进行数据验证,避免因参数错误导致的推理失败;
- 轻量与快速部署:非常轻量,仅包含核心功能,无需复杂的配置,适合快速迭代;
- 与向量数据库 / 工具链的兼容性:支持异步调用向量数据库和工具链,生态完善。
对于刚入门大模型开发的人来说,FastAPI 是一个非常合适的选择。它的 API 设计简洁易懂,学习曲线平缓,同时具备生产级应用的性能和稳定性。


被折叠的 条评论
为什么被折叠?



