1. 项目概述:当AI智能体开始玩“猜词游戏”

最近,我动手做了一个挺有意思的东西:一个专为AI智能体设计的“Wordle”游戏。如果你对Wordle还有印象,它就是那个风靡全球的每日猜词游戏,玩家有六次机会猜一个五个字母的单词,每次猜测后,系统会用颜色(绿色代表字母正确且位置正确,黄色代表字母正确但位置错误,灰色代表字母不在单词中)给出反馈。这个游戏的精髓在于,玩家需要根据有限的反馈信息,运用逻辑推理和词汇知识,一步步逼近正确答案。

那么,当玩家从人类换成AI智能体时,会发生什么?这正是我这个项目的核心。我构建了一个标准化的游戏环境,让不同的AI智能体——无论是基于大型语言模型(LLM)的对话式智能体,还是专门训练的逻辑推理模型——都能接入并参与这个游戏。我的目标不是简单地复现Wordle,而是创建一个可以衡量、对比和优化AI智能体在受限信息下进行序列决策与逻辑推理能力的“基准测试场”。

这个项目适合所有对AI智能体、强化学习、游戏AI或者单纯对“让AI玩游戏”感兴趣的朋友。无论你是想了解如何为智能体设计交互环境,还是想测试自家智能体的推理能力,亦或是好奇AI会如何玩这种人类擅长的文字推理游戏,都能从这里获得启发。接下来,我会详细拆解整个项目的设计思路、技术实现、踩过的坑以及一些有趣的发现。

2. 整体架构与核心设计思路

2.1 为什么选择Wordle作为测试床?

在为AI智能体设计测试环境时,选择Wordle并非偶然。它具备几个非常适合作为基准测试的优良特性:

  1. 状态空间有限但非平凡 :单词库虽然庞大(我采用了约2300个常见的五字母单词作为答案库),但相对于围棋、星际争霸等游戏,其状态空间是有限的、可枚举的。然而,从起始的完全不确定到最终确定唯一单词,其搜索和推理过程并不简单,充满了组合爆炸的可能性。
  2. 完美的信息可观测性 :游戏规则是确定且透明的。智能体在每一步都能获得明确、无噪声的反馈(颜色标记)。这避免了像真实物理世界或部分信息游戏中存在的感知不确定性,让我们能更纯粹地测试智能体的 规划与推理能力 ,而非感知能力。
  3. 序列决策与信息增益 :这是一个典型的序列决策过程。每一次猜测不仅是为了“碰运气”,更是为了最大化“信息增益”。一个好的猜测应该能最大限度地缩小可能的单词集合。这直接对应了AI中的 探索与利用 权衡,以及基于信息的决策理论。
  4. 可量化的性能指标 :评估标准极其清晰——成功猜出单词所需的尝试次数。我们可以计算平均尝试次数、成功率(在6次内猜中的比例)等指标,方便不同智能体进行横向对比。

基于这些考虑,我将项目核心定位为: 构建一个标准化、可编程交互的Wordle游戏服务器,并定义清晰的智能体接口协议 。这样,任何符合接口的智能体都能“即插即用”地进行对战和评估。

2.2 系统架构拆解

整个系统采用客户端-服务器(C/S)架构,但这里的“客户端”是AI智能体。架构清晰分离了环境与智能体,符合主流强化学习环境的设计规范。

服务器端(游戏环境)

  • 游戏引擎 :核心逻辑模块。负责从预设词库中随机选择当日单词、验证玩家猜测的单词是否合法(是否在允许的猜测词列表中,我使用的列表包含约13000个五字母单词)、根据规则计算并返回颜色反馈。
  • 状态管理器 :为每个游戏会话维护状态,包括:已进行的回合数、历史猜测记录、历史反馈、当前仍有可能的单词集合(根据反馈动态过滤)。
  • API网关 :提供一组标准的RESTful API或WebSocket接口。这是智能体与游戏环境通信的桥梁。关键接口包括:
    • POST /start :开始一个新游戏,返回一个唯一的游戏会话ID。
    • POST /guess/{session_id} :智能体提交一个猜测单词。服务器验证后,返回反馈(颜色模式)和当前游戏状态(回合数、是否结束)。
    • GET /state/{session_id} :获取指定游戏的当前状态。

