黑客智能体的核心任务是在于通过与空间环境及多位评委的动态交互,准确推断并揣摩评委的隐藏偏好(Taste)与既定的赛道指南(Track Guidelines),最终生成具有高度可执行性的黑客马拉松项目海报及提案(Proposals)。这要求智能体必须超越传统的大语言模型(LLM)基于无状态上下文窗口(Stateless Context Window)的问答模式,发展出包含“心智理论”(Theory of Mind, ToM)的复杂社会认知记忆网络
Hackathon Multi-Agent System: Full Proposal 系统概览 核心主张:50 个 Hacker Agent 在一个 Gather.town 式的 2D 虚拟空间里,通过最多 N=7 轮结构化社交匹配,形成 4 人团队,再基于对 M=5 条赛道与多位 Judge 的 ToM 推断,共同生成可执行的 Hackathon 提案与海报。 (所以大概有 ~50/4 个process同时搞 llm batch inference) 每个 Agent 的记忆由 Supermemory.ai 提供支撑:它的 container_tag 机制天然支持对每个 Agent 独立维护记忆桶,且能做语义 + 知识图谱 hybrid 检索,并内置"智能遗忘"与 recency bias,适合跨轮次的社会认知记忆。
Phase 0: 世界初始化 0.1 Track 与 Judge 信息发布 系统启动时,M=5 条赛道的信息以 JSON 形式广播给全体 Agent: json { "track_id": "T03", "name": "Agentic Infrastructure", "public_guidelines": [ "项目必须展示 multi-agent coordination", "要有可 live demo 的 working prototype", "infra 可扩展性是评分重点" ], "scoring_weights": { // examples,后面自己具体定义吧 "novelty": 0.3, "feasibility": 0.4, "agentic_depth": 0.2, "ui_polish": 0.1 }, "example_projects": ["AutoFlow", "AgentMesh v2"] }
Judge 的信息分两类: 公开信息:姓名、所属机构、past award projects、proposed 的 track 项目信息 Judge 的隐藏 Taste:只有 orchestrator 知道, Agent 需要通过 Q&A 互动和观察反馈来推断 后续轮次里,通过模拟 judge Q&A 或听别人分享的信息,逐步更新 对 这个赛道的认知 0.2 Agent Persona 初始化 每个 Agent 有一个固定的不可变 persona 核心: json { "agent_id": "A_17", "persona": { "archetype": "Full-Stack Pragmatist", "selfishness": 0.75, "risk_appetite": "medium-high", "communication_style": "blunt_direct", "core_values": ["feasibility over hype", "shipping beats theorizing"] }, "skills": { "backend": 0.9, "frontend": 0.5, "ml_research": 0.4, "product_thinking": 0.6, "pitching": 0.5 }, "track_affinities": { "T03_agentic_infra": 0.85, "T01_social_good": 0.2 } }
这份配置直接写入 System Prompt 的不可变部分,用于强化"立场坚定、不 submissive"的行为。
Phase 1: 团队匹配阶段 (N = 7 轮) 1.1 状态机 每个 Agent 在每一轮开始时有以下三种状态之一: 状态 含义 LONE_WOLF 完全未组队,进入四人随机匹配 PARTIAL_TEAM (size=2 or 3) 已有初步共识,作为一个整体参与下轮匹配 LOCKED_TEAM (size=4) 正式锁队,退出匹配池
1.2 群聊 Session 内部流程 (每轮) 一次 Session 最多 X=6 个回合 (sub-turns),分三个阶段: 阶段 A — Pitch (2 sub-turns) Orchestrator 先调用每个 Agent 的 LLM,单独生成 idea (此时各自独立,互不可见) Orchestrator 收集四个 idea 后一次性发布到群聊 每个 Agent 依次对所有 idea 做 reaction (这是第 1 个公开 sub-turn) 阶段 B — Debate (3 sub-turns) 每个 Agent 轮流发言: 必须包含 ≥1 个看法或质疑点 (prompt 强制约束) 必须更新自己对 track/judge 的看法 Orchestrator 向每个 Agent 注入: "本 Session 还剩 X 个回合,请聚焦核心分歧" 阶段 C — Decision (1 sub-turn) 每个 Agent:做出willing_to_team决定,并填写 wish/avoid 列表 Orchestrator 收集决策后,运行 matching 算法,更新状态机 1.3 单个 Agent 发言的 Prompt 结构 text [SYSTEM - 不可变] 你是 Hackathon Hacker,ID: {agent_id} 人设:{persona_json} 你的核心行为准则:
- 永远服务于你的人设和偏好,不要因为别人说什么就改变核心立场
- 每次发言必须包含至少一个你不同意或质疑的点并说明原因
- 你自私且目标明确:找到最可能帮你赢得 Hackathon 的队友和方向
[CONTEXT - 每轮更新] 当前轮次: Round {R}/{N},Session 内 Sub-turn: {X} 剩余 你的 Supermemory 检索结果(对本次队友的历史认知): {supermemory_search_results} 你对各 Judge 的当前推断: {judge_model_summary} 本 Session 当前消息记录: {session_history}
[TASK] 阶段:{phase_A/B/C} 输出严格 JSON: { "utterance": "...", "stance": { "idea_scores": {"A_05_idea": 0.7, "A_12_idea": 0.3}, "judge_alignment": {"T03": 0.8} }, "updated_judge_beliefs": {...}, "private_notes": "自己的内心独白,不发到群里" }
utterance 字段发到群聊,其他字段留给 orchestrator 处理。 1.4 Temperature 调度 轮次压力和温度同步变化,越接近 N=7 轮,Agent 越收敛: 轮次 Temperature 行为模式 Round 1-2 0.95 高度发散,大胆提新想法,探索性社交 Round 3-4 0.80 开始评估优先组合,focus 在 2-3 个感兴趣的方向 Round 5-6 0.65 明显收敛,开始倾向锁队 Round 7 0.6 几乎确定性决策,强烈倾向快速锁队
Orchestrator 在 Round 5+ 还额外注入 Pressure Prompt:
"
Phase 2: 匹配算法细节 2.1 数据结构 python class MatchingState: seen_matrix: dict[str, dict[str, int]] # seen[i][j] = 见面次数 wish_list: dict[str, list[str]] # 上轮结束后填写 avoid_list: dict[str, list[str]] compatibility: dict[str, dict[str, float]] # 双方互评的 score agent_status: dict[str, AgentStatus] # LONE_WOLF / PARTIAL_TEAM / LOCKED partial_teams: list[PartialTeam] # 当前所有 partial teams
2.2 分组算法 (每轮开始前执行) python def form_groups(state: MatchingState) -> list[Group]: # Step 1: 收集所有参与匹配的 unit units = [] for pt in state.partial_teams: units.append(pt) # 已有 partial team 作为 unit for a in lone_wolves: units.append(SingleAgent(a))
# Step 2: 优先合并两个 size=2 的 partial teams
size2 = [u for u in units if u.size == 2]
for i in range(0, len(size2) - 1, 2):
if compatible(size2[i], size2[i+1], state):
yield Group([size2[i], size2[i+1]]) # 形成 size=4
# Step 3: 剩余 lone wolves 分组
remaining = [u for u in units if not assigned]
shuffle(remaining)
for seed in remaining:
if assigned(seed): continue
group = [seed]
candidates = get_candidates(seed, state) # 过滤 avoid + 见面上限
# 优先加入 wish list 里的 1 人
for wish in state.wish_list[seed.id]:
if wish in candidates and group_size < 4:
group.append(wish)
break
# 剩余 slots 用 diversity 贪心填充
while len(group) < 4 and candidates:
best = max(candidates, key=lambda k: diversity_score(group + [k]))
group.append(best)
candidates.remove(best)
yield Group(group)
def diversity_score(group: list[Agent]) -> float: # 组内 pairwise 平均特征距离 (技能 + track 偏好 + persona 风格) vectors = [agent.feature_vector for agent in group] return mean(cosine_distance(a, b) for a, b in combinations(vectors, 2))
2.3 partial team 的具体组队规则 一轮群聊结束后,如果 Agent A 和 Agent B 都填写了对方在 wish_list,并且 willing_to_team=True: 形成 PARTIAL_TEAM(A, B),状态变为待定 下一轮匹配时,这个 partial team 作为一个不可分拆的整体 unit 参与匹配 匹配优先级: 两个 size=2 的 partial team 合并 → 直接 size=4 一个 size=2 的 partial team + 两个 lone wolves → 凑 size=4 一个 size=3 的 partial team + 一个 lone wolf → 凑 size=4
Phase 3: Supermemory.ai 集成方案 每个 Agent 的 container_tag = 其 agent_id。Supermemory 在以下时机被调用: 3.1 写入时机 (Session 结束后) python
summary_prompt = f""" 本 Session 消息记录:{session_history} 请从 {agent_id} 视角,输出对本次遇到的队友的总结,JSON 格式: {{ "peer_summaries": {{ "A_05": {{ "skills_inferred": {{}}, "preferences_inferred": {{}}, "personality_notes": "...", "compatibility": 0.0-1.0, "wish_to_meet_again": true/false, "key_moments": ["..."] // 记住对方说过的重要细节 }} }}, "judge_belief_updates": {{}}, "my_own_status": {{ "current_idea_direction": "...", "track_commitment": "...", }} }} """ summary = llm.call(summary_prompt)
memory.add( content=json.dumps(summary), container_tag=agent_id, metadata={ "type": "session_summary", "round": current_round, "peers_encountered": [p_ids] } )
Supermemory 的 knowledge graph 会自动将"A_17 认为 A_05 擅长 ML"这类关系建图,跨轮次可精准检索。 3.2 读取时机 (下一轮 Session 开始前) python
for peer_id in current_group: results = memory.search.memories( q=f"关于 {peer_id} 的偏好、技能和可靠性", container_tag=agent_id, search_mode="hybrid", # 语义 + 关键字混合 limit=3 ) peer_context[peer_id] = results
3.3 Agent 间推荐机制 Session 结束时,在私聊 Decision 阶段,Orchestrator 额外问每个 Agent: "你在之前几轮中遇到过的 agent 里,有没有你觉得适合你当前队友但还没锁队的人?请给出 ≤2 个 agent_id 和推荐理由。" Agent 返回: json { "referrals": [ { "agent_id": "A_29", "reason": "Round 2 里他说自己会做 frontend,补充我的短板", "confidence": 0.7 } ] }
这个 referral 信息同时写入 Supermemory(供自己后续检索),以及广播到 orchestrator 的全局推荐图。Orchestrator 在下轮分组时,给这些推荐对增加一定的"软优先级"权重,但不强制撮合(还要服从多样性约束)。
Phase 4: 全程压力感知与信号注入 下面是每轮开始前 orchestrator 发给每个 agent 的 Pressure Broadcast: 轮次 压力信号 R=1 "欢迎!你有 7 轮机会找到最佳队伍,尽情探索。" …
R=5 "你已经见过 {n} 位 agent,建议开始缩小范围。" R=6 "🔴 最后 1 轮!强烈建议此轮锁队,否则将进入随机兜底匹配。" R=7 "最终轮。所有未锁队的 agent 将被强制分配到剩余小组。"
R=7 的"兜底强制分配"对 Agent 是已知规则,这本身就是 ToM 里很重要的"共同知识"(common knowledge):所有 Agent 知道规则,也知道别人知道,这会让临近最后几轮时的锁队决策更加务实。
Phase 5: 组队后行动 (简述) 一旦 LOCKED_TEAM 形成: 四人的 Supermemory 记忆桶: 每个人可以检索自己/对评委和同伴的认知与信念,作为协作基础 团队共同进入 Judge Q&A 阶段,继续更新 judge_model 的 taste_vector 和 confidence 最终基于 judge ToM + track guidelines 生成 proposal 和海报
关键技术决策一览 模块 技术选择 理由 Agent 记忆 Supermemory.ai (container_tag per agent) 原生支持 knowledge graph + hybrid search + 遗忘机制 LLM 调用 任意 API (Claude/GPT/Qwen),统一封装 Supermemory 支持所有主流模型 匹配器 Python 贪心 + diversity score 50 agent 规模,O(n²) 足够 消息格式 强制结构化 JSON output 方便 orchestrator 解析 stance 和 belief update Temperature Round 线性衰减 0.95 → 0.45 模拟"探索 → 确信"的认知收敛 Partial team 作为不可分拆 unit 参与匹配 保护已有共识,减少社交摩擦
一个逆向思考 值得注意的是:让 Agent 太"知道"剩余轮数,可能导致 Round 1-2 过于保守(不愿意表达真实偏好,因为还有时间),导致真正有效的信息交换都堆在 Round 5-6。可以考虑一个不对称信息结构:有些 Agent 知道总轮数,有些不知道,观察这两种 agent 的社交策略是否不同 — 这反而是一个有趣的 ablation,也可以作为你系统里的一个 experimental variable。
讨论的时候,三个大shuffle,到第三轮还没哟team的agent,广播告诉他们有多少个team left,给一个压力信号他们