news 2026/6/17 21:07:59

第七篇章:项目实战——从零到上线

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
第七篇章:项目实战——从零到上线

本篇目标:做一个真正可上线的 AI 智能助手(支持 Agent + RAG + 用户系统 + 流式对话)
最终效果:一个类似 ChatGPT 的 Web 应用(可登录、可聊天、可查知识库)
技术栈:FastAPI + LangGraph + ChromaDB + Vue3 + SQLite/PostgreSQL + Nginx
前置知识:RAG + Agent + LangGraph 基础


一、项目我们要做什么?

我们要做一个完整 AI Web 应用,包含:

🤖 1. AI 对话能力(Agent)

  • 可以问:
    • 今天北京天气
    • 现在几点
    • 2+3*4是多少
    • 记录一个笔记

📚 2. 知识库问答(RAG)

  • 上传 PDF / TXT / Word
  • AI 可以基于文档回答问题

👤 3. 用户系统

  • 注册
  • 登录
  • JWT 鉴权

💬 4. 流式对话

  • AI 像 ChatGPT 一样“打字输出”

📝 5. 对话历史

  • 每个用户有自己的聊天记录

二、系统整体架构(先建立全局认知)

前端 Vue3 ↓ HTTP / SSE FastAPI 后端 ↓ ┌─────────────────────────────┐ │ Agent系统(LangGraph) │ │ RAG系统(ChromaDB) │ │ 用户系统(JWT) │ └─────────────────────────────┘ ↓ SQLite / PostgreSQL + 向量数据库

三、项目初始化

3.1 创建项目

mkdir ai-assistant cd ai-assistant mkdir backend frontend

3.2 后端安装依赖

cd backend pip install fastapi uvicorn sqlalchemy python-jose passlib bcrypt \ python-multipart langchain langgraph chromadb \ langchain-openai pypdf2 python-docx

3.3 requirements.txt

fastapi uvicorn sqlalchemy python-jose[cryptography] passlib[bcrypt] python-multipart langchain langgraph chromadb langchain-openai pypdf2 python-docx

四、后端基础搭建


4.1 项目结构

backend/ ├── main.py ├── database.py ├── models.py ├── auth.py ├── config.py ├── agent/ ├── rag/

五、基础配置

5.1 config.py

import os from dotenv import load_dotenv load_dotenv() DEEPSEEK_API_KEY = os.getenv("DEEPSEEK_API_KEY", "") DEEPSEEK_BASE_URL = "https://api.deepseek.com" MODEL_NAME = "deepseek-chat" SECRET_KEY = os.getenv("SECRET_KEY") ALGORITHM = "HS256" ACCESS_TOKEN_EXPIRE_MINUTES = 60 * 24 DATABASE_URL = "sqlite:///./app.db" CHROMA_PATH = "./chroma_db"

六、数据库设计

6.1 为什么要用数据库?

因为我们要保存:

  • 用户
  • 对话
  • 消息历史

6.2 models.py

from sqlalchemy import Column, Integer, String, DateTime, ForeignKey, Text from sqlalchemy.orm import relationship from datetime import datetime from database import Base class User(Base): __tablename__ = "users" id = Column(Integer, primary_key=True) username = Column(String, unique=True) hashed_password = Column(String) conversations = relationship("Conversation", back_populates="user") class Conversation(Base): __tablename__ = "conversations" id = Column(Integer, primary_key=True) user_id = Column(Integer, ForeignKey("users.id")) title = Column(String, default="新对话") messages = Column(Text, default="[]") # 简化存储 user = relationship("User", back_populates="conversations")

七、JWT用户系统

7.1 功能

  • 注册
  • 登录
  • token鉴权

7.2 核心代码(auth.py)

from jose import jwt from passlib.context import CryptContext from datetime import datetime, timedelta pwd_context = CryptContext(schemes=["bcrypt"]) SECRET_KEY = "secret" ALGORITHM = "HS256" def hash_password(pwd): return pwd_context.hash(pwd) def verify_password(pwd, hashed): return pwd_context.verify(pwd, hashed) def create_token(user_id): expire = datetime.utcnow() + timedelta(days=1) return jwt.encode({"sub": str(user_id), "exp": expire}, SECRET_KEY, algorithm=ALGORITHM)

八、FastAPI主入口

8.1 main.py(核心)

from fastapi import FastAPI, Depends from fastapi.middleware.cors import CORSMiddleware from database import Base, engine Base.metadata.create_all(bind=engine) app = FastAPI() app.add_middleware( CORSMiddleware, allow_origins=["*"], allow_methods=["*"], allow_headers=["*"] )

九、Agent系统(核心)

9.1 我们要做什么?

让 AI 能:

  • 自动选择工具
  • 自动调用函数
  • 自动返回结果

9.2 tools.py