智能体端

  • 这是变量所在,也是项目的趣味核心 。每个智能体需要实现一个标准的“决策函数”。这个函数接收当前游戏状态(历史记录和反馈),并输出下一个要猜测的单词。智能体的内部实现可以千差万别:
    • 规则型智能体 :实现固定的猜测策略,例如总是从“AROSE”或“CRANE”这类元音和常用辅音丰富的单词开始。
    • 搜索型智能体 :在每一轮,根据当前所有可能的单词集合(由历史反馈约束),通过算法(如熵最大化、最小化最坏情况)选择一个最优猜测。
    • LLM驱动型智能体 :将游戏状态和规则作为提示词(Prompt)提交给大型语言模型(如GPT-4、Claude等),让模型“思考”并生成下一个猜测。这是测试LLM逻辑推理能力的绝佳场景。
    • 学习型智能体 :采用强化学习(RL)训练,通过与环境的多次交互来学习猜测策略。

注意 :服务器端词库和验证列表的选择至关重要。我使用了经过社区验证的Wordle原始词库,确保单词的常见性和游戏难度与原版一致。避免使用生僻词,否则会不公平地偏向于拥有庞大词汇嵌入(Embedding)的LLM智能体。

3. 核心模块实现细节

3.1 游戏引擎的实现要点

游戏引擎的核心是反馈计算函数。它的输入是秘密单词 secret 和猜测单词 guess ,输出是一个长度为5的字符串,每个字符代表一个字母的反馈状态(例如“G”代表绿色/正确,“Y”代表黄色/存在,“B”代表黑色/灰色/不存在)。

实现这个函数时,有几个容易出错的细节:

  1. 重复字母的处理 :这是Wordle规则中最微妙的部分。假设秘密单词是“APPLE”,猜测单词是“PAPER”。

    • 第一个‘P’:在秘密单词中,第一个‘P’在位置2。猜测单词位置1的‘P’是黄色(存在但位置错)。
    • 第二个‘A’:在秘密单词中,第一个‘A’在位置1。猜测单词位置2的‘A’是黄色。
    • 第三个‘P’:秘密单词只有一个‘P’,而且已经被第一个猜测的‘P’匹配(标记为黄色)了。那么第三个‘P’应该标记为灰色(不存在),因为秘密单词里没有多余的‘P’来匹配它了。
    • 正确的反馈应该是:黄,黄,灰,绿,灰(对应位置:P, A, P, E, R)。

    我的实现逻辑是进行两轮扫描:

    def calculate_feedback(secret: str, guess: str) -> str:
        secret_list = list(secret)
        guess_list = list(guess)
        result = [‘B‘] * 5  # 初始化为全灰
    
        # 第一轮:标记精确匹配(绿色)
        for i in range(5):
            if guess_list[i] == secret_list[i]:
                result[i] = ‘G‘
                secret_list[i] = None  # 标记已匹配,避免重复使用
                guess_list[i] = None
    
        # 第二轮:标记存在但位置错误(黄色)
        for i in range(5):
            if guess_list[i] is not None and guess_list[i] in secret_list:
                result[i] = ‘Y‘
                # 找到并消耗掉秘密单词中第一个未被匹配的相同字母
                idx = secret_list.index(guess_list[i])
                secret_list[idx] = None
    
        return ‘‘.join(result)
    

    这个算法确保了重复字母的反馈符合官方规则。

  2. 词库的加载与验证 :我准备了两个词表文件: answer_words.txt (约2300个,作为可能的秘密单词)和 allowed_guesses.txt (约13000个,所有合法的猜测单词)。游戏开始时,从 answer_words.txt 中随机选取一个作为 secret 。智能体提交的猜测必须在 allowed_guesses.txt 中才被接受。这样做既控制了游戏难度,又给了智能体一定的灵活性(例如可以猜一些虽不是答案但信息量大的词)。

3.2 智能体接口协议设计

为了让智能体易于集成,我设计了一个非常轻量级的接口。智能体只需要实现一个类,其中包含一个 make_guess 方法。

# 智能体基类定义
class WordleAgent:
    def __init__(self, agent_name: str):
        self.name = agent_name
        self.game_state = {}  # 用于存储服务器返回的状态

    def update_state(self, game_state: dict):
        """更新智能体内部维护的游戏状态。"""
        self.game_state = game_state
        # 状态通常包括:当前回合数、历史猜测、历史反馈、是否结束、是否获胜等

    def make_guess(self) -> str:
        """
        核心决策函数。
        基于当前的 self.game_state,推理并返回下一个猜测单词。
        必须返回一个在合法猜测词列表中的5字母单词。
        """
        raise NotImplementedError(“子类必须实现此方法”)

