使用AI(GPT-4)实现AI prompt 应用--自动审核评论系统

手把手复现:基于 Flask + GPT-4 的自动评论审核系统

关键词 :Flask、GPT-4、自动审核、内容合规、APScheduler、SQLAlchemy、评论系统、CSDN 教程


一、项目背景

在 UGC(用户生成内容)平台中,评论审核是保障内容生态健康的关键环节。传统人工审核成本高、效率低;而借助大模型(如 GPT-4),我们可以构建一个智能、自动、合规的审核系统。

本文将带你复现一个完整的评论审核系统,具备以下能力:

  • 用户提交评论(状态为"未审核")
  • 后台每30秒自动调用 GPT-4 审核未处理评论
  • 提供管理员界面手动通过/拒绝评论
  • 前端展示已审核评论,并支持"X分钟前"时间显示
  • 完全兼容中国网络内容安全规范

二、核心逻辑实现

📁 文件结构

复制代码
comment-audit-system/
├── app.py                 # 主程序(下文完整代码)
├── .env                   # 环境变量
└── templates/             # HTML 模板(后文提供)
    ├── index.html
    └── admin.html

📄 app.py(完整代码)

复制代码
import os
import json  # 新增:用于安全解析 JSON
from dotenv import load_dotenv
from openai import OpenAI

from flask import Flask, render_template, request, redirect
from flask_sqlalchemy import SQLAlchemy
from flask_apscheduler import APScheduler
from datetime import datetime

#加载环境变量
load_dotenv()


class Config(object):
    # 定义定时任务
    # HOST = '0.0.0.0'
    # FLASK_RUN_PORT = 8081
    # DEBUG = True

    SQLALCHEMY_DATABASE_URI = 'sqlite:///comments.db'
    SCHEDULER_API_ENABLED = True
    SQLALCHEMY_TRACK_MODIFICATIONS  = False

    JOBS = [
        # {
        #     'id': 'job1',  # 任务 ID
        #     'func': 'app:print_time',  # 执行任务的函数
        #     'args': ('job1',),  # 传递给函数的参数
        #     'trigger': 'interval',  # 触发类型
        #     'seconds': 10  # 时间间隔(秒)
        # },
        {
            'id': 'auto_audit',  # 任务 ID
            'func': 'app:auto_audit',  # 执行任务的函数
            'trigger': 'interval',  # 触发类型
            'seconds': 30  # 时间间隔(秒)
        }
    ]


#定时打印时间测试
def print_time(job_id):
    #打印当前时间,按照年月日时分秒的格式
    nowstr = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    print(f"{nowstr} :Task {job_id} executed.")


#调用GPT大模型,自动审核评论
def auto_audit():
    # 必须在应用上下文中操作数据库,否则会报错
    with app.app_context():
        # 配置 OpenAI 服务
        client = OpenAI(
            base_url=os.getenv("OPENAI_BASE_URL"),
            api_key=os.getenv("OPENAI_API_KEY")
        )
        # set the prompt
        prompt = '''
# 评论内容审核指令

## 任务描述
对用户提交的评论内容进行合规性评估,判断其是否适合在中国境内网络平台发布

## 评估维度
1. **政治敏感性**
   - 是否包含不当政治表述
   - 是否涉及敏感政治人物/事件

2. **宗教文化适配**
   - 是否含有宗教歧视内容
   - 是否符合社会主义核心价值观

3. **法律合规性**
   - 是否违反网络安全法
   - 是否包含违法信息

4. **社会文化规范**
   - 是否存在地域/民族歧视
   - 是否使用侮辱性语言
   - 是否包含低俗内容

## 返回格式要求
```json
{
  "passed": <0|1>,
  "reason": "<审核结果说明>"
} 
'''

        # get all comments
        comments = Comment.query.filter_by(status=0).order_by(Comment.id).all()
        # 遍历 comments
        for comment in comments:
            userInput = comment.content
            # call the OpenAI API
            generation_response = client.chat.completions.create(
                model="gpt-4-1106-preview",
                messages=[
                    {
                        "role": "system",
                        "content": prompt
                    },
                    {
                        "role": "user",
                        "content": userInput
                    }
                ],
                response_format={"type": "json_object"},
                stream=False
            )
            #ChatCompletion(id='chatcmpl-8cYEeiOrkM42OlMo40QlMDKQfqu0j', choices=[Choice(finish_reason='stop', index=0, logprobs=None, message=ChatCompletionMessage(content='{\n  "passed": 0,\n  "reason": "[该评论内容含有可能被视为不尊重的言辞]"\n}', role='assistant', function_call=None, tool_calls=None))], created=1704198756, model='gpt-4-1106-preview', object='chat.completion', system_fingerprint='fp_3905aa4f79', usage=CompletionUsage(completion_tokens=33, prompt_tokens=207, total_tokens=240))
            resultContent = generation_response.choices[0].message.content
            #转化为json对象 ------ 修复:使用 json.loads 替代 eval
            result = json.loads(resultContent)

            # 判断评论的检查结果是否合规
            if result["passed"] == 1:
                comment.status = 1
                db.session.commit()
                print(f"{comment.id} 自动审核通过!")
            else:
                comment.status = 2
                db.session.commit()
                print(f"[{comment.id}] '{comment.content}' 有问题 : {result['reason']} .")



