从零构建一个全栈AI应用:Next.js + FastAPI + OpenAI API

news2025/4/18 6:03:47

💡 为什么写这篇文章?

很多开发者希望构建一个能“聊天、问答、调用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_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

三、构建前端页面(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>
        <textarea
          value={message}
          onChange={(e) => setMessage(e.target.value)}
          placeholder="输入你的问题..."
          className="w-full p-4 rounded border"
          rows={5}
        />
        <button
          onClick={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>
  );
}

四、前后端联调

确保:

  1. 后端 FastAPI 在 localhost:8000
  2. 前端 Next.js 项目运行在 localhost:3000
  3. 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 是开放的,任何人都能访问。

解决方案

  • 在请求中添加自定义 Authorization header
  • 后端校验合法性(可以设定 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 年最值得学习的技能之一 —— “用代码连接人和大模型”。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2332788.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【学生管理系统升级版】

学生管理系统升级版 需求分析&#xff1a;注册功能:登录功能&#xff1a;验证码规则&#xff1a;忘记密码&#xff1a; 实操&#xff1a;系统主页面注册功能登录功能忘记密码效果演示 需求 为学生管理系统书写一个登陆、注册、忘记密码的功能。     只有用户登录成功之后&…

Web3 的云基础设施正在成型,Polkadot 2.0 用三项技术改写“上链成本”

在Web3基础设施内卷加剧的今天&#xff0c;“如何以更低成本、更大灵活性部署一条高性能应用链”正成为开发者们最关心的问题。而刚刚走出“技术慢热”误区的Polkadot&#xff0c;正在用一套名为 Polkadot 2.0 的架构升级方案&#xff0c;重新定义这一问题的解法。 这套升级最…

机器学习——ROC曲线、PR曲线

一、ROC曲线简介 1.1 ROC曲线的构成 1.横轴&#xff08;假正率&#xff0c;FPR&#xff09;&#xff1a; 表示负样本被错误分类为正的比例&#xff08;越小越好&#xff09; 2.纵轴&#xff08;真正率&#xff0c;TPR&#xff0c;即召回率&#xff09;&#xff1a; 表示正样…

我为女儿开发了一个游戏网站

大家好&#xff0c;我是星河。 自从协助妻子为女儿开发了算数射击游戏后&#xff0c;星河就一直有个想法&#xff1a;为女儿打造一个专属的学习游戏网站。之前的射击游戏虽然有趣&#xff0c;但缺乏难度分级&#xff0c;无法根据女儿的学习进度灵活调整。而且&#xff0c;仅仅…

【Spring Cloud Netflix】GateWay服务网关

1.基本概述 GateWay用于在微服务架构中提供统一的入口点&#xff0c;对请求进行路由&#xff0c;过滤和处理。它就像是整个微服务系统的大门&#xff0c;所有外部请求都要通过它才能访问到后端的各个微服务。 2.核心概念 2.1路由(Route) 路由是Spring Cloud gateWay中最基本…

Docker部署Jenkins服务

文章目录 1.下载Jenkins服务2.部署Java21&#xff08;可选&#xff09;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

信息收集 怎么一下子多这么多过滤啊&#xff0c;我以为跳过了好几题 这又能eval了&#xff0c;但是连$也不能用了 不能用. * ?&#xff0c;所以打不出fla*或者fla?????了 不能用/&#xff0c;构造不出日志注入和伪协议包含 仔细观察&#xff0c;禁的是中文的括号&#x…

蓝桥杯c ++笔记(含算法 贪心+动态规划+dp+进制转化+便利等)

蓝桥杯 #include <iostream> #include <vector> #include <algorithm> #include <string> using namespace std; //常使用的头文件动态规划 小蓝在黑板上连续写下从 11 到 20232023 之间所有的整数&#xff0c;得到了一个数字序列&#xff1a; S12345…

Qt问题之 告别软件因系统默认中文输入法导致错误退出的烦恼

1. 问题 使用Qt进行研发时&#xff0c;遇到一个问题&#xff0c;当在系统默认输入法中文&#xff08;英文输入法或者搜狗就不会触发闪退&#xff09;的情况下&#xff0c;选中QTableWidget控件&#xff08;QTableWidgetItem有焦点&#xff0c;但是不双击&#xff09;&#xff…

AlDente Pro for Mac电脑 充电限制保护工具

AlDente Pro for Mac电脑 充电限制保护工具 一、介绍 AlDente Pro for Mac&#xff0c;是一款充电限制保护工具&#xff0c;是可以限制最大充电百分比来保护电池的工具。锂离子和聚合物电池&#xff08;如 MacBook 中的电池&#xff09;在40&#xff05; 至 80&#xff05; 之…

算法训练之动态规划(一)

♥♥♥~~~~~~欢迎光临知星小度博客空间~~~~~~♥♥♥ ♥♥♥零星地变得优秀~也能拼凑出星河~♥♥♥ ♥♥♥我们一起努力成为更好的自己~♥♥♥ ♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥ ♥♥♥如果有什么问题可以评论区留言或者私信我哦~♥♥♥ ✨✨✨✨✨✨ 个…

Navicat连接远程PostGreSQL失败

问题描述 使用本地Navicat连接Windows远程服务器上部署的PostGreSQL数据库时,出现以下错误: 解决方案 出现以上报错信息,是因为PostGreSQL数据库服务尚未设置允许客户端建立远程连接。可做如下配置, 1. 找到PostGreSQL数据库安装目录下的data子文件夹,重点关注:postgres…

新一代达梦官方管理工具SQLark:可视化建表操作指南

在数据库管理工作中&#xff0c;新建表是一项基础且频繁的操作。SQLark 的可视化建表功能为我们提供了一种高效、便捷且丝滑流畅的建表新体验。一起来了解下吧。 SQLark 官方下载链接&#xff1a;www.sqlark.com 新建表作为常见的功能&#xff0c;相比其他管理工具&#xff0c;…

什么是EXR透视贴图 ?

EXR透视贴图是一种基于 OpenEXR 格式的高动态范围&#xff08;HDR&#xff09;图像技术&#xff0c;主要用于3D建模、渲染和视觉特效领域。它通过高精度图像数据和透视映射功能&#xff0c;为场景创建逼真的光影效果和空间深度。 技术原理 高动态范围&#xff08;HDR&#xf…

每日一题(小白)数组娱乐篇21

由于题意可知我们是要将对应的数字转换为英文&#xff0c;我们要考虑两点一个是进制的转换&#xff0c;也就是类似于我们的十进制一到9就多一位&#xff0c;这里的进制就是Z进制也就是27进制一旦到26下一位则进位&#xff1b;另一方面要考虑数字的转换也就是1~26对应A~Z。解决上…

LINUX的使用(1)-挂载云硬盘

1.磁盘的挂载&#xff1a; 这个输出是来自 fdisk 或类似的工具&#xff0c;它展示了两块磁盘的分区信息。让我们逐个分析&#xff1a; 第一块磁盘 /dev/sda: 磁盘大小: 53.7 GB (约 53687091200 字节)&#xff0c;总共有 104857600 个扇区。扇区单位: 每个扇区大小为 512 字节…

GPT-4o-image模型:开启AI图片编辑新时代

在生成式AI技术爆发式迭代的今天&#xff0c;智创聚合API率先突破多模态创作边界&#xff0c;正式发布集成GPT-4o-image模型的创作平台&#xff0c;以“文生图-图生图-循环编辑”三位一体的技术矩阵&#xff0c;重新定义数字内容生产流程。生成图像效率较传统工具提升300%&…

使用pip3安装PyTorch与PyG,实现NVIDIA CUDA GPU加速

使用python3的pip3命令安装python依赖库。 # python3 -V Python 3.12.3 # # pip3 -V pip 25.0.1 from /root/.pyenv/versions/3.12.3/lib/python3.12/site-packages/pip (python 3.12)Usage: pip3 install [options] <package> ...pip3 install [options] -r <re…

Rust主流框架性能比拼: Actix vs Axum vs Rocket

本内容是对知名性能评测博主 Anton Putra Actix (Rust) vs Axum (Rust) vs Rocket (Rust): Performance Benchmark in Kubernetes 内容的翻译与整理, 有适当删减, 相关指标和结论以原作为准 在以下中&#xff0c;我们将比较 Rust 生态中最受欢迎的几个框架。我会将三个应用程序…

【QT】QT的消息盒子和对话框(自定义对话框)

QT的消息盒子和对话框&#xff08;自定义对话框&#xff09; 一、消息盒子QMessageBox1、弹出警告盒子示例代码&#xff1a;现象&#xff1a; 2、致命错误盒子示例代码&#xff1a;现象&#xff1a; 3、帮助盒子示例代码&#xff1a;现象&#xff1a; 4、示例代码&#xff1a; …