通过三个独立角色回答同一问题、批评者指出缺陷、Python 统计投票、置信度由共识程度决定( unanimous→HIGH,split→LOW)的方式对抗 LLM 自信幻觉,在 NVIDIA NIM 上实测 8 次调用/辩论。
多次询问同一个模型同一个问题,你会得到三次改写和一个自信的语气——无论答案是否真的存在争议。多智能体辩论则恰恰相反:三个角色独立作答,一位批评者指出每个人的缺陷,每个智能体修订或辩护,Python 统计票数,裁判综合出最终答案——置信度本身就是共识的体现:全票通过 → HIGH,分歧 → LOW。
来自 Zero 的 Agentic AI 项目 9 在真实环境中针对 NVIDIA NIM(meta/llama-3.1-8b-instruct)运行了这场辩论——每次辩论 8 次模型调用,两轮辩论,共 16 次实时调用。
多样性是工程出来的,不是碰运气
辩论只有在辩论者存在分歧时才有用。这通过三个截然不同的 system prompt 对同一个模型实现:
PERSONAS = [
Persona("cautious", "Cautious", "🛡️",
"You are the CAUTIOUS debater. Risk-averse and conservative: prefer proven, low-downside "
"answers, distrust hype, and double-check the arithmetic and edge cases before committing."),
Persona("creative", "Creative", "💡",
"You are the CREATIVE debater. Think laterally; back a bold, unconventional answer if the "
"upside is high — but flair is no excuse for being wrong on a question with a definite answer."),
Persona("literal", "Literal", "📏",
"You are the LITERAL debater. Precise and methodical: answer EXACTLY what was asked, show the "
"steps, and read nothing into the question that is not there."),
]
每个角色在不看其他人答案的情况下独立作答(temperature 0.7)。在一个有争议的问题上,它们从一开始就分道扬镳:2 个 bootstrap / 1 个 venture capital——真正的分歧,而不是三种措辞。关键是,每个提案都附带一个简短的规范立场——这是立场本身,而不是方法的描述——所以两个达成一致的智能体会发出相同的标签,可以被统计。
批评者不回答任何问题;反驳才是改变思想的关键
一位批评者阅读所有提案,并对每一个返回判决(sound / flawed / unsupported)和最重要的一个缺陷。它不回答问题——它唯一的工作是给反驳者一个可以攻击的靶子。然后每个提案者重新作答,在阅读了批评和其他人的意见后,只有在真正被说服的情况下才改变立场。而且思想变化是被测量出来的,而不是从模型的自我报告中信任的:
def detect_mind_changes(before, after): # measured from the STANCES, not self-report
pre = {p.persona_id: normalize_stance(p.stance) for p in before}
return [p.persona_id for p in after if pre[p.persona_id] != normalize_stance(p.stance)]
投票和置信度是确定性的 Python 代码
立场就是选票。将其标准化,使"$0.05"、"0.05"和".05"能够合并统计,然后计数:
def tally(final_proposals):
ballots = {p.persona_id: normalize_stance(p.stance) for p in final_proposals}
counts = dict(Counter(ballots.values()))
winner, votes = sorted(counts.items(), key=lambda kv: (-kv[1], kv[0]))[0] # plurality
tied = list(counts.values()).count(votes) > 1
return Tally(ballots, counts, winner, votes, total=len(final_proposals), tied=tied)
def derive_confidence(t):
r = t.winner_votes / t.total # the consensus ratio
if t.winner_votes == t.total and not t.tied: return Confidence("high", r, "unanimous")
if t.winner_votes > t.total / 2 and not t.tied: return Confidence("medium", r, "a majority")
return Confidence("low", r, "split — no majority; flagged")
裁判永远不能断言置信度——它是从数学中自然产生的。
两场真实辩论,两种截然不同的结果
在球棒和球的问题上,专家组达成了共识:"0.05"×3,比率 1.00,裁判说出"$0.05",HIGH 100%。在 bootstrap 对比 VC 的问题上,批评移动了两个人的想法(venture capital → hybrid,bootstrap → venture capital)——但专家组并没有收敛,而是分散成 1/1/1 的三向平局,比率 0.33,LOW 33%,被标记。这就是关键所在:一轮没有达成共识的辩论是一个有效的结果,真正的分歧被可视化为低置信度,而不是被虚假地抹平。
模型负责辩论;将论证转化为判决的每个部分都是确定性的 Python 代码,你可以阅读和测试。在这里逐步走过两轮辩论:https://dev48v.infy.uk/agentic/project9-debate.html——代码库在 https://github.com/dev48v/agentic-ai-from-zero
接下来,项目 10:一个自我反思的智能体,为自己的工作打分。