一个面向抖音信息流场景的 AI 卡片原型项目。
MomentCard 试图回答一个问题:如果 AI 不是一个需要用户主动打开、输入和等待的工具,而是一张在信息流里“刷到即成立”的内容卡片,它应该如何理解用户此刻真正需要什么?
本项目对应赛道三「AI 体验:刷到懂你的瞬间」,核心方向是:基于用户原始搜索与交互数据沉淀 Profile Skills,再由实时事件触发,生成用户此时此刻最可能需要的信息流 AI 卡片。
我们以搜索行为识别高意图需求,以自然刷视频行为补全偏好证据,以实时事件作为触发器,在“用户画像 × 当前事件 × 即时意图”的交叉点上实现精准推送,满足用户当下需求。
传统信息流推荐主要依赖用户刷视频时的停留、点赞、完播、互动等行为。但这些信号并不总能代表用户在某个具体时刻的真实需求。
例如,用户停留在一个美食视频上,可能只是被画面吸引;看完一个旅行视频,也不代表他马上需要行程安排。普通刷视频行为更适合判断长期兴趣,但很难直接说明“此刻需要什么”。
MomentCard 的核心判断是:
真正能产生“刚好懂你”的信息流体验,不应该只根据用户喜欢什么内容,而应该根据用户在某个事件发生时最可能需要什么信息。
因此,本项目不以传统推荐算法为中心,而是把重点放在:
- 用用户搜索记录锚定高意图需求。
- 用搜索结果中的视频点击、停留、跳出等行为细化垂直画像。
- 用自然信息流观看行为作为偏好佐证,而不是主触发依据。
- 用天气、节气、时间、地点、近期焦虑等事件触发卡片生成。
- 用 LLM 与 skill-like 画像单元完成 demo 级推荐与生成。
MomentCard 的推荐逻辑不是“预测用户会点哪条视频”,而是:
原始搜索与交互数据
↓
LLM 抽取意图、偏好、约束和证据
↓
沉淀为 Profile Skill
↓
实时事件触发相关 Profile Skill
↓
生成一张信息流 AI 卡片
↓
用户在刷到时直接理解并轻量互动
这里的 Profile Skill 不是传统意义上的推荐标签,也不是单纯的 LLM 工具能力,而是一种可被事件触发调用的用户画像单元。它既记录用户可能关心什么,也记录这个画像应在什么事件下生效、有哪些行为证据、生成卡片时应该遵守什么约束。
Profile Skill Store 是本项目的核心设计。
普通画像可能只会保存:
{
"likes": ["美食", "羊肉", "火锅"]
}但 MomentCard 更关注事件下的即时需求,因此画像应该被组织成类似下面的结构:
{
"skill_id": "cold_weather_food_intent",
"name": "冷天饮食即时需求画像",
"activation": {
"events": ["降温", "立冬", "晚饭前"],
"min_confidence": 0.7
},
"evidence": [
{
"type": "search",
"query": "天冷吃什么",
"weight": 0.9
},
{
"type": "searched_video_watch",
"tags": ["羊肉汤", "涮羊肉", "饺子馅"],
"weight": 0.8
},
{
"type": "feed_watch",
"tags": ["家常菜", "热汤"],
"weight": 0.4
}
],
"profile": {
"current_need": "冷天晚饭想要暖身、低决策成本的食物方案",
"likes": ["羊肉", "热汤", "饺子", "家常做法"],
"avoids": ["复杂菜谱", "纯外卖推荐"]
},
"card_contract": {
"style": "直接给方案,不暴露搜索记录",
"actions": ["换个馅", "生成买菜清单", "不吃羊肉"]
}
}这种结构有几个特点:
- 可解释:每个画像都有原始行为证据。
- 可触发:画像不会随时生效,而是在特定事件下被激活。
- 可更新:用户对卡片的点击、跳过、反馈可以继续写回原始交互数据。
- 可生成:卡片生成时不只知道用户偏好,还知道语气、限制和交互入口。
本项目强调事件是推荐成立的前提。没有事件,用户画像只是长期偏好;有了事件,画像才会变成“此时此刻”的需求。
当前优先考虑的事件类型包括:
- 天气事件:降温、下雨、大风、炎热、湿冷。
- 节气事件:立冬、冬至、小寒、清明、端午等。
- 时间事件:晚饭前、睡前、通勤前、周末上午。
- 地点事件:用户途经商圈、地铁站、菜市场、健身房、学校附近。
- 近期焦虑事件:用户反复搜索睡眠、减脂、考试、消费决策等问题。
例如,立冬当天降温,且用户近期搜索过“天冷吃什么”“羊肉汤做法”“饺子馅推荐”,系统才适合生成一张饮食卡片。卡片前台不需要解释“因为你搜过这些”,而是直接呈现:
立冬这一顿,吃点热乎的
羊肉白菜饺子 + 紫菜蛋花汤
暖身 / 好买菜 / 30 分钟能做
[换个馅] [生成买菜清单] [不吃羊肉]
本项目 demo 不采用传统推荐算法的召回、排序和模型训练流程,而是使用 LLM 与 skill-like 数据结构完成原型验证。
推荐流程分为五步:
-
记录原始数据 保存用户搜索、搜索结果点击、视频停留、跳过、收藏、轻量反馈等关键行为。
-
抽取 Profile Skill LLM 从原始行为中抽取用户的垂直意图、偏好、规避项、证据权重和适用事件。
-
监听当前事件 读取天气、节气、时间、地点、近期重复搜索等上下文。
-
匹配并生成卡片 LLM 判断哪些 Profile Skill 被当前事件触发,并按卡片生成约束输出结构化卡片。
-
前端信息流展示 前端只消费结构化卡片数据,不在组件里硬编码复杂分析逻辑。
项目答辩和文档中使用的 GPT-Image-2 架构图 prompt 已整理在:
仓库当前包含两个主要工程:
TokenDance/
├─ douyin-base/ # Vue 3 + Vite 前端展示工程
├─ flow_agent/ # Python 数据分析与卡片生成工程
├─ dataset/ # demo 数据集
├─ index.html # GitHub 展示用静态原型入口
├─ styles.css
├─ script.js
└─ README.md
flow_agent 负责数据处理、LLM 调用和结构化结果生成,适合承载:
- 原始用户搜索与交互日志。
- Profile Skill 抽取与更新。
- 当前事件上下文读取。
- 卡片生成与导出。
建议的数据文件包括:
flow_agent/data/raw_user_events.jsonl
flow_agent/data/profile_skills.json
flow_agent/data/current_events.json
flow_agent/output/ai_feed_cards.json
douyin-base 负责移动端信息流展示,适合承载:
- 抖音式上下滑推荐流。
- AI 卡片在推荐流中的沉浸式呈现。
- 卡片内部轻量交互。
- 用户反馈写回或 mock 写回。
前端建议读取:
douyin-base/public/data/ai_feed_cards.json
当前 demo 优先做三个强事件场景,不考虑复杂赛事推荐。
用户行为锚点:
- 搜索“天冷吃什么”
- 搜索“羊肉汤做法”
- 在搜索结果中长看“涮羊肉蘸料”“饺子馅推荐”
- 自然信息流中对“家常菜”“热汤”内容有停留
事件触发:
- 立冬
- 当天降温
- 晚饭前
卡片价值:
- 直接给出一顿饭的组合。
- 提供换馅、买菜清单、不吃羊肉等轻互动。
用户行为锚点:
- 搜索“附近地铁站”
- 搜索“雨天通勤穿什么”
- 长看低成本通勤、打车省钱相关内容
事件触发:
- 下雨
- 通勤时间
- 用户靠近地铁站或办公区
卡片价值:
- 直接给出通勤方案、出门提醒和轻量备选。
用户行为锚点:
- 连续搜索“电动牙刷怎么选”
- 搜索品牌对比、测评、价格区间
- 在搜索结果中长看横评视频,但未形成明确选择
事件触发:
- 连续多天搜索同一类消费决策问题
- 用户再次刷到相关内容
卡片价值:
- 把多步搜索压缩成一张决策卡。
- 直接给出“更适合你的选择”和关键理由。
信息流卡片必须在刷到瞬间成立,因此前端呈现应遵守:
- 直接给结果:不要先问用户要不要查看推荐。
- 不暴露监控感:不直接展示“因为你搜索过……”。
- 一眼可理解:标题、主建议、三条以内理由。
- 交互足够轻:最多 2-3 个动作按钮。
- 用完即走:不强迫跳转完整工具页。
- 可反馈更新:用户点“不吃羊肉”“换一个”等反馈可写回画像。
这个方向需要避免“过度懂你”的不适感。demo 中应通过产品表达控制边界:
- 前台只呈现自然建议,不暴露具体搜索记录。
- 单次搜索不直接形成强画像,需要结合时间衰减和多证据置信度。
- 自然刷视频行为只作为佐证,不作为强触发。
- 敏感意图需要弱化表达,避免推断过度。
- 用户反馈应能快速修正 Profile Skill。
根目录提供一个零依赖静态原型,可以直接打开:
index.html
前端展示工程:
cd douyin-base
npm install
npm run dev数据分析工程:
cd flow_agent
uv sync
uv run pytestMomentCard 不是一个传统推荐系统 demo,也不是一个普通 AI 聊天工具。它想验证的是:
能否把用户搜索与交互行为沉淀成可调用的 Profile Skills,并在现实事件发生时生成一张用户刷到即理解、即满足、即互动的信息流 AI 卡片。
这也是本项目对赛题“刷到懂你的瞬间”的核心回答。