feat(prompt-quality): 质量评价与对比模块 API、脚本与 Vue 页面
Made-with: Cursor
This commit is contained in:
48
scripts/ensure_evaluation_schema_mysql.sql
Normal file
48
scripts/ensure_evaluation_schema_mysql.sql
Normal 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='对比组表';
|
||||
39
scripts/ensure_evaluation_schema_sqlite.sql
Normal file
39
scripts/ensure_evaluation_schema_sqlite.sql
Normal file
@@ -0,0 +1,39 @@
|
||||
-- 开发环境默认 SQLite(config/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);
|
||||
15
scripts/prompt_quality_schema.sql
Normal file
15
scripts/prompt_quality_schema.sql
Normal 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);
|
||||
61
scripts/run_prompt_history_mysql_migration.py
Normal file
61
scripts/run_prompt_history_mysql_migration.py
Normal 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())
|
||||
Reference in New Issue
Block a user