
FastAPI与大模型服务化
学习大模型时,除了了解训练流程,还需要掌握如何将模型封装为可调用的服务,方便前端、其他后端或第三方系统访问。
FastAPI 是一个常用的 Python Web 框架,适合构建模型推理接口、内部工具系统以及通用 API 服务。
FastAPI异步支持
速度性能更好,耗时更少,但不代表更好 同步:每次只相应一个,完成后在完成另一个 比如一个请求进来:
- 接收请求
- 调用模型
- 等模型返回
- 返回响应
@app.post("/chat")
def chat(req: ChatRequest):
result = infer(req.prompt)
return {"answer": result}
这个过程中,当前处理流程会一直“等着”。 异步:当程序遇到需要等待的操作时,不傻等,先去处理别的事情。
- 等数据库返回
- 等第三方 API 返回
- 等文件读写
- 等网络响应
@app.post("/chat")
async def chat(req: ChatRequest):
result = await some_io_task()
return {"answer": result}
异步主要优化“等待时间”,不是直接优化“计算速度”。
终端运行指令
python -m uvicorn main:app --reload
python -m uvicorn 会明确使用当前这个 Python
main是当前文件的文件名
app是main里面创建的FastAPI实例
--reload可以使修改后端后可以直接使用而不是关闭后端在打开
访问FastAPI交互式文档
IP地址:端口/docs
基础入门
路由
路由就是url_地址和处理函数之间的映射关系,它决定了当用户访问某个特定网址时,服务器应该执行哪段代码来返回结果 FatsAPI的路由定义基于Python的装饰器模式
@app.get("/")
#FastAPI实例app 请求方法get 请求路径/
参数
客户端发送请求时附带的额外信息和指令 作用是让同一个接口能根据不同的输入,返回不同的输出,实现动态交互
路径参数
位置:URL路径的一部分
/book/{id}
作用:指向唯一的,特定的资源
方法:get
类型注解 Path
导入FastAPI的Path函数
def name(id: int = Path(...,gt=0,lt=101,description="描述"))
Path函数的 作用:...:默认初始值 gt:int类型最小值,lt:int类型最大值,description:描述
查询参数
位置:URL?之后 k1=v1&k2=v2
作用:对资源集合进行过滤,排序,分类等操作
方法:GET
@app.get("/hello/news_list")
async def get_news_list(skip: int, limit: int):
return {"skip": skip, "limit": limit}
额外类型注解Query
skip: int = Query(0 ,description="描述" ,lt = 10),
和Path差不多
请求体参数
位置:HTTP请求的消息体(body)中 作用:创建,更新资源携带大量数据,如:JSON 方法:POST,PUT等等 请求有三部分
请求行
包括方法,URL,协议版本
请求头
元数据信息(Content-Type,Authorization等)
请求体
1.定义类型
from pydantic import BaseModel
class User(BaseModel):
name: str
age: int
password: str
2.类型注解
user:User
Field类型注解
从pydantic导入类型注解
from pydantic import Field
响应类型
默认情况下,FastAPI会自动将路径返回的参数对象转换为JSON兼容格式 如果需要返回的非JSON格式,FastAPI同样有丰富的相应类型去返回不同的结果
响应类型设置方式
装饰器中指定响应类
场景:固定返回类型(HTML,纯文本等)
from fastapi.responses import HTMLResponse
@app.get("/html", response_class=HTMLResponse)
async def get_html():
return "<h1>Hello World<h1>"
返回响应对象
场景:文件下载,图片,流式响应
from fastapi.responses import RedirectResponse
@app.get("/redirect")
async def redirect():
return RedirectResponse(url="/html")#这个返回的是地址,通过RedirectResponse返回地址的文件和图片
自定义返回类型
class User(BaseModel):
name: str = Field(default= "法外狂徒张三", min_length=2, max_length=20, description="用户名,长度2-20")
id: int
title: str
password: str
@app.get("/news/{id}", response_model=User)
async def get_news(id:int, name:str):
return {
"name": name,
"id": id,
"title": f"Hello {id}",
"password": 0000,
}
异常处理
对于客户端引发的错误,可使用fastapi。HTTPException 来中断正常处理流程,并返回标准错误响应
from fastapi import HTTPException
raise HTTPException(status_code=404, detail="用户不存在")