很多开发者希望构建一个能“聊天、问答、调用AI能力”的完整应用,但在前端、后端、模型接口之间打通时,常常踩坑。
今天这篇文章将手把手教你如何从零构建一个 AI 全栈应用:
目标是让你掌握前后端分离 + LLM 调用 + API 代理 + UI 交互的整个流程。
ai-app/
├── backend/ # FastAPI 服务
│ └── main.py
├── frontend/ # Next.js 页面
│ └── pages/
│ └── index.tsx
├── .env
└── README.md
层级 | 技术栈 | 用途 |
---|---|---|
前端 | Next.js + Tailwind | 搭建聊天界面 |
后端 | FastAPI | 提供统一 API 接口 |
LLM 接口 | OpenAI API | 提供模型回答能力 |
cd backend
pip install fastapi uvicorn requests python-dotenv
cd frontend
npx create-next-app@latest
npm install axios
npm install -D tailwindcss postcss autoprefixer
npx tailwindcss init -p
backend/main.py
from fastapi import FastAPI, Request
from fastapi.middleware.cors import CORSMiddleware
import requests, os
from dotenv import load_dotenv
load_dotenv()
app = FastAPI()
# 允许前端跨域访问
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
@app.post("/chat")
async def chat(req: Request):
body = await req.json()
user_input = body.get("message", "")
headers = {
"Authorization": f"Bearer {OPENAI_API_KEY}",
"Content-Type": "application/json"
}
data = {
"model": "gpt-3.5-turbo",
"messages": [{"role": "user", "content": user_input}]
}
response = requests.post("https://api.openai.com/v1/chat/completions", headers=headers, json=data)
result = response.json()
reply = result["choices"][0]["message"]["content"]
return {"reply": reply}
.env
文件OPENAI_API_KEY=sk-xxxxxxxxxxxxxxxxxxxx
uvicorn main:app --reload --port 8000
参考官网:https://tailwindcss.com/docs/guides/nextjs
frontend/pages/index.tsx
import { useState } from "react";
import axios from "axios";
export default function Home() {
const [message, setMessage] = useState("");
const [reply, setReply] = useState("");
const handleSend = async () => {
const res = await axios.post("http://localhost:8000/chat", { message });
setReply(res.data.reply);
};
return (
AI Chat Assistant
);
}
确保:
localhost:8000
localhost:3000
axios.post('http://localhost:8000/chat')
# 后端
cd backend && uvicorn main:app --reload
# 前端
cd frontend && npm run dev
访问 http://localhost:3000
,即可看到聊天页面!
你已经构建了一个完整的 AI 全栈应用,下一步可以考虑:
将每轮聊天记录维护在前端 messages
数组中,一起发给后端。
将历史对话存入数据库,实现“对话历史”、“回顾功能”。
结合向量数据库(如 FAISS、Qdrant)+ 文本 embedding,实现个性化问答。
用 Web Speech API + Edge TTS 创建语音 AI 助手。
问题 | 解决方案 |
---|---|
跨域失败(CORS) | FastAPI 添加 allow_origins=["*"] |
OpenAI 返回错误 | 检查 API key 是否正确,模型是否支持聊天格式 |
Axios 报错 Network Error | 后端服务未启动 / 地址不正确 / 端口冲突 |
Next.js SSR 与 API 混淆 | 前端直接请求后端接口,避免 API route 混用 |
现在你的全栈 AI 应用已经可以对话了,但距离一个“真正能用”的产品,还有以下几个重要提升点:
当前每次只发送用户一句话,没有上下文,模型不知道你在问什么。
✅ 解决方案:
维护一个 messages
数组,结构如下:
const messages = [
{ role: "user", content: "你是谁?" },
{ role: "assistant", content: "我是一个AI助手。" },
{ role: "user", content: "你能做什么?" },
];
并将 messages
整体发给后端,模型就能理解上下文。
当前 FastAPI 是开放的,任何人都能访问。
✅ 解决方案:
Authorization
header为了实现“对话记录查看”、“历史导出”、“用户画像”功能,可以接入数据库。
✅ 示例结构:
{
"user_id": "abc123",
"timestamp": "2025-04-09T10:00:00Z",
"messages": [
{ "role": "user", "content": "你好" },
{ "role": "assistant", "content": "你好!请问有什么可以帮你?" }
]
}
✅ 实现方向:
SpeechRecognition
(Chrome)识别语音这就是一个真正意义上的语音助手。
Tailwind + Shadcn/ui
构建现代组件(如对话框、按钮、输入框)接下来把这个项目部署上线,分享给朋友或部署到企业内部。
pip install gunicorn uvicorn
gunicorn main:app -k uvicorn.workers.UvicornWorker --bind 0.0.0.0:8000
使用 Nginx 反向代理到端口 8000,设置 HTTPS 证书。
vercel login
vercel deploy
创建 Dockerfile
:
FROM node:18
WORKDIR /app
COPY . .
RUN npm install
RUN npm run build
EXPOSE 3000
CMD ["npm", "start"]
Vercel 环境变量设为:
NEXT_PUBLIC_API_URL=https://your-backend-domain.com
ai-assistant-app/
├── backend/ # FastAPI 后端
│ ├── main.py # 主 API 服务
│ └── .env # API 密钥配置
├── frontend/ # Next.js 前端
│ ├── pages/
│ │ └── index.tsx # 主页面
│ ├── components/ # 可拆分组件(ChatBox, MessageBubble)
│ ├── public/ # 静态资源
│ ├── styles/ # 全局样式
│ └── tailwind.config.js
├── docker-compose.yml # 可选:一键部署配置
├── README.md
想要离线、私有化部署?你可以替换为:
vLLM
+ LLaMA3 / Qwentransformers
+ AutoModelForCausalLM
OpenRouter
统一调用多模型 API只需修改 FastAPI 中调用模型的部分逻辑即可。
支持 AI 自动调用搜索、数据库、发送邮件等“工具”:
例如:
你现在拥有的,不只是一个聊天前后端,而是一个灵活的 AI 架构基础:
这是 2025 年最值得学习的技能之一 —— “用代码连接人和大模型”。