LLM输出不稳定怎么办?liars-bar-llm的JSON解析+5次重试容错机制实战教程
2026/8/23 14:43:55 网站建设 项目流程

LLM输出不稳定怎么办?liars-bar-llm的JSON解析+5次重试容错机制实战教程

【免费下载链接】liars-bar-llm一个由大语言模型驱动的AI版骗子酒馆对战框架项目地址: https://gitcode.com/gh_mirrors/li/liars-bar-llm

LLM输出不稳定怎么办?如果你正在用大语言模型驱动 Agent,一定会遇到这个问题:模型有时返回一段带闲聊的 JSON,有时干脆格式全错。开源项目liars-bar-llm是一个由 LLM 驱动的「AI版骗子酒馆」对战框架,让 DeepSeek、ChatGPT、Claude、Gemini 等大模型同桌博弈。它的核心难点之一,就是如何让模型稳定输出符合游戏规则的 JSON 决策——项目用「提示词强约束 + 正则提取 + 5次重试容错」三层组合拳解决了这个问题,本教程带你完整拆解这套可直接复用的容错方案。

一、为什么 LLM 输出不稳定?骗子酒馆放大了这个问题 🎲

在 liars-bar-llm 的对抗场景中,每个 AI 玩家在「出牌」和「质疑」两个阶段都必须输出严格格式的 JSON:

  • 出牌阶段:必须返回played_cards(1~3 张手牌)、behavior(表演描述)、play_reason(理由)三个键;
  • 质疑阶段:必须返回was_challenged(布尔值)和challenge_reason(理由)。

问题在于,LLM 是概率模型:同样的提示词,它可能输出带 markdown 代码块包裹的 JSON,可能在 JSON 前后夹杂解释文字,甚至给出不在手牌里的牌。游戏流程一旦卡在这里,整局对战就会崩溃。

项目的 README.md 在「已知问题」中也明确写道:

模型在出牌和质疑阶段的输出可能不稳定,当输出无法满足游戏规定时,会自动重试。

下面逐层拆解 liars-bar-llm 的容错设计。

二、容错机制拆解:JSON 解析 + 5 次重试是怎么做的 🔍

整套机制的入口在 player.py 的Player类中,共四道防线。

防线 1:提示词从源头约定 JSON 输出格式

项目在 prompt/ 目录下用模板文件约束输出格式,例如出牌提示词 play_card_prompt_template.txt 明确要求:

你需要输出一个完整的json结构,包含三个键值对:played_cardsbehaviorplay_reason

质疑提示词 challenge_prompt_template.txt 同理。模板中同时注入了 rule_base.txt 游戏规则和实时对局状态,让模型「知道该输出什么」。

防线 2:正则提取,容忍"不纯粹的 JSON"

模型输出经常是「前言 + JSON + 后记」的混合体。player.py 没有直接json.loads整段文本,而是先用正则从任意位置抠出 JSON 部分

json_match = re.search(r'({[\s\S]*})', content) json_str = json_match.group(1) result = json.loads(json_str)

这一步能兼容模型加解释、加代码块前后缀等常见"污染"。

防线 3:5 次自动重试 + 业务规则校验 🛡️

抠出 JSON 还不够,还要验证业务规则。以出牌为例,choose_cards_to_play 中有一个for attempt in range(5)循环:

  1. 校验三个键是否齐全(played_cards/behavior/play_reason);
  2. 容错处理:若played_cards被模型输出成字符串,自动包成列表;
  3. 验证每张牌必须在当前手牌中、张数在 1~3 之间——防止模型"幻觉"出不存在的牌;
  4. 任何一步失败(包括 API 请求异常,因为 llm_client.py 的chat方法出错时会返回空字符串兜底),只打印日志、不修改原始提示词,用同一条 prompt 再请求一次;
  5. 最多 5 次。

质疑决策 decide_challenge 采用完全相同的模式,额外校验was_challenged必须是布尔值。

防线 4:重试耗尽后快速失败,而不是静默出错

如果 5 次都失败,两处方法都会抛出RuntimeError(见 player.py 与 player.py),让进程明确中断,避免"错误决策悄悄混入对局"。这种宁可失败也不降级的策略,对需要可信数据的对战记录(保存在 game_record.py 定义的game_recordsJSON 文件中)尤为重要。

三、实战上手:三步跑起带容错机制的 AI 对战 🚀

第 1 步:克隆项目

git clone https://link.gitcode.com/i/9939233720d6c59cf7f010628defe0b9 cd liars-bar-llm

第 2 步:安装依赖并配置模型接口

pip install openai

在 llm_client.py 中填入API_BASE_URLAPI_KEY(项目建议通过 New API 等统一网关管理多模型接口)。

第 3 步:配置玩家并运行

在 game.py 或 multi_game_runner.py 入口处的player_configs中设置模型名称,然后:

python game.py # 单局对战 python multi_game_runner.py -n 10 # 批量跑 10 局

运行过程中若模型输出不合规则,你会在控制台看到尝试 1 解析失败: ...这类日志——这正是 5 次重试机制在工作。对局数据会自动保存为 JSON,可用 json_convert.py 转成可读文本、game_analyze.py 统计胜率。项目已附带四个模型 50 局的演示数据,见 demo_records/。

四、输出仍然不稳定?两个进阶调节旋钮 🎛️

当某个模型频繁触发重试上限时,README 给出了官方建议,两个方向都改起来很快:

  1. 增加重试次数:修改 player.py 中choose_cards_to_play与 player.py 中decide_challengerange(5),把上限从 5 调大;
  2. 强化提示词限制:在 play_card_prompt_template.txt 和 challenge_prompt_template.txt 中补充"只输出 JSON、禁止任何解释文字"等硬性措辞(注意:过强的格式限制可能对模型推理能力有一定影响,需权衡)。

五、关键文件速查表 📂

模块路径作用
容错重试核心player.py出牌/质疑的 5 次重试与 JSON 校验
模型接口封装llm_client.py统一 LLM 请求与异常兜底
输出格式约束prompt/出牌、质疑、反思三套提示词模板
游戏主程序game.py单局对战流程
批量运行multi_game_runner.py多局对战
记录与统计game_record.py、game_analyze.pyJSON 记录与数据分析

总结

面对LLM输出不稳定,liars-bar-llm 的实战答案可以浓缩为一句话:提示词约定格式、正则宽容提取、业务规则校验、有限次重试兜底。这套「JSON解析 + 5次重试」的容错机制不依赖特定模型,任何需要 LLM 结构化输出的 Agent 项目(决策系统、工具调用、数据提取)都能直接借鉴。动手跑一局 AI 骗子酒馆对战,是理解这套机制最快的方式 🃏。

【免费下载链接】liars-bar-llm一个由大语言模型驱动的AI版骗子酒馆对战框架项目地址: https://gitcode.com/gh_mirrors/li/liars-bar-llm

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询