#把时间戳转为年月日的时间来展示
def format_timestamp(timestamp):
    return datetime.fromtimestamp(timestamp).strftime('%Y-%m-%d %H:%M:%S')


# 自定义的timesense过滤器
def relative_time_from_timestamp(timestamp):
    # 将时间戳转换为 datetime 对象
    target_time = datetime.fromtimestamp(timestamp)
    now = datetime.now()

    # 计算时间差
    delta = now - target_time
    days = delta.days
    seconds = delta.seconds
    minutes = seconds // 60
    hours = minutes // 60

    # 根据时间差返回相对时间
    if days > 365:
        years = days // 365
        return "%i 年前" % years
    elif days > 30:
        months = days // 30
        return "%i 个月前" % months
    elif days > 7:
        weeks = days // 7
        return "%i 周前" % weeks
    elif days > 0:
        return "%i 天前" % days
    elif hours > 0:
        return "%i 小时前" % hours
    elif minutes > 0:
        return "%i 分钟前" % minutes
    elif seconds > 0:
        return "%i 秒前" % seconds
    else:
        return "刚刚"




app = Flask(__name__)
app.config.from_object(Config())

#向 jinja_env 应用添加过滤器
app.jinja_env.filters['timesince'] = relative_time_from_timestamp

db = SQLAlchemy(app)

# 初始化调度器
scheduler = APScheduler()
scheduler.init_app(app)
scheduler.start()



