微信扫码
添加专属顾问
我要投稿
❝近期网上疯狂流传了一个人类与AI参与的VR狼人杀游戏,十分有趣。通过对游戏内容的分析,我发现游戏VR的表现形式十分吸引人,但其中的AI对话部分并不复杂。于是小智使用LangGraph实现了一个文字版本,今天将代码开源(文末获取),希望大家能喜欢。
首先给没看过视频的小伙伴们介绍下:
一个名为 Tore Knabe 的网友在 X 平台发布了一个视频,展示了一个有趣的实验:
这是一次反向图灵测试,几个全球最先进的大模型坐在一起,坐着火车唱着歌,但其中混进了人类:
参与者扮演历史知名人物,古希腊巨哲 —— 亚里士多德(GPT4 Turbo),维也纳古典乐派代表人物 —— 莫扎特(Claude3 Opus),意大利文艺复兴时期画家 —— 列奥纳多・达・芬奇(Llama3),埃及艳后 —— 克利奥帕特拉七世(Gemini Pro)。其中蒙古军事家 —— 成吉思汗由人类扮演。
游戏规则要求,参与者通过提问和回答来分辨人类与 AI,最后通过投票确定谁是人类。
人类扮演者因缺乏深度和逻辑性的回答,在第一轮的投票中就被3票淘汰,人类一败涂地。
接下来,我们来看看如何用LangGraph把这个游戏做出来吧!
游戏的过程很简单,主要包括以下三个环节。小智使用主持人Agent来将整个流程串起来。
def ask_for_speak(state: GameState):
# 如果待发言池为空,则进入投票阶段
if len(state['waiting']) == 0:
state['waiting'] = state['roles'].copy()
state['stage'] = 'vote'
print(f"主持人:游戏结束,请进行投票。请大家耐心等待投票结果!")
return ask_for_vote(state)
chat_history = state['chat_history']
last_chat = chat_history[-1]
last_chat_str = last_chat[0]+': '+last_chat[1]
waiting_roles_str = ','.join(state['waiting'])
llm = ChatOpenAI(model="glm-4", temperature=0.01)
choose_prompt = ChatPromptTemplate.from_template(load_prompt("prompt/choose_speaker.prompt"))
chain = choose_prompt|llm|StrOutputParser()
role_chosen = chain.invoke({"history": last_chat_str, "waitings": waiting_roles_str})
if role_chosen in state['waiting']:
state['waiting'].remove(role_chosen)
state['next_speaker'] = role_chosen
else:
next = random.choice(state['waiting'])
state['next_speaker'] = next
state['waiting'].remove(next)
return state
def ask_for_vote(state: GameState):
if len(state['waiting']) == 0:
human_role = state['human_role']
round = state['round']
# 统计票数决定是否结束游戏
vote_store = state['vote_store']
human_vote_count = 0
for vote in vote_store:
vote_role = vote[1]['vote']
if vote_role == human_role:
human_vote_count += 1
totle_votes = len(state['roles'])
# 如果人类角色票数超过一半,结束游戏
if human_vote_count > totle_votes / 2:
state['stage'] = 'end'
print("AI win!")
print("投票详情如下:"+json.dumps(vote_store, ensure_ascii=False))
elif round == 3:
state['stage'] = 'end'
print("Human存活超过3轮,Human win!")
else:
print("Human存活,游戏继续!")
print("上轮投票详情如下:"+json.dumps(vote_store, ensure_ascii=False))
state = gen_and_dispatch_role(state)
return state
next = random.choice(state['waiting'])
state['next_speaker'] = next
state['waiting'].remove(next)
return state
有了主持人Agent控场,那么其他角色就很好设计了,由于AI除了扮演角色不一样外,所执行的逻辑是一致的,我们可以统一抽象为AI角色扮演Agent,再就是用于人类输出的人类Agent
def speak(state: GameState):
role = state['next_speaker']
roles_str = ','.join(state['roles'])
chat_history = state['chat_history']
history = ""
for chat in chat_history:
history += f"{chat[0]}: {chat[1]}\n"
llm = ChatOpenAI(model="glm-4", temperature=0.8)
role_prompt = ChatPromptTemplate.from_template(load_prompt("prompt/role.prompt"))
chain = role_prompt|llm|StrOutputParser()
rsp = chain.stream({"role": role, "roles": roles_str, "history": history})
output = ''
print(role+':', end='', flush=True)
for token in rsp:
output += token
print(token, end='', flush=True)
print()
print("---------------------------")
state['chat_history'].append((role, output))
return state
def vote(state: GameState):
role = state['next_speaker']
roles_str = ','.join(state['roles'])
chat_history = state['chat_history']
history = ""
for chat in chat_history:
history += f"{chat[0]}: {chat[1]}\n"
llm = ChatOpenAI(model="glm-4", temperature=0.01)
vote_prompt = ChatPromptTemplate.from_template(load_prompt("prompt/vote.prompt"))
chain = vote_prompt|llm|JsonOutputParser()
output = chain.invoke({"role": role, "roles": roles_str, "history": history})
state['vote_store'].append((role, output))
return state
def speak(state: GameState):
role = state['next_speaker']
print("你当前的角色是:"+role)
user_input = input("请输入你的对话内容: ")
state['chat_history'].append((role, user_input))
return state
def vote(state: GameState):
role = state['next_speaker']
roles_str = ','.join(state['roles'])
print("你当前的角色是:"+role)
print("可供投票的选项有:"+roles_str)
user_vote = input("请输入你的投票选择: ")
user_reason = input("请输入你的投票原因: ")
state['vote_store'].append((role, {"vote":user_vote,"reason":user_reason}))
return state
最终实现效果如下所示:
游戏的完整代码已上传github开源,感兴趣的小伙伴可以拉取到自己本地玩一玩:https://github.com/q2wxec/langgraph-demo/tree/master/werewolf
53AI,企业落地大模型首选服务商
产品:场景落地咨询+大模型应用平台+行业解决方案
承诺:免费场景POC验证,效果验证后签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2025-03-11
阿里QwQ-32B发布啦,可能是671B最好的替代方案
2025-03-11
填补空白!首个提升大模型工作流编排能力的大规模数据集开源
2025-03-11
何必舍近求远 计算工厂帮你一键部署DeepSeek云主机
2025-03-11
剖析DeepSearcher,可本地部署的深度研究框架
2025-03-11
上线一天Github过万星,OpenManus核心作者聊Agent发展趋势
2025-03-11
微软开源多模态AI基础模型!无需额外微调轻松拿捏网页、机器人
2025-03-11
Manus AI 被「越狱」了?创始人紧急回应,并官宣开源计划
2025-03-10
惊了!动动嘴皮子就能搞定图像识别?这个神器让 AI 编程不再是梦!(内附代码)
2025-01-01
2024-07-25
2024-05-06
2025-01-21
2024-09-20
2024-07-20
2024-06-12
2024-08-13
2024-07-11
2024-12-26
2025-03-08
2025-03-03
2025-03-02
2025-03-01
2025-02-26
2025-02-23
2025-02-18
2025-02-15