# 一个简单的随机智能体示例
class RandomAgent(WordleAgent):
    def __init__(self):
        super().__init__(“RandomBot”)
        with open(‘allowed_guesses.txt‘, ‘r‘) as f:
            self.all_words = [line.strip().upper() for line in f]

    def make_guess(self) -> str:
        # 随机选择一个词,这显然不是好策略,仅作演示
        return random.choice(self.all_words)

服务器会通过API调用智能体的 update_state 来同步信息,然后调用 make_guess 获取猜测。这种设计将游戏逻辑和智能体逻辑完全解耦。

3.3 信息论最优智能体实现

为了建立一个强大的基线(Baseline),我实现了一个基于信息论的“最优”搜索智能体。它的目标是在每一轮猜测中,选择能带来 最大期望信息增益 的单词。

核心原理

  1. 可能单词集合(Candidate Set) :初始为所有答案单词(~2300个)。每获得一次反馈,就根据反馈过滤这个集合,只保留与所有历史反馈一致的单词。
  2. 计算猜测单词的信息价值 :对于一个候选的猜测单词 g ,我们考虑它针对 当前可能单词集合 中每一个可能的秘密单词 s 会产生什么样的反馈 f 。我们将产生相同反馈 f 的秘密单词 s 归为一组。
  3. 计算熵(Entropy) :分组后,每个组的大小不同。信息增益的期望与猜测后剩余的不确定性(熵)减少量相关。一个“好”的猜测会将可能单词集合均匀地分割成许多小分组,这意味着无论秘密单词是什么,这个猜测都能极大地缩小范围。其期望信息增益公式可以简化为计算猜测单词的“熵”: H(g) = - Σ (p_i * log2(p_i)) ,其中 p_i 是猜测 g 导致第 i 种反馈模式的概率(用当前可能集合中的单词频率估算)。
  4. 选择策略 :在每一轮,从所有允许猜测的单词中,选择能使 H(g) 最大化的那个单词作为本次猜测。如果当前可能单词集合只剩一个或很少几个,则直接从中选择。

实现细节与优化

  • 计算开销 :最朴素的实现需要遍历所有允许猜测词(~13000)和所有当前可能答案词(最多~2300),计算量很大。我进行了优化:
    • 第一轮猜测是固定的,可以预先计算好最优开局词(如“SALET”、“CRANE”在信息论上评分很高),无需实时计算。
    • 当可能单词集合缩小到一定数量(如50个)以下时,可以只在这个小集合和答案集合中搜索最优猜测,大幅减少计算量。
    • 使用缓存(Memoization)来存储已经计算过的(猜测词,反馈模式)对对应的可能单词子集大小。
  • 实操心得 :这个智能体非常强大,平均尝试次数在3.5次左右,6次内成功率超过99%。它为我们评估其他智能体(尤其是LLM智能体)提供了一个近乎完美的参照系。如果某个LLM智能体的平均表现接近这个信息论智能体,说明其逻辑推理能力非常出色。

4. 让LLM智能体参与游戏:挑战与技巧

本项目的重头戏之一是接入大型语言模型(LLM)作为智能体。我测试了包括GPT-3.5、GPT-4、Claude等在内的多种模型。这个过程充满了挑战,也收获了许多有趣的发现。

4.1 Prompt工程的设计与迭代

让LLM玩Wordle,本质上是通过精心设计的提示词,引导它进行一步步的逻辑推理。我的提示词结构经历了多次迭代:

初始版本(效果一般)

你正在玩Wordle游戏。秘密是一个5字母的英文单词。
你之前的猜测和反馈如下:
[历史记录]
请根据以上信息,给出下一个最有可能的猜测单词。只输出单词本身。
  • 问题 :LLM经常忽略历史反馈的约束,或者做出不符合规则的猜测(如重复已排除的字母)。它更倾向于根据语义关联“蒙”一个词,而不是进行系统的逻辑过滤。

改进版本(加入规则与推理要求)

