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+1
IS 模块确认:锁定“一线城市”
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)

五、防骚扰与体验控制(关键)

为了避免变成“查户口”,必须加入熔断机制

  1. Turn Limit: 单轮对话最多 7 个画像问题,超出自动转入纯聊天模式。
  2. Skip Tolerance: 连续 2 次回答 unknown,暂停 KA 阶段 24 小时。
  3. 伪装策略: 所有 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
写 KBprefers_new_tech: {yes: 1}, budget_tight: {yes: 1}
5 Bot: 懂了,讲究个性价比高的新鲜感!最近那种便携式咖啡机挺火的,你平时有喝咖啡的习惯吗? 逻辑KA Phase
目的:补“生活习惯”。
选问逻辑:基于上一轮“预算有限但爱新鲜”,推测可能有“办公室/租房轻改造”需求。
如果回答“有”,则 coffee_lover: yes,可推咖啡机/挂耳。
5 User: 有啊,每天必喝。 逻辑:解析响应。
写 KBdrinks_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": ["都市新锐青年", "性价比党", "咖啡爱好者"]
    }
  }
}
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