跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
PythonAI算法

Python 实现 AI 大模型智能对话系统

使用 Python 和 FastAPI 构建智能对话系统的完整流程。涵盖环境配置、项目结构、数据库设计、OpenAI API 集成、Vue 前端界面及 Docker 部署。教程包含多轮对话管理、历史记录存储及流式响应实现,适合希望掌握 AI 应用全栈开发的开发者参考。

性能调优发布于 2026/4/6更新于 2026/9/1079 浏览
Python 实现 AI 大模型智能对话系统

第一部分:技术背景与项目概述

1.1 AI 大模型发展现状

近年来,人工智能大模型技术取得了突破性进展。从 GPT 系列到国内的文心一言、通义千问等,大模型正在改变我们与计算机交互的方式。Python 作为 AI 开发的首选语言,拥有丰富的生态系统和完善的工具链,是开发 AI 应用的最佳选择。

1.2 为什么选择 Python?
  • 丰富的 AI 库:TensorFlow、PyTorch、OpenAI 等
  • 强大的 Web 框架:FastAPI、Django、Flask
  • 完善的工具链:虚拟环境、包管理、测试框架
  • 活跃的社区:海量开源项目和教程资源
1.3 项目目标

在本教程中,我们将使用 Python 开发一个完整的智能对话 Web 应用,具备以下功能:

  • 基于大模型的智能对话
  • 多轮对话上下文管理
  • 用户对话历史记录
  • 现代化的 Web 界面
  • 生产环境部署能力

第二部分:环境准备与基础配置

2.1 Python 环境搭建

首先确保你的系统已安装 Python 3.8 或更高版本:

# 检查 Python 版本
python --version
# 或 python3 --version
2.2 创建虚拟环境

使用虚拟环境隔离项目依赖:

# 创建项目目录
mkdir ai-chat-app
cd ai-chat-app
# 创建虚拟环境
python -m venv venv
# 激活虚拟环境
# Windows: venv\Scripts\activate
# Linux/Mac: source venv/bin/activate
2.3 安装必要依赖

创建 requirements.txt 文件:

fastapi==0.104.1
uvicorn==0.24.0
openai==1.3.0
sqlalchemy==2.0.23
alembic==1.12.1
python-multipart==0.0.6
python-dotenv==1.0.0

安装依赖:

pip install -r requirements.txt

第三部分:核心功能开发实战

3.1 项目结构设计

让我们先规划项目结构:

ai-chat-app/
├── app/
│   ├── __init__.py
│   ├── main.py # FastAPI 应用入口
│   ├── models.py # 数据模型
│   ├── database.py # 数据库配置
│   ├── api/
│   │   ├── __init__.py
│   │   └── chat.py # 聊天 API
│   └── services/
│       ├── __init__.py
│       └── openai_service.py # OpenAI 服务
├── static/ # 静态文件
├── templates/ # 模板文件
├── requirements.txt
├── .env # 环境变量
└── README.md

