第4章 策略与投票¶
学习目标¶
- 掌握多 Agent 共识机制与多投票决策的原理与实现
- 理解专家评审(Evaluator)模式与辩论机制的设计要点
- 能够设计质量评估流程,对多 Agent 产出进行客观打分
- 使用 Python 实现多 Agent 投票、评审与辩论的最小系统
- 识别群体思维与策略操控等风险并提出缓解方案
问题导入¶
某投资决策系统让三个分析师 Agent 各自给出"买入/持有/卖出"建议。结果三个 Agent 都基于同一份财报给出"买入",但事后证明这份财报数据有误——三个 Agent 同时出错,"全票通过"反而放大了风险。问题在于:简单多数投票假设各 Agent 独立判断,但若它们共享同一信息源、同一模型,"共识"只是幻觉。如何设计投票与评审机制,让决策既可靠又能暴露分歧?本章给出答案。
核心概念¶
1. 共识机制¶
共识(Consensus)指多 Agent 就某一决策达成一致。常见共识算法:
| 机制 | 描述 | 适用场景 |
|---|---|---|
| 多数投票(Majority) | 票数过半即通过 | 二选一/多选一的快速决策 |
| 加权投票(Weighted) | 按专家权重计票 | Agent 能力差异大 |
| 一致同意(Unanimous) | 全票通过 | 高风险决策需谨慎 |
| 多轮投票(Iterative) | 多轮收敛,每轮淘汰低票选项 | 选项多、需收敛 |
| 拜占庭容错(BFT) | 容忍少数恶意/错误 Agent | 高可靠分布式系统 |
共识的前提:各 Agent 应尽量独立判断——使用不同模型、不同信息源、不同 Prompt 视角,否则"共识"只是同一错误的放大。
2. 多投票决策¶
当选项多于两个时,简单多数可能无法得出过半结果。常用方法:
- 绝对多数(>50%):第一轮无人过半则淘汰末位,进入下一轮。
- 偏好投票(Ranked Voting):每个 Agent 给选项排序,按偏好积分决出胜者。
- 赞成投票(Approval Voting):每个 Agent 可投多个"可接受"选项,得票最多者胜。
- 孔多塞(Condorcet):两两对决,能击败所有其他选项者胜。
3. 专家评审(Evaluator)模式¶
Evaluator 模式把"产出"与"评审"分离:
执行 Agent(产出方案) → 评审 Agent(打分/挑错) → 反馈 → 修订
- 单评审:一个评审 Agent 打分,低于阈值则打回重做。
- 多评审:多个评审 Agent 各自打分,取均值或加权值。
- 对抗评审(Red Team):专门挑刺的 Agent,模拟攻击者找漏洞。
关键设计:评审 Agent 的 Prompt 与执行 Agent 不同,关注"是否符合规范、有无错误、是否遗漏",而非"重新做一遍"。
4. 辩论机制¶
辩论(Debate)让持不同观点的 Agent 公开交锋,通过论证与反驳逼近更优结论:
- 正方 Agent 提出论点与证据。
- 反方 Agent 针对论点反驳。
- 裁判 Agent 评估双方论证质量,判定胜方或要求继续。
- 设置最大轮次(如 3 轮),避免无休止辩论。
价值:暴露单 Agent 未考虑的反面论据,降低"自信但错误"的风险。研究表明,辩论机制能显著提升 LLM 在推理任务上的准确率。
5. 质量评估¶
对多 Agent 产出的质量评估需多维度:
| 维度 | 评估方式 | 示例 |
|---|---|---|
| 正确性 | 与标准答案/事实比对 | 代码能否通过测试 |
| 完整性 | 是否覆盖所有要点 | 报告是否含必要章节 |
| 一致性 | 多次产出是否稳定 | 同输入重复运行结果差异 |
| 相关性 | 是否切题 | 答案是否回答了问题 |
| 安全性 | 是否含有害内容 | 经毒性/偏见检测 |
评估方法:①基于规则(正则、单测);②基于 LLM 评审(GPT-4 当裁判);③基于人工抽样;④基于用户反馈(点赞/点踩)。
6. 群体思维与策略操控风险¶
- 群体思维(Groupthink):Agent 为"达成共识"而压抑异议,导致次优决策。缓解:引入"魔鬼代言人" Agent 强制提出反对意见。
- 策略操控:Agent 为使自己的偏好胜出而策略性投票(如不投真实偏好)。缓解:匿名投票、限制通信。
- 信息级联:先发言的 Agent 影响后续 Agent。缓解:并行独立投票后再汇总。
原理图¶
flowchart TB
Task[待决策任务] --> Split[分发]
Split --> A1[Agent 1\n独立判断]
Split --> A2[Agent 2\n独立判断]
Split --> A3[Agent 3\n独立判断]
A1 --> Vote[投票汇总]
A2 --> Vote
A3 --> Vote
Vote -->|过半| Pass[通过]
Vote -->|未过半| Runoff[多轮淘汰]
Runoff --> Vote
Pass --> Evaluator[评审 Agent\n打分]
Evaluator -->|达标| Final[最终决策]
Evaluator -->|不达标| Revise[返回修订]
subgraph 辩论机制
D1[正方 Agent] -->|论点| D2[反方 Agent]
D2 -->|反驳| D1
D1 --> Judge[裁判 Agent]
D2 --> Judge
Judge --> Winner[判定胜方]
end
图:多 Agent 投票、评审与辩论决策流程
示例代码¶
实现一个支持多数投票、加权投票与评审的多 Agent 决策系统。
from collections import Counter
from dataclasses import dataclass
from typing import Callable
@dataclass
class Voter:
"""投票 Agent。"""
agent_id: str
weight: float = 1.0
decide: Callable = None # 输入问题,返回选项
class VotingSystem:
"""多 Agent 投票决策系统。"""
def __init__(self, voters: list):
self.voters = voters
def majority_vote(self, question: str, options: list) -> tuple:
"""简单多数投票。返回 (胜出选项, 票数明细)。"""
ballots = []
for v in self.voters:
choice = v.decide(question, options) if v.decide else options[0]
ballots.append(choice)
tally = Counter(ballots)
winner = tally.most_common(1)[0][0]
return winner, dict(tally)
def weighted_vote(self, question: str, options: list) -> tuple:
"""加权投票:按 Agent 权重计票。"""
scores = Counter()
for v in self.voters:
choice = v.decide(question, options) if v.decide else options[0]
scores[choice] += v.weight
winner = scores.most_common(1)[0][0]
return winner, dict(scores)
def runoff_vote(self, question: str, options: list, max_rounds=3) -> tuple:
"""多轮淘汰投票:每轮淘汰末位,直至有人过半。"""
remaining = list(options)
for rnd in range(max_rounds):
ballots = [v.decide(question, remaining) for v in self.voters]
tally = Counter(ballots)
total = len(ballots)
top, top_votes = tally.most_common(1)[0]
if top_votes * 2 > total:
return top, dict(tally)
# 淘汰票数最少的
if len(remaining) > 2:
loser = tally.most_common()[-1][0]
remaining.remove(loser)
else:
return top, dict(tally)
return remaining[0], dict(tally)
@dataclass
class Evaluator:
"""评审 Agent:对产出打分。"""
agent_id: str
evaluate: Callable # 输入 (任务, 方案),返回 0-100 分
class ReviewPipeline:
"""执行→评审→修订 流水线。"""
def __init__(self, executor: Callable, evaluators: list,
threshold: float = 80.0, max_revisions: int = 2):
self.executor = executor
self.evaluators = evaluators
self.threshold = threshold
self.max_revisions = max_revisions
def run(self, task: str):
"""产出方案并评审,不达标则修订。"""
proposal = self.executor(task)
for i in range(self.max_revisions + 1):
scores = [e.evaluate(task, proposal) for e in self.evaluators]
avg = sum(scores) / len(scores)
print(f"[评审] 第 {i+1} 轮平均分: {avg:.1f} (阈值 {self.threshold})")
if avg >= self.threshold:
return proposal, avg
# 修订:把评审意见反馈给执行 Agent
proposal = self.executor(f"{task}\n[评审反馈] 当前得分 {avg},请改进质量。")
return proposal, avg
# 使用示例
if __name__ == "__main__":
def decide_a(q, opts): return opts[0]
def decide_b(q, opts): return opts[1]
def decide_c(q, opts): return opts[0]
voters = [
Voter("A", weight=1.0, decide=decide_a),
Voter("B", weight=2.0, decide=decide_b), # 专家权重更高
Voter("C", weight=1.0, decide=decide_c),
]
vs = VotingSystem(voters)
q = "是否上线新功能 X?"
opts = ["上线", "不上线"]
print("多数投票:", vs.majority_vote(q, opts))
print("加权投票:", vs.weighted_vote(q, opts))
def exec_draft(task): return f"关于『{task}』的方案 v1"
def eval_1(t, p): return 75 if "v1" in p else 85
def eval_2(t, p): return 78 if "v1" in p else 88
pipe = ReviewPipeline(exec_draft,
[Evaluator("E1", eval_1), Evaluator("E2", eval_2)],
threshold=85)
result, score = pipe.run("接口设计方案")
print("最终方案:", result, "得分:", round(score, 1))
辩论机制示例:
from openai import OpenAI
client = OpenAI()
def debate(question: str, max_rounds: int = 3) -> str:
"""正反方辩论,裁判判定。"""
history = f"议题:{question}\n"
for rnd in range(max_rounds):
pro = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "system", "content": "你是正方,提出支持论点。"},
{"role": "user", "content": history}]).choices[0].message.content
con = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "system", "content": "你是反方,针对正方反驳。"},
{"role": "user", "content": history + "\n正方:" + pro}]).choices[0].message.content
history += f"\n[第{rnd+1}轮] 正方:{pro}\n反方:{con}"
verdict = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "system", "content": "你是裁判,基于辩论判定胜方并总结。"},
{"role": "user", "content": history}]).choices[0].message.content
return verdict
企业案例¶
案例 1:投资决策的多 Agent 投票¶
某基金公司构建"多分析师 Agent 投票"决策系统。三个 Agent 分别用价值、成长、技术分析视角给出建议,加权投票(价值分析权重 0.5)决出最终建议。引入"魔鬼代言人" Agent 强制提出看空论据后,避开了 2 次"全票看多"的群体思维陷阱,回测显示决策准确率提升 12%。
案例 2:代码评审的 Evaluator 模式¶
某团队在研发流水线中加入评审 Agent:开发 Agent 提交 PR 后,两个评审 Agent 分别从"功能正确性"与"代码规范"打分,均分低于 80 分则打回修订。设置最大修订 2 次防死循环。上线后 PR 一次通过率从 55% 升至 78%。
案例 3:医疗诊断的辩论机制¶
某医疗 AI 系统针对疑难病例让"诊断 Agent A"与"诊断 Agent B"基于不同医学指南辩论,由"主任医师 Agent"裁判并综合两方论据给出最终诊断。辩论机制让 8% 的病例在初诊被推翻,最终诊断与多学科会诊结论的一致性达 91%。
常见问题¶
Q1:投票和评审有什么区别? A:投票是从多个方案中"选一个",评审是对单个方案"打分判断是否合格"。投票用于决策选择,评审用于质量把关,常组合使用:先投票选方案,再评审把关质量。
Q2:几个 Agent 投票比较合适? A:奇数避免平票,3-5 个为宜。过多会增加成本且边际收益递减。关键是保证 Agent 的独立性(不同模型/信息源),而非单纯增加数量。
Q3:辩论机制会不会很贵? A:会。每轮辩论需要多次 LLM 调用,3 轮辩论约 7 次调用。建议:仅对高风险/高价值决策启用辩论;用小模型承担正反方、大模型当裁判;设置最大轮次。
Q4:如何检测群体思维? A:①监测共识度过高(如全票通过率 >80%)的决策;②引入"魔鬼代言人"强制反对;③让 Agent 并行独立判断后再汇总;④定期审计"全票错误"案例。
面试题¶
1. 设计一个多 Agent 投票决策系统,需要考虑哪些要素? 答题要点:选项设计、投票规则(多数/加权/多轮)、Agent 独立性(不同模型/信息源)、权重分配、平票处理、最大轮次、群体思维防范、审计日志。
2. 简述 Evaluator 模式及其与投票的区别。 参考答案:Evaluator 把产出与评审分离,由独立评审 Agent 对方案打分,不达标则修订。区别:投票是"多选一"的决策,评审是"单方案质量判断"的把关,二者常组合使用。
3. 辩论机制如何提升 LLM 决策质量?有哪些代价? 参考答案:辩论让正反方公开交锋,暴露单 Agent 未考虑的反面论据,降低"自信但错误"风险,研究表明能提升推理准确率。代价是 token 消耗大(多轮多 Agent)、延迟高、需裁判 Agent 综合判断。适合高风险高价值决策。
练习题¶
- 投票实操:实现一个"偏好投票"(Ranked Voting)算法,让 3 个 Agent 对 4 个选项排序,按 Borda 计分法决出胜者。
- 评审设计:为"自动生成营销文案"场景设计评审 Agent,定义至少 4 个评审维度(如吸引力、合规性、准确性、品牌一致性)并实现打分逻辑。
- 思考题:如果投票的三个 Agent 都基于同一个 LLM,"共识"还有意义吗?如何提升 Agent 的独立性?
小结¶
投票、评审与辩论是多 Agent 决策的三大工具。投票用于多方案选择,评审用于质量把关,辩论用于暴露盲区。关键前提是 Agent 的独立性——否则共识只是同一错误的放大。群体思维是主要风险,"魔鬼代言人"与并行独立投票是有效缓解手段。决策机制的选择应与决策重要性匹配:日常用多数投票,关键链路用评审+辩论。下一章将讲解如何让多 Agent 系统安全、可扩展地运行在生产环境。延伸阅读:论文《Improving Factuality and Reasoning in Language Models through Multiagent Debate》、社交选择理论(Arrow 不可能性定理)。