feat: 标题生成提示词区分视频画面与封面场景

后端:
- GenerateTitleRequest 新增 usage 字段(video/cover)
- 根据 usage 渲染不同的场景描述、风格要求、创作注意
- title_system.txt / title.txt 增加  等变量

前端:
- scriptApi.generateTitle 新增 usage 参数
- SubtitleBurning 传 usage: 'video'(视频画面标题)
- CoverDesign 传 usage: 'cover'(封面标题)
This commit is contained in:
小鱼开发
2026-04-30 15:55:25 +08:00
parent 580b39747f
commit bdd582bd76
7 changed files with 27 additions and 5 deletions
+3 -3
View File
@@ -1,14 +1,14 @@
请根据以下脚本内容,创作一个${title_type_desc}。
使用场景:${usage_desc}
脚本内容:
${script_content}
标题类型:${title_type_desc}
字数限制:严格控制在 ${max_length} 个字以内(含标点)
风格要求:短视频平台风格,口语化,避免生僻字
风格要求:${style_requirement}
注意:
- 如果创作的是主标题,请聚焦核心卖点,用最抓眼球的方式表达
- 如果创作的是副标题,请补充说明或制造悬念,让观众想看下去
${usage_note}
直接返回标题文字,不要加引号、书名号或任何额外说明。
@@ -1,8 +1,11 @@
你是一位专业的短视频标题创作专家,擅长为口播类短视频创作吸引眼球的标题。
【当前任务场景】
${usage_desc}
【主标题(大标题)与副标题(小标题)的区别】
- 主标题:视频最核心的卖点/钩子,必须极度吸睛,让观众一眼就想点进去。要求简短有力,善用数字、疑问、痛点、冲突等手法。
- 副标题:对主标题的补充说明或延伸,承担"解释原因""制造悬念""补充细节"的作用,让观众知道点进去能看到什么具体内容
- 主标题:视频最核心的卖点/钩子,必须极度吸睛。要求简短有力,善用数字、疑问、痛点、冲突等手法。
- 副标题:对主标题的补充说明或延伸,承担"解释原因""制造悬念""补充细节"的作用。
创作原则:
1. 标题要紧扣脚本核心内容,提炼最有吸引力的点
+14
View File
@@ -228,6 +228,16 @@ async def generate_title(request: GenerateTitleRequest):
data=None,
)
# 根据使用场景确定描述
if request.usage == "cover":
usage_desc = "视频封面标题——用于封面图设计,是决定用户是否点击的第一要素"
style_requirement = "极具冲击力、抓眼球,适合静态封面大图展示,善用爆款句式"
usage_note = "- 封面主标题必须极度吸睛,让用户一眼就想点进去,善用数字、疑问、痛点、冲突\n- 封面副标题要补充悬念或细节,激发点击欲望"
else:
usage_desc = "视频画面标题——直接叠加在视频画面上,与动态视频内容共存"
style_requirement = "口语化、精炼有力,适合视频内展示,避免遮挡画面主体"
usage_note = "- 视频画面上的标题需要精炼,聚焦核心关键词\n- 副标题与主标题形成呼应,补充说明但不喧宾夺主"
# 渲染用户提示词
title_type_desc = "大标题(主标题,提炼核心卖点,吸睛)" if request.title_type == "main" else "小标题(副标题,补充说明或制造悬念)"
user_prompt = render_template(
@@ -236,6 +246,10 @@ async def generate_title(request: GenerateTitleRequest):
title_type_desc=title_type_desc,
script_content=request.script_content,
max_length=request.max_length,
usage=request.usage,
usage_desc=usage_desc,
style_requirement=style_requirement,
usage_note=usage_note,
)
try:
+1
View File
@@ -117,6 +117,7 @@ class GenerateTitleRequest(BaseModel):
script_content: str = Field(..., description="脚本内容(utterances 文本拼接)", min_length=1)
title_type: str = Field(..., description="标题类型:main(大标题) / sub(小标题)")
max_length: int = Field(default=8, ge=1, le=100, description="最大字数限制")
usage: str = Field(default="video", description="使用场景:video(视频画面标题) / cover(封面标题)")
class GenerateTitleResponse(BaseModel):
+2
View File
@@ -72,6 +72,7 @@ export interface GenerateTitleParams {
scriptContent: string;
titleType: 'main' | 'sub';
maxLength?: number;
usage?: 'video' | 'cover';
}
/**
@@ -202,6 +203,7 @@ export const scriptApi = {
script_content: params.scriptContent,
title_type: params.titleType,
max_length: params.maxLength,
usage: params.usage ?? 'video',
});
},
@@ -98,6 +98,7 @@ export default function CoverDesign() {
scriptContent,
titleType,
maxLength,
usage: 'cover',
});
setConfig((prev) => ({
...prev,
@@ -135,6 +135,7 @@ export default function SubtitleBurning() {
scriptContent,
titleType,
maxLength,
usage: 'video',
});
if (titleType === 'main') {
setMainTitle(res.title);