目录

  1. 1.1 AI 大模型发展现状
  2. 1.2 为什么选择 Python?
  3. 1.3 项目目标
  4. 2.1 Python 环境搭建
  5. 检查 Python 版本
  6. 或 python3 --version
  7. 2.2 创建虚拟环境
  8. 创建项目目录
  9. 创建虚拟环境
  10. 激活虚拟环境
  11. Windows: venv\Scripts\activate
  12. Linux/Mac: source venv/bin/activate
  13. 2.3 安装必要依赖
  14. 3.1 项目结构设计
  15. 3.2 创建 FastAPI 应用
  16. 创建 FastAPI 应用实例
  17. 配置 CORS 中间件
  18. 配置静态文件和模板
  19. 3.3 数据库模型设计
  20. 3.4 数据库配置
  21. 数据库配置
  22. 创建数据库引擎
  23. 创建 SessionLocal 类
  24. 创建数据库表
  25. 数据库依赖
  26. 3.5 OpenAI 服务封装
  27. 创建全局实例
  28. 3.6 聊天 API 实现
  29. 3.7 前端界面实现
  30. 3.8 更新主应用文件
  31. 创建数据库表
  32. 创建 FastAPI 应用实例
  33. 配置 CORS 中间件
  34. 配置静态文件和模板
  35. 注册路由
  36. 4.1 环境变量配置
  37. OpenAI API 配置
  38. 数据库配置
  39. 应用配置
  40. 4.2 流式响应实现
  41. 5.1 Docker 容器化部署
  42. 安装系统依赖
  43. 复制依赖文件
  44. 安装 Python 依赖
  45. 复制应用代码
  46. 创建非 root 用户
  47. 暴露端口
  48. 启动命令
  49. 5.2 生产环境配置
  50. 服务器绑定
  51. 工作进程数
  52. 工作模式
  53. 日志配置
  54. 超时设置
  55. 5.3 启动脚本
  56. 激活虚拟环境
  57. 启动应用
  58. 1. 环境准备
  59. 克隆项目(如果有 Git 仓库)
  60. 创建虚拟环境
  61. Windows: venv\Scripts\activate
  62. 安装依赖
  63. 2. 配置环境变量
  64. 复制环境变量模板
  65. 编辑.env 文件,设置你的 OpenAI API 密钥
  66. 3. 启动应用
  67. 开发模式
  68. 或使用启动脚本
  69. 4. 访问应用
3.2 创建 FastAPI 应用

创建 app/main.py 文件:

from fastapi import FastAPI
from fastapi.staticfiles import StaticFiles
from fastapi.templating import Jinja2Templates
from fastapi.middleware.cors import CORSMiddleware
import os

# 创建 FastAPI 应用实例
app = FastAPI(
    title="AI 智能对话系统",
    description="基于 Python 和 AI 大模型的智能对话应用",
    version="1.0.0"
)

# 配置 CORS 中间件
app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

# 配置静态文件和模板
app.mount("/static", StaticFiles(directory="static"), name="static")
templates = Jinja2Templates(directory="templates")

@app.get("/")
async def root():
    return {"message": "AI 智能对话系统 API 服务已启动"}

@app.get("/health")
async def health_check():
    return {"status": "healthy"}

if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=8000)
3.3 数据库模型设计

创建 app/models.py 文件:

from sqlalchemy import Column, Integer, String, Text, DateTime, Boolean
from sqlalchemy.ext.declarative import declarative_base
from datetime import datetime

Base = declarative_base()

class Conversation(Base):
    __tablename__ = "conversations"
    id = Column(Integer, primary_key=True, index=True)
    session_id = Column(String(100), index=True, nullable=False)
    user_message = Column(Text, nullable=False)
    ai_response = Column(Text, nullable=False)
    created_at = Column(DateTime, default=datetime.utcnow)
    model_used = Column(String(50), default="gpt-3.5-turbo")

class UserSettings(Base):
    __tablename__ = "user_settings"
    id = Column(Integer, primary_key=True, index=True)
    session_id = Column(String(100), unique=True, index=True)
    temperature = Column(Integer, default=7) # 0-10, 默认 7
    max_tokens = Column(Integer, default=1000)
    model_preference = Column(String(50), default="gpt-3.5-turbo")
    created_at = Column(DateTime, default=datetime.utcnow)
    updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
3.4 数据库配置

创建 app/database.py 文件:

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from app.models import Base
import os

# 数据库配置
DATABASE_URL = os.getenv("DATABASE_URL", "sqlite:///./chat_app.db")

# 创建数据库引擎
engine = create_engine(
    DATABASE_URL,
    connect_args={"check_same_thread": False} # SQLite 专用参数
)

# 创建 SessionLocal 类
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

# 创建数据库表
def create_tables():
    Base.metadata.create_all(bind=engine)

# 数据库依赖
def get_db():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()
3.5 OpenAI 服务封装

