上海创智学院2025PE考试
注意:提示词都是用中文编写,若将中文直接翻译成英文,效果可能下降。
任务理解
给定数据结构如下所示的数据:
val.jsonl中,每⼀条数据的字段说明:
{
"user_id": 5737, // ⽤⼾编号
"item_list": [ // ⽤⼾历史观看电影列表,按时间顺序排列,越靠后表⽰越近期观看
[1836, "Last Days of Disco, The"], // [电影ID, 电影名称]
[3565, "Where the Heart Is"],
// ... 更多历史观看记录,⻓度不定
],
"target_item": [1893, "Beyond Silence"], // ⽤⼾实际观看的下⼀部电影 [电影ID, 电影名称]
"candidates": [ // 推荐系统召回阶段得到的候选电影列表
[2492, "20 Dates"],
[684, "Windows"],
[1893, "Beyond Silence"], // 包含⽤⼾实际观看的下⼀部电影
// ... 更多候选电影,⻓度不定,⼀般为20个左右
]
}
我们需要将candidates列表按照匹配度进行重排序,列表第一个元素是最有可能(最喜欢)观看的电影,列表最后一个是最不可能(最不喜欢)的电影。
根据题目所述,“考生需要分析用户的历史观影⾏为,从中挖掘用户偏好特征,并将这些信息合理地融⼊提示词中,使大语言模型能够对候选电影进行准确排序。”,我们将任务拆结成:
- 分析用户观影行为
- 挖掘用户偏好特征
- 将用户观影行为和用户偏好特征融入到提示词中,使得大语言模型更准确
NDCG指标
采用$NDCG@KNormalized Discounted Cumulative Gain$评价。NDCG值范围为[0,1],越接近1表示排序质量越高。
具体来说,给定一个预测的排序列表 $p = [p_1, p_2, …, p_k]$ 和用户实际观看的下一部电影 $g$,我们计算NDCG如下:
- 相关性评分:对预测列表中的每个电影 $p_i$,如果 $p_i = g$,则相关性 $rel_i = 1$;否则 $rel_i = 0$
- 折损累积收益$DCG$:$DCG@k = \sum_{i=1}^{k} \frac{rel_i}{\log_2$i+1$}$
- 理想折损累积收益$IDCG$:在本任务中,由于只有一个相关项,理想情况是将其放在第一位。因此: $$ IDCG@k = \frac{1}{\log_2$1+1$} = 1$ $$
- 归一化折损累积收益$NDCG$:$NDCG@k = \frac{DCG@k}{IDCG@k} = DCG@k$
最佳提示词OneShot-RecPrompt
system_message = {
"role": "system",
"content": (
"你是一位电影推荐专家模型,任务是根据用户最近的观影行为预测其下一部最可能观看的电影,"
"并对给定的候选电影列表进行精准排序,输出推荐强度从高到低的电影ID数组,以最大化排序评估指标NDCG@10。\n\n"
"【排序目标】\n"
"- 推荐重点在于预测真实用户行为,而非泛兴趣匹配;\n"
"- 候选列表中**包含真实目标电影**,应最大程度地将其排序前置,确保NDCG@10达到或超过0.8。\n\n"
"【推荐逻辑流程】\n"
"1. 提取用户最近3部观影记录中的偏好特征(类型、题材、情绪氛围、导演风格),形成兴趣画像;\n"
"2. 对每部候选电影构建对应的四维内容标签,需基于真实内容描述,不可仅依标题推测;\n"
"3. 计算候选电影与用户兴趣的匹配程度,生成推荐强度;\n"
"4. 综合排序逻辑如下:\n"
" - 【强匹配】:类型+题材完全一致,风格/情绪贴合 → 排前2位;\n"
" - 【中匹配】:类型或题材匹配,且有风格或情绪相似点 → 排第3-5位;\n"
" - 【容错匹配】:风格或情绪较接近,但题材创新或偏离主流兴趣 → 排第6-8位;\n"
" - 【弱匹配】:标签脱节,风格差异大,与近期行为不符 → 排末位;\n"
" - 若候选项虽匹配度不强但有潜在行为目标特征(如冷门探索、片单延续等),允许其容错前移排序。\n\n"
"【强化要求】\n"
"- 对真实目标电影(若能识别)应排序在前3位;\n"
"- 对内容标签缺失或类型模糊的电影,需根据剧情、氛围、设定合理推理填补;\n"
"- 不得基于标题或流行度主观推测,应以结构化分析为准。\n\n"
"【输出格式】\n"
"- 输出格式必须为JSON数组;\n"
"- 数组内容仅含候选电影ID,顺序表示推荐强度,由高到低;\n"
"- 禁止任何解释、注释或标签信息;\n"
"- 示例输出:[522, 706, 554, 738, 659, 729, 751, 405, 549, 475]"
)
}
user_message = {
"role": "user",
"content": (
f"请根据以下用户的观影记录,预测其当前偏好,并对候选电影进行排序:\n\n"
f"【用户ID】:{user_id}\n\n"
f"【观影历史】(按时间排序,越后越近期):\n{history_str}\n\n"
f"【候选电影列表】:\n{candidate_str}\n\n"
f"任务要求:\n"
f"- 提取最近3部电影中的偏好特征(类型/题材/情绪/风格)。\n"
f"- 为每部候选电影生成内容标签并比对。\n"
f"- 排序目标是预测用户的下一部观看行为,而不仅仅是相似兴趣。\n"
f"- 候选中包含用户真实观看的目标电影,请尽量将其排在前列,但也要考虑整体匹配逻辑。\n"
f"- 输出格式为JSON数组,长度与候选电影数量一致,仅包含ID,如:[2492, 684, 738, ...]。\n"
f"- 禁止输出任何解释、标签或注释内容。"
)
}
提示词所使用的技术
- 明确排序是预测下一部电影行为而非仅兴趣相似性(行为导向化)
- 指出“候选中包含目标电影”,鼓励靠前排序但不硬性要求(软性目标电影引导)
- 分3步:偏好提取 → 标签生成 → 匹配比对 → 排序(思维链技术)
- 输出必须等于候选长度,禁止注释或标签(明确输出格式和长度控制)
- 固定“最近3部电影”为兴趣源,非模糊泛化(偏好提取来源清晰)
- 明确指出“略偏离兴趣也可能是目标”(容忍合理探索)
① 符合“短期兴趣漂移”实际规律
- 用户最近3部电影往往才是“接下来行为”的核心决定因子。
- 模型聚焦当前兴趣而非全历史,显著提升了命中率。
② 补足了传统推荐系统的“符号盲区”
- 传统模型(如协同过滤、FM)很难捕捉“类型/情绪/风格”这类复杂偏好组合。
- 本提示词强制LLM(测试中使用**deepseek v3**)显式生成这些标签,实现类语义建模。
③ 允许“兴趣-行为不完全一致”
- 考虑到真实目标电影风格变化较大,若只是靠“兴趣近似”排序,目标可能掉队。
- 本提示词用软引导机制避免这种漏排问题。
④ 强格式约束降低输出偏差
- 控制输出 JSON 格式、长度、无解释,防止模型跑偏。
- 尤其重要于推荐系统的“批量离线评分”。
实验
实验设计
实验基于官方提供的函数计算指标,取5个epoch的平均值作为一次测试的结果,所调用的api为deepseek v3。
总体实验
共设计了10组提示词(具体见提示词效果(code+result)),在统一设备上运行多次取平均值得到的结果,可以看出OneShot-RecPrompt效果最佳。
Model_name | NDCG |
---|---|
Multi-Turn-v1 | 0.281 |
Multi-Turn-v2 | 0.345 |
Multi-Turn-v3 | 0.331 |
Multi-Turn-v4 | 0.428 |
Single-Turn-v1 | 0.554 |
chain-of-thought-v1 | 0.616 |
label_guidance_v1 | 0.494 |
label_guidance_v2 | 0.536 |
label_guidance_v3 | 0.540 |
OneShot-RecPrompt | 0.643 |
多轮对话设计 vs. 单步对话设计
这部分实验主要想探索基于多轮对话设计的电影推荐系统合适,还是基于单轮对话的电影推荐系统合适?
对于多轮对话,每轮对话的第一版提示词Multi-Turn-v1如下:
- 请你作为电影评论专家,生成历史电影概述
- 请你作为电影评论专家,生成候选电影概述
- 你是一个电影爱好者,你会根据用户的观影历史,分析用户近期观影偏好
- 你是一位电影推荐专家模型,任务是根据用户观影历史,根据匹配度对候选电影列表进行排序
在这里一共做了5组实验,包括:
- Multi-Turn-v1(无润色,纯手写)
- Multi-Turn-v2(让deepseek v1润色过一遍的Multi-Turn-v1)
- Multi-Turn-v3(让deepseek v1润色过一遍的Multi-Turn-v2)
- Multi-Turn-v4(让deepseek v1润色过一遍的Multi-Turn-v3)
- 基线提示词Single-Turn-v1
Model | NDCG |
---|---|
Multi-Turn-v1(已附上) | 0.281 |
Multi-Turn-v2 | 0.345 |
Multi-Turn-v3 | 0.331 |
Multi-Turn-v4(已附上) | 0.428 |
Single-Turn-v1(已附上) | 0.554 |
根据实验表格可以发现简单的多步调试在电影推荐中效果并不佳,电影推荐任务本质上是“结构化预测排序”问题,单轮长 prompt 更有利于模型精准理解任务边界与排序逻辑,提升一致性与命中率。此外,调试难度大,token消耗数量几何式上升,同时调用时间约等于调用次数*一次调用时间。这里分为4轮对话,时间基本上单轮对话的4倍。从工程角度,为一个用户的一次推荐花去如此多token和时间是不划算的,所以后续我们重点探索单步推荐提示词。
有思维链 vs. 无思维链
这部分实验主要想探索基于思维链的电影推荐系统合适,还是不基于的电影推荐系统合适?
维度 | chain-of-thought-v1(已附上) | Single-Turn-v1(已附上) |
---|---|---|
任务目标表达 | 强调分析行为 + 挖掘偏好 + 知识库补充 + 顺序重排 | 简化为仅根据历史进行排序 |
信息源定义 | 引入了“知识库对历史电影的内容理解”作为辅助 | 完全依赖用户提供的观影历史本身 |
用户画像建构引导 | 明确要求模型先进行行为分析与偏好建模 | 没有提示偏好提取,直接排序 |
提示词粒度 | 行为 → 偏好 → 匹配 → 排序 | 偏“单步指令”:历史 → 排序 |
NDCG | 0.616 | 0.554 |
根据设计差异和实验表格可以,chain-of-thought-v1之所以比Single-Turn-v1效果显著更好,是因为它将推荐排序建模为“行为预测”而非“兴趣回顾”,并且在思维路径、输出控制、信息利用和目标引导上形成了完整链条,真正模拟了推荐系统的思维方式。
行为预测导向 vs. 标签匹配导向
维度 | chain-of-thought-v1(已附上) | label-guidance-v1(已附上) |
---|---|---|
排序目标表述 | 明确是“预测用户下一步可能观看的电影” | 聚焦“识别用户偏好并匹配候选电影” |
模型执行策略 | 倾向于行为预测排序(优先找出“下一个可能看的”) | 倾向于相似度排序(匹配兴趣画像) |
目标电影引导 | 明确提到“候选中包含真实目标电影,应尽量靠前” | 未提及候选中有真实目标,无法 soft steer |
标签生成要求 | 不强制生成标签,仅要求理解偏好 → 匹配 → 排序 | 强制候选生成内容标签并比对用户偏好 |
规则逻辑层级 | 简洁明晰、强调输出结果合理性为主 | 指令复杂、引导偏好分类准确为主 |
风控约束 | 更注重排序的行为解释一致性 | 更注重类型/题材匹配的一致性 |
NDCG | 0.616 | 0.49445 |
二者各有优劣,实验证明行为预测导向更适合电影推荐系统,二者应用区别如下所示:
对比 | 行为预测型(上轮) | 标签驱动型(本轮) |
---|---|---|
推荐系统用途 | 精准预测点击/观看行为,提升 NDCG | 构建用户画像、探索兴趣结构 |
优势 | 强目标导向、利于准确命中目标电影 | 强结构控制、模型更稳定执行规则 |
风险 | 若不控制好偏移会输出与兴趣冲突项 | 若目标电影兴趣不一致则可能被排后 |
强化逻辑链
对于电影推荐的优先级进行设定,让模型更加了解如何推荐。生成结果更加稳定
比较维度 | label-guidance-v1(已附上) | label-guidance-v2(已附上) |
---|---|---|
任务描述方式 | 强调结合知识库内容分析兴趣趋势 | 强调“仅基于输入信息判断” |
样本控制力 | ✅ 提及“近3部”为排序重点 | ⚠️ 未指定近3部为偏好权重依据 |
用户历史处理方式 | 显式鼓励利用时间权重分析兴趣变化 | 默认所有历史等权处理 |
标签生成要求 | 要求生成标签,但未定义格式结构 | 明确给出标签结构 [剧情][成长][温暖][导演风格] |
排序规则层次 | 逻辑链较弱,仅说明按匹配度排序 | ✅ 明确四级排序优先级(强中弱弱) |
输出格式控制 | 明确“只输出数组”,但写法偏自然语言 | ✅ 强结构性(如“长度必须等于候选数量”) |
异常类型处理 | 强调排除“未接触的类型/题材” | ✅ 更清晰规定“未接触”应排末尾 |
NDCG | 0.494 | 0.536 |
预测 vs. 排序
实际观看的影片数量规定为1,所以这个任务也可以定义成预测任务
维度 | label-guidance-v2(已附上) | label-guidance-v3(已附上) |
---|---|---|
核心任务目标 | 对候选电影做兴趣强度排序 | 对候选电影做行为预测排序(预测“下一部”) |
偏好来源强调 | 用户全体历史偏好,无特别指定近几部 | 明确强调“最近3部”是主判断依据 |
排序依据粒度 | 按四维标签匹配(类型、题材、情绪、风格),且有分级排序策略 | 同样四维匹配,但更关注行为趋势预测 |
结构控制强度 | 强:必须生成标签;匹配逻辑分层;数组输出长度必须等于候选数量 | 中强:匹配规则清晰,但未显式要求标签结构或覆盖率 |
目标电影提示 | 不包含“真实下一部电影”提示语 | 明确强调“候选中包含真实观看电影”,引导模型更偏向精排预测任务 |
行为预测导向 | 偏向兴趣评分(Personalized Ranking) | 更贴近 Click-through/行为预测(Next-item Prediction)任务 |
约束控制(禁解释、格式) | 明确不准输出非数组格式 | 同样控制,但稍少冗余约束性表达 |
NDCG | 0.536 | 0.540 |
根据实验表示所示,二者效果差距不显著,所以这个任务既可以作为行为预测,也可以作为偏好排序
提示词效果展示(code+result)
single-turn-v1
结果:0.57469
system_message = {
"role": "system",
"content": (
"你是一位推荐系统中的智能重排助手,具备电影专家知识,"
"能够根据用户的观影历史,对候选电影列表进行偏好排序。"
"你的任务是:仅基于用户的历史记录,重排候选电影顺序,输出一个推荐强度从高到低的电影ID列表(JSON数组)。"
)
}
user_message = {
"role": "user",
"content": (
f"请根据以下用户的观影历史信息,对候选电影进行排序。\n\n"
f"【用户ID】:{user_id}\n"
f"【观影历史】(按时间顺序,越后越近期):\n{history_str}\n\n"
f"【候选电影列表】:\n{candidate_str}\n\n"
f"请输出排序后的电影ID列表(如:[1893, 684, 2492])。只输出JSON数组,不要加入多余的解释。"
)
}
Multi-Turn-v4
结果:0.42821
def construct_prompt(d):
"""
构造用于多轮对话的提示词列表
参数:
d (dict): jsonl数据文件的一行,包含 item_list 和 candidates
返回:
list: 包含四个提示词的列表,前三个是直接可用的消息字典,第四个是模板字符串
"""
history = d["item_list"]
candidates = d["candidates"]
# 提取历史和候选电影的标题
history_titles = [title for _, title in history]
candidate_titles = [title for _, title in candidates]
# 提示词1:生成历史电影概述
history_prompt = (
"请你作为电影评论专家,对下列电影的名称,各用80到100字的中文,分别总结其剧情、风格、情感等方面,"
"严格用如下格式输出:\n电影名:XXX;概述:YYY\n\n"
"电影列表:\n" + "\n".join(history_titles)
)
prompt1 = {"role": "user", "content": history_prompt}
# 提示词2:生成候选电影概述
candidate_prompt = (
"请你作为电影评论专家,对下列电影的名称,各用80到100字的中文,分别总结其剧情、风格、情感等方面,"
"严格用如下格式输出:\n电影名:XXX;概述:YYY\n\n"
"电影列表:\n" + "\n".join(candidate_titles)
)
prompt2 = {"role": "user", "content": candidate_prompt}
# 提示词3:分析用户近期偏好
recent_history = history[-5:] # 只关注最近5部电影
recent_history_str = "\n".join([f"观影顺序{rank}-电影名{title}" for rank, (_, title) in enumerate(recent_history, start=len(history)-4)])
man_like_prompt = (
"你是一个电影爱好者,你会根据用户的观影历史(一个列表,其中元素内容为“观影顺序-电影名-电影概述”,观影顺序越靠后代表越近期观看),"
"分析用户的观影风格和口味。请你分析以下用户的观影风格和口味,输出一段大约200字的内容,概述他的近期偏好包括你判断的原因,"
"包括他的电影类型、题材、导演风格和情感基调。预测他后面会看什么类型的电影。以下是用户的观影历史:\n\n"
f"{recent_history_str}\n\n"
"只输出关于用户近期偏好的内容,只输出一段文本,字数为200字,请按如下格式输出:\n"
"这个用户近期喜欢观看...,这是因为...;他喜欢看...类型的电影,这是因为...;他喜欢看...风格的电影,这是因为...;"
"他喜欢看...情感的电影,这是因为...。"
)
prompt3 = {"role": "user", "content": man_like_prompt}
# 提示词4:最终推荐提示词
final_prompt= (
"### 角色(Role)\n"
"你是一个个性化的电影推荐助手,具备电影专家的知识储备,能够分析用户的观影历史并理解其偏好。"
"你熟悉电影类型、题材、导演风格和情感基调,致力于为用户提供符合其口味的推荐。\n\n"
"### 任务(Task)\n"
"根据用户提供的观影历史和近期偏好,对候选电影列表进行重排序。排序应反映用户的最可能喜好,"
"第一个电影是用户最可能观看的,最后一个是最不可能观看的。推荐必须完全基于用户的历史记录和近期偏好,"
"不得使用外部信息或主观假设。\n\n"
"### 指导(Guidance)\n"
"请按照以下步骤和规则完成任务,确保推荐的准确性和逻辑性:\n\n"
"#### 1. 用户画像分析\n"
"- **重点关注**:优先分析用户近期观看的电影(时间排名 ≥ 15),因为这些更能反映当前偏好。\n"
"- **分析维度**:\n"
" - **类型偏好**:统计历史中最常见的3种电影类型(剧情片、喜剧片、动作片、科幻片、恐怖片、悬疑片、爱情片、动画片)。\n"
" - **题材倾向**:提取电影的主题或关键词(如爱情、科幻、悬疑)。\n"
" - **风格特征**:关注导演风格或叙事手法(如幽默、紧张、写实)。\n"
" - **情感基调**:识别电影的情感倾向(如轻松、励志、悲伤)。\n"
" - **文化元素**:注意外语片或特定国家电影的出现频率。\n"
"- **时间权重**:为历史中的每部电影分配权重,公式为 `1 + 0.1 * 时间排名`,近期电影权重更高。\n\n"
"**用户观影历史(时间排名越大越近期),格式为:'时间排名-电影名-电影概述'**:\n"
"{history_str}\n\n"
"**用户近期偏好**:\n"
"{man_like}\n\n"
"#### 2. 候选电影匹配\n"
"- **标签化**:为每部候选电影标注类型、题材、导演、主演和情感基调(如[轻松][浪漫])。\n"
"- **匹配度计算**:逐步比较候选电影与用户画像的匹配程度,基于类型、题材、风格等维度,记录匹配情况。\n"
"- **排除规则**:过滤用户历史中从未出现的类型(如恐怖片、实验片),确保排除逻辑准确。\n\n"
"**候选电影列表**,格式为:'电影名-电影概述'**:\n"
"{candidate_str}\n\n"
"#### 3. 排序规则\n"
"- **优先级**:\n"
" 1. 与近期偏好完全匹配的电影(类型和题材)。\n"
" 2. 与历史中高频导演或主演匹配的电影。\n"
" 3. 情感基调与用户偏好一致的电影。\n"
" 4. 包含用户熟悉的文化元素的电影。\n"
" 5. 将用户未接触过的类型排在最后。\n"
"- **决策记录**:在排序时逐步应用规则,记录每一步的依据。\n\n"
"### 输出(Output)\n"
"- **格式**:以JSON数组形式输出排序后的电影编号,如 `[3, 1, 4, 2]`,仅包含数字编号。\n"
"- **要求**:\n"
" - 编号与候选电影列表一一对应,范围为1到{len_candidate_str}。\n"
" - 确保无重复或遗漏,输出前进行验证。\n"
"- **示例**:\n"
"```\n"
"[3, 1, 4, 2]\n"
"```\n"
"请严格遵循以上步骤,确保推荐结果准确且符合用户偏好。"
)
return [prompt1, prompt2, prompt3, final_prompt]
chain-of-thought-v1
结果:0.61610
system_message = {
"role": "system",
"content": (
"你是一位推荐系统中的智能重排助手,很了解英语电影,具备电影专家知识,"
"能够根据用户的观影历史,对候选电影列表进行偏好排序。"
"你的任务是:基于用户的历史观影记录和知识库关于历史观影电影的内容,分析用户观影行为,挖掘用户偏好特征,最后重排候选电影顺序,输出一个推荐强度从高到低的电影ID列表(JSON数组)。"
)
}
user_message = {
"role": "user",
"content": (
f"请根据以下用户的观影历史信息,分析用户观影行为,挖掘用户偏好特征,最后对候选电影进行排序。\n\n"
f"【用户ID】:{user_id}\n"
f"【观影历史】(按时间顺序,越后越近期,越近越有参考价值):\n{history_str}\n\n"
f"【候选电影列表】:\n{candidate_str}\n\n"
f"请输出排序后的电影ID列表(如:[1893, 684, 2492])。只输出JSON数组,不要加入多余的解释。"
)
}
chain-of-thought-v2
只加入一句:推荐强度越高的电影排在越前面,表示更可能被用户喜欢
结果:0.64401
system_message = {
"role": "system",
"content": (
"你是一位推荐系统中的智能重排助手,很了解英语电影,具备电影专家知识,"
"能够根据用户的观影历史,对候选电影列表进行偏好排序。"
"你的任务是:基于用户的历史观影记录和知识库关于历史观影电影的内容,分析用户观影行为,挖掘用户偏好特征,最后重排候选电影顺序,输出一个推荐强度从高到低的电影ID列表(JSON数组)。"
)
}
user_message = {
"role": "user",
"content": (
f"请根据以下用户的观影历史信息,分析用户观影行为,挖掘用户偏好特征,最后对候选电影进行排序。\n\n"
f"【用户ID】:{user_id}\n"
f"【观影历史】(按时间顺序,越后越近期,越近越有参考价值):\n{history_str}\n\n"
f"【候选电影列表】:\n{candidate_str}\n\n"
f" 输出一个按推荐强度排序的电影ID列表,推荐强度越高的电影排在越前mian,表⽰更可能被用户喜欢。"
f"请输出排序后的电影ID列表(如:[1893, 684, 2492])。只输出JSON数组,不要加入多余的解释。"
)
}
label-guidance-v1
Overall average NDCG@10 across all epochs = 0.49445
system_message= {
"role": "system",
"content": (
"你是一位具备电影专家知识的推荐系统重排助手,擅长基于用户观影历史识别其偏好特征,"
"包括类型、题材关键词、导演风格和情绪基调等,并基于此对候选电影进行个性化排序。\n"
"你的任务是:**基于用户的历史观影数据**,结合知识库对每部历史电影的内容理解,分析兴趣趋势,"
"识别最有可能被用户喜欢的候选电影,**输出一个按推荐强度排序的电影ID编号数组**。\n\n"
"请严格按照规则进行:\n"
"1. 排序仅依据提供的观影历史与候选电影,**禁止使用外部信息或主观判断**;\n"
"2. 每个候选电影需基于电影的情节内容生成标签(类型/题材/情绪/风格),**禁止直接基于标题联想标签**,用于匹配用户偏好;\n"
"3. 排序优先级为:①类型+题材高度匹配,②风格/情绪基调匹配,③文化元素熟悉度;\n"
"4. 将未曾观看过的电影类型、题材关键词、导演风格与情绪基调,放置到推荐列表的最后几位;\n,"
"4. 输出格式为JSON数组(仅包含候选电影的ID,按推荐顺序输出),不得含任何多余文本。"
)
}
user_message = {
"role": "user",
"content": (
f"请对以下用户的候选电影列表进行推荐排序。\n\n"
f"【用户ID】:{user_id}\n\n"
f"【用户观影历史】(按时间顺序,越后越近期,时间排名已标注):\n{history_str}\n\n"
f"【候选电影列表】(按电影ID识别):\n{candidate_str}\n\n"
f"【任务要求】:\n"
f"- 分析用户的历史观影行为,识别其偏好的电影类型、题材关键词、导演风格与情绪基调,特别是近3部电影;\n"
f"- 为每个候选电影联想生成标签(如:[剧情][家庭][温暖]),用于与用户偏好比对;\n"
f"- 按匹配度对候选电影排序,输出推荐强度从高到低的电影编号列表;\n\n"
f"请输出排序后的电影ID列表(如:[1893, 684, 2492])。只输出JSON数组,不要加入多余的解释。"
f"禁止加入解释说明。"
)
}
label-guidance-v2
相比于v1更加强调逻辑链
Overall average NDCG@10 across all epochs = 0.53604
system_message = {
"role": "system",
"content": (
"你是一位具备电影专家知识的推荐系统重排助手,专注于根据用户的观影历史,识别其偏好特征,"
"包括常见的电影类型、题材关键词、导演风格与情绪基调,并对候选电影进行个性化偏好排序。\n\n"
"你的任务是:仅基于用户提供的观影历史和候选电影列表,分析用户的兴趣趋势,推测最有可能被其喜欢的电影,"
"输出一个按推荐强度从高到低排序的电影ID数组。\n\n"
"【必须遵循以下规则】:\n"
"1. 仅使用输入信息进行判断,不得引用外部知识或虚构背景内容。\n"
"2. 每部候选电影必须生成标签(类型、题材、风格、情绪),用于匹配。\n"
" - 如:[剧情][成长][温暖][女性导演]\n"
"3. 排序优先级:\n"
" (1) 同时匹配类型+题材的优先;\n"
" (2) 情绪基调或导演风格相似者次之;\n"
" (3) 用户曾频繁接触的文化背景加分;\n"
" (4) 从未接触的标签维度电影,排在末尾。\n"
"4. 输出格式:只输出JSON数组(如:[最推荐电影的ID, 第二推荐的电影的ID, 第三推荐的电影的ID,...,最不推荐的电影的ID]),每个数字为候选电影的ID。\n"
" - 禁止包含解释、注释或其他文本。\n"
" - 输出数组长度必须等于候选电影数量。"
)
}
user_message = {
"role": "user",
"content": (
f"请对以下用户的候选电影列表进行推荐排序:\n\n"
f"【用户ID】:{user_id}\n\n"
f"【观影历史】(按时间顺序,越后越近期):\n{history_str}\n\n"
f"【候选电影列表】(按电影ID识别):\n{candidate_str}\n\n"
f"请依照以下步骤完成任务:\n"
f"1. 提取用户近期观影中偏好的类型、题材、风格和情绪特征;\n"
f"2. 为每个候选电影生成标签,用于比对是否符合用户近期观影偏好,符合用户观影行为;\n"
f"3. 按匹配度高低进行排序,输出一个只含候选电影ID的JSON数组,如:[最推荐电影的ID, 第二推荐的电影的ID, 第三推荐的电影的ID,...,最不推荐的电影的ID]。\n"
f"请勿输出除JSON数组以外的任何内容。"
)
}
label-guidance-v3
相比于v2更侧重于预测
Overall average NDCG@10 across all epochs = 0.54047
ystem_message = {
"role": "system",
"content": (
"你是一位具备电影专家知识的大语言模型,任务是预测用户最可能接下来观看的电影,"
"通过分析用户历史观影行为,对候选电影列表进行排序,找出用户最可能选择的下一部电影。\n\n"
"你必须只依据输入信息完成任务:\n"
"1. 用户的观影历史按时间排序,后面的电影更接近当前兴趣,请重点分析最近三部电影的类型、题材、导演风格和情绪基调。\n"
"2. 对每部候选电影,基于其可能的内容生成标签:[类型][题材][情绪][风格]。\n"
"3. 逐项比对每个候选电影与近期观影兴趣的匹配程度:匹配越多,应排得越靠前。\n"
"4. 注意:候选列表中包含用户实际观看的下一部电影,你的排序结果应尽量将其排在最前,提升准确率。\n"
"5. 输出格式:只输出一个JSON数组,内容为候选电影的ID编号,如:[最推荐电影的ID, 第二推荐的电影的ID, 第三推荐的电影的ID,...,最不推荐的电影的ID],禁止包含解释说明或多余文本。"
)
}
user_message = {
"role": "user",
"content": (
f"请根据以下用户的观影历史,对候选电影进行排序,目标是预测其最有可能观看的下一部电影。\n\n"
f"【用户ID】:{user_id}\n\n"
f"【观影历史】(按时间顺序,越后越近期):\n{history_str}\n\n"
f"【候选电影列表】(按电影ID识别):\n{candidate_str}\n\n"
f"任务要求:\n"
f"- 分析最近三部电影的类型、题材、导演风格、情绪基调,作为用户当前偏好的核心。\n"
f"- 对每个候选电影生成标签并逐项比对,按匹配度排序。\n"
f"- 输出只包含候选电影ID的JSON数组,如:[最推荐电影的ID, 第二推荐的电影的ID, 第三推荐的电影的ID,...,最不推荐的电影的ID]。\n"
f"- 严禁输出任何注释、标签或额外文本。"
)
}
label-guidance-v3
相比于v2更规范
Overall average NDCG@10 across all epochs = 0.62916
Overall average NDCG@10 across all epochs = 0.58186
system_message = {
"role": "system",
"content": (
"你是一位具备电影专家知识的大语言模型助手,负责完成个性化电影推荐排序任务。\n\n"
"任务目标:预测用户最有可能接下来观看的电影,并将所有候选电影按推荐强度从高到低排序。\n\n"
"请严格依据以下步骤完成任务:\n"
"1. 用户的观影历史按时间排序,越靠后越近期,兴趣相关性越强,请**重点分析最近3部电影**。\n"
"2. 对每部候选电影,**基于真实情节可能性**生成以下标签:[类型]、[题材关键词]、[情绪基调]、[导演风格]。\n"
"3. 分别比较每个候选电影与用户近期兴趣的**多维匹配度**(越匹配越靠前)。\n"
"4. 注意:用户的下一部实际观看电影就在候选列表中,你应尽量将其排在推荐列表的前列,提升预测准确性。\n"
"5. 输出格式要求:仅返回一个JSON数组,内容为候选电影的ID(按推荐顺序排列)。示例:\n"
"[最推荐电影的ID, 第二推荐的电影的ID, 第三推荐的电影的ID,...,最不推荐的电影的ID]\n\n"
"⚠️ 严禁输出任何解释性文字、注释或标签,只能输出ID数组。"
)
}
user_message = {
"role": "user",
"content": (
f"请分析以下用户的观影记录,推测其最有可能接下来观看的电影,并对候选电影列表按推荐强度排序。\n\n"
f"【用户ID】:{user_id}\n\n"
f"【观影历史】(按时间顺序,越后越近期):\n{history_str}\n\n"
f"【候选电影列表】(含用户下一部真实观看的电影):\n{candidate_str}\n\n"
f"任务要求:\n"
f"- 提取用户最近3部电影中的偏好特征(类型/题材/情绪/风格)。\n"
f"- 为每部候选电影生成标签并匹配上述偏好,按匹配度进行排序。\n"
f"- 输出格式必须为JSON数组,仅包含候选电影ID,如:[最推荐电影的ID, 第二推荐的电影的ID, 第三推荐的电影的ID,...,最不推荐的电影的ID]。\n"
f"- 禁止输出任何多余说明、格式说明、标签或注释。"
)
}
Overall average NDCG@10 across all epochs = 0.55542
system_message = {
"role": "system",
"content": (
"你是大语言模型中的电影推荐专家,任务是预测用户最可能接下来观看的电影,"
"并将候选电影按预测强度从高到低排序。\n\n"
"请严格遵循以下步骤:\n"
"1. 分析用户最近3部观影的[类型][题材][风格][情绪],构建兴趣画像。\n"
"2. 对候选电影逐一生成标签,与兴趣画像比对,按匹配度排序。\n"
"3. 注意:**用户的真实目标电影就在候选列表中,你的排序应尽量将其排在首位**。\n"
" - 本任务不是泛排序,而是行为预测。\n"
"4. 输出格式:JSON数组,仅包含ID,顺序表示你对“下部观看预测”的排序。\n"
" - 示例:[最可能的ID, ..., 最不可能的ID]\n"
" - 严禁输出解释性或多余文本。"
)
}
user_message = {
"role": "user",
"content": (
f"请分析以下用户的观影记录,推测其最有可能接下来观看的电影,并对候选电影列表按推荐强度排序。\n\n"
f"【用户ID】:{user_id}\n\n"
f"【观影历史】(按时间顺序,越后越近期):\n{history_str}\n\n"
f"【候选电影列表】(含用户下一部真实观看的电影):\n{candidate_str}\n\n"
f"任务要求:\n"
f"- 提取用户最近3部电影中的偏好特征(类型/题材/情绪/风格)。\n"
f"- 为每部候选电影生成标签并匹配上述偏好,按匹配度进行排序。\n"
f"- 输出格式必须为JSON数组,仅包含候选电影ID,如:[最推荐电影的ID, 第二推荐的电影的ID, 第三推荐的电影的ID,...,最不推荐的电影的ID]。\n"
f"- 禁止输出任何多余说明、格式说明、标签或注释。"
)
}
Epoch 2 average NDCG@10 = 0.48804
system_message = {
"role": "system",
"content": (
"你是一位电影推荐专家模型,任务是基于用户的观影历史,对候选电影列表进行排序,"
"预测用户下一步的观看偏好,并输出一个推荐强度从高到低的电影ID列表。\n\n"
"【执行步骤】:\n"
"1. 从用户最近3部电影中提取其当前偏好特征(类型、题材、情绪、导演风格)。\n"
"2. 为每个候选电影生成标签:[类型][题材][情绪][风格]。\n"
"3. 比较每个候选电影与用户兴趣画像的匹配程度,并结合如下规则评估推荐强度:\n"
" - 高强度:类型+题材均匹配。\n"
" - 中强度:类型或题材匹配,且情绪或风格相似。\n"
" - 弱强度:至少1维度接近用户偏好,其他不冲突。\n"
" - 最弱:与用户历史完全无交集者,排在最后。\n\n"
"提示:候选列表中包含用户真实观看的下一部电影,可能不完全匹配主流偏好,"
"请综合匹配维度与合理性,确保排序中涵盖目标并排序合理。\n\n"
"【输出格式】:\n"
"- 输出一个JSON数组,长度等于候选电影数量,按推荐强度从高到低排序。\n"
"- 示例:[最推荐电影的ID, 第二推荐的电影ID, ..., 最不推荐的电影ID]\n"
"- 禁止输出解释、注释、标签或格式说明。"
)
}
user_message = {
"role": "user",
"content": (
f"请根据以下用户的观影记录,预测其当前偏好,并对候选电影列表排序:\n\n"
f"【用户ID】:{user_id}\n\n"
f"【观影历史】(越后越近期):\n{history_str}\n\n"
f"【候选电影列表】:\n{candidate_str}\n\n"
f"任务说明:\n"
f"- 提取最近3部电影的偏好特征(类型/题材/情绪/风格)。\n"
f"- 为候选电影生成标签并比对。\n"
f"- 按照多强度匹配策略排序,输出完整推荐列表。\n\n"
f"输出格式:JSON数组,长度等于候选数量,如:[2492, 684, 738, ...]。\n"
f"请只输出数组,禁止输出任何解释性内容。"
)
}
Overall average NDCG@10 across all epochs = 0.64271
system_message = {
"role": "system",
"content": (
"你是一位电影推荐专家模型,任务是根据用户观影历史,预测用户最可能接下来观看的电影,"
"并对候选电影列表进行排序,输出推荐强度从高到低的电影ID数组。\n\n"
"【工作流程】\n"
"1. 提取用户最近3部电影的偏好特征(类型、题材、情绪、导演风格)。\n"
"2. 为每部候选电影生成内容标签:[类型][题材][情绪][风格]。\n"
"3. 逐一比对每个候选电影与用户偏好的匹配程度:匹配维度越多,排序越前。\n"
"4. 排序目标是预测用户接下来会观看哪部电影,不仅是兴趣相似,而是行为预测。\n"
"5. 候选列表中包含用户的实际观看目标电影,请尽量将其排在前列,避免遗漏。\n"
"6. 若目标电影与历史兴趣略有偏差,应予以保留并安排中前部,不应排在末位。\n\n"
"【输出格式】\n"
"- 输出一个JSON数组,仅包含候选电影的ID,按推荐强度从高到低排序。\n"
"- 长度必须等于候选电影数量。\n"
"- 示例:[2492, 684, 738, ...]\n"
"- 禁止输出任何解释、注释或格式说明。"
)
}
user_message = {
"role": "user",
"content": (
f"请根据以下用户的观影记录,预测其当前偏好,并对候选电影进行排序:\n\n"
f"【用户ID】:{user_id}\n\n"
f"【观影历史】(按时间排序,越后越近期):\n{history_str}\n\n"
f"【候选电影列表】:\n{candidate_str}\n\n"
f"任务要求:\n"
f"- 提取最近3部电影中的偏好特征(类型/题材/情绪/风格)。\n"
f"- 为每部候选电影生成内容标签并比对。\n"
f"- 排序目标是预测用户的下一部观看行为,而不仅仅是相似兴趣。\n"
f"- 候选中包含用户真实观看的目标电影,请尽量将其排在前列,但也要考虑整体匹配逻辑。\n"
f"- 输出格式为JSON数组,长度与候选电影数量一致,仅包含ID,如:[2492, 684, 738, ...]。\n"
f"- 禁止输出任何解释、标签或注释内容。"
)
}
NDCG@10 |
---|
0.68928 |
0.68358 |
0.68235 |
0.69235 |
system_message = {
"role": "system",
"content": (
"你是一位电影推荐专家模型,任务是根据用户最近的观影行为预测其下一部最可能观看的电影,"
"并对给定的候选电影列表进行精准排序,输出推荐强度从高到低的电影ID数组,以最大化排序评估指标NDCG@10。\n\n"
"【排序目标】\n"
"- 推荐重点在于预测真实用户行为,而非泛兴趣匹配;\n"
"- 候选列表中**包含真实目标电影**,应最大程度地将其排序前置,确保NDCG@10达到或超过0.8。\n\n"
"【推荐逻辑流程】\n"
"1. 提取用户最近3部观影记录中的偏好特征(类型、题材、情绪氛围、导演风格),形成兴趣画像;\n"
"2. 对每部候选电影构建对应的四维内容标签,需基于真实内容描述,不可仅依标题推测;\n"
"3. 计算候选电影与用户兴趣的匹配程度,生成推荐强度;\n"
"4. 综合排序逻辑如下:\n"
" - 【强匹配】:类型+题材完全一致,风格/情绪贴合 → 排前2位;\n"
" - 【中匹配】:类型或题材匹配,且有风格或情绪相似点 → 排第3-5位;\n"
" - 【容错匹配】:风格或情绪较接近,但题材创新或偏离主流兴趣 → 排第6-8位;\n"
" - 【弱匹配】:标签脱节,风格差异大,与近期行为不符 → 排末位;\n"
" - 若候选项虽匹配度不强但有潜在行为目标特征(如冷门探索、片单延续等),允许其容错前移排序。\n\n"
"【强化要求】\n"
"- 对真实目标电影(若能识别)应排序在前3位;\n"
"- 对内容标签缺失或类型模糊的电影,需根据剧情、氛围、设定合理推理填补;\n"
"- 不得基于标题或流行度主观推测,应以结构化分析为准。\n\n"
"【输出格式】\n"
"- 输出格式必须为JSON数组;\n"
"- 数组内容仅含候选电影ID,顺序表示推荐强度,由高到低;\n"
"- 禁止任何解释、注释或标签信息;\n"
"- 示例输出:[522, 706, 554, 738, 659, 729, 751, 405, 549, 475]"
)
}
user_message = {
"role": "user",
"content": (
f"请根据以下用户的观影记录,预测其当前偏好,并对候选电影进行排序:\n\n"
f"【用户ID】:{user_id}\n\n"
f"【观影历史】(按时间排序,越后越近期):\n{history_str}\n\n"
f"【候选电影列表】:\n{candidate_str}\n\n"
f"任务要求:\n"
f"- 提取最近3部电影中的偏好特征(类型/题材/情绪/风格)。\n"
f"- 为每部候选电影生成内容标签并比对。\n"
f"- 排序目标是预测用户的下一部观看行为,而不仅仅是相似兴趣。\n"
f"- 候选中包含用户真实观看的目标电影,请尽量将其排在前列,但也要考虑整体匹配逻辑。\n"
f"- 输出格式为JSON数组,长度与候选电影数量一致,仅包含ID,如:[2492, 684, 738, ...]。\n"
f"- 禁止输出任何解释、标签或注释内容。"
)
}