构建 AI 应用的后端,最主流的选择就是 Python + FastAPI。

以下是针对每一个知识点的详细教学:

1. FastAPI 路由 (对标 Express 路由)

在图中的代码里,你看到了 @app.get("/health")@app.post("/api/chat")

  • 装饰器 (Decorator) :Python 里的 @ 叫做装饰器。你可以把它理解为一种"拦截器"或"绑定机制"。@app.get("/health") 的作用就是告诉框架:"当收到对 /health 的 GET 请求时,立刻执行紧挨着我的下方那个函数。"

  • 自动序列化 :注意看 health() 函数,它直接 return {"status": "ok"}。在 Express 中,你通常需要写 res.json({status: "ok"}),但在 FastAPI 中,只要返回一个 Python 字典(Dictionary)------{键:值, 键:值},框架会自动将它序列化为标准的 JSON 格式返回给客户端,非常简洁。

2. Pydantic 模型与类型标注 (对标 TypeScript 的 Interface + 运行时校验)

这是图中最核心的部分,也是 FastAPI 最强大的功能。图中写了 request: ChatRequest,但没有给出定义。

  • 类型标注 (Type Hints) :Python 原本是动态弱类型语言,但现在的现代 Python 后端开发必须写类型标注。request: ChatRequest 明确告诉编辑器和框架,这个参数必须符合 ChatRequest 的结构。

  • Pydantic 到底是什么? 你可以把它当成带有严格运行时校验的 TypeScript Interface 。在前端发起 POST 请求时,Pydantic 会自动拦截 req.body,验证里面的字段。如果不符合格式,它会自动拦截并给前端返回 422 Unprocessable Entity 错误,完全不需要你手动写 if (!request.question) 这种判断逻辑。

如何写出这个 ChatRequest 需要用到类 (Class)

Python

python 复制代码
from pydantic import BaseModel

# 继承 BaseModel,这就相当于定义了一个 Interface
class ChatRequest(BaseModel):
    question: str  # 标注为字符串类型
    # 如果想加一个可选参数,可以这样写:
    # history: list = [] 

3. 数据结构:字典、列表、函数与类

图里提到了需要理解的基本数据结构,它们和 JS 非常相似:

  • 字典 (Dictionary){"answer": request.question}。等同于 JS 的 Object。注意 Python 里的键(Key)在定义时必须带引号。

  • 列表 (List)["AI", "LLM", "Agent"]。等同于 JS 的 Array(数组)。

  • 函数 (Function) :用 def 关键字定义,也就是图中的 def health():def chat(...):

  • 类 (Class) :用 class 关键字定义,主要用于面向对象编程,但在 FastAPI 阶段,你最常用来定义上面提到的 Pydantic 模型。

4. 异常处理 (对标 try...catch)

在调用 AI 模型(比如组装 HTTP 请求发给大模型 API,或者读取本地向量数据库)时,网络超时或服务报错是常态。我们需要捕获这些异常,防止后端服务崩溃。

Python 中使用的是 try...except 语法:

Python

python 复制代码
from fastapi import HTTPException

@app.post("/api/chat")
def chat(request: ChatRequest):
    try:
        # 这里未来会写调用 LLM 的代码
        answer = "模拟 LLM 回复: " + request.question
        return {"answer": answer}
    except Exception as e:
        # 如果出错,抛出标准的 500 状态码
        raise HTTPException(status_code=500, detail=str(e))

🎓 整合实战:跑起你的第一个 AI 接口服务

把上面的知识点组合起来,这就是图里要求的完整、可运行的第一阶段代码。你可以新建一个 main.py 文件,贴入以下代码:

Python

python 复制代码
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel

# 1. 初始化 FastAPI 实例 (相当于 const app = express())
app = FastAPI()

# 2. 定义 Pydantic 模型 (定义请求体结构)
class ChatRequest(BaseModel):
    question: str

# 3. 定义 GET 路由
@app.get("/health")
def health():
    return {"status": "ok"}