创建 app/services/openai_service.py 文件:

import openai
import os
from typing import List, Dict, Optional
from openai import OpenAI

class OpenAIService:
    def __init__(self):
        # 从环境变量获取 API 密钥
        api_key = os.getenv("OPENAI_API_KEY")
        if not api_key:
            raise ValueError("OPENAI_API_KEY 环境变量未设置")
        self.client = OpenAI(api_key=api_key)

    async def chat_completion(
        self,
        messages: List[Dict[str, str]],
        model: str = "gpt-3.5-turbo",
        temperature: float = 0.7,
        max_tokens: int = 1000
    ) -> str:
        """ 调用 OpenAI 聊天补全 API """
        try:
            response = self.client.chat.completions.create(
                model=model,
                messages=messages,
                temperature=temperature,
                max_tokens=max_tokens,
                stream=False
            )
            return response.choices[0].message.content
        except Exception as e:
            raise Exception(f"OpenAI API 调用失败:{str(e)}")

    async def stream_chat_completion(
        self,
        messages: List[Dict[str, str]],
        model: str = "gpt-3.5-turbo",
        temperature: float = 0.7,
        max_tokens: int = 1000
    ):
        """ 流式聊天补全(用于实时打字效果) """
        try:
            response = self.client.chat.completions.create(
                model=model,
                messages=messages,
                temperature=temperature,
                max_tokens=max_tokens,
                stream=True
            )
            for chunk in response:
                if chunk.choices[0].delta.content is not None:
                    yield chunk.choices[0].delta.content
        except Exception as e:
            yield f"错误:{str(e)}"

# 创建全局实例
openai_service = OpenAIService()
3.6 聊天 API 实现

创建 app/api/chat.py 文件:

from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.orm import Session
from typing import List, Dict
import uuid
from datetime import datetime
from app.database import get_db
from app.models import Conversation, UserSettings
from app.services.openai_service import openai_service

router = APIRouter(prefix="/api/chat", tags=["chat"])

@app.post("/message")
async def send_message(
    message: str,
    session_id: str = None,
    db: Session = Depends(get_db)
):
    """ 发送消息并获取 AI 回复 """
    # 生成或使用现有的 session_id
    if not session_id:
        session_id = str(uuid.uuid4())

    # 获取用户设置
    user_settings = db.query(UserSettings).filter(
        UserSettings.session_id == session_id
    ).first()

    if not user_settings:
        # 创建默认用户设置
        user_settings = UserSettings(
            session_id=session_id,
            temperature=7,
            max_tokens=1000,
            model_preference="gpt-3.5-turbo"
        )
        db.add(user_settings)
        db.commit()
        db.refresh(user_settings)

    # 构建对话历史
    conversation_history = await get_conversation_history(session_id, db)

    # 添加用户新消息
    messages = conversation_history + [{"role": "user", "content": message}]

    try:
        # 调用 OpenAI 服务
        response = await openai_service.chat_completion(
            messages=messages,
            model=user_settings.model_preference,
            temperature=user_settings.temperature / 10.0, # 转换为 0-1 范围
            max_tokens=user_settings.max_tokens
        )

        # 保存对话记录
        conversation = Conversation(
            session_id=session_id,
            user_message=message,
            ai_response=response,
            model_used=user_settings.model_preference
        )
        db.add(conversation)
        db.commit()

        return {
            "session_id": session_id,
            "user_message": message,
            "ai_response": response,
            "timestamp": datetime.utcnow().isoformat()
        }
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))

@app.get("/history/{session_id}")
async def get_chat_history(
    session_id: str,
    limit: int = 50,
    db: Session = Depends(get_db)
):
    """ 获取指定会话的聊天历史 """
    conversations = db.query(Conversation).filter(
        Conversation.session_id == session_id
    ).order_by(Conversation.created_at.desc()).limit(limit).all()

    return [
        {
            "id": conv.id,
            "user_message": conv.user_message,
            "ai_response": conv.ai_response,
            "created_at": conv.created_at.isoformat(),
            "model_used": conv.model_used
        }
        for conv in reversed(conversations) # 按时间正序返回
    ]