from langchain_core.tools import tool from datetime import datetime @tool def get_time(): return datetime.now().strftime("%Y-%m-%d %H:%M:%S") @tool def calculator(expr: str): try: return str(eval(expr)) except: return "计算错误"

9.3 Agent创建

from langgraph.prebuilt import create_react_agent from langchain_openai import ChatOpenAI def create_agent(): llm = ChatOpenAI(model="deepseek-chat", streaming=True) return create_react_agent( model=llm, tools=[get_time, calculator] )

十、RAG知识库系统


10.1 目标

让 AI 可以读 PDF 并回答问题


10.2 文档加载

from PyPDF2 import PdfReader def load_pdf(path): reader = PdfReader(path) return "\n".join([p.extract_text() for p in reader.pages])

10.3 向量数据库

from langchain_chroma import Chroma vectorstore = Chroma( persist_directory="./chroma_db" )

10.4 RAG核心流程

文档 → 切分 → 向量化 → 存储 → 检索 → LLM回答

十一、API接口设计


11.1 登录

@app.post("/login") def login(): return {"token": "xxx"}

11.2 聊天接口

@app.post("/chat") def chat(): return StreamingResponse(stream())

11.3 流式输出

def stream(): yield "data: hello\n\n"

十二、前端 Vue3


12.1 页面结构

LoginView ChatView

12.2 聊天核心逻辑

fetch("/chat").then(res => { const reader = res.body.getReader() })

12.3 UI能力

  • Markdown渲染
  • 实时输出
  • 对话列表

十三、知识库上传

@app.post("/upload") async def upload(file: UploadFile): content = await file.read()

十四、运行项目

后端

uvicorn main:app --reload

前端

npm run dev

十五、部署上线

Nginx

Vue3 → 静态文件 API → FastAPI

HTTPS

certbot --nginx

十六、本项目你真正学到的东西

技术能力

  • FastAPI后端开发
  • JWT认证系统
  • Agent(LangGraph)
  • RAG知识库系统
  • SSE流式通信
  • Vue3前端开发

工程能力

  • 前后端分离
  • 模块化设计
  • AI系统集成
  • 简易生产部署

下一篇预告

第八篇章:进阶视野 & 面试准备——模型微调概览、多模态入门、MCP 协议、RAG/Agent 面试高频考点、八篇章结业总结。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/17 21:05:03

Role: 你的角色名称

Role: 你的角色名称 【免费下载链接】LangGPT LangGPT: Empowering everyone to become a prompt expert! 🚀 📌 结构化提示词(Structured Prompt)提出者 📌 元提示词(Meta-Prompt)发起者 &…

作者头像 李华
网站建设 2026/6/17 21:03:32

PP-Seg(PP-LiteSeg)模型零基础完整学习教程(原理+实战+部署)

目录 一、PP-LiteSeg 核心概述与优势 1.1 什么是 PP-LiteSeg 1.2 对比传统分割模型优势 二、PP-LiteSeg 核心网络原理 2.1 整体网络结构 2.2 三大核心创新模块(核心考点) (1)SPPM 简易金字塔池化 (2&#xff0…

作者头像 李华
网站建设 2026/6/17 21:02:50

电源接口EMC设计实战:从浪涌防护到滤波优化

1. 电源接口EMC设计的核心挑战 电源接口就像电子产品的"咽喉要道",所有能量都从这里进出。我在设计第一款智能家居网关时,就曾因为电源接口EMC问题栽过跟头——产品在雷雨季节故障率飙升,返修率高达15%。后来拆解发现,压…

作者头像 李华
网站建设 2026/6/17 20:57:24

京东流量运营实战:免费自然流量+付费推广流量玩法

各位京东运营的小伙伴大家好!做京东店铺,核心本质永远是流量为王,转化致胜。很多新手运营、中小商家在店铺运营中都会陷入两个极端:要么只靠免费流量佛系运营,店铺起量慢、权重停滞不前;要么盲目猛砸快车、…

作者头像 李华
网站建设 2026/6/17 20:57:09

Hackintool音频修复完整指南:解决黑苹果声音问题的专业方案

Hackintool音频修复完整指南:解决黑苹果声音问题的专业方案 【免费下载链接】Hackintool The Swiss army knife of vanilla Hackintoshing 项目地址: https://gitcode.com/gh_mirrors/ha/Hackintool Hackintool是黑苹果爱好者的瑞士军刀,提供了一…

作者头像 李华
网站建设 2026/6/17 20:55:16

NXP FXTH87xx02 TPMS固件开发指南:全局变量、函数调用与实战解析

1. 项目概述与核心价值在汽车电子领域,尤其是胎压监测系统(TPMS)的开发中,我们常常需要与芯片原厂提供的底层固件库打交道。NXP的FXTH87xx02系列芯片就是一个典型例子,它集成了压力、温度、加速度传感器以及低频&#…

作者头像 李华