创意碰撞合伙人:用 Python 统计沟通后的想法增量,找到你的最佳 Brainstorming 拍档。
一、实际应用场景描述
你有没有过这种体验:
跟 A 喝完咖啡回来,路上就在备忘录里敲了三个新点子,恨不得立刻回公司验证。跟 B 开完两小时会,除了"嗯嗯对""收到"之外什么都没留下,回来甚至觉得脑子被掏空了。
跟 C 聊天的时候觉得特别热闹,笑了一路,但坐回电脑前发现——一个能用的想法都没有。跟 D 聊天全程没怎么笑,甚至偶尔有点"被挑战"的不适感,但回去复盘发现笔记里多了一整页新思路。
同样是两个人说话,为什么有些对话是"创意催化剂",有些只是"时间黑洞"?
更扎心的是:你凭印象觉得"跟 A 聊天最有收获",但如果你真的去翻记录,可能会发现过去三个月跟 A 聊了十次,只有两次产生了想法;反而跟 E 聊了三次,每次都能蹦出新东西——只是 E 不太会来事儿,所以你本能地更少约 TA。
这就是"创意碰撞合伙人"要解决的事:用数据说话,找出那个真正能跟你撞出火花的沟通伙伴。
二、痛点引入
常见困境 隐藏问题
brainstorming 会开完啥也没留下 参会人员搭配不当,缺乏认知多样性
跟某些人"聊得很嗨"但没产出 社交愉悦 ≠ 认知增量,混淆了两个维度
直觉选搭档,结果不稳定 记忆有偏差,近因效应和光环效应干扰判断
创意灵感来源模糊不清 不知道自己的想法是从哪来的,无法复制成功条件
想组局但不知道该叫谁 凭感觉凑人,缺乏"认知互补"的考量
核心矛盾:我们选择沟通伙伴的标准通常是"聊得来""关系好""方便约",但这些标准和"能产生创意碰撞"几乎没有相关性。创意碰撞需要的是认知差异 + 心理安全感 + 建设性冲突——这三个要素跟"关系好"不完全重叠。
这个程序做的事情:每次沟通后记录"想法增量",长期积累后自动排序,帮你找到真正的创意碰撞合伙人。
三、核心逻辑讲解
理论基础
三个核心概念:
1. 认知多样性(Cognitive Diversity):Page 的"多样性预测定理"证明,认知工具集不同的人组成的团队,解决问题能力强于能力更强的同质化团队。你的创意碰撞合伙人应该在思维方式上跟你有明显差异。
2. 建设性冲突(Constructive Conflict):创意碰撞不是"互相认同",而是"互相挑战但保持尊重"。适度的认知摩擦是想法产生的必要条件。
3. 创意产出可量化:每个想法可以被记录为一条结构化数据——主题、类型(新方向/改进/关联/质疑)、可执行度、后续动作。累计计数 + 质量加权 = 沟通伙伴的"创意产能评分"。
程序设计思路
┌──────────────────────────────────────────────┐
│ 配置层 (IdeaTypes & ScoringRules) │
│ 想法分类、评分权重、伙伴匹配度算法 │
├──────────────────────────────────────────────┤
│ 沟通记录器 (ConversationLogger) │
│ 记录单次对话 → 捕捉想法 → 结构化存储 │
├──────────────────────────────────────────────┤
│ 想法评估器 (IdeaEvaluator) │
│ 对每条想法评分:新颖度 × 可行度 × 关联度 │
├──────────────────────────────────────────────┤
│ 伙伴分析仪 (PartnerAnalyzer) │
│ 聚合历史 → 计算人均想法产出 → 匹配度排名 │
├──────────────────────────────────────────────┤
│ 碰撞推荐器 (CollisionRecommender) │
│ 基于认知互补 + 历史产能 → 推荐最佳组合 │
├──────────────────────────────────────────────┤
│ CLI 入口 (main) │
│ 交互式记录 / 生成排行榜 / 推荐拍档 │
└──────────────────────────────────────────────┘
关键设计决策:
1. 想法不是"有或无",而是有类型的。 新方向型(从零到一)、改进型(优化已有方案)、关联型(跨领域连接)、质疑型(推翻错误前提)——不同类型的想法权重不同。
2. 沟通质量 ≠ 想法数量。 一个人让你产生了 10 个小想法,另一个人让你产生了 2 个大想法——后者可能更有价值。所以有"质量加权总分"。
3. 匹配度不仅看产能,还看互补性。 你和对方在哪些维度上不同?专业背景?思维偏好?沟通风格?互补性越高,碰撞潜力越大。
4. 最低样本量保护。 只聊过一次的人不参与排名,避免偶然性误导。
四、代码模块化讲解(带注释)
4.1 配置层:想法分类与评分规则
# 想法类型及基础权重
IDEA_TYPES = {
"new_direction": { # 全新方向:从零到一的原创想法
"label": "新方向",
"base_weight": 1.5,
"description": "之前完全没考虑过的路径",
},
"improvement": { # 改进型:对已有方案的优化
"label": "改进",
"base_weight": 1.0,
"description": "让现有方案更好的微调",
},
"connection": { # 关联型:跨领域/跨项目的连接
"label": "跨界关联",
"base_weight": 1.3,
"description": "把一个领域的思路用到另一个领域",
},
"challenge": { # 质疑型:推翻错误前提
"label": "质疑/推翻",
"base_weight": 1.2,
"description": "发现之前的假设是错的",
},
"clarification": { # 澄清型:理清模糊地带
"label": "澄清",
"base_weight": 0.7,
"description": "把模糊的想法变得清晰可执行",
},
}
# 想法评分维度 (1~5分)
IDEA_SCORING = {
"novelty": {"weight": 0.35, "label": "新颖度:多大程度上是新的"},
"feasibility": {"weight": 0.30, "label": "可行度:多大概率能落地"},
"impact": {"weight": 0.35, "label": "影响力:如果做成价值多大"},
}
# 认知互补维度(用于计算匹配度)
COMPLEMENTARITY_DIMENSIONS = [
"domain_expertise", # 专业领域
"thinking_style", # 思维偏好 (发散/收敛)
"working_style", # 工作方式 (快/慢, 独/合)
"industry_context", # 行业背景
]
# 最低样本量
MIN_CONVERSATIONS = 3
4.2 数据模型:想法与对话的结构化表示
@dataclass
class Idea:
idea_id: str
description: str
idea_type: str # 对应 IDEA_TYPES 的 key
novelty: int # 1~5
feasibility: int # 1~5
impact: int # 1~5
tags: list[str] = field(default_factory=list)
follow_up: str = "" # 后续动作
created_at: str = ""
def quality_score(self) -> float:
"""计算单条想法的质量加权分 (0~5)"""
return (
self.novelty * IDEA_SCORING["novelty"]["weight"]
+ self.feasibility * IDEA_SCORING["feasibility"]["weight"]
+ self.impact * IDEA_SCORING["impact"]["weight"]
)
def weighted_value(self) -> float:
"""结合类型权重后的最终价值"""
type_weight = IDEA_TYPES[self.idea_type]["base_weight"]
return self.quality_score() * type_weight
@dataclass
class Conversation:
conv_id: str
partner_id: str
partner_name: str
date: str
duration_min: int
context: str # coffee/chat/meeting/walk/call
ideas: list[Idea] = field(default_factory=list)
partner_traits: dict = field(default_factory=dict) # 认知特征快照
mood_before: int = 3 # 1~5
mood_after: int = 3 # 1~5
def idea_count(self) -> int:
return len(self.ideas)
def total_idea_value(self) -> float:
"""本次对话产生的想法总价值"""
return sum(idea.weighted_value() for idea in self.ideas)
def ideas_per_hour(self) -> float:
"""每小时想法产出率"""
hours = self.duration_min / 60.0
if hours == 0:
return 0.0
return len(self.ideas) / hours
def value_per_hour(self) -> float:
"""每小时想法价值产出率"""
hours = self.duration_min / 60.0
if hours == 0:
return 0.0
return self.total_idea_value() / hours
4.3 沟通记录器:交互式想法捕捉
class ConversationLogger:
def __init__(self, data_file: str = "conversations.json"):
self.data_file = Path(data_file)
self.conversations: list[Conversation] = []
self._load()
def log_interactive(self) -> Conversation:
"""交互式记录一次对话及其产出的想法"""
print("\n💬 记录一次沟通对话")
print("=" * 50)
partner_name = input("对方姓名: ").strip()
partner_id = input("对方ID: ").strip()
date = input("日期 (YYYY-MM-DD, 回车=今天): ").strip() or datetime.now().strftime("%Y-%m-%d")
duration = int(input("时长(分钟): "))
context = input("场景 (1:咖啡 2:散步 3:会议 4:电话 5:其他): ").strip()
ctx_map = {"1": "coffee", "2": "walk", "3": "meeting", "4": "call", "5": "other"}
context = ctx_map.get(context, context)
mood_before = int(input("聊天前心情 (1~5): "))
mood_after = int(input("聊天后心情 (1~5): "))
# 记录认知特征(用于后续互补性分析)
print("\n对方的认知特征 (用于匹配度分析):")
traits = {}
for dim in COMPLEMENTARITY_DIMENSIONS:
traits[dim] = input(f" {dim}: ").strip()
conv = Conversation(
conv_id=uuid.uuid4().hex[:8],
partner_id=partner_id,
partner_name=partner_name,
date=date,
duration_min=duration,
context=context,
partner_traits=traits,
mood_before=mood_before,
mood_after=mood_after,
)
# 记录想法
print(f"\n🧠 这次聊天产生了多少个新想法?")
print("(输入想法描述,空行结束)")
while True:
desc = input("\n想法描述 (回车结束): ").strip()
if not desc:
break
print("类型:")
for i, (k, v) in enumerate(IDEA_TYPES.items()):
print(f" [{i}] {v['label']} - {v['description']}")
type_idx = int(input("选择: "))
idea_type = list(IDEA_TYPES.keys())[type_idx]
novelty = self._prompt_score("新颖度 (1~5)")
feasibility = self._prompt_score("可行度 (1~5)")
impact = self._prompt_score("影响力 (1~5)")
tags = input("标签 (逗号分隔, 可选): ").strip()
follow_up = input("后续动作: ").strip()
idea = Idea(
idea_id=uuid.uuid4().hex[:6],
description=desc,
idea_type=idea_type,
novelty=novelty,
feasibility=feasibility,
impact=impact,
tags=[t.strip() for t in tags.split(",")] if tags else [],
follow_up=follow_up,
created_at=datetime.now().isoformat(),
)
conv.ideas.append(idea)
print(f" ✓ 已记录 (质量分: {idea.quality_score():.1f}, 加权值: {idea.weighted_value():.2f})")
self.conversations.append(conv)
self._save()
print(f"\n📊 本次对话总结:")
print(f" 想法数量: {conv.idea_count()}")
print(f" 总价值: {conv.total_idea_value():.2f}")
print(f" 每小时产出: {conv.ideas_per_hour():.1f} 个想法")
return conv
def _prompt_score(self, prompt: str) -> int:
while True:
try:
val = int(input(f" {prompt}: "))
if 1 <= val <= 5:
return val
except ValueError:
pass
print(" 请输入 1~5 之间的整数")
def _load(self):
if self.data_file.exists():
with open(self.data_file, "r", encoding="utf-8") as f:
data = json.load(f)
# 反序列化为对象(简化版,生产环境可用 marshmallow/pydantic)
for c in data:
conv = Conversation(**{k: v for k, v in c.items() if k != 'ideas'})
for i in c.get('ideas', []):
conv.ideas.append(Idea(**i))
self.conversations.append(conv)
def _save(self):
data = []
for c in self.conversations:
d = asdict(c)
data.append(d)
with open(self.data_file, "w", encoding="utf-8") as f:
json.dump(data, f, ensure_ascii=False, indent=2)
4.4 伙伴分析仪:聚合与排名
@dataclass
class PartnerProfile:
partner_id: str
partner_name: str
conversations: list[Conversation]
total_ideas: int = 0
avg_ideas_per_conv: float = 0.0
avg_ideas_per_hour: float = 0.0
avg_value_per_hour: float = 0.0
total_value: float = 0.0
idea_type_distribution: dict = field(default_factory=dict)
complementarity_score: float = 0.0
overall_score: float = 0.0
rank: int = 0
class PartnerAnalyzer:
def analyze(self, conversations: list[Conversation],
my_traits: dict = None) -> list[PartnerProfile]:
"""聚合分析所有沟通伙伴"""
groups: dict[str, list[Conversation]] = {}
for conv in conversations:
groups.setdefault(conv.partner_id, []).append(conv)
profiles = []
for pid, convs in groups.items():
if len(convs) < MIN_CONVERSATIONS:
continue # 样本不足,跳过
p = PartnerProfile(
partner_id=pid,
partner_name=convs[0].partner_name,
conversations=convs,
)
# 基础统计
p.total_ideas = sum(c.idea_count() for c in convs)
p.avg_ideas_per_conv = p.total_ideas / len(convs)
p.avg_ideas_per_hour = sum(c.ideas_per_hour() for c in convs) / len(convs)
p.total_value = sum(c.total_idea_value() for c in convs)
p.avg_value_per_hour = sum(c.value_per_hour() for c in convs) / len(convs)
# 想法类型分布
type_counts = {}
for c in convs:
for idea in c.ideas:
type_counts[idea.idea_type] = type_counts.get(idea.idea_type, 0) + 1
p.idea_type_distribution = type_counts
# 互补性评分
if my_traits and convs[0].partner_traits:
p.complementarity_score = self._calc_complementarity(
my_traits, convs[0].partner_traits
)
# 综合评分 = 价值产出 × 0.5 + 互补性 × 0.3 + 稳定性 × 0.2
stability = self._calc_stability(convs)
p.overall_score = (
p.avg_value_per_hour * 0.5
+ p.complementarity_score * 0.3
+ stability * 0.2
)
profiles.append(p)
# 排序
profiles.sort(key=lambda x: x.overall_score, reverse=True)
for i, p in enumerate(profiles):
p.rank = i + 1
return profiles
def _calc_complementarity(self, my_traits: dict, their_traits: dict) -> float:
"""计算互补性得分 (0~5)"""
differences = 0
dimensions = 0
for dim in COMPLEMENTARITY_DIMENSIONS:
if dim in my_traits and dim in their_traits:
if my_traits[dim] != their_traits[dim]:
differences += 1
dimensions += 1
if dimensions == 0:
return 2.5 # 默认中等
return (differences / dimensions) * 5
def _calc_stability(self, convs: list[Conversation]) -> float:
"""计算想法产出的稳定性 (0~5)"""
if len(convs) < 2:
return 2.5
values = [c.total_idea_value() for c in convs]
mean = sum(values) / len(values)
variance = sum((v - mean) ** 2 for v in values) / len(values)
std = variance ** 0.5
# 变异系数越低越稳定
cv = std / mean if mean > 0 else 1.0
# 转换为 0~5 分数(cv越小分越高)
stability = max(0, 5 - cv * 5)
return stability
4.5 碰撞推荐器:智能组局
class CollisionRecommender:
def __init__(self, profiles: list[PartnerProfile], my_traits: dict):
self.profiles = profiles
self.my_traits = my_traits
def recommend_top_partners(self, top_n: int = 3) -> list[dict]:
"""推荐最适合碰撞创意的 Top N 伙伴"""
recommendations = []
for p in self.profiles[:top_n]:
rec = {
"rank": p.rank,
"name": p.partner_name,
"overall_score": round(p.overall_score, 2),
"avg_value_per_hour": round(p.avg_value_per_hour, 2),
"complementarity": round(p.complementarity_score, 2),
"best_idea_type": max(p.idea_type_distribution, key=p.idea_type_distribution.get)
if p.idea_type_distribution else "N/A",
"why": self._explain(p),
}
recommendations.append(rec)
return recommendations
def recommend_combination(self, size: int = 3) -> list[dict]:
"""推荐多人碰撞组合(最大化认知多样性)"""
if len(self.profiles) < size:
return []
# 贪心算法:从 Top 中选出互补性最高的组合
selected = [self.profiles[0]] # 先选第一名
candidates = self.profiles[1:]
while len(selected) < size and candidates:
best = None
best_diversity = -1
for c in candidates:
diversity = sum(
self._trait_distance(c.partner_traits, s.partner_traits)
for s in selected
)
if diversity > best_diversity:
best_diversity = diversity
best = c
if best:
selected.append(best)
candidates.remove(best)
return [
{
"name": p.partner_name,
"role": "核心碰撞者" if i == 0 else "多样性贡献者",
"strength": max(p.idea_type_distribution, key=p.idea_type_distribution.get)
if p.idea_type_distribution else "均衡型",
}
for i, p in enumerate(selected)
]
def _explain(self, p: PartnerProfile) -> str:
"""生成推荐理由"""
reasons = []
if p.avg_value_per_hour > 3:
reasons.append("单位时间想法产出极高")
if p.complementarity_score > 3:
reasons.append("认知互补性强,能带来不同视角")
if p.idea_type_distribution:
top_type = max(p.idea_type_distribution, key=p.idea_type_distribution.get)
type_label = IDEA_TYPES[top_type]["label"]
reasons.append(f"擅长产出「{type_label}」类想法")
return ";".join(reasons) if reasons else "综合表现良好"
def _trait_distance(self, traits_a: dict, traits_b: dict) -> float:
"""计算两组特征的差异度"""
diff = 0
dims = 0
for dim in COMPLEMENTARITY_DIMENSIONS:
if dim in traits_a and dim in traits_b:
if traits_a[dim] != traits_b[dim]:
diff += 1
dims += 1
return diff / max(dims, 1)
4.6 运行效果
╔══════════════════════════════════════════════════════════╗
║ 🧠 创意碰撞合伙人排行榜 ║
╠══════════════════════════════════════════════════════════╣
║ ║
║ 🥇 #1 阿哲 ║
║ 综合评分 : 4.32 ║
║ 价值产出 : 3.85 /小时 ║
║ 互补性 : 4.0 / 5.0 ║
║ 擅长类型 : 跨界关联 (12次) ║
║ 为什么 : 单位时间想法产出极高;认知互补性强; ║
║ 擅长产出「跨界关联」类想法 ║
║ ║
║ 🥈 #2 mentor李 ║
║ 综合评分 : 3.78 ║
║ 价值产出 : 3.20 /小时 ║
║ 互补性 : 3.5 / 5.0 ║
║ 擅长类型 : 新方向 (8次) ║
║ 为什么 : 认知互补性强;擅长产出「新方向」类想法 ║
║ ║
║ 🥉 #3 设计师小林 ║
║ 综合评分 : 3.15 ║
║ 价值产出 : 2.60 /小时 ║
║ 互补性 : 4.5 / 5.0 ║
║ 擅长类型 : 质疑/推翻 (6次) ║
║ 为什么 : 认知互补性极强 ║
║ ║
╠══════════════════════════════════════════════════════════╣
║ 🎯 推荐碰撞组合 (3人局): ║
║ 阿哲 (核心碰撞者) — 擅长跨界关联 ║
║ 设计师小林 (多样性贡献者) — 擅长质疑/推翻 ║
║ 你 ║
║ 预期效果: 认知多样性最大化,覆盖从发散到收敛的全流程 ║
╚══════════════════════════════════════════════════════════╝
五、README 文件与使用说明
idea-collision-tracker
一个用 Python 记录和量化沟通对话中产生的创意想法,帮助你找到最适合碰撞创意的沟通伙伴。
项目结构
idea-collision-tracker/
├── config.py # 想法类型、评分维度、互补性维度
├── models.py # 数据类定义
├── logger.py # 沟通记录器
├── analyzer.py # 伙伴分析器
├── recommender.py # 碰撞推荐器
├── run_demo.py # 一键运行演示
└── README.md
环境要求
- Python 3.10+
- 无第三方依赖(纯标准库)
快速开始
git clone https://github.com/yourname/idea-collision-tracker.git
cd idea-collision-tracker
python run_demo.py
使用流程
1. 初始化你的认知特征:运行后首先输入你自己的专业领域、思维偏好等信息
2. 记录对话:每次跟人深度沟通后,运行程序记录对话内容和产生的想法
3. 查看排行榜:积累 3 次以上对话后,自动生成创意碰撞合伙人排名
4. 获取推荐:程序会推荐最适合组局的人选和组合
数据存储
所有数据以 JSON 格式存储在本地
"conversations.json" 中,不上传任何服务器。
核心 API
from logger import ConversationLogger
from analyzer import PartnerAnalyzer
from recommender import CollisionRecommender
# 记录
logger = ConversationLogger()
logger.log_interactive()
# 分析
analyzer = PartnerAnalyzer()
profiles = analyzer.analyze(logger.conversations, my_traits={"domain": "backend", "thinking_style": "logical"})
# 推荐
recommender = CollisionRecommender(profiles, my_traits)
top3 = recommender.recommend_top_partners(3)
for p in top3:
print(f"#{p['rank']} {p['name']}: {p['why']}")
设计原则
原则 说明
想法可量化 每条想法有类型、新颖度、可行度、影响力四维评分
质量优先于数量 加权评分体系,避免"很多水想法"刷榜
互补性考量 不只看产出量,还看认知差异
本地优先 数据不出本机
渐进式 样本不足时给出提示而非虚假精确
免责声明
本工具为教学演示用途,基于心理学与创造力研究构建简化模型。不构成职业建议或社交指导。 创意产出受多种因素影响,本工具仅提供一种量化视角的参考。
六、核心知识点卡片
📘 卡片 1:认知多样性与集体智慧
- 领域:复杂性科学 / 组织行为学
- 来源:Scott Page《The Difference》
- 要点:多样性团队的解决问题能力优于同质化的高能力团队,前提是成员有不同的"认知工具箱"
📘 卡片 2:建设性冲突(Constructive Controversy)
- 领域:社会心理学
- 来源:Johnson & Johnson 的合作学习研究
- 要点:当团队成员观点冲突但以追求真理为目标时,决策质量和创造力显著提升
📘 卡片 3:联想网络理论(Associative Network Theory)
- 领域:认知心理学
- 来源:Mednick (1962) 的创造力理论
- 要点:创造力高的人拥有更扁平、更广的联想网络,能把看似无关的概念连接起来
📘 卡片 4:心流与对话状态
- 领域:积极心理学
- 来源:Mihaly Csikszentmihalyi
- 要点:最佳创意对话往往发生在双方都进入"心流"状态时——挑战与技能匹配、反馈即时、自我意识消失
📘 卡片 5:社会促进 vs 社会抑制
- 领域:社会心理学
- 要点:他人在场对简单任务有促进作用,对复杂创造性任务可能抑制表现——除非对方提供认知脚手架
📘 卡片 6:创意孵化期(Incubation)
- 领域:创造力研究
- 要点:很多想法不是在对话中
利用AI解决实际问题,如果你觉得这个工具好用,欢迎关注长安牧笛!