async def get_conversation_history(session_id: str, db: Session) -> List[Dict[str, str]]:
    """ 获取格式化后的对话历史 """
    conversations = db.query(Conversation).filter(
        Conversation.session_id == session_id
    ).order_by(Conversation.created_at.asc()).limit(10).all()

    # 最近 10 条对话
    messages = []
    for conv in conversations:
        messages.append({"role": "user", "content": conv.user_message})
        messages.append({"role": "assistant", "content": conv.ai_response})
    return messages
3.7 前端界面实现

创建 templates/index.html 文件:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>AI 智能对话系统</title>
    <script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
    <link rel="stylesheet" href="https://unpkg.com/element-plus/dist/index.css">
    <script src="https://unpkg.com/element-plus"></script>
    <style>
        body {
            margin: 0;
            padding: 0;
            font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
            min-height: 100vh;
        }
        .chat-container {
            max-width: 800px;
            margin: 0 auto;
            background: white;
            border-radius: 10px;
            box-shadow: 0 10px 30px rgba(0,0,0,0.1);
            overflow: hidden;
            height: 90vh;
            display: flex;
            flex-direction: column;
        }
        .chat-header {
            background: #2c3e50;
            color: white;
            padding: 20px;
            text-align: center;
        }
        .chat-messages {
            flex: 1;
            padding: 20px;
            overflow-y: auto;
            background: #f8f9fa;
        }
        .message {
            margin-bottom: 15px;
            display: flex;
        }
        .user-message {
            justify-content: flex-end;
        }
        .ai-message {
            justify-content: flex-start;
        }
        .message-bubble {
            max-width: 70%;
            padding: 12px 16px;
            border-radius: 18px;
            word-wrap: break-word;
        }
        .user-bubble {
            background: #007bff;
            color: white;
        }
        .ai-bubble {
            background: white;
            border: 1px solid #e9ecef;
        }
        .chat-input {
            padding: 20px;
            border-top: 1px solid #e9ecef;
            background: white;
        }
        .typing-indicator {
            display: flex;
            align-items: center;
            color: #6c757d;
            font-style: italic;
        }
        .dot {
            width: 8px;
            height: 8px;
            border-radius: 50%;
            background: #6c757d;
            margin: 0 2px;
            animation: bounce 1.4s infinite ease-in-out;
        }
        .dot:nth-child(1) { animation-delay: -0.32s; }
        .dot:nth-child(2) { animation-delay: -0.16s; }
        @keyframes bounce {
            0%, 80%, 100% { transform: scale(0); }
            40% { transform: scale(1); }
        }
    </style>
