feat(prompt-quality): 质量评价与对比模块 API、脚本与 Vue 页面

Made-with: Cursor
This commit is contained in:
renjianbo
2026-04-06 19:02:21 +08:00
parent daa34582e9
commit 5dad35de82
28 changed files with 6606 additions and 0 deletions

View File

@@ -0,0 +1,48 @@
-- 评价 / 对比功能所需结构(在已有库上增量执行;若列或表已存在会报错,可忽略对应语句)
-- MySQL 5.7+ / 8.0
-- 1. prompt_history 扩展字段(模型 history_models.PromptHistory 依赖)
-- 分两条执行:避免 AFTER 依赖列名/顺序;若某列已存在会报 Duplicate column可忽略该条
ALTER TABLE prompt_history
ADD COLUMN comparison_group_id VARCHAR(64) NULL COMMENT '对比组ID';
ALTER TABLE prompt_history
ADD COLUMN is_comparison_enabled TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否参与对比';
ALTER TABLE prompt_history ADD INDEX idx_comparison_group (comparison_group_id);
-- 若上面因「列已存在」失败,说明已执行过,可继续执行下面建表。
-- 2. 评价表(与 evaluation_models.PromptEvaluation 一致)
CREATE TABLE IF NOT EXISTS prompt_evaluation (
id INT PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID',
history_id INT NOT NULL COMMENT '历史记录ID',
user_id INT NOT NULL COMMENT '评价者用户ID',
clarity_rating TINYINT NULL COMMENT '清晰度评分',
specificity_rating TINYINT NULL COMMENT '具体性评分',
effectiveness_rating TINYINT NULL COMMENT '有效性评分',
professionalism_rating TINYINT NULL COMMENT '专业性评分',
completeness_rating TINYINT NULL COMMENT '完整性评分',
is_best_version TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否为最佳版本',
comparison_group_id VARCHAR(64) NULL COMMENT '对比组ID',
overall_rating TINYINT NULL COMMENT '综合评分',
comments TEXT NULL COMMENT '评价意见',
created_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
INDEX idx_history_id (history_id),
INDEX idx_user_id (user_id),
INDEX idx_comparison_group (comparison_group_id),
CONSTRAINT fk_pe_history FOREIGN KEY (history_id) REFERENCES prompt_history(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='提示词评价表';
-- 3. 对比组表
CREATE TABLE IF NOT EXISTS comparison_group (
id INT PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID',
group_id VARCHAR(64) NOT NULL COMMENT '对比组ID',
user_id INT NOT NULL COMMENT '创建者用户ID',
name VARCHAR(100) NULL COMMENT '对比组名称',
description TEXT NULL COMMENT '对比组描述',
is_public TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否公开',
created_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
updated_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
UNIQUE KEY uk_group_id (group_id),
INDEX idx_user_id (user_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='对比组表';

View File

@@ -0,0 +1,39 @@
-- 开发环境默认 SQLiteconfig/development.py → sqlite:///dev.db增量修复
-- 在仓库根目录执行: sqlite3 dev.db < scripts/ensure_evaluation_schema_sqlite.sql
-- 若列已存在会报错,可忽略该句或先 .schema prompt_history 查看
ALTER TABLE prompt_history ADD COLUMN comparison_group_id VARCHAR(64);
ALTER TABLE prompt_history ADD COLUMN is_comparison_enabled INTEGER NOT NULL DEFAULT 0;
-- 评价表(与 ORM 一致;若已存在可跳过整段)
CREATE TABLE IF NOT EXISTS prompt_evaluation (
id INTEGER PRIMARY KEY AUTOINCREMENT,
history_id INTEGER NOT NULL,
user_id INTEGER NOT NULL,
clarity_rating INTEGER,
specificity_rating INTEGER,
effectiveness_rating INTEGER,
professionalism_rating INTEGER,
completeness_rating INTEGER,
is_best_version INTEGER NOT NULL DEFAULT 0,
comparison_group_id VARCHAR(64),
overall_rating INTEGER,
comments TEXT,
created_at TIMESTAMP,
updated_at TIMESTAMP,
FOREIGN KEY (history_id) REFERENCES prompt_history(id) ON DELETE CASCADE
);
CREATE TABLE IF NOT EXISTS comparison_group (
id INTEGER PRIMARY KEY AUTOINCREMENT,
group_id VARCHAR(64) NOT NULL UNIQUE,
user_id INTEGER NOT NULL,
name VARCHAR(100),
description TEXT,
is_public INTEGER NOT NULL DEFAULT 0,
created_at TIMESTAMP,
updated_at TIMESTAMP
);
CREATE INDEX IF NOT EXISTS idx_pe_history ON prompt_evaluation(history_id);
CREATE INDEX IF NOT EXISTS idx_pe_user ON prompt_evaluation(user_id);

View File

@@ -0,0 +1,15 @@
-- 提示词结构化质量评价表SQLite 与 MySQL 通用写法MySQL 可将 evaluation_json 改为 JSON 类型)
CREATE TABLE IF NOT EXISTS prompt_quality_record (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER NOT NULL,
batch_id VARCHAR(36) NOT NULL,
prompt_index INTEGER NOT NULL DEFAULT 0,
optimized_prompt TEXT NOT NULL,
evaluation_json TEXT NOT NULL,
batch_summary TEXT,
incremental_hints_json TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE INDEX IF NOT EXISTS ix_pqr_user_id ON prompt_quality_record (user_id);
CREATE INDEX IF NOT EXISTS ix_pqr_batch_id ON prompt_quality_record (batch_id);
CREATE INDEX IF NOT EXISTS ix_pqr_created_at ON prompt_quality_record (created_at);

View File

@@ -0,0 +1,61 @@
# -*- coding: utf-8 -*-
"""为 prompt_history 增加对比相关列(可重复执行,已存在则跳过)。"""
from __future__ import annotations
import os
import sys
from pathlib import Path
ROOT = Path(__file__).resolve().parents[1]
sys.path.insert(0, str(ROOT))
from dotenv import load_dotenv
from sqlalchemy import create_engine, text
load_dotenv(ROOT / ".env")
DATABASE_URL = os.environ.get("DATABASE_URL")
if not DATABASE_URL:
print("ERROR: 未设置 DATABASE_URL", file=sys.stderr)
sys.exit(1)
STATEMENTS = [
(
"comparison_group_id",
"ALTER TABLE prompt_history ADD COLUMN comparison_group_id VARCHAR(64) NULL COMMENT '对比组ID'",
),
(
"is_comparison_enabled",
"ALTER TABLE prompt_history ADD COLUMN is_comparison_enabled TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否参与对比'",
),
(
"idx_comparison_group",
"ALTER TABLE prompt_history ADD INDEX idx_comparison_group (comparison_group_id)",
),
]
def main() -> int:
engine = create_engine(DATABASE_URL)
ok = 0
with engine.connect() as conn:
for name, sql in STATEMENTS:
try:
conn.execute(text(sql))
conn.commit()
print(f"OK: {name}")
ok += 1
except Exception as e:
conn.rollback()
err = str(e).lower()
if "duplicate" in err or "1060" in str(e) or "1061" in str(e) or "1826" in str(e):
print(f"SKIP (已存在): {name}")
else:
print(f"FAIL: {name} -> {e}", file=sys.stderr)
return 1
print(f"完成,成功执行 {ok} 条新变更。")
return 0
if __name__ == "__main__":
raise SystemExit(main())