每步出牌都可复盘:liars-bar-llm中GameRecord数据结构设计与全链路对局记录原理
【免费下载链接】liars-bar-llm一个由大语言模型驱动的AI版骗子酒馆对战框架项目地址: https://gitcode.com/gh_mirrors/li/liars-bar-llm
liars-bar-llm 是一个由大语言模型驱动的 AI 版骗子酒馆对战框架,让 DeepSeek、ChatGPT、Claude、Gemini 等主流模型坐在同一张牌桌前互相"撒谎"与"质疑"。本文带你拆解它最核心的设计——GameRecord 对局记录数据结构,以及从出牌、质疑、开枪到自动存盘的全链路对局记录原理,让你对每一步 AI 出牌都能完整复盘。
为什么 AI 对战需要完整的对局复盘?
骗子酒馆(Liar's Bar)是一款心理博弈桌游:每轮随机指定一张目标牌,玩家谎称自己打出目标牌,下家可以选择相信或发起质疑;质疑失败者要执行"开枪"惩罚,直到只剩一名玩家存活。
当玩家换成大语言模型时,复盘价值更高:
- 🎯 每一步出牌都附带出牌理由与模型思维链(thinking),决策依据完整留痕
- 🎯 每次质疑都记录了质疑理由、质疑结果,能还原"猜谎"过程
- 🎯 每轮开始时快照了手牌、子弹位置、玩家间印象,信息不丢失
这正是 GameRecord 要解决的问题:把一场"谁说了什么、为什么这么说"的完整博弈过程,结构化地沉淀下来。
GameRecord 数据结构:四级分层设计
核心实现在 game_record.py 中,整个结构像俄罗斯套娃,分为四级:
| 层级 | 类名 | 职责 | 关键字段 |
|---|---|---|---|
| 局 | GameRecord | 一整局游戏的总记录 | game_id、player_names、rounds、winner |
| 轮 | RoundRecord | 一轮(一次发牌周期) | round_id、target_card、round_players、player_initial_states、player_opinions、play_history、round_result |
| 动作 | PlayAction | 一次出牌 + 后续质疑 | played_cards、remaining_cards、play_reason、behavior、was_challenged、challenge_result、play_thinking |
| 快照 | PlayerInitialState | 轮次开始时玩家状态 | bullet_position、current_gun_position、initial_hand |
几个值得注意的设计细节:
- 动作即质疑:
PlayAction默认带was_challenged=False,质疑发生后才通过update_challenge()把质疑信息"追加"进同一条出牌记录,保证"出牌—质疑—结果"永远绑定在一起,复盘时不会错位 - 快照而非引用:每轮开始时深拷贝手牌、枪位和玩家印象(
player_opinions),即使后续状态变化,历史轮次依然可还原 - 时间戳即文件名:
generate_game_id()用%Y%m%d_%H%M%S时间戳生成game_id,一局一个 JSON 文件,天然按时间排序
一条出牌记录长什么样
以demo_records/game_records/20250225_095738.json为例,Claude 质疑失败后的记录包含:出牌方打出的牌、剩余手牌、出牌理由(含"数学依据"的推理)、质疑方的质疑理由、质疑结果(失败)、以及双方的思维链——任何一步决策都可以被完整还原。
全链路记录流程:从开局到存盘
game.py主循环在游戏的每个关键节点都会调用GameRecord的方法,形成闭环:
- 开局:
GameRecord.start_game()登记玩家名单,并在构造时自动创建game_records目录 - 每轮开始:
start_round()冻结目标牌、起始玩家、各玩家初始状态与相互印象 - 出牌:
record_play()把 AI 返回的出牌、剩余手牌、理由、表演描述、thinking 写入当前轮 - 质疑:
record_challenge()更新最近一次PlayAction的质疑字段 - 开枪:
record_shooting()记录射手与命中结果,并自动触发auto_save() - 终局:
finish_game(winner)写入胜利者并再次auto_save()
关键在第 5 步:auto_save()会把整局记录以indent=4、ensure_ascii=False的 JSON 格式落盘到game_records/{game_id}.json。也就是说每次开枪都会触发一次完整存盘——即使程序中途异常退出,已进行的轮次也不会丢失。
记录不止于保存:GameRecord 反向驱动 AI 决策
GameRecord 不只是"日志",它同时是 AI 玩家的"记忆接口":
get_latest_round_actions(current_player):把本轮历史改写成以当前玩家视角叙述的文本("你打出 2 张牌"或"轮到 Claude 出牌……"),直接拼进出牌提示词get_play_decision_info()/get_challenge_decision_info():注入双方已开枪次数与你对下家的印象,辅助"要不要质疑"的判断get_latest_round_result():轮次结束前生成射击结果文本,喂给反思(reflect)环节,让 AI 更新对对手的画像
这套"记录 → 渲染视角化文本 → 反哺提示词"的闭环,正是各模型印象(player_opinions)一轮比一轮更精准的原因。提示词模板位于prompt/目录,规则说明见prompt/rule_base.txt。
一键复盘:JSON 变成人话报告 📊
拿到 JSON 记录后,项目内置三个分析工具,把原始数据变成可读成果:
python json_convert.py:把game_records/下所有 JSON 转成中文叙事文本,输出到converted_game_records/,示例见 demo_records/converted_game_records/20250225_095738.txtpython player_matchup_analyze.py:提取模型两两对决的质疑事件,生成matchup_records/下的详细对局报告python game_analyze.py:统计胜场、开枪次数、存活积分与模型间胜率矩阵
项目已附带 50 局真实 Demo 数据(4 个模型 6 份两两对决记录),在demo_records/目录下可直接体验,无需先跑一局。
快速上手指南
1️⃣ 克隆仓库
git clone https://gitcode.com/gh_mirrors/li/liars-bar-llm cd liars-bar-llm2️⃣ 安装依赖并配置模型接口(统一接口配置在llm_client.py)
pip install openai3️⃣ 在game.py的player_configs中填入模型名称,运行单局
python game.py4️⃣ 批量跑 10 局并生成复盘报告
python multi_game_runner.py -n 10 python json_convert.py python game_analyze.py跑完后打开converted_game_records/里最新的时间戳文本,就能像看小说一样回顾每步出牌、每场质疑与每一次开枪——这就是 GameRecord 全链路记录设计的全部意义。
总结
- 四级分层:GameRecord → RoundRecord → PlayAction → 状态快照,一局游戏被完整结构化
- 质疑内嵌出牌:
PlayAction.update_challenge()让"出牌-质疑-结果"天然绑定,复盘零错位 - 关键节点自动存盘:开枪、终局触发
auto_save(),进程中断也不丢局 - 记录即记忆:同一份数据以"视角化文本"反哺 AI 提示词,驱动决策与反思
如果你想让 LLM 玩家的行为可解释、可审计、可量化,这套"动作留痕 + 快照冻结 + 自动落盘 + 工具化复盘"的 GameRecord 设计,是很值得参考的对局记录范式。
【免费下载链接】liars-bar-llm一个由大语言模型驱动的AI版骗子酒馆对战框架项目地址: https://gitcode.com/gh_mirrors/li/liars-bar-llm
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考