从零构建一个全栈AI应用:Next.js + FastAPI + OpenAI API
💡 为什么写这篇文章?
很多开发者希望构建一个能“聊天、问答、调用AI能力”的完整应用,但在前端、后端、模型接口之间打通时,常常踩坑。
今天这篇文章将手把手教你如何从零构建一个 AI 全栈应用:
- 前端用 Next.js 构建交互界面
- 后端用 FastAPI 管理 API 和权限
- 模型调用使用 OpenAI API(或其他 LLM API)
目标是让你掌握前后端分离 + 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
二、构建后端 API(FastAPI)
🔐 文件:backend/main.py
from fastapi import FastAPI, Request
from fastapi.middleware.cors import CORSMiddleware
import requests, os
from dotenv import load_dotenvload_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
三、构建前端页面(Next.js)
🎨 配置 TailwindCSS(略)
参考官网: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 (<main className="min-h-screen p-10 bg-gray-50"><div className="max-w-2xl mx-auto"><h1 className="text-2xl font-bold mb-4">💬 AI Chat Assistant</h1><textareavalue={message}onChange={(e) => setMessage(e.target.value)}placeholder="输入你的问题..."className="w-full p-4 rounded border"rows={5}/><buttononClick={handleSend}className="mt-4 px-4 py-2 bg-blue-600 text-white rounded">发送</button>{reply && (<div className="mt-6 bg-white p-4 rounded shadow"><strong>AI 回复:</strong><p className="mt-2 whitespace-pre-wrap">{reply}</p></div>)}</div></main>);
}
四、前后端联调
确保:
- 后端 FastAPI 在
localhost:8000 - 前端 Next.js 项目运行在
localhost:3000 - CORS 跨域设置正确,前端使用
axios.post('http://localhost:8000/chat')
启动服务
# 后端
cd backend && uvicorn main:app --reload# 前端
cd frontend && npm run dev
访问 http://localhost:3000,即可看到聊天页面!
五、扩展方向(建议)
你已经构建了一个完整的 AI 全栈应用,下一步可以考虑:
📌 加入上下文记忆
将每轮聊天记录维护在前端 messages 数组中,一起发给后端。
📌 多轮聊天记录存储(MongoDB)
将历史对话存入数据库,实现“对话历史”、“回顾功能”。
📌 接入企业知识库(RAG)
结合向量数据库(如 FAISS、Qdrant)+ 文本 embedding,实现个性化问答。
📌 支持语音输入、TTS 语音回复
用 Web Speech API + Edge TTS 创建语音 AI 助手。
六、踩坑记录
| 问题 | 解决方案 |
|---|---|
| 跨域失败(CORS) | FastAPI 添加 allow_origins=["*"] |
| OpenAI 返回错误 | 检查 API key 是否正确,模型是否支持聊天格式 |
| Axios 报错 Network Error | 后端服务未启动 / 地址不正确 / 端口冲突 |
| Next.js SSR 与 API 混淆 | 前端直接请求后端接口,避免 API route 混用 |
七、项目优化建议:让你的 AI 应用更好用、更像产品
现在你的全栈 AI 应用已经可以对话了,但距离一个“真正能用”的产品,还有以下几个重要提升点:
🧠 1. 多轮上下文记忆(Chat History)
当前每次只发送用户一句话,没有上下文,模型不知道你在问什么。
✅ 解决方案:
维护一个 messages 数组,结构如下:
const messages = [{ role: "user", content: "你是谁?" },{ role: "assistant", content: "我是一个AI助手。" },{ role: "user", content: "你能做什么?" },
];
并将 messages 整体发给后端,模型就能理解上下文。
🔐 2. 接口鉴权(Token 验证)
当前 FastAPI 是开放的,任何人都能访问。
✅ 解决方案:
- 在请求中添加自定义
Authorizationheader - 后端校验合法性(可以设定 JWT token 或简单密码)
- 避免 OpenAI API 被滥用
💾 3. 聊天记录存储(MongoDB / SQLite)
为了实现“对话记录查看”、“历史导出”、“用户画像”功能,可以接入数据库。
✅ 示例结构:
{"user_id": "abc123","timestamp": "2025-04-09T10:00:00Z","messages": [{ "role": "user", "content": "你好" },{ "role": "assistant", "content": "你好!请问有什么可以帮你?" }]
}
🎙 4. 加入语音输入输出(Web Speech API + Edge TTS)
✅ 实现方向:
- 浏览器原生
SpeechRecognition(Chrome)识别语音 - 语音识别后转文本发给后端
- AI 回复后,用 Edge TTS 合成语音播放
这就是一个真正意义上的语音助手。
🎨 5. UI 美化 + Loading 状态优化
- 使用
Tailwind + Shadcn/ui构建现代组件(如对话框、按钮、输入框) - 加入 loading 动画(如 Typing 动效)
- 支持 markdown 渲染(渲染代码、公式、链接)
八、实战部署:让你的 AI 应用上线可用
接下来把这个项目部署上线,分享给朋友或部署到企业内部。
🚀 1. 部署 FastAPI 到服务器(Gunicorn + Nginx)
pip install gunicorn uvicorn
gunicorn main:app -k uvicorn.workers.UvicornWorker --bind 0.0.0.0:8000
使用 Nginx 反向代理到端口 8000,设置 HTTPS 证书。
🌐 2. 部署 Next.js 应用到 Vercel / Docker
✅ 方法一:Vercel 免费部署
vercel login
vercel deploy
✅ 方法二:Docker 本地部署
创建 Dockerfile:
FROM node:18
WORKDIR /app
COPY . .
RUN npm install
RUN npm run build
EXPOSE 3000
CMD ["npm", "start"]
🌍 3. 前后端通信环境变量
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
十、进阶建议与未来趋势
🔄 接入本地模型(替代 OpenAI)
想要离线、私有化部署?你可以替换为:
- 🌐
vLLM+ LLaMA3 / Qwen - 🤗
transformers+AutoModelForCausalLM - ✨
OpenRouter统一调用多模型 API
只需修改 FastAPI 中调用模型的部分逻辑即可。
🤖 让 AI 应用变成插件系统(多工具调用)
支持 AI 自动调用搜索、数据库、发送邮件等“工具”:
- 构建多工具 agent:LangChain / OpenAgents
- 添加功能:获取天气 / 查航班 / 调用企业 API
- 变成你的“AI 秘书”甚至“AI 员工”
🧬 构建 AI Copilot:面向业务的智能助手
例如:
- 🧾 财务 Copilot:读取发票、报销记录、汇总财报
- 📖 教育 Copilot:答疑解惑 + 多模态 PPT 生成
- 🧠 法律 Copilot:合同审核 + 法条查找 + GPT 生成解读
🔚 结语:AI 全栈应用,不只是聊天机器人
你现在拥有的,不只是一个聊天前后端,而是一个灵活的 AI 架构基础:
- 可以换模型、接数据库、加插件
- 可以本地部署、远程扩展、加智能记忆
- 可以向企业级 AI Copilot 逐步演化
这是 2025 年最值得学习的技能之一 —— “用代码连接人和大模型”。
相关文章:
从零构建一个全栈AI应用:Next.js + FastAPI + OpenAI API
💡 为什么写这篇文章? 很多开发者希望构建一个能“聊天、问答、调用AI能力”的完整应用,但在前端、后端、模型接口之间打通时,常常踩坑。 今天这篇文章将手把手教你如何从零构建一个 AI 全栈应用: 前端用 Next.js 构…...
idea里面不能运行 node 命令 cmd 里面可以运行咋回事啊
idea里面不能运行 node 命令 cmd 里面可以运行咋回事啊 在 IntelliJ IDEA(或其他 JetBrains 系列 IDE)中无法运行某些命令,但在系统的命令提示符(CMD)中可以正常运行,这种情况通常是由于以下原因之一导致的…...
Dify 生成提示词的 Prompt
Dify 生成提示词的 Prompt **第1次提示词****第2次提示词****第3次提示词**总结 Dify 生成提示词是,会和LLM进行3次交互,下面是和LLM进行交互是的Prompt。 以下是每次提示词的概要、目标总结以及原始Prompt: 第1次提示词 概要: …...
ocr python库
ocr python库 上手Git、Gitee和Github!watt toolkit...
【学生管理系统升级版】
学生管理系统升级版 需求分析:注册功能:登录功能:验证码规则:忘记密码: 实操:系统主页面注册功能登录功能忘记密码效果演示 需求 为学生管理系统书写一个登陆、注册、忘记密码的功能。 只有用户登录成功之后&…...
HTTP:二.URI及相关术语
HTTP相关技术和术语 WEB开发语言 **http:**Hyper Text Transfer Protocol 应用层协议,默认端口: 80/tcp WEB前端开发语言: htmlcssjavascripthtml Hyper Text Markup Language 超文本标记语言,编程语言,主要负责实现页面的结构 范例:html 语言 <html> <h…...
Web3 的云基础设施正在成型,Polkadot 2.0 用三项技术改写“上链成本”
在Web3基础设施内卷加剧的今天,“如何以更低成本、更大灵活性部署一条高性能应用链”正成为开发者们最关心的问题。而刚刚走出“技术慢热”误区的Polkadot,正在用一套名为 Polkadot 2.0 的架构升级方案,重新定义这一问题的解法。 这套升级最…...
【12】RUST智能指针
文章目录 智能指针Box<T>Rc<T>Weak<T>方法 Arc<T>RefCell<T>方法Ref<T>和RefMut<T> 常见使用方式 智能指针 Box<T> 数据存储在堆上只能有一个所有者 Rc<T> 单线程,引用计数不可变需要主要避免循环引用 …...
机器学习——ROC曲线、PR曲线
一、ROC曲线简介 1.1 ROC曲线的构成 1.横轴(假正率,FPR): 表示负样本被错误分类为正的比例(越小越好) 2.纵轴(真正率,TPR,即召回率): 表示正样…...
Unity AssetBundle依赖树可视化分析工具开发指南
一、需求分析与技术选型 1.1 需求背景 在Unity项目开发中,AssetBundle依赖关系管理是性能优化的关键。当项目资源量达到GB级别时,依赖树深度可能超过10层,容易导致: 资源重复打包(平均冗余率可达15%-30%)…...
WebStorm中使用live-server插件
文章目录 1. 前提条件1.1 已安装Node1.1.1 淘宝的镜像1.2 安装live-server1.3 安装WebStorm2. Windows配置hosts3. WebStorm配置live-server3.1 WebStorm创建3.2 启动 live-server1. 前提条件 1.1 已安装Node Windows PowerShell 版权所有(C) Microsoft Corporation。保留所…...
RTP Payload Format for H.264 Vide(1)
摘要:: 本备忘录描述了一种用于 ITU-T H.264 视频编码标准(与 ISO/IEC 国际标准 14496-10 技术上相同)的 RTP 负载格式,但不包括可伸缩视频编码(SVC)扩展和多视角视频编码(MVC&#…...
我为女儿开发了一个游戏网站
大家好,我是星河。 自从协助妻子为女儿开发了算数射击游戏后,星河就一直有个想法:为女儿打造一个专属的学习游戏网站。之前的射击游戏虽然有趣,但缺乏难度分级,无法根据女儿的学习进度灵活调整。而且,仅仅…...
【Spring Cloud Netflix】GateWay服务网关
1.基本概述 GateWay用于在微服务架构中提供统一的入口点,对请求进行路由,过滤和处理。它就像是整个微服务系统的大门,所有外部请求都要通过它才能访问到后端的各个微服务。 2.核心概念 2.1路由(Route) 路由是Spring Cloud gateWay中最基本…...
Docker部署Jenkins服务
文章目录 1.下载Jenkins服务2.部署Java21(可选)2.1 安装Java21 3.Maven3.9.9安装4.启动Jenkins5.初始化Jenkins5.1 入门5.2 安装推荐的插件5.3 创建第一个管理员用户5.4 实例配置5.5 Jenkins已就绪5.6 开始使用Jenkins5.7 重启Jenkins 6.配置Jenkins6.1 …...
[ctfshow web入门] web40
信息收集 怎么一下子多这么多过滤啊,我以为跳过了好几题 这又能eval了,但是连$也不能用了 不能用. * ?,所以打不出fla*或者fla?????了 不能用/,构造不出日志注入和伪协议包含 仔细观察,禁的是中文的括号&#x…...
蓝桥杯c ++笔记(含算法 贪心+动态规划+dp+进制转化+便利等)
蓝桥杯 #include <iostream> #include <vector> #include <algorithm> #include <string> using namespace std; //常使用的头文件动态规划 小蓝在黑板上连续写下从 11 到 20232023 之间所有的整数,得到了一个数字序列: S12345…...
UE5 Windows游戏窗口置顶
参考资料:UE5 UE4 项目设置全局置顶_ue4运行设置置顶-CSDN博客 修改完build.cs后,关掉重新生成解决方案。(不然可能编译报错,在这卡了半个小时) 不知道怎么用C的,可以用这个 Topmost - Keep Editor/Game w…...
Qt问题之 告别软件因系统默认中文输入法导致错误退出的烦恼
1. 问题 使用Qt进行研发时,遇到一个问题,当在系统默认输入法中文(英文输入法或者搜狗就不会触发闪退)的情况下,选中QTableWidget控件(QTableWidgetItem有焦点,但是不双击)ÿ…...
力扣热题100刷题day62|283.移动零、39.组合总和、94.二叉树的中序遍历
1.283.移动零——双指针 快慢两个指针,慢指针指向新数组,快指针遍历旧数组,寻找非0元素,找到后,交换快慢指针所指向元素; 因为快指针已经遍历过,所以交换前慢指针处的元素都是0; …...
API 请求失败时的处理方法
在使用 Python 爬虫调用 API 时,请求失败是一个常见的问题。这可能是由于网络问题、API 限制、服务器错误或其他原因导致的。为了确保爬虫的稳定性和可靠性,我们需要合理地处理这些失败的请求。以下是一些有效的处理方法: 1. 捕获异常 使用…...
【MySQL | 八、 事务管理】
文章目录 什么是事务?事务的特性:事务的意义事务的提交查看事务提交方式事务的自动提交事务的手动提交开始事务执行SQL操作事务操作提交事务示例: 事务的隔离级别并发访问的基本概念并发事务的典型问题对ACID特性的影响查看和设置隔离属性各个…...
AlDente Pro for Mac电脑 充电限制保护工具
AlDente Pro for Mac电脑 充电限制保护工具 一、介绍 AlDente Pro for Mac,是一款充电限制保护工具,是可以限制最大充电百分比来保护电池的工具。锂离子和聚合物电池(如 MacBook 中的电池)在40% 至 80% 之…...
算法训练之动态规划(一)
♥♥♥~~~~~~欢迎光临知星小度博客空间~~~~~~♥♥♥ ♥♥♥零星地变得优秀~也能拼凑出星河~♥♥♥ ♥♥♥我们一起努力成为更好的自己~♥♥♥ ♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥ ♥♥♥如果有什么问题可以评论区留言或者私信我哦~♥♥♥ ✨✨✨✨✨✨ 个…...
Navicat连接远程PostGreSQL失败
问题描述 使用本地Navicat连接Windows远程服务器上部署的PostGreSQL数据库时,出现以下错误: 解决方案 出现以上报错信息,是因为PostGreSQL数据库服务尚未设置允许客户端建立远程连接。可做如下配置, 1. 找到PostGreSQL数据库安装目录下的data子文件夹,重点关注:postgres…...
漏洞扫描系统docker版本更新(2025.4.10)
一、github地址 https://github.com/huan-cdm/info_scan本人一直维护的一个项目,持续更新中,感兴趣的小伙伴帮忙点点星 二、docker版本更新 1. 账号密码:nginx/web/mysql:admin/123456 2. 创建docker自定义网络,使容…...
新一代达梦官方管理工具SQLark:可视化建表操作指南
在数据库管理工作中,新建表是一项基础且频繁的操作。SQLark 的可视化建表功能为我们提供了一种高效、便捷且丝滑流畅的建表新体验。一起来了解下吧。 SQLark 官方下载链接:www.sqlark.com 新建表作为常见的功能,相比其他管理工具,…...
什么是EXR透视贴图 ?
EXR透视贴图是一种基于 OpenEXR 格式的高动态范围(HDR)图像技术,主要用于3D建模、渲染和视觉特效领域。它通过高精度图像数据和透视映射功能,为场景创建逼真的光影效果和空间深度。 技术原理 高动态范围(HDR…...
音频转文本:如何识别音频成文字
Python脚本:MP4转MP3并语音识别为中文 以下是一个完整的Python脚本,可以将MP4视频转换为MP3音频,然后使用语音识别模型将音频转换为中文文本。 准备工作 首先需要安装必要的库: pip install moviepy pydub SpeechRecognition openai-whisper完整脚本 import os from m…...
每日一题(小白)数组娱乐篇21
由于题意可知我们是要将对应的数字转换为英文,我们要考虑两点一个是进制的转换,也就是类似于我们的十进制一到9就多一位,这里的进制就是Z进制也就是27进制一旦到26下一位则进位;另一方面要考虑数字的转换也就是1~26对应A~Z。解决上…...
