Files
爽哒哒 f26d35da66
All checks were successful
Deploy to Server / deploy (push) Successful in 18s
创赢未来评分系统 - 初始化提交(移除大文件)
2026-03-18 22:41:23 +08:00

151 lines
6.4 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import uuid
from django.db import models
from django.utils.translation import gettext_lazy as _
class TranscriptionTask(models.Model):
class Status(models.TextChoices):
PENDING = 'PENDING', _('等待中')
PROCESSING = 'PROCESSING', _('处理中')
SUCCEEDED = 'SUCCEEDED', _('成功')
FAILED = 'FAILED', _('失败')
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
file_url = models.URLField(verbose_name=_('文件链接'), max_length=1024)
task_id = models.CharField(verbose_name=_('听悟任务ID'), max_length=100, blank=True, null=True)
status = models.CharField(
verbose_name=_('状态'),
max_length=20,
choices=Status.choices,
default=Status.PENDING
)
# 存储阿里云听悟返回的原始 JSON 结构
transcription_data = models.JSONField(verbose_name=_('转写原始数据'), blank=True, null=True, help_text=_('阿里云返回的Transcription完整JSON'))
summary_data = models.JSONField(verbose_name=_('总结原始数据'), blank=True, null=True, help_text=_('阿里云返回的Summarization完整JSON'))
auto_chapters_data = models.JSONField(verbose_name=_('章节原始数据'), blank=True, null=True, help_text=_('阿里云返回的AutoChapters完整JSON'))
project = models.ForeignKey(
'competition.Project',
on_delete=models.SET_NULL,
null=True,
blank=True,
related_name='transcription_tasks',
verbose_name=_('关联参赛项目')
)
transcription = models.TextField(verbose_name=_('逐字稿'), blank=True, null=True)
summary = models.TextField(verbose_name=_('AI总结'), blank=True, null=True)
# 已解耦到 AIEvaluation 模型
# score = models.IntegerField(verbose_name=_('AI评分'), blank=True, null=True, help_text=_('基于转写内容的评分'))
# evaluation = models.TextField(verbose_name=_('AI评语'), blank=True, null=True)
error_message = models.TextField(verbose_name=_('错误信息'), blank=True, null=True)
created_at = models.DateTimeField(verbose_name=_('创建时间'), auto_now_add=True)
updated_at = models.DateTimeField(verbose_name=_('更新时间'), auto_now=True)
class Meta:
verbose_name = _('转写任务')
verbose_name_plural = _('转写任务')
ordering = ['-created_at']
def __str__(self):
return f"{self.id} - {self.get_status_display()}"
class AIEvaluationTemplate(models.Model):
name = models.CharField(verbose_name=_('模板名称'), max_length=100, help_text=_('例如:销售话术评分、逻辑性分析'))
model_selection = models.CharField(
verbose_name=_('模型选择'),
max_length=50,
default='qwen-plus',
help_text=_('例如: qwen-plus, qwen-turbo, qwen-max')
)
prompt = models.TextField(
verbose_name=_('评分提示词'),
default='你是一个专业的评分助手。请根据提供的转写内容对内容质量、逻辑清晰度、语言表达等方面进行综合评分0-100分并给出详细的评语。请以JSON格式返回包含"score""evaluation"字段。',
help_text=_('用于指导AI评分的提示词')
)
score_dimension = models.ForeignKey(
'competition.ScoreDimension',
on_delete=models.SET_NULL,
null=True,
blank=True,
verbose_name=_('关联评分维度'),
help_text=_('如果同步到比赛评分,优先使用此维度。未填写则默认使用"AI Rating"或包含"AI"的维度')
)
is_default = models.BooleanField(
verbose_name=_('是否为默认模板'),
default=False,
help_text=_('默认模板会评价所有比赛,非默认模板且未关联评分维度时不会自动评价')
)
is_active = models.BooleanField(verbose_name=_('是否启用'), default=True, help_text=_('启用后,新的转写任务完成后将自动使用此模板进行评估'))
created_at = models.DateTimeField(verbose_name=_('创建时间'), auto_now_add=True)
updated_at = models.DateTimeField(verbose_name=_('更新时间'), auto_now=True)
class Meta:
verbose_name = _('AI评估模板')
verbose_name_plural = _('AI评估模板')
ordering = ['-created_at']
def __str__(self):
return self.name
class AIEvaluation(models.Model):
class Status(models.TextChoices):
PENDING = 'PENDING', _('等待中')
PROCESSING = 'PROCESSING', _('生成中')
COMPLETED = 'COMPLETED', _('已完成')
FAILED = 'FAILED', _('失败')
task = models.ForeignKey(
TranscriptionTask,
on_delete=models.CASCADE,
related_name='ai_evaluations',
verbose_name=_('关联任务')
)
template = models.ForeignKey(
AIEvaluationTemplate,
on_delete=models.SET_NULL,
null=True,
blank=True,
related_name='evaluations',
verbose_name=_('使用的模板')
)
# 评分与评语
score = models.IntegerField(verbose_name=_('AI评分'), blank=True, null=True, help_text=_('0-100分'))
evaluation = models.TextField(verbose_name=_('AI评语'), blank=True, null=True)
# 记录当时的配置 (快照)
model_selection = models.CharField(
verbose_name=_('模型选择'),
max_length=50,
default='qwen-plus'
)
prompt = models.TextField(verbose_name=_('评分提示词'))
# 原始数据与推理
raw_response = models.JSONField(verbose_name=_('原始响应'), blank=True, null=True, help_text=_('大模型返回的完整JSON'))
reasoning = models.TextField(verbose_name=_('推理过程'), blank=True, null=True, help_text=_('AI的推理过程如果有'))
status = models.CharField(
verbose_name=_('评估状态'),
max_length=20,
choices=Status.choices,
default=Status.PENDING
)
error_message = models.TextField(verbose_name=_('错误信息'), blank=True, null=True)
created_at = models.DateTimeField(verbose_name=_('创建时间'), auto_now_add=True)
updated_at = models.DateTimeField(verbose_name=_('更新时间'), auto_now=True)
class Meta:
verbose_name = _('AI评估结果')
verbose_name_plural = _('AI评估结果')
ordering = ['-created_at']
def __str__(self):
return f"Evaluation for Task {self.task.id} ({self.template.name if self.template else 'Custom'})"