实现第一个GPT聊天机器人:从API调用到数据库管理全流程指南

前言

随着ChatGPT的爆发式增长,集成AI能力成为后端开发者必备技能。本文将从零开始,带你使用Flask框架实现一个生产级别的GPT聊天机器人后端服务,涵盖API开发、数据校验、测试、数据库等完整流程。

一、章节概览

本教程分为以下核心模块:

模块主要内容
OpenAI API实现第一个聊天接口API调用、环境配置
数据校验Flask-wtf请求验证
规范化响应统一数据格式、错误处理
单元测试PyTest配置与测试用例
数据库管理SQLAlchemy ORM、Flask-Migrate迁移

二、实现第一个GPT聊天接口

2.1 环境配置分离

使用 python-dotenv 库将 .env 文件加载到环境变量,实现配置与代码分离:

import os
from dotenv import load_dotenv

load_dotenv()  # 加载.env文件

# 获取环境变量
api_key = os.getenv("OPENAI_API_KEY")

2.2 为什么需要请求校验

  • 数据完整性:确保数据格式、类型、长度正确
  • 安全性:防止SQL注入等安全漏洞
  • 用户体验:提供友好的错误提示

2.3 Flask-wtf 安装与使用

pip install flask-wtf

Flask-wtf 基于 wtforms 封装,支持:

  • 数据类型:布尔值、日期、文本、时间、浮点数、邮箱、文件等
  • 校验规则:必填、长度、邮箱格式、正则、范围、URL等

三、统一响应接口设计

3.1 为什么要统一数据格式

建立前后端接口约定,统一数据格式方便处理。如果不统一,前端需要判断多种可能,效率极低。

3.2 响应格式设计

HTTP状态码统一返回200,通过业务状态码判断成功与否:

{
  "code": "success",
  "message": "获取AI应用数据成功",
  "data": {
    "content": "你好!有什么可以帮助你的吗?"
  }
}

3.3 分页数据响应格式

{
  "code": " "success",
  "message": "",
  "data": {
    "paginator": {
      "page_size": 10,
      "current_page": 1,
      "total_page": 10,
      "total_record": 100
    },
    "list": []
  }
}

3.4 业务状态码定义

状态码说明
success操作成功
fail操作失败
not_found资源不存在
unauthorized未授权
forbidden禁止访问
validate_error校验错误

四、PyTest单元测试

4.1 PyTest简介

PyTest是功能强大的Python测试框架,优势包括:

  • 简单易用,学习曲线低
  • 支持多种测试样式
  • 丰富的插件生态
  • 详细的输出信息

4.2 安装

pip install pytest

4.3 测试规则

规则说明
测试文件test_ 开头或 _test 结尾
测试类Test 开头,不带 __init__ 方法
测试函数test_ 开头
断言使用基本 assert

4.4 fixture设置测试环境

# test/conftest.py
import pytest
from app import app

@pytest.fixture
def client():
    app.config["TESTING"] = True
    with app.test_client() as client:
        yield client

4.5 参数化测试

@pytest.mark.parametrize("query", [None, "你好,你是?"])
def test_completion(self, query, client):
    r = client.post("/app/completion", json={"query": query})
    assert r.status_code == 200
    if query is None:
        assert r.json.get("code") == "VALIDATE_ERROR"
    else:
        assert r.json.get("code") == "SUCCESS"

4.6 pytest.ini配置

[pytest]
cache_dir = tmp/.pytest_cache
addopts = -v -s
python_files = test_*.py *_test.py
python_classes = Test*
python_functions = test_*

五、SQLAlchemy ORM数据库操作

5.1 ORM是什么

ORM (Object-Relational Mapping) 将数据库表映射为类:

  • 表 → 类
  • 行 → 类实例
  • 列 → 属性

5.2 安装

pip install flask-sqlalchemy psycopg2

5.3 核心配置

配置项说明示例
SQLALCHEMY_DATABASE_URI数据库连接地址postgresql://root:123456@127.0.0.1:5432/test
SQLALCHEMY_ECHO打印SQL语句True
SQLALCHEMY_TRACK_MODIFICATIONS追踪变化False

5.4 创建模型

import uuid
from datetime import datetime
from sqlalchemy import Column, UUID, String, DateTime, PrimaryKeyConstraint, Index
from sqlalchemy.dialects.postgresql import JSONB
from internal.extension.database_extension import db

class App(db.Model):
    """AI应用模型"""
    __tablename__ = "app"
    __table_args__ = (
        PrimaryKeyConstraint("id", name="pk_app_id"),
        Index("idx_app_account_id", "account_id"),
    )
    
    id = Column(UUID, default=uuid.uuid4, nullable=False)
    account_id = Column(UUID, nullable=False)
    name = Column(String(255), default="", nullable=False)
    icon = Column(String(255), default="", nullable=False)
    config = Column(JSONB, default={}, nullable=False)
    updated_at = Column(DateTime, default=datetime.now, onupdate=datetime.now, nullable=False)
    created_at = Column(DateTime, default=datetime.now, nullable=False)

5.5 增删改查操作

# 新增
student = Students(name='yy', fullname='yoyo')
db.session.add(student)
db.session.commit()

# 查询
users = User.query.order_by(User.id).all()
user = User.query.filter_by(username='john').first()

# 修改
Student.query.filter_by(name='yy').update({"fullname": "xx"})
db.session.commit()

# 删除
Student.query.filter_by(name='imooc").delete()
db.session.commit()

5.6 自动提交封装

from contextlib import contextmanager
from flask_sqlalchemy import SQLAlchemy as _SQLAlchemy

class SQLAlchemy(_SQLAlchemy):
    @contextmanager
    def auto_commit(self):
        try:
            yield
            self.session.commit()
        except Exception as e:
            self.session.rollback()
            raise e

# 使用
with db.auto_commit():
    student = Student.query.first()
    student.name = "imooc"

六、Flask-Migrate数据库迁移

6.1 为什么需要迁移

db.create_all() 无法更新已存在的表结构,需要迁移工具保留数据进行表结构更新。

6.2 安装与初始化

pip install flask-migrate
from flask_migrate import Migrate
migrate = Migrate(app, db, directory="internal/migration")

6.3 常用命令

# 初始化迁移环境
flask --app app.server.app db init

# 生成迁移脚本
flask --app app.server.app db migrate -m "create_table"

# 更新数据库
flask --app app.server.app db upgrade

# 回滚
flask --app app.server.app db downgrade

# 回滚到初始版本
flask --app app.server.app db downgrade base

七、总结

本文从零开始构建了一个生产级别的GPT聊天机器人后端服务,核心要点:

  1. 环境配置:使用 .env 实现配置分离
  2. 数据校验:Flask-wtf 确保请求安全
  3. 统一响应:标准化API返回格式
  4. 单元测试:PyTest 保证代码质量
  5. ORM操作:SQLAlchemy 简化数据库交互
  6. 数据库迁移:Flask-Migrate 管理表结构变更

这些技术组合起来,构成了一个完整的AI应用后端架构基础。


参考资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

加倍巴巴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值