你是一个Wordle游戏高手。游戏规则:秘密是一个5字母单词。每次猜测后,你会得到反馈:
- 绿色(G):字母正确且位置正确。
- 黄色(Y):字母存在但位置错误。
- 灰色(B):字母不存在于单词中。
历史记录(格式:猜测 -> 反馈):
[历史记录]
请严格遵循以下步骤思考:
1. 根据灰色字母,列出绝对不包含的字母。
2. 根据黄色字母,列出必须包含但位置错误的字母及其错误位置。
3. 根据绿色字母,确定已固定的字母及其位置。
4. 综合以上,在脑海中过滤可能的单词集合。
5. 选择一个既符合所有约束,又尽可能包含高频字母(如E, A, R, S, T)的单词作为你的下一次猜测。
请输出你的完整推理过程,并在最后一行以‘猜测:‘开头输出你的单词。
  • 改进 :强制LLM进行一步步的推理,并将中间思考过程暴露出来。这大大提高了猜测的合规性和逻辑性。使用“在脑海中过滤”这样的指令,能更好地利用LLM的文本模式匹配能力。

最终稳定版本(引入外部工具调用模拟)

你是一个Wordle求解器。你的核心能力是进行逻辑推理和集合操作。
当前游戏状态:
- 已排除字母:[列出所有灰色字母]
- 必须包含但位置待定字母:[字母: [错误位置列表], ...]
- 已确定位置字母:[位置: 字母, ...]
- 剩余尝试次数:X
历史猜测与反馈:
[历史记录]

你的任务:基于以上状态,生成下一个最优猜测单词。
为了帮助你,你可以按需使用以下“工具”:
1. 工具【过滤词表】:当你需要根据当前所有约束条件,筛选可能的单词列表时,可以调用此工具。输入你的约束条件描述。
2. 工具【选择猜测】:当你从可能的单词列表中决定最终猜测时,可以调用此工具。输入你的候选单词列表和选择理由。

请先陈述你的推理思路,然后明确说明你将使用哪个工具,以及输入是什么。我将扮演工具并返回结果。
  • 关键突破 :这个设计利用了LLM在“函数调用”或“工具使用”模式下的优势。虽然我并没有实现真正的工具后端,但通过这种结构化提示,我引导LLM模拟了搜索型智能体的两个关键步骤: 过滤 决策 。LLM输出的结构化文本更容易被解析,其推理过程也更接近人类高手的思路——先缩小范围,再从中择优。

4.2 不同LLM的表现差异

在相同的提示词下,不同模型的性能差异显著:

模型 平均尝试次数 6次内成功率 观察到的特点
GPT-4 ~3.8 - 4.2 ~95% 推理链条清晰,能严格遵守约束,善于利用词频和单词结构知识。偶尔会“想太多”,选择一些非常生僻但符合逻辑的词。
GPT-3.5-Turbo ~4.5 - 5.0 ~80-85% 基本逻辑正确,但更容易犯“遗忘”约束的错误(例如重复使用灰色字母)。稳定性不如GPT-4。
Claude (Opus) ~3.9 - 4.3 ~93% 推理能力与GPT-4相当,有时在解释推理过程时更详尽。对提示词的细微变化非常敏感。

实操心得 :温度(Temperature)参数的设置至关重要。对于Wordle这类需要严谨推理的任务,必须将温度设置为0或接近0(如0.1),以确保模型输出的确定性和可重复性。较高的温度会导致模型“创造性”地违反游戏规则,性能急剧下降。

4.3 LLM智能体的典型失败模式

即使是最先进的LLM,也会暴露出一些有趣的缺陷:

  1. 词汇量幻觉与过度推理 :LLM的词汇知识来源于训练语料,它可能“知道”一些极其生僻的单词。有时,当所有常见单词都被排除后,LLM会选择一个完全符合字母约束但极其罕见的单词(如“XYLYL”),而不是意识到自己的过滤逻辑可能有误,或者当前可能单词集合其实已经为空(说明之前推理出错)。这反映了LLM缺乏对自身知识边界和问题现实性的判断。
  2. 对重复字母规则的混淆 :尽管在提示词中明确说明了规则,LLM在处理重复字母的反馈时,仍然比规则型智能体更容易出错。例如,它可能理解“有一个黄色‘S’”意味着单词中至少有一个‘S’,但无法准确推断出具体有几个‘S’。
  3. 无法进行长程规划 :信息论智能体会选择那些即使猜不中也能最大化信息增益的单词(例如,即使知道“A”在单词里,也可能故意去猜一个没有“A”的词来测试其他字母)。LLM则更倾向于“贪心”策略,总是优先猜测它认为最可能是答案的单词,缺乏为未来回合收集信息的主动规划。

5. 评估体系与实验结果分析

为了科学地评估不同智能体,我设计了一个自动化的评估流水线。

