Skip to content

Python 工程基础

这页不是 Python 语法入门。它默认你已经会写代码,只是还没用 Python 跑过 AI SDK,或者之前主要写前端、Node.js、Java、Go,现在需要先把 AI 应用开发里最常见的一套 Python 起步流程跑通。

目标很简单:本地有一个独立环境,API Key 不写进代码,能用脚本拿到模型回复,再把同样的能力包成一个最小 HTTP 接口。

建立 Python 虚拟环境

我更推荐用 uv,它安装依赖快,后面做项目时也方便管理环境。如果你暂时不想多装工具,用 Python 自带的 venv 也够用。

uv

bash
uv venv
source .venv/bin/activate

用内置 venv

bash
python -m venv venv
source venv/bin/activate

Windows PowerShell 对应是:

powershell
.\venv\Scripts\Activate.ps1

确认当前环境已经切换成功:

bash
python --version
which python

如果 which python 指向项目目录里的 .venvvenv,说明后面的依赖会装在这个项目环境里,不会污染系统 Python。

安装依赖

先装最小依赖:

bash
pip install openai fastapi uvicorn python-dotenv

如果你想把依赖固定下来,可以新建 requirements.txt

txt
openai
fastapi
uvicorn
python-dotenv

以后换一台机器时,直接执行:

bash
pip install -r requirements.txt

这里先不用 LangChain。刚开始学习 AI 应用开发时,最好先看清楚“你的代码如何直接调用模型 API”,等这个闭环稳定了,再去理解框架帮你封装了什么。

配置 API Key

在项目根目录新建 .env

txt
OPENAI_API_KEY=sk-your-api-key

.env 不应该提交到 Git。它放的是本地密钥,仓库里通常只保留 .env.example 这种示例文件。

读取环境变量时,用 python-dotenv.env 加载进当前进程,再从 os.environ 里取值:

python
import os
from dotenv import load_dotenv

load_dotenv()

api_key = os.environ.get("OPENAI_API_KEY")
if not api_key:
    raise RuntimeError("请先在 .env 中配置 OPENAI_API_KEY")

如果你用的是兼容 OpenAI SDK 的其他服务,通常还会有 base_url 之类的配置。先别急着抽象,等你确实接了第二个模型服务再整理配置层。

第一个 API 调用

新建 chat_once.py

python
import os
from dotenv import load_dotenv
from openai import OpenAI

load_dotenv()

api_key = os.environ.get("OPENAI_API_KEY")
if not api_key:
    raise RuntimeError("请先在 .env 中配置 OPENAI_API_KEY")

model = "gpt-4o-mini"  # 可以替换成任何兼容当前 API 的模型名
client = OpenAI(api_key=api_key)

response = client.chat.completions.create(
    model=model,
    messages=[{"role": "user", "content": "用一句话解释什么是 RAG"}],
)

print(response.choices[0].message.content)

运行:

bash
python chat_once.py

如果能看到模型回复,说明最小调用链已经通了:本地 Python 代码读取 API Key,发起 HTTP 请求,拿到模型返回。

第一个流式调用

非流式调用会等完整回复生成完再一次性返回。聊天产品里更常见的是流式输出:模型生成一点,你的程序就先拿到一点。

新建 chat_stream.py

python
import os
from dotenv import load_dotenv
from openai import OpenAI

load_dotenv()

api_key = os.environ.get("OPENAI_API_KEY")
if not api_key:
    raise RuntimeError("请先在 .env 中配置 OPENAI_API_KEY")

model = "gpt-4o-mini"  # 可以替换成任何兼容当前 API 的模型名
client = OpenAI(api_key=api_key)

stream = client.chat.completions.create(
    model=model,
    messages=[{"role": "user", "content": "给我一个学习 Tool Calling 的小练习"}],
    stream=True,
)

for chunk in stream:
    delta = chunk.choices[0].delta.content
    if delta:
        print(delta, end="", flush=True)

print()

这个例子只是在终端里逐段打印。真正接到前端时,后端通常会把这些片段转成 SSE 格式,再让浏览器逐段消费。后面可以继续看 流式输出与 SSE

用 FastAPI 封装接口

脚本能跑通之后,就可以把模型调用包成一个最小 API。新建 main.py

python
import os
from dotenv import load_dotenv
from fastapi import FastAPI
from openai import OpenAI
from pydantic import BaseModel

load_dotenv()

api_key = os.environ.get("OPENAI_API_KEY")
if not api_key:
    raise RuntimeError("请先在 .env 中配置 OPENAI_API_KEY")

model = "gpt-4o-mini"  # 可以替换成任何兼容当前 API 的模型名
client = OpenAI(api_key=api_key)
app = FastAPI()


class ChatRequest(BaseModel):
    message: str


@app.post("/chat")
def chat(request: ChatRequest):
    response = client.chat.completions.create(
        model=model,
        messages=[{"role": "user", "content": request.message}],
    )

    return {"reply": response.choices[0].message.content}

这个接口只处理单轮对话,没有会话历史,也没有错误重试。它的价值是帮你看清楚最小后端结构:请求进来,校验字段,调用模型,返回结果。

本地验证

启动服务:

bash
uvicorn main:app --reload

再开一个终端,用 curl 调用:

bash
curl -X POST http://127.0.0.1:8000/chat \
  -H "Content-Type: application/json" \
  -d '{"message":"给我一个适合新手的 RAG 项目点子"}'

你应该会看到类似这样的 JSON:

json
{
  "reply": "可以做一个个人知识库问答应用..."
}

到这里,第一条 AI 应用开发链路已经跑通。下一步先把 Prompt 写稳,再进入结构化输出和工具调用:Prompt 工程

面向开发者的 AI 实战路线——Vibe Coding 与 AI 应用开发