
做用户行为模拟和问卷预研时最常遇到的一个尴尬现象是把同一个问题交给大模型扮演“目标用户”无论怎么调整 Prompt得到的回答风格都高度趋同。换一句话说模型不像某个具体的人更像一个“平均人”。如果想让 AI 模拟出不同性格、不同决策偏好、不同风险容忍度的真实用户群体单纯靠一套 System Prompt 很难覆盖这种多样性。“Mind the Gaps: Mixture-of-Minds for Human Simulation” 这个题目里最值得注意的词是 Gaps。它有两层含义第一层是人类行为与大模型默认输出之间存在系统性差异第二层是不同人类个体之间的认知差异。本文围绕 Human Simulation人类模拟场景设计并实现一套基于 Mixture-of-Minds思维混合的模拟框架用多个相互独立的“思维模块”共同逼近真实用户的决策过程。无论你是做 Agent 应用、用户研究、推荐系统冷启动还是行为经济学仿真这套思路都有直接参考价值。1. 背景与核心概念在展开代码之前先建立共识什么是人类模拟为什么单一模型不够用。1.1 人类模拟是什么人类模拟英文常写作 Human Simulation指用计算机程序模拟人类在特定场景下的认知、决策和交互行为。它在很多领域都有落地需求产品经理在做问卷调研前想预判不同用户对定价的接受程度。游戏策划希望 NPC 拥有差异化性格而不是千篇一律的对话回复。社会科学研究中需要低成本复制实验人群做行为经济学仿真。推荐系统团队希望模拟用户对候选商品的点击和购买倾向。大语言模型出现后很多团队直接用 ChatGPT 或开源模型“扮演用户”把 Prompt 写成“你是一个 25 岁的一线城市白领”然后让它回答问题。这种做法在简单场景下有效但一旦涉及多因素权衡例如价格、品牌、社交认同、售后风险同时起作用单一模型很容易陷入“道理我都懂”的平均化回答。1.2 为什么单一模型会“漏掉”人类行为的关键空白“Mind the Gaps”中的 Gaps我认为对应三个关键空白。第一个是认知风格空白。真实人类不是完全理性的也不是完全情绪化的。系统 1快思考和系统 2慢思考会在不同情境下各自接管决策。单一大模型在回答消费决策类问题时往往默认进入“理性分析模式”把利弊列得非常工整。可实际上大量真实购买决策是由冲动、从众、恐惧错过驱动的。第二个是个体差异空白。用户不是一个抽象集合而是由不同偏好参数构成的分布。哪怕两个人都想买智能手表一个人关注健康监测精度另一个人关注社交炫耀价值他们最终的决策逻辑完全不同。单一 Prompt 只能编码一种逻辑。第三个是稳定性与可解释性空白。直接问大模型“你会买吗”它可能给出模棱两可的答案。你很难知道它是基于什么假设做出的判断。而人类行为模拟系统如果无法解释“为什么这个模拟用户不愿意购买”在业务上就无法指导后续跟进策略。1.3 Mixture-of-Minds 的核心思想Mixture-of-Minds 借鉴了 Mixture-of-Experts 的“分而治之”思想但目标不是提升模型指标而是模拟人类行为的横向多样性。具体做法是将“人类用户”抽象成一组相互独立、可配置的思维模块每个思维模块代表一种决策逻辑。例如效用最大化思维只看性价比和需求匹配度。风险厌恶思维考虑售后、贬值、维权成本。社会认同思维参考身边人是否购买、品牌是否被认可。情绪冲动思维被广告、限时折扣、稀缺性驱动。当模拟用户面对一个决策时系统让这些思维模块分别给出倾向分数再通过权重混合得到最终决策。权重可以由研究者预设也可以通过小样本校准得到。这样既保留了个体差异又能解释最终决策由哪几个思维主导。2. 整体架构与方案对比在进入代码之前先明确整体架构避免后面陷入细节。2.1 系统设计这个模拟系统的核心组件分为四层输入层负责接收模拟场景例如问卷题目、商品信息、环境约束。思维层包含多个 BaseMind 子类每个子类实现独立的打分逻辑。混合层根据权重将多个思维分数聚合成最终决策分数。输出层将分数转换为人类可读的决策文本例如“购买”“不购买”“犹豫”。在实现时我刻意让“思维层”既支持规则计算也支持大模型增强。规则计算的好处是逻辑透明、无需网络请求、可以快速调试大模型增强的好处是能生成自然语言解释让模拟结果更贴近真人表达。2.2 与其他方案的对比方案优点缺点适用场景单一 Prompt 模拟实现简单零代码输出同质化严重缺少解释快速 DemoFine-tune 专用模型能拟合真实用户分布成本高、数据难获取、迭代慢有大量真实语料的团队多智能体对话模拟交互过程丰富需要复杂的对话管理结果不稳定开放域对话研究Mixture-of-Minds可解释、可配置、低成本需要设计思维模块与权重问卷预研、行为仿真、游戏 NPCMixture-of-Minds 的核心优势在于“可解释的多样性”。它不追求一个模型输出所有可能性而是用多个简单模型分别覆盖不同的行为模式模式之间通过权重组合出连续变化。2.3 适用范围这套方案适合四类任务问卷预测试在大规模发放问卷前先用模拟用户跑一遍检查题目是否存在引导性。行为经济仿真设定不同风险偏好、时间偏好参数观察群体决策变化。游戏 NPC 决策为不同 NPC 配置不同思维权重让它们对同一事件作出差异化反应。Agent 用户画像生成为下游 Agent 生成多样化的模拟交互数据。需要注意的是它不适合替代真实用户反馈。模拟结果只能作为研究假设和预筛工具不能直接当作真实市场结论。3. 环境准备与版本说明下面是一个可以在本地直接运行的最小实现。由于大模型生态更新很快本文不绑定某个特定版本而是给出通用运行思路。3.1 运行环境操作系统Windows / macOS / Linux 均可。Python 版本建议 3.10 及以上。依赖库无需额外第三方库纯 Python 标准库即可跑通规则版。可选增强如果需要接入大模型生成自然语言解释需要安装 openai 等 SDK并且准备对应的 API Key。版本需要根据你的项目实际情况调整本文示例以常见环境为例重点演示配置思路。3.2 项目结构human_simulation/ ├── config.py # 全局配置包括思维模块权重 ├── minds.py # 思维模块定义 ├── mixer.py # 混合器与决策器 ├── agent.py # 模拟用户代理 ├── simulator.py # 批量模拟入口 └── main.py # 命令行演示入口这个结构适合学习也方便后续扩展成 Web 服务。3.3 依赖安装规则版不需要安装依赖创建虚拟环境后直接运行即可mkdir human_simulation cd human_simulation python -m venv venv source venv/bin/activate # Windows 下为 venv\Scripts\activate如果后面要接大模型增强再单独安装 SDKpip install openai这里的示例思路如下需要按你实际使用的模型和 SDK 版本调整。4. 核心原理拆解这一节是整个项目的核心我会逐块讲解思维模块的设计。4.1 把“人”拆成多份思维传统 Agent 设计喜欢把人格写进一份长长的 System Prompt。但人类决策并不是由一个统一理性系统完成的而是多个子系统竞争和协作的结果。在代码层面每个“思维”就是一个实现了统一接口的对象# minds.py from abc import ABC, abstractmethod class BaseMind(ABC): 所有思维模块的基类。 每个思维模块负责从自己的视角对当前决策情境打分 分数范围统一映射到 0 到 1 之间。 name: str base_mind description: str def __init__(self, context: dict): self.context context abstractmethod def score(self) - float: 返回该思维对积极决策的倾向分数0 表示强烈反对1 表示强烈支持。 raise NotImplementedError这里的context是外部传入的情境字典包含价格、需求强度、预算、社交影响等字段。不同的思维模块可以只读取与自己相关的字段忽略其他信息。这种设计保证了模块之间的低耦合。4.2 每个 Mind 的内部设计我设计了四个典型的思维模块覆盖大部分消费决策场景。第一个是效用最大化思维它关注“商品带来的实际价值是否超过价格”。在真实用户中这类人对应那些会看参数评测、对比配置的理性消费者。class UtilityMind(BaseMind): 效用最大化思维只看需求匹配度与性价比。 name utility description 基于商品效用、价格与预算做理性评估。 def score(self) - float: usefulness self.context.get(usefulness, 5) / 10 price self.context.get(price, 3000) budget self.context.get(budget, 5000) # 预算不足时即使效用再高也会大幅扣分 if price budget: return round(usefulness * 0.2, 2) utility usefulness * (budget / price) return round(min(utility, 1.0), 2)第二个是风险厌恶思维。它关注的是“买了之后会不会后悔”。哪怕商品本身性价比很高如果用户风险厌恶程度高仍然可能放弃购买。class RiskAverseMind(BaseMind): 风险厌恶思维考虑售后、贬值、冲动消费风险。 name risk_averse description 关注购买后的潜在风险倾向于保守决策。 def score(self) - float: risk self.context.get(risk, 0.5) after_sale self.context.get(after_sale_quality, 0.7) # 售后越差风险越高购买倾向越低 effective_risk risk * (1.0 - after_sale 0.3) return round(max(0.0, 1.0 - effective_risk * 1.5), 2)第三个是社会认同思维。许多购买决策不是纯个人行为而是社会行为。它会考虑“身边人是否买”“品牌口碑”“是否值得发朋友圈”。class SocialConformityMind(BaseMind): 社会认同思维根据社交圈口碑、品牌热度做决策。 name social description 受到社交圈、品牌热度与从众心理影响。 def score(self) - float: social_pressure self.context.get(social_pressure, 0.3) brand_reputation self.context.get(brand_reputation, 0.6) visible_benefit self.context.get(social_visibility, 0.4) score 0.2 0.3 * social_pressure 0.3 * brand_reputation 0.2 * visible_benefit return round(min(score, 1.0), 2)第四个是情绪冲动思维。限时折扣、稀缺感、广告冲击都会激活这类思维。它的特点是高低分切换剧烈没有中间地带。class ImpulseMind(BaseMind): 情绪冲动思维被稀缺、折扣和即时满足驱动。 name impulse description 对限时折扣、稀缺性做出快速反应。 def score(self) - float: discount_rate self.context.get(discount_rate, 0.0) scarcity self.context.get(scarcity, 0.0) # 折扣和稀缺同时存在会产生加速效应 if discount_rate 0.2 and scarcity 0.5: return 0.9 if discount_rate 0.1: return 0.6 return 0.2这四个思维并不需要完全符合心理学模型它们的意义在于展示“如何把不同决策逻辑模块化”。你可以根据业务替换成自己的思维集合。4.3 混合策略加权、投票与路由拿到多个思维分数后如何得到最终决策我实现了三种混合策略。第一种是加权平均适合研究者明确知道目标人群的属性分布。例如“这个模拟用户有 40% 理性、30% 风险厌恶、20% 从众、10% 冲动”直接按比例加权。# mixer.py from typing import List, Tuple from minds import BaseMind class WeightedMixer: 加权平均混合器每个思维权重之和应接近 1。 def __init__(self, minds_with_weights: List[Tuple[BaseMind, float]]): self.items minds_with_weights def mix(self) - Tuple[float, dict]: total_score 0.0 details {} for mind, weight in self.items: s mind.score() details[mind.name] {score: s, weight: weight} total_score weight * s return round(total_score, 2), details第二种是投票阈值适合多智能体讨论场景。每个思维不是打分而是给出“买”或“不买”的离散意见最终按多数决。这里为保持接口统一我用 0.5 作为阈值。class VotingMixer: 投票混合器每个思维投一票超过半数则通过。 def __init__(self, minds: List[BaseMind]): self.minds minds def mix(self) - Tuple[float, dict]: vote_results [] agree_count 0 for mind in self.minds: s mind.score() vote 1 if s 0.5 else 0 vote_results.append({mind: mind.name, score: s, vote: vote}) agree_count vote final_score agree_count / len(self.minds) return round(final_score, 2), {vote_results: vote_results}第三种是情境路由适合场景明确的情况。例如“当价格低于预算 20% 时直接进入冲动思维判断否则走理性思维”。路由本质上是 if-else 规则虽然简单但在工程上很实用。class RoutingMixer: 路由混合器根据情境字段决定使用哪个思维。 def __init__(self, minds: dict): # minds 是 {思维名: 思维对象} 的字典 self.minds minds def mix(self) - Tuple[float, dict]: price self.context.get(price, 0) budget self.context.get(budget, 5000) if price budget * 0.8: mind self.minds[impulse] else: mind self.minds[utility] s mind.score() return round(s, 2), {routed_to: mind.name, score: s}需要注意的是RoutingMixer需要读取context所以这里的构造函数需要额外处理后面完整代码会修正。4.4 用 Gaps 指导权重权重是整个系统中最重要的“旋钮”。在人类模拟项目中权重不应该拍脑袋定而应来自三个方面真实调研数据通过小样本问卷校准让模拟用户的行为分布接近真实用户。理论假设行为经济学中的前景理论、社会认同理论都可以转化为权重约束。场景先验不同产品品类天然有不同的决策权重。买房子和买奶茶的思维权重显然不同。此外Mixture-of-Minds 还有一个独特价值通过对比“单一模型输出”和“混合模型输出”可以定位人类行为中被单一模型遗漏的 Gaps。例如如果真实用户中有 30% 因为“售后差”而放弃购买但单一模型完全没有体现说明风险厌恶思维缺失或权重过低。5. 完整实战案例模拟问卷调研下面我们构建一个完整可运行的模拟项目。场景是一个品牌想推出一款售价 2999 元的智能手表产品经理想提前模拟三种不同类型用户对“是否购买”的态度。5.1 业务场景定义我们模拟三位用户用户 A理性参数党预算 4000看重健康监测判断力强不容易冲动。用户 B社交敏感型预算充足买手表更在意品牌和身边人推荐。用户 C冲动消费型预算紧张但容易被“限时八折”“库存紧张”刺激。对应到思维权重上三位用户应该拥有完全不同的权重分布。5.2 配置文件创建config.py# config.py PRODUCT_SCENARIO { product: 智能手表, price: 2999, budget: 4000, usefulness: 8.5, risk: 0.3, after_sale_quality: 0.8, social_pressure: 0.4, brand_reputation: 0.7, social_visibility: 0.5, discount_rate: 0.2, scarcity: 0.6, } AGENT_PRESETS { 理性参数党: { utility: 0.5, risk_averse: 0.3, social: 0.1, impulse: 0.1, }, 社交敏感型: { utility: 0.1, risk_averse: 0.1, social: 0.7, impulse: 0.1, }, 冲动消费型: { utility: 0.1, risk_averse: 0.0, social: 0.2, impulse: 0.7, }, }把权重放进配置的好处是后面做群体模拟时可以批量生成不同参数组合。5.3 核心代码agent.py负责把思维模块、混合器和用户配置绑定到一起# agent.py from minds import UtilityMind, RiskAverseMind, SocialConformityMind, ImpulseMind from mixer import WeightedMixer class Agent: 模拟用户代理持有思维模块和对应的权重。” def __init__(self, name: str, weights: dict, context: dict): self.name name self.context context mind_map { utility: UtilityMind, risk_averse: RiskAverseMind, social: SocialConformityMind, impulse: ImpulseMind, } self.minds_with_weights [] for mind_name, weight in weights.items(): if mind_name in mind_map and weight 0: mind mind_map[mind_name](context) self.minds_with_weights.append((mind, weight)) self.mixer WeightedMixer(self.minds_with_weights) def decide(self): final_score, details self.mixer.mix() if final_score 0.7: decision 强烈倾向购买 elif final_score 0.5: decision 可以购买但不算积极 elif final_score 0.3: decision 犹豫需要进一步打动 else: decision 不买 return { agent: self.name, final_score: final_score, decision: decision, details: details, }simulator.py批量运行所有模拟用户# simulator.py from agent import Agent from config import PRODUCT_SCENARIO, AGENT_PRESETS def run_simulation(): results [] for agent_name, weights in AGENT_PRESETS.items(): agent Agent(agent_name, weights, PRODUCT_SCENARIO) results.append(agent.decide()) return resultsmain.py作为入口输出结果# main.py import json from simulator import run_simulation if __name__ __main__: results run_simulation() for result in results: print(json.dumps(result, ensure_asciiFalse, indent2)) print(- * 40)5.4 运行与验证在项目目录下执行python main.py预期输出类似{ agent: 理性参数党, final_score: 0.83, decision: 强烈倾向购买, details: { utility: {score: 0.85, weight: 0.5}, risk_averse: {score: 0.69, weight: 0.3}, social: {score: 0.66, weight: 0.1}, impulse: {score: 0.9, weight: 0.1} } }跑通后你可以尝试修改两处参数观察变化把PRODUCT_SCENARIO里的price提高到 4500观察理性参数党和冲动消费型的行为差异。把AGENT_PRESETS里权重改成极端值例如让impulse为 1.0模拟“完全情绪化用户”。这个实验能直观展示 Mixture-of-Minds 的价值最终决策不是某个单一思维决定的而是群体思维的加权结果。5.5 接入 LLM 增强规则版能给出数值决策但在生成解释文本时缺少灵活性。建议在规则分数基础上引入大模型生成“模拟用户的内心旁白”。这里给出一个可运行的思路需要安装openai并配置 API Key。# llm_enhance.py from openai import OpenAI client OpenAI() # 读取环境变量中的 API Key def generate_agent_reason(agent_name, final_score, details, scenario): prompt f 你是一个用户行为模拟解释器。请用第一人称口吻解释为什么这个模拟用户会做出如下决策。 用户类型{agent_name} 决策倾向分数{final_score} 思维明细{details} 商品信息{scenario} 要求输出 50 到 100 字语气自然像真实用户在访谈中说的话。不要泄露你是 AI。 response client.chat.completions.create( modelgpt-4o-mini, messages[{role: user, content: prompt}], temperature0.7, ) return response.choices[0].message.content这段代码只是示例思路你可能需要根据你使用的模型和 SDK 版本调整参数。核心思想是规则机制负责保证决策稳定可解释LLM 负责把决策翻译成人类可读的语言。6. 常见问题与排查思路在实际运行和扩展这个项目时会遇到一些典型问题下面整理成表格。问题现象常见原因解决思路所有模拟用户最终决策完全一致权重设置太接近或者多个思维分数互相抵消检查 AGENT_PRESETS将不同用户的核心思维权重拉开差距某个思维始终不起作用权重设置为 0或者 context 缺少该思维所需字段检查配置字典确认字段名拼写一致final_score 计算出错出现负数或大于 1思维模块没有归一化或权重之和远大于 1让每个思维得分约束在 0 到 1权重归一化后再混合LLM 增强输出风格趋同temperature 太低或 Prompt 限制了表达空间调高 temperature在 Prompt 中强调“有自己的语气和偏好”模拟结果与真实调研差异大使用的思维维度不符合业务场景收集真实用户访谈重定义思维模块而不是继续调权重批量模拟时接口调用超时LLM 被串行调用阻塞了整体流程使用 asyncio 并发控制或先跑规则版再做 LLM 解释想要验证单一模型与混合模型的差异缺少对照组加一组“只用 utility 思维”的用户配置对比决策分布排查时可以按这个顺序先确认 context 字段完整再确认思维模块正常打分然后确认权重没有丢失最后检查混合逻辑。7. 最佳实践与工程建议在项目落地阶段以下经验值得重视。7.1 把思维模块做成可插拔组件不要把所有决策逻辑堆在一个类里。每个思维模块独立成文件方便单独测试。例如你想增加一个“环保意识思维”只需要新增一个EnvironmentMind然后在mind_map里注册即可。7.2 用配置驱动权重不要硬编码权重是业务参数不是代码逻辑。把权重放在 JSON 或 YAML 配置文件中可以让产品经理直接参与调参而不需要改动 Python 代码。生产环境还可以将配置放在配置中心支持热更新。# agent_config.yaml agents: 理性参数党: utility: 0.5 risk_averse: 0.3 social: 0.1 impulse: 0.17.3 对模拟结果做分布校验不要只看单个模拟用户的决策还要看群体分布。例如跑 1000 个模拟用户统计购买比例、价格敏感曲线再与真实历史数据对比。如果分布偏移过大优先检查权重参数其次检查思维模块的公式假设。# distribution_check.py from agent import Agent from config import PRODUCT_SCENARIO import random def run_group_simulation(n1000): buy_count 0 scores [] for _ in range(n): weights { utility: random.uniform(0.0, 0.6), risk_averse: random.uniform(0.0, 0.4), social: random.uniform(0.0, 0.5), impulse: random.uniform(0.0, 0.5), } agent Agent(sample, weights, PRODUCT_SCENARIO) result agent.decide() scores.append(result[final_score]) if result[final_score] 0.5: buy_count 1 print(f模拟购买率: {buy_count / n:.2%}) print(f平均倾向分数: {sum(scores) / n:.2f})7.4 善用日志和可观测性在每次决策中记录完整的思维明细每个思维的分数、权重、最终混合分数。这样当结果异常时可以定位是哪个思维模块出了问题而不是盲目调整全局参数。7.5 明确伦理边界大模型人类模拟在问卷预调研、用户分层、产品早期验证上有价值但必须注意不能将模拟结果直接等同于真实用户意见不能利用模拟用户进行误导性营销实验。涉及真实用户数据的场景需要获得合法授权并遵守最小必要原则。在生产环境中使用这类框架建议在输出中注明“AI 生成模拟结果仅供参考”。8. 总结Mixture-of-Minds 提供了一种平衡“行为多样性”和“决策可解释性”的人类模拟思路。它先把人类决策拆解成多个独立思维模块再用加权、投票或路由机制合成最终行为。相比单一 Prompt 模拟这种方案的优势在于每个决策都能追溯到具体思维权重方便研究者校准和解释。在你自己的项目中可以先从四个思维模块入手跑通规则版再逐步接入 LLM 生成自然语言解释。重点是根据业务场景定义思维类型并用真实调研数据持续校准权重。记住人类模拟的最终目标不是让模型“看起来像人”而是让模型的分工和权衡逻辑能够覆盖真实人群中的关键决策模式。后面如果想深入可以继续探索行为经济学中的前景理论、多智能体博弈交互以及基于强化学习的权重自动校准这些都是很好的延伸方向。