Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
S
saas-dml
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
EzijingWeb
saas-dml
Commits
a546e977
提交
a546e977
authored
11月 21, 2025
作者:
王鹏飞
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
chore: update
上级
cdf9c380
隐藏空白字符变更
内嵌
并排
正在显示
12 个修改的文件
包含
2006 行增加
和
353 行删除
+2006
-353
Index.vue
src/modules/live/product/category/views/Index.vue
+7
-1
FormPrice.vue
src/modules/live/product/management/components/FormPrice.vue
+8
-2
Upload.vue
src/modules/live/product/management/components/Upload.vue
+2
-2
RecordView.vue
src/modules/live/test/components/RecordView.vue
+771
-274
RecordViewText.vue
src/modules/live/test/components/RecordViewText.vue
+31
-0
Steps.vue
src/modules/operations/components/Steps.vue
+1
-1
CompetitionLive.vue
src/modules/score/components/CompetitionLive.vue
+7
-1
CompetitionLiveProd.vue
src/modules/score/components/CompetitionLiveProd.vue
+7
-1
prompt.ts
src/modules/score/prompt.ts
+0
-12
prompt2.ts
src/modules/score/prompt2.ts
+1167
-54
Index.vue
src/modules/score/views/Index.vue
+3
-3
View.vue
src/modules/score/views/View.vue
+2
-2
没有找到文件。
src/modules/live/product/category/views/Index.vue
浏览文件 @
a546e977
...
@@ -25,7 +25,13 @@ const listOptions = {
...
@@ -25,7 +25,13 @@ const listOptions = {
filters
:
[{
label
:
'商品品类名称'
,
prop
:
'name'
,
type
:
'input'
,
placeholder
:
'请输入类别名称'
}],
filters
:
[{
label
:
'商品品类名称'
,
prop
:
'name'
,
type
:
'input'
,
placeholder
:
'请输入类别名称'
}],
columns
:
[
columns
:
[
{
label
:
'商品品类名称'
,
prop
:
'name'
,
align
:
'left'
},
{
label
:
'商品品类名称'
,
prop
:
'name'
,
align
:
'left'
},
{
label
:
'层级'
,
prop
:
'level'
},
{
label
:
'层级'
,
prop
:
'level'
,
computed
({
row
})
{
return
parseInt
(
row
.
level
)
+
1
},
},
{
{
label
:
'状态'
,
label
:
'状态'
,
prop
:
'status'
,
prop
:
'status'
,
...
...
src/modules/live/product/management/components/FormPrice.vue
浏览文件 @
a546e977
...
@@ -269,7 +269,13 @@ function batchSetReferencePrice() {
...
@@ -269,7 +269,13 @@ function batchSetReferencePrice() {
</el-button>
</el-button>
</div>
</div>
</div>
</div>
<el-button
type=
"primary"
plain
:icon=
"Plus"
@
click=
"addSpec"
:disabled=
"specCount >= maxSpecCount"
>
<el-button
type=
"primary"
plain
:icon=
"Plus"
@
click=
"addSpec"
:disabled=
"specCount >= maxSpecCount"
v-if=
"specCount
<
1
"
>
添加规格(
{{
specCount
}}
/
{{
maxSpecCount
}}
)
添加规格(
{{
specCount
}}
/
{{
maxSpecCount
}}
)
</el-button>
</el-button>
</div>
</div>
...
@@ -285,7 +291,7 @@ function batchSetReferencePrice() {
...
@@ -285,7 +291,7 @@ function batchSetReferencePrice() {
<el-form-item
label=
"价格与库存"
required
>
<el-form-item
label=
"价格与库存"
required
>
<div
class=
"form-tips"
v-if=
"hasSpecs"
>
根据规格自动生成,请为每个SKU填写价格和库存
</div>
<div
class=
"form-tips"
v-if=
"hasSpecs"
>
根据规格自动生成,请为每个SKU填写价格和库存
</div>
<div
class=
"form-tips"
v-else
>
请填写商品价格和库存
</div>
<div
class=
"form-tips"
v-else
>
请填写商品价格和库存
</div>
<div
class=
"batch-set-container"
v-if=
"form.info.sku && form.info.sku.length > 0"
>
<div
class=
"batch-set-container"
v-if=
"form.info.sku && form.info.sku.length > 0"
v-show=
"false"
>
<div
class=
"batch-set-item"
>
<div
class=
"batch-set-item"
>
<el-input
v-model=
"batchPrice"
placeholder=
"批量设置价格"
type=
"number"
style=
"width: 200px"
>
<el-input
v-model=
"batchPrice"
placeholder=
"批量设置价格"
type=
"number"
style=
"width: 200px"
>
<template
#
prefix
>
¥
</
template
>
<template
#
prefix
>
¥
</
template
>
...
...
src/modules/live/product/management/components/Upload.vue
浏览文件 @
a546e977
...
@@ -84,7 +84,7 @@ const handleChatSave = (url) => {
...
@@ -84,7 +84,7 @@ const handleChatSave = (url) => {
<div
v-for=
"(item, i) in props.limit"
:key=
"i"
>
<div
v-for=
"(item, i) in props.limit"
:key=
"i"
>
<el-popover
placement=
"top"
width=
"220px"
trigger=
"hover"
>
<el-popover
placement=
"top"
width=
"220px"
trigger=
"hover"
>
<ul
class=
"upload-popover"
>
<ul
class=
"upload-popover"
>
<li
@
click=
"handleOpen(i)"
>
<li
@
click=
"handleOpen(i)"
v-if=
"false"
>
<i
class=
"el-icon"
><UploadFilled
/></i>
本地上传
<i
class=
"el-icon"
><UploadFilled
/></i>
本地上传
</li>
</li>
<li
@
click=
"handleOpenDesign(i)"
v-if=
"!isVideo"
>
<li
@
click=
"handleOpenDesign(i)"
v-if=
"!isVideo"
>
...
@@ -117,7 +117,7 @@ const handleChatSave = (url) => {
...
@@ -117,7 +117,7 @@ const handleChatSave = (url) => {
<
template
v-else
>
<
template
v-else
>
<el-popover
placement=
"top"
width=
"160px"
trigger=
"hover"
>
<el-popover
placement=
"top"
width=
"160px"
trigger=
"hover"
>
<ul
class=
"upload-popover"
>
<ul
class=
"upload-popover"
>
<li
@
click=
"handleOpen"
>
<li
@
click=
"handleOpen"
v-if=
"false"
>
<i
class=
"el-icon"
><UploadFilled
/></i>
本地上传
<i
class=
"el-icon"
><UploadFilled
/></i>
本地上传
</li>
</li>
<li
@
click=
"handleOpenDesign"
v-if=
"!isVideo"
>
<li
@
click=
"handleOpenDesign"
v-if=
"!isVideo"
>
...
...
src/modules/live/test/components/RecordView.vue
浏览文件 @
a546e977
...
@@ -4,6 +4,7 @@ import Demo from '../components/Demo.vue'
...
@@ -4,6 +4,7 @@ import Demo from '../components/Demo.vue'
import
ImprovementPlan
from
'../components/ImprovementPlan.vue'
import
ImprovementPlan
from
'../components/ImprovementPlan.vue'
import
{
getRecord
,
updateRecord
}
from
'../api'
import
{
getRecord
,
updateRecord
}
from
'../api'
import
{
useChat
}
from
'@ezijing/ai-vue'
import
{
useChat
}
from
'@ezijing/ai-vue'
import
RecordViewText
from
'./RecordViewText.vue'
const
{
isLoading
,
generateText
}
=
useChat
({
provider
:
'volcano'
})
const
{
isLoading
,
generateText
}
=
useChat
({
provider
:
'volcano'
})
...
@@ -13,11 +14,12 @@ const props = defineProps({
...
@@ -13,11 +14,12 @@ const props = defineProps({
})
})
const
detail
=
ref
(
null
)
const
detail
=
ref
(
null
)
const
timelines
=
ref
([])
const
fetchRecord
=
async
()
=>
{
const
fetchRecord
=
async
()
=>
{
const
res
=
await
getRecord
({
id
:
props
.
recordId
})
const
res
=
await
getRecord
({
id
:
props
.
recordId
})
const
resDetail
=
res
.
data
.
detail
const
resDetail
=
res
.
data
.
detail
detail
.
value
=
{
...
resDetail
,
live_info
:
JSON
.
parse
(
resDetail
.
live_info
)
}
detail
.
value
=
{
...
resDetail
,
live_info
:
JSON
.
parse
(
resDetail
.
live_info
)
}
timelines
.
value
=
JSON
.
parse
(
resDetail
.
subtitle
)?.
Result
?.
Sentences
||
[]
try
{
try
{
if
(
!
resDetail
.
ai_analyze
)
{
if
(
!
resDetail
.
ai_analyze
)
{
handleAIScore
()
handleAIScore
()
...
@@ -86,12 +88,16 @@ const handleAIScore = async () => {
...
@@ -86,12 +88,16 @@ const handleAIScore = async () => {
const
messages
=
[
const
messages
=
[
{
{
role
:
'system'
,
role
:
'system'
,
content
:
'你是一位专业的直播电商分析师,需要为选手的直播演练生成一份全面、详细的AI评价报告。'
,
content
:
`你是一位专业的直播电商分析师,现在需要你基于我给你的输入信息,为直播练习生成一份全面、详细、准确的直播评价报告。
**核心要求:**
1. 所有数据统计必须基于实际输入内容进行精确计算,不得估算或编造
2. 严格遵循输出格式规范,保持结构一致性
3. 分析客观专业,建议具体可执行`
,
},
},
{
{
role
:
'user'
,
role
:
'user'
,
content
:
`
content
:
`
[输入信息]
一、输入信息
- 直播时长:
${
detail
.
value
?.
live_duration
}
秒
- 直播时长:
${
detail
.
value
?.
live_duration
}
秒
-
字幕文本:
$
{
detail
.
value
?.
subtitle
}
-
字幕文本:
$
{
detail
.
value
?.
subtitle
}
-
直播话术脚本:
$
{
detail
.
value
?.
live_practice_info
.
live_speech
.
content
}
-
直播话术脚本:
$
{
detail
.
value
?.
live_practice_info
.
live_speech
.
content
}
...
@@ -99,313 +105,795 @@ const handleAIScore = async () => {
...
@@ -99,313 +105,795 @@ const handleAIScore = async () => {
-
营销活动:
$
{
detail
.
value
?.
live_practice_info
.
live_speech
.
marketing_campaign
}
-
营销活动:
$
{
detail
.
value
?.
live_practice_info
.
live_speech
.
marketing_campaign
}
-
商品信息:
$
{
JSON
.
stringify
(
detail
.
value
?.
live_practice_info
.
live_commodity
)}
-
商品信息:
$
{
JSON
.
stringify
(
detail
.
value
?.
live_practice_info
.
live_commodity
)}
【输出要求】
二、输出要求与规则
2.1
输出格式
JSON
结构(必须严格遵守):
请基于以上信息生成结构化的
Markdown
报告,并保证
JSON
字段与现有前端对接保持一致:
{
{
"sellingPoints"
:
"...卖点讲解覆盖情况的
总结
内容..."
,
"sellingPoints"
:
"...卖点讲解覆盖情况的
完整 Markdown
内容..."
,
"forbiddenWords"
:
"...违禁词分析报告的 Markdown 内容..."
,
"forbiddenWords"
:
"...违禁词分析报告的
完整
Markdown 内容..."
,
"speechSpeed"
:
"...语速分析报告的 Markdown 内容..."
,
"speechSpeed"
:
"...语速分析报告的
完整
Markdown 内容..."
,
"optimizationTips"
:
"...直播优化建议的 Markdown 内容..."
"optimizationTips"
:
"...直播优化建议的
完整
Markdown 内容..."
}
}
报告中必须覆盖以下四大板块,并按照既定标题层级输出,避免新增或删除节点:
注意:
四个字段必须全部返回,值为字符串类型
每个字段的值为对应板块的完整
Markdown
内容
不允许修改字段名称,以保证前端对接一致性
2.2
数据统计规则(重要)
规则
1
:口播字数统计
统计方法:
基于【字幕文本】内容进行统计
统计所有汉字、字母、数字的总数(不含标点符号和空格)
计算公式:口播字数
=
len
(
re
.
sub
(
r
'[^
\
w
\
u4e00-
\
u9fff]'
,
''
,
字幕文本
))
示例:
字幕文本:
"大家好,欢迎来到直播间!今天给大家带来一款超值面膜。"
口播字数:
25
字(不含标点和空格)
规则
2
:卖点讲解判断标准
判断方法:
逐一对比【预设卖点】和【字幕文本】
如果字幕中出现卖点的关键词(至少
3
个连续汉字匹配),则认为该卖点已讲解
如果卖点被提及且有相关描述(超过
15
字),则认为是有效讲解
示例:
预设卖点:
"三重玻尿酸深层补水"
字幕中出现:
"这款面膜含有三重玻尿酸,能够深层补水"
→
已讲解
✓
字幕中出现:
"含有玻尿酸成分"
→
未充分讲解
✗(描述不足
15
字)
覆盖率计算:
覆盖率
=
(
已讲解卖点数量
/
预设卖点总数量
)
×
100
%
规则
3
:语速计算规则
计算方法:
基于【字幕文本】和【直播时长】计算
平均语速
=
口播字数
÷
直播时长(分钟)
分段语速:将直播时长按分钟切分,分别统计每分钟的字数
示例:
直播时长:
15
分钟
口播字数:
3000
字
平均语速:
3000
÷
15
=
200
字
/
分钟
语速评价标准:
✅
正常:
180
-
220
字
/
分钟
⚡
偏快:
221
-
240
字
/
分钟
❌
过快:
>
240
字
/
分钟
⚠️
偏慢:
150
-
179
字
/
分钟
❌
过慢:
<
150
字
/
分钟
规则
4
:违禁词检测规则
检测方法:
基于【违禁词对照表】逐个检测【字幕文本】
记录每个违禁词的出现位置、次数、上下文
标注违禁词在原文中的位置(使用
↑违禁
标记)
违禁词对照表(共
65
个):
|
类别
|
违禁词列表
|
|
------------------
|
------------------------------------------------------------------------------------------------------------------------------
|
|
绝对化用语(
20
个)
|
最、最佳、最好、最优、最大、最小、最新、最先进、第一、首个、首选、唯一、独一无二、前无古人、极致、完美、顶级、至尊、终极、巅峰
|
|
夸大宣传(
15
个)
|
100
%
、百分百、保证、必然、绝对、肯定、立竿见影、立即见效、马上见效、即刻、永久、终身、永远、一劳永逸、彻底
|
|
医疗用语(
20
个)
|
治疗、治愈、医治、疗效、药用、处方、抗炎、消炎、杀菌、灭菌、防癌、抗癌、降血压、降血糖、降血脂、治痤疮、祛痘、去斑、修复、再生
|
|
虚假宣传(
10
个)
|
国家级、世界级、全球级、宇宙级、最高级、最低价、史无前例、前所未有、销量第一、市场占有率第一
|
严重程度评估标准:
严重:≥
5
个违禁词
中等:
3
-
4
个违禁词
轻微:
1
-
2
个违禁词
零违禁:
0
个违禁词
三、输出示例
示例
1
:
sellingPoints
(卖点讲解覆盖情况)
##
卖点讲解覆盖情况
###
卖点讲解综合评价
**
【整体表现】
**
本次直播时长
15
分钟,累计口播
2847
字,平均语速约
190
字
/
分钟。本次直播共讲解了
4
个卖点,覆盖率达到
80
%
(预设
5
个卖点)。
**
已讲解卖点:
**
1
.
✅
三重玻尿酸深层补水(讲解时长约
45
秒,内容充分)
2
.
✅
烟酰胺提亮肤色(讲解时长约
30
秒,内容充分)
3
.
✅
48
小时持久保湿(讲解时长约
35
秒,内容充分)
4
.
✅
医研共创配方(讲解时长约
25
秒,内容简略)
**
未讲解卖点:
**
1
.
❌
神经酰胺和角鲨烷修护屏障(完全未提及)
**
整体评价:
**
卖点讲解较为全面,重点突出,但遗漏了
"神经酰胺和角鲨烷"
这一重要卖点。前
3
个卖点讲解深入,但第
4
个卖点
"医研共创配方"
仅简单带过,缺乏具体说明。建议在二次直播中补充遗漏卖点,并对
"医研共创配方"
进行更详细的讲解,增加品牌背书和专业性。
示例
2
:
forbiddenWords
(违禁词分析报告)
情况
A
:发现违禁词
##
违禁词分析报告
###
检测结果总览
-
**
共发现
**
:
3
个违禁词
/
敏感词
-
**
严重程度评估
**
:轻微
---
###
违禁词详细列表
**
【违禁词
#
1
】
**
━━━━━━━━━━━━
-
**
违禁词
**
:
"最好"
-
**
类型
**
:绝对化用语
-
**
出现时间
**
:第
3
分
25
秒
-
**
出现次数
**
:
1
次
-
**
上下文原文
**
:
"这款面膜效果最好,市场上独一无二的配方..."
↑违禁
↑违禁
**
【违禁词
#
2
】
**
━━━━━━━━━━━━
-
**
违禁词
**
:
"独一无二"
-
**
类型
**
:绝对化用语
-
**
出现时间
**
:第
3
分
27
秒
-
**
出现次数
**
:
1
次
-
**
上下文原文
**
:
"这款面膜效果最好,市场上独一无二的配方..."
↑违禁
↑违禁
**
【违禁词
#
3
】
**
━━━━━━━━━━━━
-
**
违禁词
**
:
"100%"
-
**
类型
**
:夸大宣传
-
**
出现时间
**
:第
8
分
15
秒
-
**
出现次数
**
:
1
次
-
**
上下文原文
**
:
"使用后 100% 能看到效果,保证满意..."
↑违禁
↑违禁
---
###
违规情况统计
-
**
违禁词总数
**
:
3
个
-
**
违禁词出现总次数
**
:
3
次
**
类型分布:
**
-
绝对化用语:
2
个(最好、独一无二)
-
夸大宣传:
1
个(
100
%
)
-
医疗用语:
0
个
-
虚假宣传:
0
个
**
高频违禁词:
**
1
.
"最好"
-
出现
1
次
2
.
"独一无二"
-
出现
1
次
3
.
"100%"
-
出现
1
次
情况
B
:零违禁(无违禁词)
##
违禁词分析报告
###
检测结果总览
-
**
共发现
**
:
0
个违禁词
/
敏感词
-
**
严重程度评估
**
:零违禁
**
【评价】
**
本次直播用词规范,未发现任何违禁词或敏感词,合规性良好。继续保持专业、准确的表达方式。
示例
3
:
speechSpeed
(语速分析报告)
##
语速分析报告
###
(一)语速分析
**
整体语速数据:
**
-
**
平均语速
**
:
195
字
/
分钟
-
**
最快语速
**
:
258
字
/
分钟(出现在第
5
分
30
秒)
-
**
最慢语速
**
:
142
字
/
分钟(出现在第
9
分
15
秒)
-
**
语速波动
**
:±
35
字
/
分钟(标准差)
---
###
(二)语速标准参考
1
.
**
理想语速
**
:
180
-
220
字
/
分钟
✅
2
.
**
偏快语速
**
:
221
-
240
字
/
分钟
⚡
3
.
**
过快语速
**
:
>
240
字
/
分钟
❌
4
.
**
偏慢语速
**
:
150
-
179
字
/
分钟
⚠️
5
.
**
过慢语速
**
:
<
150
字
/
分钟
❌
---
###
(三)语速曲线分析
**
【语速统计区间】
**
|
时间段
|
语速
(
字
/
分
)
|
评价
|
对应环节
|
|
:
---
:
|
:
---
:
|
:
---
:
|
:
---
:
|
|
00
:
00
-
01
:
00
|
188
|
✅正常
|
开场白
|
|
01
:
00
-
02
:
00
|
192
|
✅正常
|
品牌介绍
|
|
02
:
00
-
03
:
00
|
165
|
⚠️偏慢
|
品牌介绍
|
|
03
:
00
-
04
:
00
|
195
|
✅正常
|
产品讲解
-
开始
|
|
04
:
00
-
05
:
00
|
225
|
⚡偏快
|
产品讲解
-
成分
|
|
05
:
00
-
06
:
00
|
258
|
❌过快
|
产品讲解
-
卖点
|
|
06
:
00
-
07
:
00
|
210
|
✅正常
|
产品讲解
-
效果
|
|
07
:
00
-
08
:
00
|
198
|
✅正常
|
产品讲解
-
价格
|
|
08
:
00
-
09
:
00
|
155
|
⚠️偏慢
|
互动环节
|
|
09
:
00
-
10
:
00
|
235
|
⚡偏快
|
促销推动
|
|
10
:
00
-
11
:
00
|
228
|
⚡偏快
|
促销推动
|
|
11
:
00
-
12
:
00
|
205
|
✅正常
|
催单话术
|
|
12
:
00
-
13
:
00
|
190
|
✅正常
|
组合优惠
|
|
13
:
00
-
14
:
00
|
185
|
✅正常
|
结束语
|
|
14
:
00
-
15
:
00
|
178
|
⚠️偏慢
|
结束语
|
---
###
(四)语速异常时间段详细分析
**
【异常片段
#
1
】
**
━━━━━━━━━━━━
-
**
时间
**
:
05
:
00
-
06
:
00
(
1
分钟)
-
**
问题
**
:语速过快
-
**
数据
**
:
258
字
/
分钟(超标准
38
字
/
分钟)
-
**
对应内容
**
:产品卖点讲解
-
三重玻尿酸成分介绍
**
【异常片段
#
2
】
**
━━━━━━━━━━━━
-
**
时间
**
:
09
:
00
-
11
:
00
(
2
分钟)
-
**
问题
**
:持续偏快
-
**
数据
**
:
231
字
/
分钟(超标准
11
字
/
分钟)
-
**
对应内容
**
:促销推动环节
**
【异常片段
#
3
】
**
━━━━━━━━━━━━
-
**
时间
**
:
02
:
00
-
03
:
00
(
1
分钟)
-
**
问题
**
:语速偏慢
-
**
数据
**
:
165
字
/
分钟(低于标准
15
字
/
分钟)
-
**
对应内容
**
:品牌介绍环节
**
【异常片段
#
4
】
**
━━━━━━━━━━━━
-
**
时间
**
:
08
:
00
-
09
:
00
(
1
分钟)
-
**
问题
**
:语速偏慢
-
**
数据
**
:
155
字
/
分钟(低于标准
25
字
/
分钟)
-
**
对应内容
**
:互动环节
---
###
(五)语速变化趋势分析
**
【整体趋势】
**
本次直播语速呈现
"波浪形"
变化。开场语速正常(
188
-
192
字
/
分钟),品牌介绍后段出现偏慢(
165
字
/
分钟)。在产品讲解环节(
4
-
6
分钟)明显加快,尤其在卖点讲解时达到
258
字
/
分钟的峰值。互动环节放慢至
155
字
/
分钟,促销环节再次加快至
231
字
/
分钟,结束语恢复正常但略显拖沓(
178
字
/
分钟)。整体语速波动较大(±
35
字
/
分钟),稳定性不足。
**
【问题诊断】
**
一、卖点讲解覆盖情况
-
**
主要问题
**
:在需要重点讲解的环节(产品卖点)语速反而过快(
258
字
/
分钟),导致观众难以吸收关键信息,影响转化效果。
卖点讲解综合评价:
-
**
次要问题
**
:语速波动过大(±
35
字
/
分钟),缺乏整体节奏控制,部分环节过快、部分环节过慢,观看体验不够流畅。
【整体表现】
【用几句话总结卖点讲解的整体情况,如:本次直播时长
XX
,累计口播
XX
字,本次直播共讲解了
X
个卖点,覆盖率达到
XX
%
。讲解较为全面
/
部分遗漏,重点突出
/
略显平淡。建议在二次直播中
...
】
示例
4
:
optimizationTips
(直播优化建议)
##
直播优化建议
二、违禁词分析报告
###
综合评价
本次直播整体表现良好,在卖点讲解和品牌介绍方面表现突出,但在语速控制、互动频率和促单技巧方面还有较大提升空间。以下从
5
个维度提出具体优化建议:
---
###
1
、语速与节奏
**
【现状描述】
**
平均语速约
195
字
/
分钟,整体适中。但在产品讲解环节(
4
-
6
分钟)语速明显过快,达到
258
字
/
分钟,在互动环节又过于缓慢(
155
字
/
分钟)。语速波动较大(±
35
字
/
分钟),节奏不够稳定。
**
【存在问题】
**
-
**
问题
1
**
:产品讲解环节(
5
:
00
-
6
:
00
)语速过快,达到
258
字
/
分钟,观众可能跟不上,尤其是
"三重玻尿酸"
等专业术语
-
**
问题
2
**
:停顿不当,在关键卖点
"48 小时持久保湿"
后没有留出思考时间,直接进入下一个卖点
-
**
问题
3
**
:节奏不稳定,从产品讲解的
258
字
/
分钟突然降到互动环节的
155
字
/
分钟,时快时慢,影响观看体验
检测结果总览:
**
【改进建议】
**
共发现:
X
个违禁词
/
敏感词
严重程度评估:严重
/
中等
/
轻微
/
零违禁
(严重程度评估标准:严重≥
5
个,中等
3
-
4
个,轻微
1
-
2
个,零违禁
0
个。此说明不写入报告。)
违禁词详细列表:(若为零违禁,则不展示下面的统计内容)
-
**
具体建议
1
**
:在讲解
"三重玻尿酸成分"
等专业内容时,有意识放慢语速至
200
字
/
分钟以内,并在关键数据(如
"48 小时"
)后停顿
1
-
2
秒,让观众充分理解
【违禁词
#
1
】━━━━━━━━━━━━
-
**
具体建议
2
**
:使用
"那么"
、
"接下来"
、
"大家注意"
等连接词自然控制节奏,在卖点之间增加过渡,避免讲解过于密集
违禁词:
"【具体违禁词】"
类型:绝对化用语
夸大宣传
医疗用语
虚假宣传
出现时间:第
X
分
X
秒
出现次数:
X
次
上下文原文:
-
**
具体建议
3
**
:提前充分练习话术脚本,熟记核心内容,避免因不熟练导致语速失控。建议每天练习
2
-
3
遍,直到能够流畅表达
"【引用完整句子,用红色标注违禁词】"
例:
"这款面膜效果最好,市场上独一无二的配方..."
↑违禁
↑违禁
【违禁词
#
2
】━━━━━━━━━━━━
违禁词:
"【具体违禁词】"
类型:绝对化用语
夸大宣传
医疗用语
虚假宣传
出现时间:第
X
分
X
秒
出现次数:
X
次
上下文原文:
"【引用完整句子】"
例:
"这款面膜能够治疗痘痘,快速修复受损肌肤..."
↑违禁
【违禁词
#
3
】━━━━━━━━━━━━
---
违禁词:
"【具体违禁词】"
类型:绝对化用语
夸大宣传
医疗用语
虚假宣传
出现时间:第
X
分
X
秒
出现次数:
X
次
上下文原文:
"【引用完整句子】"
例:
"使用后100%能看到效果,保证满意..."
↑违禁
↑违禁
(依此类推,列出所有违禁词
...
)
###
2
、互动能力
违规情况统计(若为零违禁,则不展示下面的统计内容)
违禁词总数:
X
个
**
【现状描述】
**
违禁词出现总次数:
X
次
类型分布:
-
绝对化用语:
X
个(如:最、第一、唯一、极致、顶级、完美等)
-
夸大宣传:
X
个(如:
100
%
、必然、保证、绝对、立即见效等)
互动频率不足,整场
15
分钟直播共发起
3
次互动,回应了
1
条观众评论。互动形式单一,主要为
"点赞破万送福利"
,缺乏创意和吸引力。
-
医疗用语:
X
个(如:治疗、疗效、药用、治愈、医治等)
-
虚假宣传:
X
个(如:国家级、世界级、最高级、最低价等)
高频违禁词:
**
【存在问题】
**
1
.
"【违禁词】"
-
出现
X
次
2
.
"【违禁词】"
-
出现
X
次
3
.
"【违禁词】"
-
出现
X
次
-
**
问题
1
**
:互动频率过低,平均每
5
分钟才有
1
次互动,直播间氛围不够活跃,观众参与感不强
常见违禁词快速对照表(不需要体现在报告里面)
-
**
问题
2
**
:互动问题设计不够吸引人,
"点赞破万"
的门槛过高(当前仅
3500
点赞),观众参与度不高
类别
1
:绝对化用语(共
20
个)
最、最佳、最好、最优、最大、最小、最新、最先进
第一、首个、首选、唯一、独一无二、前无古人
极致、完美、顶级、至尊、终极、巅峰
类别
2
:夸大宣传(共
15
个)
-
**
问题
3
**
:对观众评论回应不够及时,评论区有
5
条
"敏感肌能用吗"
的提问,但直播中未及时回应,错过了互动机会
100
%
、百分百、保证、必然、绝对、肯定
立竿见影、立即见效、马上见效、即刻
永久、终身、永远、一劳永逸、彻底
类别
3
:医疗用语(共
20
个)
-
**
问题
4
**
:抽奖活动执行不到位,仅在开场提了一次
"点赞破万抽奖"
,后续未再强调,未能充分调动观众积极性
治疗、治愈、医治、疗效、药用、处方
抗炎、消炎、杀菌、灭菌、防癌、抗癌
降血压、降血糖、降血脂、治痤疮、祛痘、去斑
修复、再生(需谨慎使用)
类别
4
:虚假宣传(共
10
个)
国家级、世界级、全球级、宇宙级
最高级、最低价、史无前例、前所未有
销量第一、市场占有率第一
**
【改进建议】
**
三、直播优化建议
-
**
具体建议
1
**
:增加互动频率,建议每
3
-
5
分钟发起一次互动,如
"有宝宝用过玻尿酸面膜吗?效果如何?扣 1 分享一下"
综合评价:
-
**
具体建议
2
**
:设计更有趣的互动问题和阶梯式目标,如
"猜猜这款面膜的秒杀价是多少?猜中送小样!"
或
"点赞 5000 抽 1 人,点赞 8000 抽 3 人"
【用几句话总结本次直播的整体表现,如:本次直播整体表现良好
/
一般
/
优秀,在卖点讲解和互动方面表现突出,但在语速控制和促单技巧方面还有提升空间。
以下
5
个维度需逐项输出:
-
**
具体建议
3
**
:安排专人实时监控评论区,对高频问题立即回应,如
"敏感肌能用吗?可以的,这款面膜不含酒精和香精,敏感肌友好"
1
、语速与节奏
【现状描述】详细描述当前语速和节奏的表现,如:平均语速约
XXX
字
/
分钟,整体偏快
/
适中
/
偏慢。在产品讲解环节语速过快,在互动环节节奏较好。
-
**
具体建议
4
**
:在点赞数接近目标时,实时播报进度并强调
"还差 500 个就到 5000 啦,大家帮忙点一下,马上抽奖!"
营造紧迫感和参与感
【存在问题】示例如下:
问题
1
,如:产品讲解环节(
X
分
X
秒
-
X
分
X
秒)语速过快,达到
XXX
字
/
分钟,观众可能跟不上
问题
2
,如:停顿不当,关键信息没有留出思考时间
问题
3
,如:节奏不稳定,时快时慢,影响观看体验
【改进建议】示例如下:
---
具体建议
1
,如:在讲解三重玻尿酸成分时,有意识放慢语速至
200
字
/
分钟以内,并在关键数据后
停顿
1
-
2
秒
具体建议
2
,如:使用
"那么"
、
"接下来"
等连接词自然控制节奏
具体建议
3
,如:提前充分练习话术脚本,避免因不熟练导致语速失控
(语速标准参考内容需保留原文,不写入报告主体)
语速标准参考
理想语速:
180
-
220
字
/
分钟
-
观众能够轻松跟上
-
有足够时间理解信息
-
节奏舒适,不紧不慢
偏快语速:
221
-
240
字
/
分钟
-
部分观众可能跟不上
-
影响信息吸收效果
-
建议适当放慢
过快语速:
>
240
字
/
分钟
-
大部分观众难以跟上
-
严重影响直播效果
-
必须改进
偏慢语速:
150
-
179
字
/
分钟
-
节奏稍显拖沓
-
可能影响直播间活跃度
-
建议适当加快
过慢语速:
<
150
字
/
分钟
-
节奏过于拖沓
-
观众容易失去耐心
-
必须改进
###
3
、卖点讲解能力
2
、互动能力
【现状描述】详细描述当前互动情况,如:互动频率一般
/
良好
/
不足,共发起
X
次互动,回应了
X
条观众评论。互动形式包括
...
**
【现状描述】
**
【存在问题】示例如下:
问题
1
,如:互动频率过低,整场
直播仅发起
X
次互动,直播间氛围不够活跃
问题
2
,如:互动问题设计不够吸引人,观众参与度不高
问题
3
,如:对观众评论回应不够及时,错过了多次互动机会
问题
4
,如:抽奖活动执行不到位,未能充分调动观众积极性
【改进建议】示例如下:
共讲解了
4
个卖点,覆盖率
80
%
(预设
5
个)。讲解较为清晰,逻辑性强,但遗漏了
1
个重要卖点,部分卖点讲解深度不够。
具体建议
1
,如:增加互动频率,建议每
3
-
5
分钟发起一次互动,如
"有宝宝用过玻尿酸面膜吗?效果如何?"
具体建议
2
,如:设计更有趣的互动问题,如
"猜猜这款面膜的秒杀价是多少?猜中送小样!"
具体建议
3
,如:及时关注评论区,对高频问题立即回应,如
"敏感肌能用吗?"
具体建议
4
,如:在点赞数接近目标时,强调
"还差XX个就到10000啦,大家帮忙点一下!"
营造参与感
**
【存在问题】
**
-
**
问题
1
**
:卖点讲解不够深入,对
"三重玻尿酸"
的概念仅说
"含有三重玻尿酸"
,未解释
"大中小分子"
的具体作用
-
**
问题
2
**
:缺少具体案例和数据支撑,
"48 小时持久保湿"
未引用
"真人实测数据"
,说服力不足
-
**
问题
3
**
:遗漏重要卖点
"神经酰胺和角鲨烷修护屏障"
,导致产品价值传达不完整
-
**
问题
4
**
:
"医研共创配方"
仅简单带过,未说明具体合作机构或背书,专业性不足
**
【改进建议】
**
-
**
具体建议
1
**
:讲解
"三重玻尿酸"
时
,
要详细说明
"大中小分子玻尿酸,分别作用于肌肤不同层次:大分子在表面锁水、中分子在中层补水、小分子深层渗透"
3
、卖点讲解能力
-
**
具体建议
2
**
:引用具体数据增强说服力,如
"真人实测 48 小时后肌肤水润度依然提升 40%,持久保湿看得见"
【现状描述】详细描述当前卖点讲解情况,如:共讲解了
X
个卖点,覆盖率
XX
%
。讲解较为清晰
/
逻辑性强
/
略显混乱。
-
**
具体建议
3
**
:补充遗漏卖点,在下次直播中加入
"神经酰胺和角鲨烷双重修护,强韧肌肤屏障,敏感肌也能安心用"
【存在问题】示例如下:
-
**
具体建议
4
**
:将所有
5
个卖点都讲解到位,每个卖点至少讲解
30
秒,按照
"成分→功效→效果→数据支撑"
的逻辑顺序展开
问题
1
,如:卖点讲解不够深入,对
"三重玻尿酸"
的概念解释不清
问题
2
,如:缺少具体案例和数据支撑,说服力不足
问题
3
,如:卖点讲解顺序混乱,没有逻辑层次
问题
4
,如:遗漏重要卖点
"神经酰胺和角鲨烷"
,影响产品价值传达
---
【改进建议】示例如下:
具体建议
1
,如:讲解
"三重玻尿酸"
时,要说明
"大中小分子玻尿酸,分别作用于肌肤不同层次,大分子锁水、中分子补水、小分子深层渗透"
具体建议
2
,如:引用具体数据
"真人实测48小时后肌肤水润度依然提升40%"
增强说服力
###
4
、促单能力
具体建议
3
,如:按照
"成分→功效→效果→价格"
的逻辑顺序讲解卖点
具体建议
4
,如:将所有
5
个卖点都讲解到位,每个卖点至少讲解
30
秒
**
【现状描述】
**
4
、促单能力
【现状描述】详细描述当前促单话术使用情况,如:促单环节共
X
次,促单话术包括
...
促单效果一般
/
良好
/
不足。
促单环节共
2
次(
8
分钟和
10
分钟各
1
次),促单话术包括
"秒杀价 69 元"
和
"限时限量"
。促单话术力度一般,缺乏紧迫感营造。
【存在问题】示例如下:
问题
1
,如:促单话术力度不够,缺乏紧迫感营造
问题
2
,如:未充分强调价格优惠,
"秒杀价69元"
只提了一次
问题
3
,如:限时限量信息传达不清,未能激发购买欲望
**
【存在问题】
**
问题
4
,如:组合优惠活动讲解不够清晰,观众可能不理解
【改进建议】示例如下:
具体建议
1
,如:在秒杀环节强调
"只剩最后5分钟!只有100份!现在还剩XX份!"
营造紧迫感
-
**
问题
1
**
:促单话术力度不够,缺乏紧迫感营造,仅说
"秒杀价 69 元"
,未强调
"限时"
和
"限量"
具体建议
2
,如:多次强调价格对比
"平时99元,今天秒杀只要69元,一片才6.9元,太划算了!"
具体建议
3
,如:在促销环节使用催单话术
"已经有XX位宝宝下单了,还在犹豫的宝宝抓紧啦!"
-
**
问题
2
**
:未充分强调价格优惠对比,
"秒杀价 69 元"
只提了
1
次,未与原价
99
元形成对比,价值感不足
具体建议
4
,如:清晰讲解组合优惠
"买10片装送2片,相当于12片只要69元,比单买划算多了!"
-
**
问题
3
**
:限时限量信息传达不清,未说明
"秒杀还剩多少时间"
、
"还剩多少库存"
,未能激发购买欲望
-
**
问题
4
**
:组合优惠活动讲解不够清晰,
"买 10 片装送 2 片"
未强调
"相当于 12 片只要 69 元"
,观众可能不理解优惠力度
5
、整体表现力
【现状描述】详细描述整体表现,如:仪表整洁,妆容得体。肢体语言自然
/
略显僵硬。镜头感良好
/
需加强。整体自信度较好
/
略显紧张。
**
【改进建议】
**
【存在问题】示例如下:
问题
1
,如:肢体语言不够丰富,全程较为僵硬
问题
2
,如:眼神交流不够,经常低头看脚本
问题
3
,如:产品展示不够充分,没有特写展示
-
**
具体建议
1
**
:在秒杀环节强调紧迫感,
"只剩最后 5 分钟!只有 100 份!现在还剩 37 份!手慢无!"
配合倒计时营造氛围
问题
4
,如:整体略显紧张,影响自信度
-
**
具体建议
2
**
:多次强调价格对比,
"平时 99 元,今天秒杀只要 69 元,一片才 6.9 元,比超市便宜一半,太划算了!"
【改进建议】示例如下:
具体建议
1
,如:增加手势配合讲解,如讲
"三重玻尿酸"
时用手势比划
"三层"
-
**
具体建议
3
**
:在促销环节使用催单话术,实时播报
"已经有 156 位宝宝下单了,还在犹豫的宝宝抓紧啦!"
营造从众心理
具体建议
2
,如:尽量看镜头而不是脚本,熟记话术内容
具体建议
3
,如:展示产品时,将产品靠近镜头,展示包装细节和文字说明
-
**
具体建议
4
**
:清晰讲解组合优惠,
"买 10 片装送 2 片,相当于 12 片只要 69 元,平均一片不到 6 块钱,比单买划算多了!"
具体建议
4
,如:直播前深呼吸放松,告诉自己
"我准备充分,一定可以"
---
四、语速分析报告
(一)语速分析
###
5
、整体表现力
整体语速数据
平均语速:
XXX
字
/
分钟
最快语速:
XXX
字
/
分钟(出现在第
X
分
X
秒)
最慢语速:
XXX
字
/
分钟(出现在第
X
分
X
秒)
**
【现状描述】
**
语速波动:
XX
字
/
分钟(标准差)
(二)语速标准参考
1
、理想语速:
180
-
220
字
/
分钟
仪表整洁,妆容得体,符合直播要求。肢体语言略显僵硬,镜头感一般,眼神交流不够。整体略显紧张,自信度有待提升。
2
、偏快语速:
221
-
240
字
/
分钟
3
、过快语速:
>
240
字
/
分钟
4
、偏慢语速:
150
-
179
字
/
分钟
5
、过慢语速:
<
150
字
/
分钟
**
【存在问题】
**
(三)语速曲线分析
【语速统计区间】(输出为表格,表头保持不变,以直播实际实际的语速数据来进行展示,展示每分钟的语速分布情况,下表为展示表格的示例内容,表格里面的内容居中对齐)
-
**
问题
1
**
:肢体语言不够丰富,全程较为僵硬,双手多数时间放在身体两侧,缺乏手势配合
时间段
|
语速
(
字
/
分
)
|
评价
|
对应环节
---------------|-------------|--------|-------------
-
**
问题
2
**
:眼神交流不够,经常低头看脚本或商品,与镜头(观众)的眼神交流不足,亲和力不够
00
:
00
-
01
:
00
|
XXX
|
✅正常
|
开场白
01
:
00
-
02
:
00
|
XXX
|
✅正常
|
品牌介绍
-
**
问题
3
**
:产品展示不够充分,讲解
"三重玻尿酸"
时未将产品包装靠近镜头展示成分表和文字说明
02
:
00
-
03
:
00
|
XXX
|
⚠️偏慢
|
品牌介绍
03
:
00
-
04
:
00
|
XXX
|
✅正常
|
产品讲解
-
开始
-
**
问题
4
**
:整体略显紧张,语气不够自信,多次出现
"嗯"
、
"那个"
等口头禅,影响专业度
04
:
00
-
05
:
00
|
XXX
|
⚡偏快
|
产品讲解
-
成分
05
:
00
-
06
:
00
|
XXX
|
❌过快
|
产品讲解
-
卖点
06
:
00
-
07
:
00
|
XXX
|
✅正常
|
产品讲解
-
效果
07
:
00
-
08
:
00
|
XXX
|
✅正常
|
产品讲解
-
价格
**
【改进建议】
**
08
:
00
-
09
:
00
|
XXX
|
⚠️偏慢
|
互动环节
09
:
00
-
10
:
00
|
XXX
|
⚡偏快
|
促销推动
10
:
00
-
11
:
00
|
XXX
|
⚡偏快
|
促销推动
11
:
00
-
12
:
00
|
XXX
|
✅正常
|
催单话术
-
**
具体建议
1
**
:增加手势配合讲解,如讲
"三重玻尿酸"
时用手势比划
"三层"
,讲
"深层补水"
时做由外向内的手势,增强表现力
12
:
00
-
13
:
00
|
XXX
|
✅正常
|
组合优惠
13
:
00
-
14
:
00
|
XXX
|
✅正常
|
结束语
-
**
具体建议
2
**
:尽量看镜头而不是脚本,熟记话术核心内容,眼神交流要自然,把镜头想象成一位朋友,用对话的方式讲解
14
:
00
-
15
:
00
|
XXX
|
✅正常
|
结束语
-
**
具体建议
3
**
:展示产品时,将产品正面靠近镜头
5
-
10
秒,展示包装细节、品牌
logo
和成分表文字说明,增强信任感
(四)语速异常时间段详细分析
-
**
具体建议
4
**
:直播前做好充分准备,深呼吸放松,告诉自己
"我准备充分,一定可以"
。减少口头禅,可以用短暂停顿代替
"嗯"
、
"那个"
示例如下:
四、特别注意事项
【异常片段
#
1
】━━━━━━━━━━━━
4.1
数据准确性要求
时间:
XX
:
XX
-
XX
:
XX
(
X
分钟)
严格统计:所有数字必须基于实际输入数据精确计算,不得估算
问题:语速过快
数据:
XXX
字
/
分钟(超标准
XX
字
/
分钟)
逻辑一致:卖点覆盖率、语速数据、违禁词数量必须前后一致
对应内容:【具体内容,如:产品卖点讲解
-
三重玻尿酸成分介绍】
【异常片段
#
2
】━━━━━━━━━━━━
可验证性:统计结果应可通过输入数据反向验证
时间:
XX
:
XX
-
XX
:
XX
(
X
分钟)
问题:语速过快
/
持续偏快
4.2
格式规范要求
数据:
XXX
字
/
分钟(超标准
XX
字
/
分钟)
标题层级:严格按照示例中的标题层级(#、##、###)输出
对应内容:【具体内容,如:促销推动环节】
【异常片段
#
3
】━━━━━━━━━━━━
符号一致:使用相同的分隔符(━━━)和图标(✅、❌、⚡、⚠️)
时间:
XX
:
XX
-
XX
:
XX
(
X
分钟)
问题:语速过慢
表格对齐:表格内容居中对齐(
:
---
:
语法)
数据:
XXX
字
/
分钟(低于标准
XX
字
/
分钟)
对应内容:【具体内容,如:品牌介绍环节】
不增不减:不允许新增或删除节点,保持结构一致
【异常片段
#
4
】━━━━━━━━━━━━
时间:
XX
:
XX
-
XX
:
XX
(
X
分钟)
4.3
零违禁词特殊处理
问题:语速过慢
当违禁词数量为
0
时:
数据:
XXX
字
/
分钟(低于标准
XX
字
/
分钟)
对应内容:【具体内容,如:互动环节】
隐藏内容:不展示
"违禁词详细列表"
、
"违规情况统计"
、
"高频违禁词"
(五)语速变化趋势分析
保留内容:保留
"检测结果总览"
并显示
"零违禁"
评价
【整体趋势】描述语速在整场直播中的变化趋势,如:开场语速正常,在产品讲解环节(
4
-
6
分钟)明显加快,互动环节放慢,促销环节又再次加快,结束语恢复正常。整体呈现
"波浪形"
变化,稳定性不足。
正向激励:给予正面评价
"本次直播用词规范"
【问题诊断】示例如下:
4.4
风格要求
主要问题:【如:在需要重点讲解的环节(产品卖点)语速反而过快,影响效果】
语言风格:专业、客观、具体,避免空泛和模糊表达
次要问题:【如:语速波动过大,缺乏整体节奏控制】
数据支撑:每个观点必须有具体数据或案例支撑
#
风格与注意事项
-
语言保持专业、客观、具体,结合提供的数据或示例描述。
建议可执行:优化建议必须具体可操作,避免
"注意""努力"
等模糊建议
-
如遇缺失信息,可使用“暂无数据”或根据上下文合理推断,但避免胡乱编造。
-
若违禁词为零,自动隐藏“违禁词详细列表”“违规情况统计”“高频违禁词”等相关段落。
避免编造:如遇缺失信息,使用
"暂无数据"
,不得编造
-
JSON
输出中的四个字段必须全部返回,值为字符串类型,内容为对应
Markdown
片段。
-
不允许调整前端依赖的标题、排版符号、表格结构与占位变量名称。
`,
完整生成流程
数据统计阶段
统计字幕文本总字数(口播字数)
计算平均语速和分段语速
检测违禁词并记录位置
判断卖点讲解情况并计算覆盖率
内容生成阶段
按照输出示例生成四个板块的
Markdown
内容
保证数据的一致性和准确性
遵循格式规范
JSON
封装阶段
将四个板块内容分别赋值给对应字段
检查
JSON
格式正确性
返回完整
JSON
对象
输出质量检查清单
在生成最终结果前,请自检:
[
]
口播字数是否基于字幕文本精确统计?
[
]
卖点讲解数量与实际分析是否一致?
[
]
语速数据计算是否正确(字数÷时长)?
[
]
违禁词数量统计是否准确?
[
]
四个
JSON
字段是否全部返回?
[
]
Markdown
格式是否符合示例规范?
[
]
表格是否居中对齐?
[
]
数据前后是否一致无矛盾?
`,
},
},
]
]
const result = await generateText({ messages, response_format: { type: 'json_object' } })
const result = await generateText({ messages, response_format: { type: 'json_object' } })
const aiAnalyze = result.content
const aiAnalyze = result.content
.replaceAll('
一、
卖点讲解覆盖情况', '')
.replaceAll('卖点讲解覆盖情况', '')
.replaceAll('
二、
违禁词分析报告', '')
.replaceAll('违禁词分析报告', '')
.replaceAll('
三、
直播优化建议', '')
.replaceAll('直播优化建议', '')
.replaceAll('
四、
语速分析报告', '')
.replaceAll('语速分析报告', '')
await updateRecord({ id: props.recordId, ai_analyze: aiAnalyze })
await updateRecord({ id: props.recordId, ai_analyze: aiAnalyze })
fetchRecord()
fetchRecord()
}
}
...
@@ -418,7 +906,11 @@ function formatDuration(seconds) {
...
@@ -418,7 +906,11 @@ function formatDuration(seconds) {
</
script
>
</
script
>
<
template
>
<
template
>
<div
class=
"live-view"
v-if=
"detail"
v-loading=
"isLoading"
element-loading-text=
"AI分析中..."
>
<div
class=
"live-view"
v-if=
"detail"
v-loading=
"isLoading"
element-loading-text=
"AI分析中,大约需要1分钟,请耐心等待..."
>
<AppCard>
<AppCard>
<div
class=
"live-info"
>
<div
class=
"live-info"
>
<div
class=
"live-info-header"
>
<div
class=
"live-info-header"
>
...
@@ -492,7 +984,10 @@ function formatDuration(seconds) {
...
@@ -492,7 +984,10 @@ function formatDuration(seconds) {
</div>
</div>
</AppCard>
</AppCard>
<AppCard
title=
"卖点讲解覆盖情况"
>
<AppCard
title=
"卖点讲解覆盖情况"
>
<ul
class=
"live-ul"
>
<template
#
header-aside
>
<RecordViewText
:timelines=
"timelines"
/>
</
template
>
<ul
class=
"live-ul"
v-if=
"false"
>
<li>
已讲解:{{ successWords.length }}个卖点
</li>
<li>
已讲解:{{ successWords.length }}个卖点
</li>
<li>
未讲解:{{ failedWords.length }}个卖点
</li>
<li>
未讲解:{{ failedWords.length }}个卖点
</li>
<li>
覆盖率:{{ ((successWords.length / detail.words?.length) * 100).toFixed(2) }}%
</li>
<li>
覆盖率:{{ ((successWords.length / detail.words?.length) * 100).toFixed(2) }}%
</li>
...
@@ -500,18 +995,20 @@ function formatDuration(seconds) {
...
@@ -500,18 +995,20 @@ function formatDuration(seconds) {
<div
class=
"live-markdown"
>
<div
class=
"live-markdown"
>
<MarkdownRender
:source=
"result.sellingPoints"
v-if=
"result.sellingPoints"
/>
<MarkdownRender
:source=
"result.sellingPoints"
v-if=
"result.sellingPoints"
/>
</div>
</div>
<h2
class=
"live-title"
>
已讲解卖点:
</h2>
<
template
v-if=
"false"
>
<el-steps
direction=
"vertical"
:active=
"1"
>
<h2
class=
"live-title"
>
已讲解卖点:
</h2>
<el-step
v-for=
"(item, index) in successWords"
:key=
"index"
:title=
"item.name"
status=
"success"
>
<el-steps
direction=
"vertical"
:active=
"1"
>
<template
#
description
>
{{
item
.
time
}}
{{
item
.
subtitle
}}
</
template
>
<el-step
v-for=
"(item, index) in successWords"
:key=
"index"
:title=
"item.name"
status=
"success"
>
</el-step>
<template
#
description
>
{{
item
.
time
}}
{{
item
.
subtitle
}}
</
template
>
</el-steps>
</el-step>
<h2
class=
"live-title"
>
未讲解卖点:
</h2>
</el-steps>
<el-steps
direction=
"vertical"
:active=
"1"
>
<h2
class=
"live-title"
>
未讲解卖点:
</h2>
<el-step
v-for=
"(item, index) in failedWords"
:key=
"index"
:title=
"item.name"
status=
"error"
>
<el-steps
direction=
"vertical"
:active=
"1"
>
<
template
#
description
>
{{
item
.
time
}}
{{
item
.
subtitle
}}
</
template
>
<el-step
v-for=
"(item, index) in failedWords"
:key=
"index"
:title=
"item.name"
status=
"error"
>
</el-step>
<
template
#
description
>
{{
item
.
time
}}
{{
item
.
subtitle
}}
</
template
>
</el-steps>
</el-step>
</el-steps>
</template>
</AppCard>
</AppCard>
<AppCard
title=
"违禁词分析"
>
<AppCard
title=
"违禁词分析"
>
<div
class=
"live-markdown"
>
<div
class=
"live-markdown"
>
...
...
src/modules/live/test/components/RecordViewText.vue
0 → 100644
浏览文件 @
a546e977
<
script
setup
>
defineProps
({
timelines
:
{
type
:
Array
,
default
:
()
=>
[]
},
})
const
dialogVisible
=
ref
(
false
)
const
handleClick
=
()
=>
{
dialogVisible
.
value
=
true
}
// 毫秒转分钟 00:00,需要补0
const
formatTime
=
(
time
)
=>
{
const
minutes
=
Math
.
floor
(
time
/
1000
/
60
)
const
seconds
=
Math
.
floor
((
time
/
1000
)
%
60
)
return
`
${
minutes
.
toString
().
padStart
(
2
,
'0'
)}
:
${
seconds
.
toString
().
padStart
(
2
,
'0'
)}
`
}
</
script
>
<
template
>
<el-button
type=
"primary"
@
click=
"handleClick"
>
查看口播文字
</el-button>
<el-dialog
v-model=
"dialogVisible"
title=
"口播文字"
width=
"600px"
>
<el-timeline>
<el-timeline-item
placement=
"top"
v-for=
"(item, index) in timelines"
:key=
"index"
:timestamp=
"formatTime(item.BeginTime)"
>
{{
item
.
Text
}}
</el-timeline-item>
</el-timeline>
</el-dialog>
</
template
>
src/modules/operations/components/Steps.vue
浏览文件 @
a546e977
...
@@ -83,7 +83,7 @@ const handleDelete = (url) => {
...
@@ -83,7 +83,7 @@ const handleDelete = (url) => {
<p>
图片格式为png/jpg/jpeg,图片大小不能超过2M
</p>
<p>
图片格式为png/jpg/jpeg,图片大小不能超过2M
</p>
</div>
</div>
<div
v-if=
"item.isVideo"
class=
"upload-tips"
>
<div
v-if=
"item.isVideo"
class=
"upload-tips"
>
<p>
视频分辨率不能超过1080p,视频文件大小不能超过
2
00M
</p>
<p>
视频分辨率不能超过1080p,视频文件大小不能超过
5
00M
</p>
<p>
视频帧率25fps,视频文件格式为mp4
</p>
<p>
视频帧率25fps,视频文件格式为mp4
</p>
</div>
</div>
</
template
>
</
template
>
...
...
src/modules/score/components/CompetitionLive.vue
浏览文件 @
a546e977
...
@@ -70,7 +70,13 @@ const secondLivePracticeRecord = computed(() => {
...
@@ -70,7 +70,13 @@ const secondLivePracticeRecord = computed(() => {
const
categoryTableOptions
=
{
const
categoryTableOptions
=
{
columns
:
[
columns
:
[
{
label
:
'商品品类名称'
,
prop
:
'name'
,
align
:
'left'
},
{
label
:
'商品品类名称'
,
prop
:
'name'
,
align
:
'left'
},
{
label
:
'层级'
,
prop
:
'level'
},
{
label
:
'层级'
,
prop
:
'level'
,
computed
({
row
})
{
return
parseInt
(
row
.
level
)
+
1
},
},
{
{
label
:
'状态'
,
label
:
'状态'
,
prop
:
'status'
,
prop
:
'status'
,
...
...
src/modules/score/components/CompetitionLiveProd.vue
浏览文件 @
a546e977
...
@@ -71,7 +71,13 @@ const secondLivePracticeRecord = computed(() => {
...
@@ -71,7 +71,13 @@ const secondLivePracticeRecord = computed(() => {
const
categoryTableOptions
=
{
const
categoryTableOptions
=
{
columns
:
[
columns
:
[
{
label
:
'商品品类名称'
,
prop
:
'name'
,
align
:
'left'
},
{
label
:
'商品品类名称'
,
prop
:
'name'
,
align
:
'left'
},
{
label
:
'层级'
,
prop
:
'level'
},
{
label
:
'层级'
,
prop
:
'level'
,
computed
({
row
})
{
return
parseInt
(
row
.
level
)
+
1
},
},
{
{
label
:
'状态'
,
label
:
'状态'
,
prop
:
'status'
,
prop
:
'status'
,
...
...
src/modules/score/prompt.ts
浏览文件 @
a546e977
...
@@ -531,13 +531,6 @@ export const generatePracticeRecord2Prompt = (data: any) => {
...
@@ -531,13 +531,6 @@ export const generatePracticeRecord2Prompt = (data: any) => {
`
`
}
}
export const generateReportPrompt = (data: any) => {
return `
请根据选手提交的直播总结报告进行评分(满分
15
分)
选手提交内容:
$
{
JSON
.
stringify
(
data
.
reports
)}
`
}
export const generatePrompt = (data: any) => {
export const generatePrompt = (data: any) => {
return `
return `
$
{
generateCommodityTypePrompt
(
data
)}
$
{
generateCommodityTypePrompt
(
data
)}
...
@@ -546,7 +539,6 @@ export const generatePrompt = (data: any) => {
...
@@ -546,7 +539,6 @@ export const generatePrompt = (data: any) => {
$
{
generateSpeechPrompt
(
data
)}
$
{
generateSpeechPrompt
(
data
)}
$
{
generatePracticeRecordPrompt
(
data
)}
$
{
generatePracticeRecordPrompt
(
data
)}
$
{
generateImprovementPlanPrompt
(
data
)}
$
{
generateImprovementPlanPrompt
(
data
)}
$
{
generateReportPrompt
(
data
)}
EXAMPLE
JSON
OUTPUT
:
EXAMPLE
JSON
OUTPUT
:
{
{
"commodity_type"
:
{
"commodity_type"
:
{
...
@@ -577,10 +569,6 @@ EXAMPLE JSON OUTPUT:
...
@@ -577,10 +569,6 @@ EXAMPLE JSON OUTPUT:
"score"
:
5
,
"score"
:
5
,
"comment"
:
"这是评语"
"comment"
:
"这是评语"
},
},
"report"
:
{
"score"
:
5
,
"comment"
:
"这是评语"
},
}
}
`
`
}
}
src/modules/score/prompt2.ts
浏览文件 @
a546e977
...
@@ -108,59 +108,1184 @@ ${JSON.stringify(data.commodity_attrs)}
...
@@ -108,59 +108,1184 @@ ${JSON.stringify(data.commodity_attrs)}
export
const
generateCommoditiesPrompt
=
(
data
:
any
)
=>
{
export
const
generateCommoditiesPrompt
=
(
data
:
any
)
=>
{
return
`
return
`
请根据选手提交的商品信息维护内容进行评分(满分10分)
一、角色定位(Role)
你是一位专业的电商运营评分专家,负责对选手的商品信息维护操作进行客观、准确的评分(满分10分)。
选手提交内容:
核心原则:
严格证据链原则:所有评分必须基于输入信息中的实际内容,不得推测、臆断或补充
有据可查原则:每一项得分或扣分都必须明确指出依据来源
客观公正原则:仅评价可见的、已配置的内容,未配置的不扣分、不臆测
二、任务说明(Task)
根据选手实际的答题结果(商品详情配置页导出或截图、媒体素材清单),结合试题要求,对商品信息维护的完成情况进行评分。
输入信息
${
JSON
.
stringify
(
data
.
commodities
)}
${
JSON
.
stringify
(
data
.
commodities
)}
评分规则
试题要求:主推商品为"襄阳牛肉面2桶装(有牛肉)",完成5个板块的全面维护
三、评分目标(Goal)
准确、公正地评价选手在以下5个板块的操作完成情况,总分10分:
商品类目关联(1分)
商品主图配置(2分)
3:4比例主图配置(1分)
价格库存配置(4分)
服务履约配置(2分)
四、详细评分规则(Objective)
4.1 商品类目关联(1分)
判定标准
必须检查项:
一级品类:"襄阳牛肉面2桶装(有牛肉)"应关联到"速食面品类"
二级品类:应关联到"速食面品类"下的"复合式速煮面"
计分规则
| 情况 | 得分 | 判定依据 |
| ------------------------------ | ----- | ----------------------------------------------------- |
| 一级品类 ✅ 且 二级品类 ✅ | 1分 | 在商品详情配置页中明确显示"速食面品类 > 复合式速煮面" |
| 仅一级品类 ✅ 或 仅二级品类 ✅ | 0.5分 | 仅显示其中一项正确 |
| 两者都错误或缺失 | 0分 | 未找到类目信息,或类目错误 |
评分示例
✅ 得1分:配置页显示"类目:速食面品类 > 复合式速煮面"
⚠️ 得0.5分:配置页显示"类目:速食面品类"(缺少二级分类)
❌ 得0分:配置页显示"类目:方便食品"(一级分类错误)
4.2 商品主图配置(2分)
判定标准
必须检查项:
图片数量:至少2张
图片比例:必须为1:1比例
图片来源:从"媒体素材清单"或"商品详情配置页"中统计
计分规则
| 图片数量 | 得分 | 判定依据 |
| ------------- | ----------- | ---------------------------------------------------------- |
| ≥2张 1:1主图 | 2分 | 媒体素材清单或配置页中显示≥2张标注为"1:1"或"正方形"的图片 |
| 仅1张 1:1主图 | 1分(-1分) | 仅找到1张1:1图片 |
| 0张 1:1主图 | 0分(-2分) | 未找到任何1:1图片 |
评分示例
✅ 得2分:媒体素材清单显示"主图1.jpg (1:1)"、"主图2.jpg (1:1)"
⚠️ 得1分:媒体素材清单仅显示"主图1.jpg (1:1)"
❌ 得0分:媒体素材清单中所有图片均为"3:4"或未标注比例
特别说明
图片比例判定:仅根据素材清单中的标注或图片尺寸信息判断(如800x800、1080x1080为1:1)
不判定质量:仅统计数量和比例,不评价图片内容质量
4.3 3:4比例主图配置(1分)
判定标准
必须检查项:
图片数量:至少1张
图片比例:必须为3:4比例
图片来源:从"媒体素材清单"或"商品详情配置页"中统计
计分规则
| 图片数量 | 得分 | 判定依据 |
| ------------- | ---- | -------------------------------------------------------------------------------- |
| ≥1张 3:4主图 | 1分 | 媒体素材清单或配置页中显示≥1张标注为"3:4"或"竖版"的图片(如750x1000、900x1200) |
| 0张 3:4主图 | 0分 | 未找到任何3:4图片 |
评分示例
✅ 得1分:媒体素材清单显示"主图3.jpg (3:4)"或"750x1000"
❌ 得0分:所有图片均为其他比例
4.4 价格库存配置(4分)
判定标准
必须检查项(共4项,每项1分):
| 检查项 | 判定依据 | 扣分规则 |
| ------------------- | --------------------------------------------------------------------------------------------------------------------- | ------------------------------- |
| ① 商品规格 | 商品详情配置页中明确显示规格列表(如"口味:原味/辣味"、"颜色:红/蓝"等),或显示"SKU列表"、"规格管理"等模块 | 未配置规格或规格信息缺失,扣1分 |
| ② 价格 | 每个规格都配置了"销售价格"或"价格"字段,且数值>0 | 任一规格缺失价格或=0,扣1分 |
| ③ 参考价(划线价) | 每个规格都配置了"原价"或"市场价"或"参考价"字段,且数值>0 | 任一规格缺失参考价或=0,扣1分 |
| ④ 库存数量 | 每个规格都配置了"库存"或"可售数量"字段,且数值>0 | 任一规格缺失库存或=0,扣1分 |
⚠️ 特别说明:
发货模式已从本项移除,归入"服务履约配置"板块统一管理
规格是必检项:不同规格对应不同的价格、参考价、库存,必须检查规格配置情况
计分规则
起评分:4分
累计扣分:每缺少一项扣1分
最低得分:0分(扣完为止)
规格判定标准详解(防止臆测)
✅ 判定为"已配置规格"的证据(必须满足以下任一条件):
明确的规格列表:配置页中显示规格名称和选项
示例:规格:口味(原味、辣味)
示例:SKU规格:颜色(红、蓝、黑)/ 尺码(S、M、L)
SKU管理表格:配置页中有SKU列表,每行代表一个规格组合
SKU列表:
- 原味/2桶装:价格29.9元,库存500件
- 辣味/2桶装:价格32.9元,库存300件
规格管理模块:配置页中有"规格管理"、"SKU管理"、"多规格设置"等明确标识
❌ 不能判定为"已配置规格"的情况(严禁臆测):
❌ 仅看到商品名称包含"2桶装",但配置页中无规格模块 → 未配置规格
❌ 仅看到一个价格,未显示规格列表 → 未配置规格
❌ 配置页中无"规格"相关字段或模块 → 未配置规格
❌ 主观推测"商品应该有规格" → 严禁臆测,必须以实际显示为准
评分示例
情况A:单规格商品(已配置规格)
✅ 得4分(满分):
商品配置页显示:
━━━━━━━━━━━━━━━
【规格管理】
规格:口味
选项:原味
【SKU列表】
- 原味:
· 销售价格:29.9元 ✓
· 参考价:49.9元 ✓
· 库存:500件 ✓
━━━━━━━━━━━━━━━
评分:
① 规格:已配置(1个规格"原味")✓
② 价格:已配置(29.9元)✓
③ 参考价:已配置(49.9元)✓
④ 库存:已配置(500件)✓
得分:4/4分
情况B:多规格商品(已配置规格)
✅ 得4分(满分):
商品配置页显示:
━━━━━━━━━━━━━━━
【规格管理】
规格:口味
选项:原味、辣味
【SKU列表】
- 原味:价格29.9元,参考价49.9元,库存500件 ✓
- 辣味:价格32.9元,参考价52.9元,库存300件 ✓
━━━━━━━━━━━━━━━
评分:
① 规格:已配置(2个规格"原味、辣味")✓
② 价格:已配置(所有规格都有价格)✓
③ 参考价:已配置(所有规格都有参考价)✓
④ 库存:已配置(所有规格都有库存)✓
得分:4/4分
情况C:未配置规格(错误案例)
❌ 得0分(-4分):
商品配置页显示:
━━━━━━━━━━━━━━━
【商品信息】
商品名称:襄阳牛肉面2桶装(有牛肉)
商品图片:已上传
⚠️ 未找到"规格管理"、"SKU列表"等模块
⚠️ 未显示任何规格信息
━━━━━━━━━━━━━━━
评分:
① 规格:未配置 ✗(扣1分)
② 价格:因未配置规格,无法填写价格 ✗(扣1分)
③ 参考价:因未配置规格,无法填写参考价 ✗(扣1分)
④ 库存:因未配置规格,无法填写库存 ✗(扣1分)
得分:0/4分
扣分原因:商品配置页中未找到规格管理模块,未配置任何规格信息,导致价格、参考价、库存无法配置。
情况D:配置了规格,但部分规格缺失价格
⚠️ 得3分(-1分):
商品配置页显示:
━━━━━━━━━━━━━━━
【规格管理】
规格:口味
选项:原味、辣味
【SKU列表】
- 原味:价格29.9元,参考价49.9元,库存500件 ✓
- 辣味:价格未填写,参考价52.9元,库存300件 ✗
━━━━━━━━━━━━━━━
评分:
① 规格:已配置 ✓
② 价格:部分缺失("辣味"规格未填写价格)✗(扣1分)
③ 参考价:已配置 ✓
④ 库存:已配置 ✓
得分:3/4分
扣分原因:"辣味"规格未配置销售价格。
严格评分要求(防止AI臆测)
评分时必须回答以下问题(证据链检查):
规格证据问题:
❓ 在配置页的哪个位置看到了规格信息?
❓ 规格名称是什么?(如"口味"、"颜色"、"尺码"等)
❓ 有几个规格选项?分别是什么?
价格证据问题:
❓ 每个规格的价格分别是多少?
❓ 是否所有规格都配置了价格?
参考价证据问题:
❓ 每个规格的参考价分别是多少?
❓ 是否所有规格都配置了参考价?
库存证据问题:
❓ 每个规格的库存分别是多少?
❓ 是否所有规格都配置了库存?
⚠️ 如果以上任何一个问题无法从配置页中找到明确答案,则该项判定为"未配置",不得臆测!
4.5 服务履约配置(2分)
判定标准
必须检查项(3项):
| 检查项 | 判定依据 | 分值 |
| ----------- | ------------------------------------------------ | ----- |
| ① 发货模式 | 商品详情配置页中明确显示"现货发货"或"48小时发货" | 0.5分 |
| ② 运费模板 | 从指定选项中至少配置1项 | 1分 |
| ③ 售后政策 | 从指定选项中至少配置1项 | 0.5分 |
② 运费模板选项(至少配置1项):
阶梯计价运费
固定运费
卖家包邮
指定条件包邮
限制买家下单区域
按件数计价
按重量计价
指定地区运费
③ 售后政策选项(至少配置1项):
7天无理由退换货
全额退款
仅退款政策
预付邮费标签
全球购物保障计划
无忧退换货
闪电退货
售后补寄
计分规则
起评分:2分
累计扣分:每缺少一项按对应分值扣分
最低得分:0分(扣完为止)
评分示例
✅ 得2分(满分):
商品配置页显示:
- 发货模式:现货发货 ✓(0.5分)
- 运费模板:卖家包邮 ✓(1分)
- 售后政策:7天无理由退换货 ✓(0.5分)
得分:2/2分
⚠️ 得1.5分(-0.5分):
商品配置页显示:
- 发货模式:现货发货 ✓(0.5分)
- 运费模板:固定运费 ✓(1分)
- 售后政策:未设置 ✗(扣0.5分)
得分:1.5/2分
扣分原因:未配置售后政策。
⚠️ 得0.5分(-1.5分):
商品配置页显示:
- 发货模式:预售发货 ✗(扣0.5分,应为"现货发货")
- 运费模板:未设置 ✗(扣1分)
- 售后政策:7天无理由退换货 ✓(0.5分)
得分:0.5/2分
扣分原因:发货模式错误,应设置为"现货发货";未配置运费模板。
❌ 得0分(-2分):
商品配置页显示:
- 发货模式:未设置 ✗(扣0.5分)
- 运费模板:未设置 ✗(扣1分)
- 售后政策:未设置 ✗(扣0.5分)
得分:0/2分
扣分原因:发货模式、运费模板、售后政策均未配置。
五、评分输出模板
5.1 评分记录(结构化格式)
【商品信息维护评分报告】
━━━━━━━━━━━━━━━━━━━━━━━━
【1. 商品类目关联】
━━━━━━━━━━━━━━━━━━━━━━━━
得分:___/1分
判定依据:
- 一级品类:【已配置/未配置/配置错误】:__________
- 二级品类:【已配置/未配置/配置错误】:__________
扣分原因:__________(如无扣分,填"无")
━━━━━━━━━━━━━━━━━━━━━━━━
【2. 商品主图配置】
━━━━━━━━━━━━━━━━━━━━━━━━
得分:___/2分
判定依据:
- 1:1主图数量:____张
- 图片来源:【媒体素材清单/商品配置页】
- 图片信息:__________
扣分原因:__________(如无扣分,填"无")
━━━━━━━━━━━━━━━━━━━━━━━━
【3. 3:4比例主图】
━━━━━━━━━━━━━━━━━━━━━━━━
得分:___/1分
判定依据:
- 3:4主图数量:____张
- 图片来源:【媒体素材清单/商品配置页】
- 图片信息:__________
扣分原因:__________(如无扣分,填"无")
━━━━━━━━━━━━━━━━━━━━━━━━
【4. 价格库存配置】
━━━━━━━━━━━━━━━━━━━━━━━━
得分:___/4分
判定依据(必须回答证据链问题):
**① 商品规格(1分)**
- 是否配置规格:【已配置/未配置】
- 规格信息位置:在配置页的________位置找到
- 规格名称:________(如"口味"、"颜色"等)
- 规格选项:________(如"原味、辣味")
- 规格数量:共____个规格
**② 价格配置(1分)**
- 是否配置价格:【已配置/部分配置/未配置】
- 价格信息:
* 规格1(______):价格______元
* 规格2(______):价格______元
* (如有更多规格,请列出)
**③ 参考价配置(1分)**
- 是否配置参考价:【已配置/部分配置/未配置】
- 参考价信息:
* 规格1(______):参考价______元
* 规格2(______):参考价______元
* (如有更多规格,请列出)
**④ 库存配置(1分)**
- 是否配置库存:【已配置/部分配置/未配置】
- 库存信息:
* 规格1(______):库存______件
* 规格2(______):库存______件
* (如有更多规格,请列出)
扣分原因:__________(如无扣分,填"无")
⚠️ 评分检查:如果无法从配置页中明确回答上述问题,则该项判定为"未配置",不得臆测!
━━━━━━━━━━━━━━━━━━━━━━━━
【5. 服务履约配置】
━━━━━━━━━━━━━━━━━━━━━━━━
得分:___/2分
1. 商品类目关联(1分)
判定标准:
●一级品类判定:
○"襄阳牛肉面2桶装(有牛肉)"应关联到"速食面品类"一级品类
●二级品类判定:
○应关联到"速食面品类"下的“复合式速煮面”二级品类
计分规则:
判定依据:
●同时正确关联一级品类和二级品类:1分
●只关联一级品类或只关联二级品类:0.5分
●错误或缺失:0分
2. 商品主图(2分)
- ① 发货模式(0.5分):【现货发货/其他/未配置】:__________
判定标准:
●每个商品至少2张1:1比例主图
●仅以张数为准,不要求质量
计分规则:
- ② 运费模板(1分):【已配置/未配置】:__________
●满足2张及以上1:1主图:2分
●只有1张:-1分(得1分)
●不足1张:-2分(得0分)
3. 3:4比例主图(1分)
- ③ 售后政策(0.5分):【已配置/未配置】:__________
判定标准:
●每个商品至少1张3:4比例主图
●仅以张数为准,不要求质量
计分规则:
●满足要求:1分
●否则:0分
扣分原因:__________(如无扣分,填"无")
4. 价格库存配置(4分)
判定标准与计分:
商品的规格、价格、库存、发货设置等信息配置完整准确。
━━━━━━━━━━━━━━━━━━━━━━━━
●包含:价格、参考价、库存数量;每缺一要素-1分
●发货模式:必须为"现货发货";不符合-1分
【总分统计】
●扣分累计,但本项最低0分
━━━━━━━━━━━━━━━━━━━━━━━━
5. 服务履约配置(2分)
判定标准与计分:
●运费模板:从以下选项中任选一项即可得分:阶梯计价运费、固定运费、卖家包邮、指定条件包邮、限制买家下单区域、按件数计价、按重量计价、指定地区运费;缺失-1分。
●售后政策:从以下选项中任选一项即可得分:7天无理由退换货、全额退款、仅退款政策、预付邮费标签、全球购物保障计划、无忧退换货、闪电退货、售后补寄;缺失-1分。
本模块总分:___/10分
●扣分累计,但本项最低0分
各板块得分明细:
- 商品类目关联:___/1分
- 商品主图配置:___/2分
- 3:4比例主图:___/1分
- 价格库存配置:___/4分
- 服务履约配置:___/2分
5.2 综合评价(质性分析)
━━━━━━━━━━━━━━━━━━━━━━━━
【整体评价】
【整体评价】
(请对选手整体表现进行1-2句总结性评价)`
━━━━━━━━━━━━━━━━━━━━━━━━
________________________________________
(100-150字,客观描述选手的整体表现)
━━━━━━━━━━━━━━━━━━━━━━━━
【亮点】
━━━━━━━━━━━━━━━━━━━━━━━━
1. __________________
2. __________________
━━━━━━━━━━━━━━━━━━━━━━━━
【不足】
━━━━━━━━━━━━━━━━━━━━━━━━
1. __________________
2. __________________
━━━━━━━━━━━━━━━━━━━━━━━━
【改进建议】
━━━━━━━━━━━━━━━━━━━━━━━━
1. __________________
2. __________________
六、评分核心要求(Critical Rules)
⚠️ 严格遵守以下规则
规则1:证据链原则
✅ 正确做法:
判定依据:配置页中明确显示"销售价格:29.9元"
得分:1分(价格已配置)
❌ 错误做法:
判定依据:商品应该配置了价格
得分:1分(臆测)
规则2:有据可查原则
✅ 正确做法:
扣分原因:配置页中未找到"参考价"字段,扣1分
❌ 错误做法:
扣分原因:参考价可能没配置,扣1分
规则3:不臆测原则
✅ 正确做法:
判定依据:配置页中未显示规格信息
⚠️ 本项不检查规格,不影响得分
❌ 错误做法:
判定依据:商品应该有规格但未看到,扣分
(严禁!规格不在评分范围内)
规则4:信息缺失处理原则
当输入信息不完整时:
| 情况 | 处理方式 |
| ------------------------------------ | ---------------------------------- |
| 配置页截图模糊,无法判断某项是否配置 | 标注"因截图模糊无法判断,暂不扣分" |
| 素材清单缺失,无法统计图片数量 | 标注"因素材清单缺失,无法评分" |
| 配置页中明确显示"未配置"或字段为空 | 按规则扣分 |
七、评分流程(Workflow)
步骤1:信息审查
检查输入信息是否完整(商品配置页 + 媒体素材清单)
确认商品名称是否为"襄阳牛肉面2桶装(有牛肉)"
如有缺失,在评分报告中标注
步骤2:逐项评分
按照5个板块的顺序,逐项检查并记录:
在输入信息中寻找对应的证据
记录判定依据(具体字段名称和值)
根据计分规则给出得分
如有扣分,明确写出扣分原因
步骤3:交叉验证
检查各板块得分相加是否等于总分
确认所有"判定依据"都有具体来源
确认未出现臆测或推断性表述
步骤4:输出报告
按照"5.1 评分记录"模板填写结构化数据
按照"5.2 综合评价"模板填写质性分析
最终输出完整的评分报告
八、常见错误示例与纠正
错误示例1:臆测规格存在(最常见错误)
❌ 错误评分:
【4. 价格库存配置】得分:4/4分
判定依据:
- ① 规格:已配置(应该有规格)✓
- ② 价格:已配置 ✓
- ③ 参考价:已配置 ✓
- ④ 库存:已配置 ✓
扣分原因:无
错误原因:未在配置页中找到明确的规格信息,主观臆测"应该有规格"
✅ 正确评分:
【4. 价格库存配置】得分:0/4分
判定依据(证据链检查):
① 商品规格(1分)
- 是否配置规格:未配置 ✗
- 规格信息位置:配置页中未找到"规格管理"、"SKU列表"等模块
- 规格名称:无
- 规格选项:无
- 规格数量:0个
② 价格配置(1分)
- 是否配置价格:未配置 ✗
- 原因:因未配置规格,无法填写价格
③ 参考价配置(1分)
- 是否配置参考价:未配置 ✗
- 原因:因未配置规格,无法填写参考价
④ 库存配置(1分)
- 是否配置库存:未配置 ✗
- 原因:因未配置规格,无法填写库存
扣分原因:商品配置页中未找到规格管理模块,未配置任何规格信息,导致价格、参考价、库存无法配置。
纠正说明:必须在配置页中看到明确的规格列表或SKU管理模块,才能判定为"已配置规格"
错误示例2:将商品名称中的描述当作规格
❌ 错误评分:
【4. 价格库存配置】得分:4/4分
判定依据:
- ① 规格:已配置(商品名称中有"2桶装")✓
错误原因:将商品名称"襄阳牛肉面2桶装(有牛肉)"中的"2桶装"误认为是规格
✅ 正确评分:
【4. 价格库存配置】得分:0/4分
判定依据:
① 商品规格
- 是否配置规格:未配置 ✗
- ⚠️ 说明:商品名称中的"2桶装"是商品描述,不是配置的规格
- ⚠️ 判定标准:必须在配置页中看到"规格管理"模块或"SKU列表"
纠正说明:商品名称中的描述(如"2桶装")不等于规格配置,必须在配置页中有明确的规格管理模块
错误示例3:缺乏判定依据
❌ 错误评分:
【1. 商品类目关联】得分:1/1分
判定依据:类目配置正确
错误原因:未说明在哪里看到类目信息,无法验证
✅ 正确评分:
【1. 商品类目关联】得分:1/1分
判定依据:
- 一级品类:已配置:配置页显示"速食面品类"
- 二级品类:已配置:配置页显示"复合式速煮面"
扣分原因:无
错误示例4:未看到SKU列表却判定价格已配置
❌ 错误评分:
【4. 价格库存配置】得分:4/4分
判定依据:
- ② 价格:已配置 ✓(应该有价格)
错误原因:未说明价格的具体数值和来源,无法验证
✅ 正确评分方式A(已配置规格的情况):
【4. 价格库存配置】得分:4/4分
判定依据:
② 价格配置
- 是否配置价格:已配置 ✓
- 价格信息:
* 原味规格:价格29.9元(见配置页SKU列表第1行)
* 辣味规格:价格32.9元(见配置页SKU列表第2行)
✅ 正确评分方式B(未配置规格的情况):
【4. 价格库存配置】得分:0/4分
判定依据:
② 价格配置
- 是否配置价格:未配置 ✗
- 原因:配置页中未找到SKU列表或价格字段
错误示例5:信息缺失时的错误处理
❌ 错误评分:
【2. 商品主图配置】得分:0/2分
扣分原因:未提供素材清单,判断为未配置
错误原因:信息缺失不应扣分,应标注"无法评分"
✅ 正确评分:
【2. 商品主图配置】得分:无法评分
扣分原因:因未提供媒体素材清单,无法统计主图数量,建议补充素材信息后重新评分
九、质量检查清单
在提交评分报告前,请自检:
证据链检查
[ ] 每一项得分都有明确的"判定依据",且能在输入信息中找到对应内容
[ ] "判定依据"中引用了具体的字段名称、位置和数值
[ ] 所有扣分原因都具体、明确,无"可能""应该""大概"等模糊表述
[ ] 未出现臆测、推断、补充信息的情况
规格判定检查(重点)
[ ] 必须回答:在配置页的哪个位置看到了规格信息?
[ ] 必须回答:规格名称是什么?有几个规格选项?
[ ] 必须回答:每个规格的价格、参考价、库存分别是多少?
[ ] 严禁臆测:如果配置页中未显示规格管理模块或SKU列表,则判定为"未配置规格"
[ ] 严禁臆测:不能根据商品名称(如"2桶装")推测规格已配置
数据一致性检查
[ ] 各板块得分相加等于总分(商品类目1分+主图2分+3:4主图1分+价格库存4分+服务履约2分=10分)
[ ] 如果"规格"判定为"未配置",则"价格、参考价、库存"也应判定为"未配置"
[ ] 如果"规格"判定为"已配置",必须列出每个规格的详细信息
信息缺失处理检查
[ ] 如有信息缺失(如素材清单缺失),已明确标注"无法评分"而非扣分
[ ] 如有截图模糊无法判断,已标注"因截图模糊无法判断,暂不扣分"
反臆测检查(最重要)
以下情况严禁判定为"已配置",请再次确认:
[ ] ❌ 仅看到商品名称包含"2桶装",但配置页中无规格模块 → 未配置规格
[ ] ❌ 仅看到一个价格,未显示规格列表 → 未配置规格
[ ] ❌ 配置页中无"规格管理"、"SKU列表"、"SKU管理"等字段或模块 → 未配置规格
[ ] ❌ 主观推测"商品应该有规格" → 严禁臆测,必须以实际显示为准
十、规格判定快速诊断工具
使用方法:在评分"价格库存配置"板块前,先用此工具诊断规格配置情况
诊断流程图
开始评分"价格库存配置"
↓
【问题1】配置页中是否有"规格管理"、"SKU管理"、"规格设置"等模块?
├─ 是 → 继续【问题2】
└─ 否 → ❌ 判定为"未配置规格",得0分
【问题2】是否能明确看到规格名称(如"口味"、"颜色"、"尺码")?
├─ 是 → 继续【问题3】
└─ 否 → ❌ 判定为"未配置规格",得0分
【问题3】是否能明确看到规格选项(如"原味、辣味")?
├─ 是 → 继续【问题4】
└─ 否 → ❌ 判定为"未配置规格",得0分
【问题4】是否有SKU列表,且每个规格都有价格、参考价、库存?
├─ 全部有 → ✅ 判定为"已配置规格",得4分
├─ 部分有 → ⚠️ 判定为"部分配置",按缺失项扣分
└─ 全部无 → ❌ 判定为"未配置规格",得0分
快速判定表
| 配置页显示内容 | 判定结果 | 得分 |
| ----------------------------------------------- | ---------- | -------------- |
| ✅ 有"规格管理"模块 + 规格列表 + SKU价格/库存表 | 已配置规格 | 4分(满分) |
| ⚠️ 有"规格管理"模块,但部分规格缺失价格/库存 | 部分配置 | 按缺失项扣分 |
| ❌ 无"规格管理"模块,仅有商品名称 | 未配置规格 | 0分 |
| ❌ 仅看到一个价格,无规格列表 | 未配置规格 | 0分 |
| ❌ 商品名称包含"2桶装",但无规格模块 | 未配置规格 | 0分 |
| ❓ 信息缺失,无法判断 | 无法评分 | 标注"无法评分" |
典型错误案例对照
| 错误判定 ✗ | 正确判定 ✓ | 原因 |
| -------------------------------- | -------------------------------- | ------------------------------ |
| "商品名称有'2桶装',规格已配置" | "未配置规格"(商品名称不是规格) | 商品名称中的描述不等于规格配置 |
| "应该有规格,判定为已配置" | "未配置规格"(未看到规格模块) | 主观臆测,缺乏证据 |
| "看到一个价格29.9元,规格已配置" | "未配置规格"(未看到规格列表) | 单独的价格不代表配置了规格 |
| "商品肯定有颜色,规格已配置" | "未配置规格"(未看到规格列表) | 主观推测,缺乏证据 |
`
}
}
export
const
generateSpeechPrompt
=
(
data
:
any
)
=>
{
export
const
generateSpeechPrompt
=
(
data
:
any
)
=>
{
...
@@ -566,13 +1691,6 @@ export const generatePracticeRecord2Prompt = (data: any) => {
...
@@ -566,13 +1691,6 @@ export const generatePracticeRecord2Prompt = (data: any) => {
`
`
}
}
export const generateReportPrompt = (data: any) => {
return `
请根据选手提交的直播总结报告进行评分(满分
10
分)
选手提交内容:
$
{
JSON
.
stringify
(
data
.
reports
)}
`
}
export const generatePrompt = (data: any) => {
export const generatePrompt = (data: any) => {
return `
return `
$
{
generateCommodityTypePrompt
(
data
)}
$
{
generateCommodityTypePrompt
(
data
)}
...
@@ -581,7 +1699,6 @@ export const generatePrompt = (data: any) => {
...
@@ -581,7 +1699,6 @@ export const generatePrompt = (data: any) => {
$
{
generateSpeechPrompt
(
data
)}
$
{
generateSpeechPrompt
(
data
)}
$
{
generatePracticeRecordPrompt
(
data
)}
$
{
generatePracticeRecordPrompt
(
data
)}
$
{
generateImprovementPlanPrompt
(
data
)}
$
{
generateImprovementPlanPrompt
(
data
)}
$
{
generateReportPrompt
(
data
)}
EXAMPLE
JSON
OUTPUT
:
EXAMPLE
JSON
OUTPUT
:
{
{
"commodity_type"
:
{
"commodity_type"
:
{
...
@@ -612,10 +1729,6 @@ EXAMPLE JSON OUTPUT:
...
@@ -612,10 +1729,6 @@ EXAMPLE JSON OUTPUT:
"score"
:
5
,
"score"
:
5
,
"comment"
:
"这是评语"
"comment"
:
"这是评语"
},
},
"report"
:
{
"score"
:
5
,
"comment"
:
"这是评语"
},
}
}
`
`
}
}
src/modules/score/views/Index.vue
浏览文件 @
a546e977
...
@@ -39,8 +39,8 @@ const listOptions = computed(() => {
...
@@ -39,8 +39,8 @@ const listOptions = computed(() => {
{
label
:
'序号'
,
type
:
'index'
,
width
:
60
},
{
label
:
'序号'
,
type
:
'index'
,
width
:
60
},
{
label
:
'ID'
,
prop
:
'id'
},
{
label
:
'ID'
,
prop
:
'id'
},
{
label
:
'姓名'
,
prop
:
'student_name'
},
{
label
:
'姓名'
,
prop
:
'student_name'
},
{
label
:
'专业'
,
prop
:
'specialty_name'
},
//
{ label: '专业', prop: 'specialty_name' },
{
label
:
'班级'
,
prop
:
'class_name'
},
//
{ label: '班级', prop: 'class_name' },
{
label
:
'成绩'
,
prop
:
'score_display'
},
{
label
:
'成绩'
,
prop
:
'score_display'
},
{
label
:
'状态'
,
prop
:
'check_status_name'
},
{
label
:
'状态'
,
prop
:
'check_status_name'
},
{
label
:
'评分人'
,
prop
:
'checker_name'
},
{
label
:
'评分人'
,
prop
:
'checker_name'
},
...
@@ -55,7 +55,7 @@ const handleExport = () => {
...
@@ -55,7 +55,7 @@ const handleExport = () => {
window
.
open
(
`/api/lab/v1/experiment/live-student-record/export?experiment_id=
${
route
.
query
.
experiment_id
}
`
)
window
.
open
(
`/api/lab/v1/experiment/live-student-record/export?experiment_id=
${
route
.
query
.
experiment_id
}
`
)
}
}
const
{
isLoading
,
generateText
}
=
useChat
({
provider
:
'
siliconflow
'
})
const
{
isLoading
,
generateText
}
=
useChat
({
provider
:
'
volcano
'
})
const
handleAIScore
=
async
()
=>
{
const
handleAIScore
=
async
()
=>
{
console
.
log
(
'AI一键评分'
)
console
.
log
(
'AI一键评分'
)
...
...
src/modules/score/views/View.vue
浏览文件 @
a546e977
...
@@ -11,7 +11,7 @@ const CompetitionOperations = defineAsyncComponent(() => import('../components/C
...
@@ -11,7 +11,7 @@ const CompetitionOperations = defineAsyncComponent(() => import('../components/C
const
route
=
useRoute
()
const
route
=
useRoute
()
const
id
=
route
.
query
.
id
const
id
=
route
.
query
.
id
const
{
isLoading
,
generateText
}
=
useChat
({
provider
:
'
siliconflow
'
})
const
{
isLoading
,
generateText
}
=
useChat
({
provider
:
'
volcano
'
})
const
detail
=
ref
(
null
)
const
detail
=
ref
(
null
)
...
@@ -41,7 +41,7 @@ const handleAIScore = async () => {
...
@@ -41,7 +41,7 @@ const handleAIScore = async () => {
try
{
try
{
const
parsed
=
JSON
.
parse
(
result
.
content
)
const
parsed
=
JSON
.
parse
(
result
.
content
)
Object
.
assign
(
scoreDetails
,
parsed
)
Object
.
assign
(
scoreDetails
,
parsed
)
commitScore
(
1
).
then
(()
=>
{
commitScore
().
then
(()
=>
{
ElMessage
.
success
(
'保存成功'
)
ElMessage
.
success
(
'保存成功'
)
})
})
}
catch
(
error
)
{
}
catch
(
error
)
{
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论