</head>
<body>
    <div id="app">
        <div class="chat-container">
            <div class="chat-header">
                <h2>🤖 AI 智能对话系统</h2>
                <p>基于 Python 和 AI 大模型的智能对话应用</p>
            </div>
            <div class="chat-messages" ref="messagesContainer">
                <div v-for="message in messages" :key="message.id" 
                     :class="['message', message.role === 'user' ? 'user-message' : 'ai-message']">
                    <div :class="['message-bubble', message.role === 'user' ? 'user-bubble' : 'ai-bubble']">
                        <div v-if="message.role === 'user'">
                            <strong>你:</strong> {{ message.content }}
                        </div>
                        <div v-else>
                            <strong>AI 助手:</strong>
                            <span v-if="message.isTyping">
                                <span></span><span></span><span></span>
                            </span>
                            <span v-else>{{ message.content }}</span>
                        </div>
                    </div>
                </div>
            </div>
            <div class="chat-input">
                <el-input v-model="inputMessage" 
                          placeholder="输入你的问题..." 
                          @keyup.enter="sendMessage" 
                          :disabled="isLoading">
                    <template #append>
                        <el-button @click="sendMessage" :loading="isLoading" type="primary">
                            发送
                        </el-button>
                    </template>
                </el-input>
            </div>
        </div>
    </div>
    <script>
        const { createApp, ref, onMounted, nextTick } = Vue;
        const { ElMessage } = ElementPlus;

        createApp({
            setup() {
                const messages = ref([]);
                const inputMessage = ref('');
                const isLoading = ref(false);
                const sessionId = ref('');
                const messagesContainer = ref(null);

                // 初始化会话 ID
                if (!sessionId.value) {
                    sessionId.value = generateSessionId();
                    loadChatHistory();
                }

                function generateSessionId() {
                    return 'session_' + Date.now() + '_' + Math.random().toString(36).substr(2, 9);
                }

                async function loadChatHistory() {
                    try {
                        const response = await fetch();
                         (response.) {
                             history =  response.();
                            messages. = history.( ({
                                : item.,
                                : ,
                                : item.,
                                : item.
                            })).(history.( ({
                                : item. + ,
                                : ,
                                : item.,
                                : item.
                            })).(  (a.) -  (b.));
                            ();
                        }
                    }  (error) {
                        .(, error);
                    }
                }

                  () {
                     (!inputMessage..() || isLoading.) ;
                     userMessage = inputMessage..();
                    inputMessage. = ;

                    
                     userMsg = {
                        : .(),
                        : ,
                        : userMessage,
                        :  ().()
                    };
                    messages..(userMsg);

                    
                     aiMsg = {
                        : .() + ,
                        : ,
                        : ,
                        : ,
                        :  ().()
                    };
                    messages..(aiMsg);
                    ();
                    isLoading. = ;

                     {
                         response =  (, {
                            : ,
                            : { : , },
                            : .({ : userMessage, : sessionId. })
                        });
                         (response.) {
                             data =  response.();
                            aiMsg. = data.;
                            aiMsg. = ;
                        }  {
                              ();
                        }
                    }  (error) {
                        aiMsg. =  + error.;
                        aiMsg. = ;
                        .();
                    }  {
                        isLoading. = ;
                        ();
                    }
                }

                 () {
                    ( {
                         (messagesContainer.) {
                            messagesContainer.. = messagesContainer..;
                        }
                    });
                }

                ( {
                    ();
                });

                 { messages, inputMessage, isLoading, messagesContainer, sendMessage };
            }
        }).().();
    </script>
</body>
</html>
3.8 更新主应用文件

更新 app/main.py 文件,添加路由和模板支持:

from fastapi import FastAPI, Request
from fastapi.staticfiles import StaticFiles
from fastapi.templating import Jinja2Templates
from fastapi.middleware.cors import CORSMiddleware
from app.database import create_tables
from app.api import chat
import os

# 创建数据库表
create_tables()

# 创建 FastAPI 应用实例
app = FastAPI(
    title="AI 智能对话系统",
    description="基于 Python 和 AI 大模型的智能对话应用",
    version="1.0.0"
)

# 配置 CORS 中间件
app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

# 配置静态文件和模板
app.mount("/static", StaticFiles(directory="static"), name="static")
templates = Jinja2Templates(directory="templates")

# 注册路由
app.include_router(chat.router)

@app.get("/")
async def root(request: Request):
    return templates.TemplateResponse("index.html", {"request": request})

@app.get("/health")
async def health_check():
    return {"status": "healthy"}

if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=8000)

第四部分:高级功能扩展

4.1 环境变量配置

创建 .env 文件:

# OpenAI API 配置
OPENAI_API_KEY=your_openai_api_key_here
# 数据库配置
DATABASE_URL=sqlite:///./chat_app.db
# 应用配置
DEBUG=True
HOST=0.0.0.0
PORT=8000

创建 config.py 文件:

import os
from dotenv import load_dotenv

