基于Learning-to-Ask (LA) 框架,ai交互过程中用户画像采集绘制
·

下面我将基于 Learning-to-Ask (LA) 框架,为你设计一个完整的“用户画像采集系统”流程。
对话流设计、后台处理逻辑、状态机、以及知识库更新规则。
一、系统总览:从“对话”到“画像”
核心思想:把用户当成一个“需要被猜出的实体”,系统通过多轮对话,一边提供服务(陪聊/推荐),一边完成画像采集。
| 模块 | 对应论文 | 功能 |
|---|---|---|
| 会话层 | 20 Questions Game | 与用户的多轮对话 |
| 决策层 | IS Module | 决定下一步问什么(缩小范围) |
| 采集层 | KA Module | 决定补什么字段(填充画像) |
| 存储层 | Bayesian KB | 存储带置信度的用户画像 |
二、数据结构定义(后台核心)
1. 用户画像库(Bayesian Profile Store)
禁止存储死值(如 age: 25),必须存储计数分布。
UserProfile: {
"uid_12345": {
"basic": {
"is_student": { "yes": 2, "no": 0, "unk": 1 },
"city_tier_1": { "yes": 3, "no": 0, "unk": 0 },
"age_gt_25": { "yes": 1, "no": 1, "unk": 0 }
},
"interests": {
"likes_fitness": { "yes": 4, "no": 0, "unk": 2 },
"likes_luxury": { "yes": 1, "no": 2, "unk": 1 },
"likes_camping": { "yes": 0, "no": 1, "unk": 0 }
},
"meta": {
"confidence": 0.65, // 综合置信度
"interaction_count": 12,
"last_updated": "2026-06-06"
}
}
}
2. 全局画像字典(Question Bank)
QuestionBank: [
{
"q_id": "Q001",
"text": "平时工作节奏快吗?",
"dimension": "lifestyle",
"type": "binary",
"priority": "high" // IS阶段用
},
{
"q_id": "Q002",
"text": "最近有买过千元以上的耳机吗?",
"dimension": "consumption_power",
"type": "binary",
"priority": "medium" // KA阶段用
}
]
三、对话流程设计(前台交互)
系统会根据用户当前画像的置信度,自动切换对话模式。
场景示例:新用户 uid_12345 的首轮对话
Step 1: 初始化(冷启动)
- System: 初始化空画像,置信度 0。
- Action: 进入 IS Phase(信息搜寻)。
Step 2: IS Phase(快速定性)
目标:用 3-5 个问题,把用户塞进一个“粗颗粒度”的桶里。
| Turn | Bot 发言 | 用户回复 | 后台处理(逻辑) |
|---|---|---|---|
| 1 | “嗨!最近想找点新爱好吗?” | “随便看看” | 无实质信息,跳过。 |
| 2 | “感觉你是个注重效率的人,平时点外卖多吗?” | “是的” | is_busy: yes+1推测:都市白领可能性↑ |
| 3 | “那应该在一线城市打拼吧?” | “对啊” | city_tier_1: yes+1IS 模块确认:锁定“一线城市” |
| 4 | “最近有在关注露营或者飞盘这类活动吗?” | “不太喜欢” | likes_outdoor: no+1 |
Step 3: 判定(Guessing)
- System Logic: 计算后验概率。
- 已知:一线 + 忙碌 + 不爱户外。
- 猜测画像:
{segment: "都市职场青年", consumption: "medium"}。
- Bot: “看你这节奏,估计也是个拼命三郎呀~” (用猜测结果做个性化回应,测试用户反应)。
Step 4: KA Phase(补位采集)
触发条件:IS 阶段已锁定大致画像,且对话未中断。
目标:在用户不反感的前提下,填充高价值细节。
| Turn | Bot 发言 | 用户回复 | 后台处理(逻辑) |
|---|---|---|---|
| 5 | “既然这么忙,平时会买那种即食健康餐吗?” | “偶尔” | diet_healthy_fast: yes+1 |
| 6 | “有没有考虑过给自己买个降噪耳机犒劳下?” | “已经有了” | has_premium_headphone: yes+1关键画像更新:消费力为中高 |
| 7 | “最近有打算换个手机或者平板吗?” | “跳过” | plan_buy_electronics: unk+1 |
Step 5: 结束与沉淀
- Bot: “好的,以后有适合你的好物第一时间告诉你~”
- System: 更新
UserProfile.confidence,对话结束。
四、后台处理逻辑(核心算法)
这是系统的“大脑”。每次用户回复后,触发以下处理链:
1. 响应解析器 (Response Parser)
def parse_response(text: str) -> str:
# 简单规则:可替换为意图识别模型
if any(w in text for w in ["是", "对", "没错", "嗯"]):
return "yes"
if any(w in text for w in ["不是", "没", "错", "不"]):
return "no"
return "unknown"
2. 状态管理器 (State Manager)
class Session:
def __init__(self, uid):
self.uid = uid
self.history = [] # [(q_id, response), ...]
self.stage = "IS" # IS -> GUESSING -> KA -> END
self.max_turns = 7 # 限制提问次数,防骚扰
def add_interaction(self, q, r):
self.history.append((q, r))
if len(self.history) >= 3 and self.stage == "IS":
self.stage = "GUESSING"
3. 决策引擎 (Decision Engine)
IS 阶段(选最能切分人群的)
def select_is_question(session):
# 1. 加载用户当前画像分布
# 2. 计算每个未问问题的“信息熵减少量”
# 3. 选减少量最大的(例如:先问“是否有小孩”比问“是否左撇子”更有效)
return best_splitting_question
KA 阶段(选最缺且最有价值的)
def select_ka_question(session):
user_profile = load_profile(session.uid)
# 筛选:高业务价值 && 低置信度
candidates = []
for attr, counts in user_profile.items():
confidence = max(counts['yes'], counts['no']) / sum(counts.values())
if confidence < 0.7: # 置信度低于70%才补
value = business_value(attr) # 例如“消费力”价值高于“鞋码”
candidates.append((attr, value))
# 选价值最高的那个
return sorted(candidates, key=lambda x: x[1], reverse=True)[0]
4. 知识库更新器 (KB Updater)
def update_profile(uid, attribute, response):
profile = db.get(uid)
if response == "yes":
profile[attribute]['yes'] += 1
elif response == "no":
profile[attribute]['no'] += 1
else:
profile[attribute]['unk'] += 1
# 更新置信度
calc_confidence(profile)
db.save(uid, profile)
五、防骚扰与体验控制(关键)
为了避免变成“查户口”,必须加入熔断机制:
- Turn Limit: 单轮对话最多 7 个画像问题,超出自动转入纯聊天模式。
- Skip Tolerance: 连续 2 次回答
unknown,暂停 KA 阶段 24 小时。 - 伪装策略: 所有 KA 问题必须包装成“推荐理由”或“闲聊”。
- 错误:“请问你的年收入是多少?”
- 正确:“感觉你挺会享受生活的,平时会买那种比较贵的咖啡豆吗?”
六、最终输出:系统运行日志
当你把这套系统跑起来,后台会生成这样的日志:
{
"session_id": "s_98765",
"uid": "uid_12345",
"start_time": "2026-06-06 15:00:00",
"flow": [
{"turn": 1, "q": "Q_city_tier", "r": "yes", "stage": "IS"},
{"turn": 2, "q": "Q_is_busy", "r": "yes", "stage": "IS"},
{"turn": 3, "q": "Q_consumption_high", "r": "yes", "stage": "KA"}
],
"profile_snapshot_before": {"consumption": "unknown"},
"profile_snapshot_after": {"consumption": "high", "confidence": 0.82}
}
这是基于 LA(Learning-to-Ask)框架 设计的真实聊天会话实录。
注意看左侧是用户看到的界面,右侧是后台看不见的处理逻辑。你会发现,用户以为自己在闲聊,实际上系统已经完成了 2 次 IS(定性)+ 2 次 KA(补像)。
七、场景设定
(消费力、兴趣、生活状态)
会话
| 轮次 | 用户视角 (Chat UI) | 后台逻辑 (System Backend) |
|---|---|---|
| 1 | Bot: 哈喽!我是小月,以后可以帮你淘点好东西~ 最近是准备搬新家,还是单纯想逛逛呀? | 逻辑:IS Phase (信息搜寻)。 目的:区分“刚需采购” vs “随意浏览”,以此判断消费紧迫度。 动作:加载问题 Q_intent。 |
| 1 | User: 刚毕业,先随便看看。 | 逻辑:解析响应。parse("刚毕业") → 标记为 student_or_new_grad: yes。推论:消费力大概率中等,价格敏感度高。 |
| 2 | Bot: 刚毕业确实自由时间多!那你平时宅家多一点,还是喜欢往外跑呀? | 逻辑:IS Phase。 目的:判断生活方式(宅 vs 动),决定后续推荐品类(数码/家居 vs 户外/运动)。 动作:加载问题 Q_lifestyle。 |
| 2 | User: 还挺爱出去玩的,周末基本都不在家。 | 逻辑:解析响应。response: yes。更新 KB*: active_lifestyle: {yes: 1}。决策:IS 信息已足够,准备进入 Guess 阶段。 |
| 3 | Bot: 感觉你这状态特别棒!像极了那种在一线城市打拼、又很会享受生活的酷盖~ | 逻辑:Guessing (推测)。 计算:基于 new_grad + active + tier1_city。猜测画像: {segment: "都市新锐青年", budget: "medium"}。用这句话试探用户,如果用户反驳则修正。 |
| 3 | User: 哈哈,被你说中了! | 逻辑:确认对齐。 用户认可猜测 → verdict = True。解锁:开启 KA Phase(开始填细节)。 |
| 4 | Bot: 那肯定得装备到位呀!你平时买数码配件,是追求那种极客黑科技,还是觉得够用就行呀? | 逻辑:KA Phase (知识获取)。 目的:补“消费偏好”。 选问逻辑:当前画像缺失 tech_preference,且该字段对电商推荐价值极高。伪装:把画像采集包装成“帮挑东西”。 |
| 4 | User: 肯定是越新越好啊,不过预算有限。 | 逻辑:解析响应。early_adopter: yes + price_sensitive: yes。写 KB: prefers_new_tech: {yes: 1}, budget_tight: {yes: 1}。 |
| 5 | Bot: 懂了,讲究个性价比高的新鲜感!最近那种便携式咖啡机挺火的,你平时有喝咖啡的习惯吗? | 逻辑:KA Phase。 目的:补“生活习惯”。 选问逻辑:基于上一轮“预算有限但爱新鲜”,推测可能有“办公室/租房轻改造”需求。 如果回答“有”,则 coffee_lover: yes,可推咖啡机/挂耳。 |
| 5 | User: 有啊,每天必喝。 | 逻辑:解析响应。 写 KB: drinks_coffee: {yes: 1}。置信度达标:核心字段已填满。 |
| 6 | Bot: 那就对了!以后有那种既便宜又有范儿的好物,我第一时间通知你~ | 逻辑:End Episode。 关闭会话,更新用户总表。 最终画像: {"segment": "都市新锐", "消费力": "中", "偏好": "数码尝鲜+咖啡控", "置信度": 0.88} |
最终沉淀(User Profile)
当对话结束时,系统内部生成的数据是这样的。用户本人完全看不到这张表:
{
"uid_888": {
"basic": {
"is_student_or_new_grad": { "yes": 1, "no": 0, "unk": 0 },
"city_tier_1": { "yes": 1, "no": 0, "unk": 0 },
"active_lifestyle": { "yes": 1, "no": 0, "unk": 0 }
},
"consumption": {
"prefers_tech": { "yes": 1, "no": 0, "unk": 0 },
"price_sensitive": { "yes": 1, "no": 0, "unk": 0 },
"drinks_coffee": { "yes": 1, "no": 0, "unk": 0 }
},
"meta": {
"confidence": 0.88,
"source": "conversation_la",
"tags": ["都市新锐青年", "性价比党", "咖啡爱好者"]
}
}
}
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)