时间:2026-01-27 23:49
人气:
作者:admin
目前国内还是很缺AI人才的,希望更多人能真正加入到AI行业,共同促进行业进步。想要系统学习AI知识的朋友可以看看我的教程http://blog.csdn.net/jiangjunshow,教程通俗易懂,风趣幽默,从深度学习基础原理到各领域实战应用都有讲解。
现在单智能体玩着都没意思了,最近多智能体对抗才是真的火!我突发奇想:让两个AI拿着同一个辩题互怼,一个正方一个反方,它们会像人类辩手一样针锋相对,还是互相商业互吹陷入死循环?
说干就干!我用2026年最火的LangGraph框架搭了个多智能体辩论系统,还加了个裁判智能体最后定胜负,全程代码开源,零基础也能跑通~ 看完这篇,你也能自己调教两个AI吵架,超有意思的!
做这个实验之前,我先把整体逻辑捋清楚了,咱不搞花里胡哨的,核心就3个角色,分工明确得很,跟真人辩论赛一模一样~
为啥选LangGraph?这可是现在生产级多智能体的首选框架啊~✅ 基于图结构设计,状态管理、上下文共享贼方便,比老版LangChain的Chain套Chain舒服多了,调试起来不头疼!
整个实验的技术栈超轻量,都是Python生态的,不用装花里胡哨的东西:
整个辩论是结构化的,轮次固定,不会乱套,流程走一遍就懂:
简单说就是:输入辩题→正方先立论→反方反驳→循环N轮→裁判定输赢,全程上下文记忆会跟着走,智能体不会忘事~
很多人做多智能体对话,最后变成AI互相尬聊,核心问题就是Prompt没写好+参数没调对!我踩了坑,给大家整理了最优配置,直接抄作业就行~
Prompt是灵魂!尤其是反方的Prompt,必须加强约束,不然它就会佛系发言,一点对抗性都没有~????
# 正方Prompt模板
pro_prompt = """
你是专业辩论赛正方辩手,当前辩题:{topic},当前是第{round}轮辩论。
【辩论历史】:{history}
请严格遵守以下规则:
1. 立论清晰,必须用数据/案例支撑你的观点,别空话;
2. 如果反方已经发言,必须针对其观点进行逻辑回击,不能避重就轻;
3. 发言控制在300字以内,简洁有力!
"""
# 反方Prompt模板(重点!强约束)
con_prompt = """
你是专业辩论赛反方辩手,当前辩题:{topic},当前是第{round}轮辩论。
【辩论历史】:{history}
请严格遵守以下规则:
1. 必须先引用正方最新发言的原话,再指出其逻辑谬误/证据不足的地方;
2. 反驳要有理有据,可举反例,不抬杠;
3. 绝对不能自说自话,脱离正方的观点;
4. 发言控制在300字以内,一针见血!
"""
# 裁判Prompt模板
judge_prompt = """
你是中立的辩论赛裁判,无任何立场,当前辩题:{topic}。
【完整辩论历史】:{history}
请根据以下标准判定胜负:
1. 论据充分性:是否有数据/案例支撑,论据是否有效;
2. 逻辑严谨性:发言是否有逻辑漏洞,反驳是否精准;
3. 立场坚定性:是否全程围绕辩题,无跑题、无前后矛盾。
要求:先总结正反两方核心观点+辩论亮点,再明确说出获胜方,最后说明判定理由,500字以内。
"""
调参真的太重要了!温度太高AI跑题,太低又太死板,我试了十几次,整理了新手友好的配置表????
| 参数项 | 正方Agent | 反方Agent | 裁判Agent | 说明 |
|---|---|---|---|---|
| 模型温度(temperature) | 0.7 | 0.8 | 0.1 | 正反方带点随机性,裁判必须绝对理性 |
| 最大生成长度(max_tokens) | 300 | 300 | 500 | 控制发言篇幅,不拖沓 |
| 上下文窗口 | 2048 | 2048 | 4096 | 裁判需要记住全程,窗口要大 |
| 重复惩罚系数 | 1.2 | 1.2 | 1.0 | 防止AI重复说一句话 |
话不多说,上硬菜!完整代码来了,注释写得超详细,复制到本地,改个API密钥就能跑~????
环境准备:先装依赖,一行命令搞定:
pip install langgraph langchain-chatglm python-dotenv graphviz
import os
from dotenv import load_dotenv
from langgraph import Graph, StateGraph, messages
from langchain_chatglm import ChatGLM
from typing import List, Dict, Any
# 加载环境变量(把你的ChatGLM-4 API密钥写在.env文件里)
load_dotenv()
API_KEY = os.getenv("CHATGLM_API_KEY")
API_BASE = os.getenv("CHATGLM_API_BASE")
# 初始化大模型
def init_llm(temperature: float, max_tokens: int) -> ChatGLM:
return ChatGLM(
model_name="chatglm4",
openai_api_key=API_KEY,
openai_api_base=API_BASE,
temperature=temperature,
max_tokens=max_tokens
)
# 初始化各智能体LLM
pro_llm = init_llm(temperature=0.7, max_tokens=300)
con_llm = init_llm(temperature=0.8, max_tokens=300)
judge_llm = init_llm(temperature=0.1, max_tokens=500)
# 定义辩论状态(LangGraph核心,管理上下文和轮次)
class DebateState(Dict):
topic: str # 辩题
round: int # 当前轮次
max_rounds: int # 最大轮次
history: List[str] # 辩论历史
result: str # 辩论结果
# 正方发言节点
def pro_speak(state: DebateState) -> DebateState:
# 拼接Prompt
prompt = pro_prompt.format(
topic=state["topic"],
round=state["round"],
history="\n".join(state["history"])
)
# 调用模型生成发言
response = pro_llm.invoke(prompt)
pro_content = f"正方第{state['round']}轮:{response.content}"
# 更新历史和状态
state["history"].append(pro_content)
print(pro_content)
return state
# 反方发言节点
def con_speak(state: DebateState) -> DebateState:
prompt = con_prompt.format(
topic=state["topic"],
round=state["round"],
history="\n".join(state["history"])
)
response = con_llm.invoke(prompt)
con_content = f"反方第{state['round']}轮:{response.content}"
state["history"].append(con_content)
print(con_content)
# 轮次+1
state["round"] += 1
return state
# 裁判判定节点
def judge_debate(state: DebateState) -> DebateState:
prompt = judge_prompt.format(
topic=state["topic"],
history="\n".join(state["history"])
)
response = judge_llm.invoke(prompt)
state["result"] = f"裁判总结与判定:{response.content}"
print("\n" + state["result"])
return state
# 轮次判断节点(是否继续辩论)
def should_continue(state: DebateState) -> str:
if state["round"] <= state["max_rounds"]:
return "pro_speak" # 继续下一轮
else:
return "judge_debate" # 进入裁判环节
# 构建LangGraph工作流
def build_debate_graph() -> StateGraph:
graph_builder = StateGraph(DebateState)
# 添加节点
graph_builder.add_node("pro_speak", pro_speak)
graph_builder.add_node("con_speak", con_speak)
graph_builder.add_node("judge_debate", judge_debate)
# 设置起始节点
graph_builder.set_entry_point("pro_speak")
# 添加边:正方→反方→判断轮次
graph_builder.add_edge("pro_speak", "con_speak")
graph_builder.add_conditional_edges("con_speak", should_continue, {
"pro_speak": "pro_speak",
"judge_debate": "judge_debate"
})
# 裁判环节为结束节点
graph_builder.set_finish_point("judge_debate")
# 编译图
return graph_builder.compile()
# 主函数:运行辩论实验
if __name__ == "__main__":
# 配置实验参数
debate_topic = "AI是否会取代程序员" # 可自定义辩题
max_rounds = 3 # 可自定义辩论轮次
# 初始化初始状态
initial_state = {
"topic": debate_topic,
"round": 1,
"max_rounds": max_rounds,
"history": [],
"result": ""
}
# 构建并运行图
debate_graph = build_debate_graph()
debate_graph.invoke(initial_state)
# 保存辩论记录到本地
with open("ai_debate_log.txt", "w", encoding="utf-8") as f:
f.write(f"AI辩论实验记录\n辩题:{debate_topic}\n最大轮次:{max_rounds}\n\n")
f.write("\n".join(initial_state["history"]))
f.write("\n\n" + initial_state["result"])
print("\n✅ 辩论实验完成!记录已保存至ai_debate_log.txt")
.env文件里,格式:CHATGLM_API_KEY=你的密钥、CHATGLM_API_BASE=你的BASE地址;ai_debate_log.txt,保存全程辩论记录,方便复盘~我用“AI是否会取代程序员”这个辩题跑了3轮,两个AI的对抗性直接拉满,裁判最后定的反方获胜,给大家看个精彩片段~????
正方第1轮:AI会取代程序员,据Gartner数据,2027年超60%的基础代码将由AI生成,低代码/无代码平台会让初级程序员失去工作,AI的编码效率是人类的10倍以上,未来基础开发岗位会被完全替代。
反方第1轮:正方提到“2027年超60%的基础代码由AI生成”,但该数据仅指向基础代码,而程序员的核心价值并非写基础代码,而是需求分析、架构设计、业务逻辑梳理,这些需要人类的行业经验和创造力,AI目前无法替代。此外,AI编码需要程序员提精准需求,没有程序员,AI的代码毫无意义。
正方第2轮:…(针对反方观点回击)
反方第2轮:…(引用正方原话反驳)
裁判最后判定反方获胜的核心理由:正方仅聚焦“基础代码生成”,忽略了程序员的核心价值,论据片面;反方精准抓住正方的逻辑漏洞,论据更全面,且全程反驳都紧扣正方观点,逻辑严谨~
真的超有意思!不同的辩题会有不同的结果,大家可以自己试试~
做完这个实验,我最大的感受是:多智能体的核心不是智能,而是协作/对抗的编排~单智能体的能力再强,也只是单点突破,而多智能体通过合理的角色分工、状态管理,能实现1+1>2的效果,这也是未来AI的核心发展方向之一。
另外,这个实验还有很多可以优化的点,大家可以自己拓展:
觉得这篇文章有用的话,别忘了点赞+收藏+关注~后续还会更更多多智能体实战案例,比如AI团队写代码、AI玩狼人杀等等,超有意思的,关注我不迷路~????
目前国内还是很缺AI人才的,希望更多人能真正加入到AI行业,共同促进行业进步。想要系统学习AI知识的朋友可以看看我的教程http://blog.csdn.net/jiangjunshow,教程通俗易懂,风趣幽默,从深度学习基础原理到各领域实战应用都有讲解。
下一篇:Claude Code