load_dotenv()

class Config:
    OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
    DATABASE_URL = os.getenv("DATABASE_URL", "sqlite:///./chat_app.db")
    DEBUG = os.getenv("DEBUG", "False").lower() == "true"
    HOST = os.getenv("HOST", "0.0.0.0")
    PORT = int(os.getenv("PORT", 8000))
4.2 流式响应实现

更新 app/api/chat.py,添加流式响应支持:

from fastapi import Response
from fastapi.responses import StreamingResponse
import json

@router.post("/message/stream")
async def stream_message(
    message: str,
    session_id: str = None,
    db: Session = Depends(get_db)
):
    """ 流式消息响应(实时打字效果) """
    if not session_id:
        session_id = str(uuid.uuid4())

    # 获取用户设置(代码同上)
    # ...

    async def generate():
        try:
            full_response = ""
            async for chunk in openai_service.stream_chat_completion(
                messages=messages,
                model=user_settings.model_preference,
                temperature=user_settings.temperature / 10.0,
                max_tokens=user_settings.max_tokens
            ):
                full_response += chunk
                yield f"data: {json.dumps({'content': chunk})}\n\n"

            # 保存完整对话记录
            conversation = Conversation(
                session_id=session_id,
                user_message=message,
                ai_response=full_response,
                model_used=user_settings.model_preference
            )
            db.add(conversation)
            db.commit()
        except Exception as e:
            yield f"data: {json.dumps({'error': str(e)})}\n\n"

    return StreamingResponse(
        generate(),
        media_type="text/event-stream",
        headers={"Cache-Control": "no-cache"}
    )

第五部分:部署与优化

5.1 Docker 容器化部署

创建 Dockerfile:

FROM python:3.9-slim
WORKDIR /app