5.1 评估指标

  1. 平均尝试次数 :在成功猜出的游戏中,平均需要多少轮。这是核心效率指标。
  2. 成功率 :在最大尝试次数(默认为6)内猜出单词的游戏比例。
  3. 尝试次数分布 :统计在1次、2次、…、6次尝试下猜中的游戏数量。这能更细致地反映智能体的表现。
  4. 失败案例分析 :对于失败的游戏(超过6次未猜中),记录其游戏历史,分析智能体在哪一步推理出现了问题。

5.2 基准测试结果

我对几种智能体在1000个随机秘密单词上进行了测试,结果摘要如下:

智能体类型 具体实现 平均尝试次数 成功率 关键特点
规则基线 固定首词“CRANE”,后续随机从符合约束的词中选 4.8 76% 实现简单,表现不稳定。
搜索型(信息论) 熵最大化搜索 3.55 99.5% 性能天花板 ,计算成本高。
LLM驱动型 GPT-4 + 结构化推理提示 4.05 95.2% 无需预编程策略,依赖提示词质量,有推理过程。
LLM驱动型 GPT-3.5 + 基础提示 4.82 82.1% 成本低,但逻辑错误明显更多。
混合型 用LLM(GPT-4)对信息论智能体筛选出的Top3候选词做最终选择 3.68 98.8% 结合了搜索的严谨性和LLM的语义知识,表现接近纯搜索型。

5.3 结果分析与洞察

  1. 纯搜索算法目前仍是王者 :在规则完全明确、状态空间可枚举的领域,基于信息论或穷举搜索的算法智能体在性能和稳定性上碾压LLM智能体。这印证了“符号AI”在特定封闭问题上的优势。
  2. LLM展现了强大的零样本推理能力 :尽管不如专用算法,但LLM在没有任何游戏特定训练、仅凭自然语言指令和上下文学习的情况下,达到了接近人类高手的水平(人类高手的平均尝试次数大约在3.8-4.2之间)。这证明了其强大的模式识别和逻辑推理潜力。
  3. 提示词即“代码” :LLM智能体的性能极度依赖于提示词的设计。一个好的提示词相当于为LLM编写了高效的“软件”。从简单指令到分步推理,再到模拟工具调用,提示词的进化直接带来了性能的跃升。
  4. 混合智能是可行方向 :“混合型”智能体的尝试表明,将LLM的语义理解、灵活性与传统算法的精确性、可靠性相结合,可以取长补短。例如,让搜索算法负责繁重的逻辑过滤和候选词生成,让LLM负责基于词频、词根、常见搭配等语义知识做最终微调选择,效果显著。

6. 项目扩展与未来方向

这个“AI智能体Wordle”平台已经成为一个有趣的试验场。基于现有框架,可以探索更多方向:

  1. 多智能体对战与协作 :让多个智能体同时玩同一个Wordle谜题,可以设计成竞争模式(看谁先用更少次数猜出),也可以设计成协作模式(智能体们可以交换信息或投票决定猜测)。
  2. 强化学习智能体训练 :将Wordle环境封装成标准的Gym环境,使用强化学习算法(如PPO、DQN)来训练一个智能体从零开始学习猜词策略。观察它是否能自发地学到“信息增益”的概念。
  3. 词汇与语言特性的探究 :通过分析不同智能体在不同类型单词(如元音多、重复字母、特定后缀)上的表现差异,可以反推LLM对英语词汇知识的掌握程度和潜在偏见。
  4. 更复杂的游戏变体 :可以引入“困难模式”(黄色字母必须在后续猜测中使用)、增加单词长度、或者使用非英语词库,来测试智能体的泛化能力和适应能力。
  5. 可视化与解释性工具 :开发一个前端界面,不仅展示游戏过程,还能可视化LLM智能体的“思考过程”(其内部生成的推理文本),让它的决策逻辑变得透明,这对于理解和调试AI行为非常有帮助。

这个项目从一个小小的想法开始,最终成为了一个剖析AI智能体推理能力的多面棱镜。它让我深刻体会到,即使是在Wordle这样一个简单的游戏中,也蕴含着序列决策、信息论、搜索算法和语言理解等多个AI核心课题。将LLM置于这样一个受控且可评估的环境中,是理解其能力边界和失败模式的绝佳方式。对于任何想要深入智能体领域的朋友,我的建议是从这样一个具体、有趣且有明确规则的小项目入手,亲手搭建环境,实现不同的智能体,并在对比中收获最直观的认知。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