# 4. 定义 POST 路由
@app.post("/api/chat")
def chat(request: ChatRequest):
    # 这里直接可以通过 request.question 拿到校验后的安全数据
    response_text = f"你问了:{request.question},这是 AI 的模拟回答。"
    return {"answer": response_text}

如何运行它?

Python 有专门的服务器引擎运行 FastAPI(类似于 Node 运行 JS),最常用的是 uvicorn

在终端执行:

uvicorn main:app --reload

(这里的 main 是文件名 main.pyapp 是代码里实例化的对象,--reload 相当于 nodemon 的热更新)

跑起来后,你可以立刻在浏览器访问 [http://127.0.0.1:8000/docs](http://127.0.0.1:8000/docs)。FastAPI 会自动为你生成一个 Swagger UI 测试页面,你可以直接在页面里测试这两个接口!

小测试:

如果我想在上面的 ChatRequest 里再加一个参数 max_tokens(必须是整数,用来控制大模型生成的最大字数),你觉得上面的 class ChatRequest 应该怎么修改?

答案在这里

在 Python 的 Pydantic 模型里加参数,就像在写数据接口约束一样。因为 max_tokens 需要是一个"整数",在 Python 里整数对应的基础类型是 int(integer 的缩写)。

你只需要在原来的 ChatRequest 类里面加一行:

Python

python 复制代码
class ChatRequest(BaseModel):
    question: str
    max_tokens: int  # 👈 就是这么简单,直接标注为 int 类型

这行代码背后发生了什么?

加上这行之后,FastAPI 就会自动为你做极其严格的参数校验。

假设前端发来的 JSON 数据是这样的:{"question": "你好", "max_tokens": "一百"}(传入了中文字符串,而不是数字)。Pydantic 甚至不会让这个请求进入你的 chat 函数体,而是直接给前端返回一个 422 错误,并附带错误信息指出 max_tokens 必须是合法的数字。这就完全省去了你在代码里手动写 typeof max_tokens === 'number' 这类判断逻辑的麻烦。

进阶小技巧:设置默认值

在实际的 AI 开发中,调用大模型时 max_tokens 通常会有一个合理的默认值。如果你希望前端如果不传这个参数时,后端自动给它设定为 1024,你可以直接用等号赋值:

Python

python 复制代码
class ChatRequest(BaseModel):
    question: str
    max_tokens: int = 1024  # 👈 等号后面就是默认值,这在 TypeScript 里也很常见

只要掌握了这个模式,图中第一阶段的"先懂普通 Python 后端"你就已经通关大半了。能够写出带有严谨数据校验的路由接口,是准备 AI 应用开发面试极其重要的基石。

相关推荐
薛定谔的悦42 分钟前
我是被现实教育之后,才明白 Skill 到底该怎么写
后端
掘金者阿豪1 小时前
你的服务器做过体检么?一份真实的 CentOS 高并发服务器体检与优化实录
后端
SimonKing1 小时前
AI逆向实战:一个壁纸网站被我5分钟摸透了,你也能
java·后端·程序员
IT_陈寒1 小时前
Vite打包时踩了个坑,static资源去哪了?
前端·人工智能·后端
学心理学的程序员1 小时前
anydoc:Firecrawl 出的 Rust 文档转 Markdown,4ms 转换、14 种格式干翻 MarkItDown
开发语言·后端·rust·开源·firecrawl·claude code·anydoc
Python私教1 小时前
创业团队做 App,第一版千万别做“大而全”:MVP 到底该留下什么
后端·python·架构
FfHUCisI1 小时前
Golang SSA 中间表示与优化 Pass
开发语言·后端·golang
武子康1 小时前
我让 Qwen3.6-27B 真改了一次 Git 仓库:工具调用怎样形成 Agent 闭环
人工智能·后端·agent
云浪1 小时前
如何让大模型操作 MySQL 数据库?
javascript·人工智能·后端