# 安装系统依赖
RUN apt-get update && apt-get install -y \
    gcc \
    && rm -rf /var/lib/apt/lists/*

# 复制依赖文件
COPY requirements.txt .

# 安装 Python 依赖
RUN pip install --no-cache-dir -r requirements.txt

# 复制应用代码
COPY . .

# 创建非 root 用户
RUN useradd -m -u 1000 user
USER user

# 暴露端口
EXPOSE 8000

# 启动命令
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]

创建 docker-compose.yml:

version: '3.8'
services:
  ai-chat-app:
    build: .
    ports:
      - "8000:8000"
    environment:
      - OPENAI_API_KEY=${OPENAI_API_KEY}
      - DATABASE_URL=sqlite:///./chat_app.db
    volumes:
      - ./data:/app/data
    restart: unless-stopped
5.2 生产环境配置

创建 gunicorn_conf.py:

import multiprocessing

# 服务器绑定
bind = "0.0.0.0:8000"
# 工作进程数
workers = multiprocessing.cpu_count() * 2 + 1
# 工作模式
worker_class = "uvicorn.workers.UvicornWorker"
# 日志配置
accesslog = "-"
errorlog = "-"
loglevel = "info"
# 超时设置
timeout = 120
keepalive = 5
5.3 启动脚本

创建 start.sh:

#!/bin/bash
# 激活虚拟环境
source venv/bin/activate

# 启动应用
if [ "$ENVIRONMENT" = "production" ]; then
    gunicorn -c gunicorn_conf.py app.main:app
else
    uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload
fi

完整项目运行指南

1. 环境准备
# 克隆项目(如果有 Git 仓库)
git clone <repository-url>
cd ai-chat-app

# 创建虚拟环境
python -m venv venv
source venv/bin/activate
# Windows: venv\Scripts\activate

# 安装依赖
pip install -r requirements.txt
2. 配置环境变量
# 复制环境变量模板
cp .env.example .env

# 编辑.env 文件,设置你的 OpenAI API 密钥
OPENAI_API_KEY=sk-your-actual-api-key-here
3. 启动应用
# 开发模式
python -m uvicorn app.main:app --reload

# 或使用启动脚本
chmod +x start.sh
./start.sh
4. 访问应用

打开浏览器访问:http://localhost:8000/

总结

通过本教程,我们完整地实现了一个基于 Python 和 AI 大模型的智能对话系统。这个项目展示了:

  1. 现代化 Python 开发:使用 FastAPI、SQLAlchemy 等现代框架
  2. AI 集成能力:与 OpenAI API 的无缝集成
  3. 完整功能实现:对话管理、历史记录、用户设置等
  4. 生产就绪:Docker 部署、性能优化、安全配置

这个项目不仅是一个可用的智能对话应用,更是一个优秀的学习范例,可以帮助开发者掌握 Python AI 应用开发的核心技能。

引用文献

  1. FastAPI 官方文档:https://fastapi.tiangolo.com/
  2. OpenAI API 文档:https://platform.openai.com/docs
  3. SQLAlchemy 文档:https://docs.sqlalchemy.org/
  4. Vue.js 官方文档:https://vuejs.org/
  5. Docker 官方文档:https://docs.docker.com/
`/api/chat/history/${sessionId.value}`
if
ok
const
await
json
value
map
item =>
id
id
role
'user'
content
user_message
timestamp
created_at
concat
map
item =>
id
id
'_ai'
role
'assistant'
content
ai_response
timestamp
created_at
sort
(a, b) =>
new
Date
timestamp
new
Date
timestamp
scrollToBottom
catch
console
error
'加载聊天历史失败:'
async
function
sendMessage
if
value
trim
value
return
const
value
trim
value
''
// 添加用户消息
const
id
Date
now
role
'user'
content
timestamp
new
Date
toISOString
value
push
// 添加 AI 响应占位符
const
id
Date
now
1
role
'assistant'
content
''
isTyping
true
timestamp
new
Date
toISOString
value
push
scrollToBottom
value
true
try
const
await
fetch
'/api/chat/message'
method
'POST'
headers
'Content-Type'
'application/json'
body
JSON
stringify
message
session_id
value
if
ok
const
await
json
content
ai_response
isTyping
false
else
throw
new
Error
'发送消息失败'
catch
content
'抱歉,发生错误:'
message
isTyping
false
ElMessage
error
'发送消息失败'
finally
value
false
scrollToBottom
function
scrollToBottom
nextTick
() =>
if
value
value
scrollTop
value
scrollHeight
onMounted
() =>
scrollToBottom
return
use
ElementPlus
mount
'#app'

更多推荐文章

查看全部
  • Java 线程池核心机制与调度原理
  • Python 结合 IPIDEA 代理实现网易云音乐数据自动采集
  • 基于蓝耘智算平台部署通义万相 2.1 文生图技术解析
  • AI 前端核心概念、技术栈与学习路径
  • Wren 个人博客模板:纯原生构建的响应式设计
  • Page-Agent:一行 JS 代码实现大模型前端 DOM 操作
  • 上下文工程核心策略:窗口限制与状态管理
  • VsCode 集成 Claude Agent 报无效请求?参数配置与网络排查指南
  • DrissionPage 使用教程:Python 动态网页自动化
  • PaddleOCR-VL 在电子病历结构化中的应用实践
  • 机器人设计核心逻辑:从模块拆解到场景适配
  • 数据结构:时间复杂度与空间复杂度
  • Spring 7 弃用 JSR 305,全面采用 JSpecify 空安全注解
  • Node.js 22 安装失败排查与 NVM 配置优化指南
  • 基于MISRA C++的车载软件开发实战案例
  • 基于强化学习与大模型的决策树自动生成方法
  • Java 面试高频基础知识点梳理与辨析
  • Qwen3-VL-WEBUI 深度解析:Instruct 与 Thinking 模式实战
  • 基于 Microi 吾码低代码框架构建 Vue 高效应用指南
  • 智能家居硬件开源项目寻找渠道与方案指南

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online