class Comment(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    content = db.Column(db.String(200), nullable=False)
    # 评论状态 0:未审核 1:已审核
    status = db.Column(db.Integer, nullable=False, default=0)
    #增加一个创建的时间,用created_at字段的时间戳,单位是秒
    created_at = db.Column(db.Integer, nullable=False, default=0)


@app.route('/', methods=['GET', 'POST'])
def index():
    if request.method == 'POST':
        content = request.form['content']
        new_comment = Comment(content=content, status=0)
        #当前时间戳,秒 存入 created_at
        new_comment.created_at = int(datetime.now().timestamp())

        try:
            db.session.add(new_comment)
            db.session.commit()
            return redirect('/')
        except:
            return 'There was an issue adding your comment'
    else:
        comments = Comment.query.filter_by(status=1).order_by(Comment.id.desc()).all()
        return render_template('index.html', comments=comments)

@app.route('/delete/<int:id>')
def delete(id):
    comment_to_delete = Comment.query.get_or_404(id)

    try:
        db.session.delete(comment_to_delete)
        db.session.commit()
        return redirect('/')
    except:
        return 'There was a problem deleting that comment'


#评论管理,可以查看评论的列表,然后审核评论, 审核通过,设置status为1,否则设置为2
@app.route('/admin')
def admin():
    #查询status为0的所有评论
    comments = Comment.query.filter_by(status=0).order_by(Comment.id).all()
    return render_template('admin.html', comments=comments)


#通过审核的方法名pass,接受评论id,然后修改status为1
@app.route('/passone/<int:id>')
def passone(id):
    comment_to_pass = Comment.query.get_or_404(id)

    try:
        comment_to_pass.status = 1
        db.session.commit()
        return redirect('/admin')
    except:
        return 'There was a problem passing that comment'

@app.route('/new')
# 此路由无实现,保留原始结构
pass


#拒绝审核的方法名reject,接受评论id,然后修改status为2
@app.route('/reject/<int:id>')
def rejectone(id):
    comment_to_reject = Comment.query.get_or_404(id)

    try:
        comment_to_reject.status = 2
        db.session.commit()
        return redirect('/admin')
    except:
        return 'There was a problem rejecting that comment'




if __name__ == "__main__":
    app.run( port=5000, debug=True)

三、前端模板

📄 templates/base.html

复制代码
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>评论审核系统</title>
    <style>
        body { font-family: sans-serif; max-width: 800px; margin: 20px auto; }
        .comment { padding: 10px 0; border-bottom: 1px solid #eee; }
        form input[type="text"] { width: 60%; padding: 6px; }
        .admin-actions a { margin-right: 10px; color: #007bff; text-decoration: none; }
    </style>
</head>
<body>
    {% block content %}{% endblock %}
</body>
</html>

📄 templates/index.html

复制代码
{% extends "base.html" %}
{% block content %}
<h2>发表评论</h2>
<form method="POST">
    <input type="text" name="content" required placeholder="请输入评论内容...">
    <button type="submit">提交</button>
</form>

<hr>
<h3>已审核评论</h3>
{% for c in comments %}
<div class="comment">
    {{ c.content }} <small>({{ c.created_at | timesince }})</small>
    <a href="/delete/{{ c.id }}" style="color:red; float:right;">删除</a>
</div>
{% endfor %}

<p><a href="/admin">进入审核后台</a></p>
{% endblock %}

📄 templates/admin.html

复制代码
{% extends "base.html" %}
{% block content %}
<h2>待审核评论({{ comments|length }} 条)</h2>
{% for c in comments %}
<div class="comment">
    [{{ c.id }}] {{ c.content }} <small>({{ c.created_at | timesince }})</small>
    <div class="admin-actions">
        <a href="/passone/{{ c.id }}">✅ 通过</a>
        <a href="/reject/{{ c.id }}">❌ 拒绝</a>
    </div>
</div>
{% else %}
<p>暂无可审核评论。</p>
{% endfor %}
<a href="/">← 返回首页</a>
{% endblock %}

四、环境配置与运行

1. 安装依赖

复制代码
pip install flask flask-sqlalchemy flask-apscheduler python-dotenv openai

2. 创建 .env 文件

复制代码
OPENAI_API_KEY=sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
OPENAI_BASE_URL=https://api.openai.com/v1

🔐 注意:请使用你自己的 OpenAI API Key,并确保网络可访问。

3. 运行项目

复制代码
python app.py

五、功能演示

  1. 用户提交评论

    → 状态为 0(未审核),不会在首页显示

  2. 自动审核

    → 每30秒,系统调用 GPT-4 审核所有 status=0 的评论

    → 通过则 status=1,首页可见;拒绝则 status=2,仅后台可见

  3. 手动审核

    → 管理员可在 /admin 页面点击"通过"或"拒绝"

  4. 时间显示

    → 使用自定义 timesince 过滤器,显示"2分钟前"等友好格式


六、总结与注意事项

✅ 项目技术点:

  • Prompt 设计,覆盖政治、宗教、法律、文化四大维度

⚠️ 生产环境注意事项:

  • 务必添加管理员登录认证 (当前 /admin 无保护)
  • 管理操作应改为 POST 请求,防止 CSRF
  • SQLite 不适合高并发,生产建议用 PostgreSQL/MySQL
  • OpenAI 调用需增加重试与限流机制

本文代码已通过本地测试,可直接运行。欢迎 fork、star、评论交流!

相关推荐
Mintopia2 小时前
Claude Code CLI UI
人工智能·aigc·全栈
Mr.Winter`2 小时前
基于Proto3和单例模式的系统参数配置模块设计(附C++案例实现)
c++·人工智能·单例模式·机器人
Mintopia2 小时前
🌐 动态网络环境下的 WebAIGC 断点续传与容错技术
前端·人工智能·aigc
qinyia2 小时前
WisdomSSH解决因未使用Docker资源导致的磁盘空间不足问题
运维·服务器·人工智能·后端·docker·ssh·github
带刺的坐椅2 小时前
AI 应用工作流:LangGraph 和 Solon AI Flow,我该选谁?
java·python·ai·solon·flow·langgraph
Stark-C3 小时前
凭实力出圈,头戴耳机的六边形战士!性价比拉满的iKF Mars实测
人工智能
paperxie_xiexuo3 小时前
面向多场景演示需求的AI辅助生成工具体系研究:十类平台的功能分型、技术实现与合规应用分析
大数据·人工智能·powerpoint·ppt
aneasystone本尊3 小时前
学习 LiteLLM 的缓存系统
人工智能
万少3 小时前
流碧卡片 6 小时闪电开发 AI gemini-3-pro-preview ! 秒出小红书爆款图,免下载直接用
前端·后端·ai编程