跳到内容

将 Pydantic 模型与 FastAPI 集成

FastAPI 是一个用 Python 构建 Web 应用的令人愉快的工具。它以与 Pydantic 模型的集成而闻名,这使得定义和验证数据结构变得直接且高效。在本指南中,我们将探讨返回 Pydantic 模型的简单函数如何与 FastAPI 无缝集成。

为什么选择 FastAPI 和 Pydantic?

  • FastAPI 是一个现代化的、高性能的 Python Web 框架,用于构建 API。
  • 支持 OpenAPI 和 JSON Schema,用于自动生成文档和验证。
  • 支持 AsyncIO 进行异步编程,利用 AsyncOpenAI() 客户端

代码示例:使用 POST 请求启动 FastAPI 应用

以下代码片段演示了如何使用 POST 端点启动 FastAPI 应用。此端点接受并返回由 Pydantic 模型定义的数据。

import instructor

from fastapi import FastAPI
from pydantic import BaseModel
from openai import AsyncOpenAI

# Enables response_model
client = instructor.from_openai(AsyncOpenAI())
app = FastAPI()


class UserData(BaseModel):
    # This can be the model for the input data
    query: str


class UserDetail(BaseModel):
    name: str
    age: int


@app.post("/endpoint", response_model=UserDetail)
async def endpoint_function(data: UserData) -> UserDetail:
    user_detail = await client.chat.completions.create(
        model="gpt-3.5-turbo",
        response_model=UserDetail,
        messages=[
            {"role": "user", "content": f"Extract: `{data.query}`"},
        ],
    )
    return user_detail

使用 FastAPI 进行流式响应

FastAPI 支持流式响应,这对于返回大量数据非常有用。此功能在使用生成大量数据的大型语言模型 (LLM) 时尤其有用。

from fastapi import FastAPI
from fastapi.responses import StreamingResponse
from typing import Iterable
from pydantic import BaseModel

app = FastAPI()


class UserData(BaseModel):
    query: str


class UserDetail(BaseModel):
    name: str
    age: int


# Route to handle SSE events and return users
@app.post("/extract", response_class=StreamingResponse)
async def extract(data: UserData):
    users = await client.chat.completions.create(
        model="gpt-3.5-turbo",
        response_model=Iterable[UserDetail],
        stream=True,
        messages=[
            {"role": "user", "content": data.query},
        ],
    )

    async def generate():
        async for user in users:
            resp_json = user.model_dump_json()
            yield f"data: {resp_json}"
        yield "data: [DONE]"

    return StreamingResponse(generate(), media_type="text/event-stream")

使用 FastAPI 自动生成文档

FastAPI 利用 OpenAPI 规范自动生成动态且交互式的文档页面,通常称为 /docs 页面。此功能对开发人员来说非常有用,因为它提供了一个实时环境,可以直接通过浏览器测试 API 端点。

要探索您的 API 功能,请按照以下步骤操作

  1. 使用 Uvicorn 命令运行 API:uvicorn main:app --reload
  2. 打开您的 Web 浏览器并导航到 http://127.0.0.1:8000/docs
  3. 您将找到一个交互式 UI,您可以在其中向您的 API 发送不同的请求并实时查看响应。

Screenshot of FastAPI /docs page