1. 项目概述当AI智能体开始玩“猜词游戏”最近我动手做了一个挺有意思的东西一个专为AI智能体设计的“Wordle”游戏。如果你对Wordle还有印象它就是那个风靡全球的每日猜词游戏玩家有六次机会猜一个五个字母的单词每次猜测后系统会用颜色绿色代表字母正确且位置正确黄色代表字母正确但位置错误灰色代表字母不在单词中给出反馈。这个游戏的精髓在于玩家需要根据有限的反馈信息运用逻辑推理和词汇知识一步步逼近正确答案。那么当玩家从人类换成AI智能体时会发生什么这正是我这个项目的核心。我构建了一个标准化的游戏环境让不同的AI智能体——无论是基于大型语言模型LLM的对话式智能体还是专门训练的逻辑推理模型——都能接入并参与这个游戏。我的目标不是简单地复现Wordle而是创建一个可以衡量、对比和优化AI智能体在受限信息下进行序列决策与逻辑推理能力的“基准测试场”。这个项目适合所有对AI智能体、强化学习、游戏AI或者单纯对“让AI玩游戏”感兴趣的朋友。无论你是想了解如何为智能体设计交互环境还是想测试自家智能体的推理能力亦或是好奇AI会如何玩这种人类擅长的文字推理游戏都能从这里获得启发。接下来我会详细拆解整个项目的设计思路、技术实现、踩过的坑以及一些有趣的发现。2. 整体架构与核心设计思路2.1 为什么选择Wordle作为测试床在为AI智能体设计测试环境时选择Wordle并非偶然。它具备几个非常适合作为基准测试的优良特性状态空间有限但非平凡单词库虽然庞大我采用了约2300个常见的五字母单词作为答案库但相对于围棋、星际争霸等游戏其状态空间是有限的、可枚举的。然而从起始的完全不确定到最终确定唯一单词其搜索和推理过程并不简单充满了组合爆炸的可能性。完美的信息可观测性游戏规则是确定且透明的。智能体在每一步都能获得明确、无噪声的反馈颜色标记。这避免了像真实物理世界或部分信息游戏中存在的感知不确定性让我们能更纯粹地测试智能体的规划与推理能力而非感知能力。序列决策与信息增益这是一个典型的序列决策过程。每一次猜测不仅是为了“碰运气”更是为了最大化“信息增益”。一个好的猜测应该能最大限度地缩小可能的单词集合。这直接对应了AI中的探索与利用权衡以及基于信息的决策理论。可量化的性能指标评估标准极其清晰——成功猜出单词所需的尝试次数。我们可以计算平均尝试次数、成功率在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”代表黑色/灰色/不存在。实现这个函数时有几个容易出错的细节重复字母的处理这是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)这个算法确保了重复字母的反馈符合官方规则。词库的加载与验证我准备了两个词表文件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我实现了一个基于信息论的“最优”搜索智能体。它的目标是在每一轮猜测中选择能带来最大期望信息增益的单词。核心原理可能单词集合Candidate Set初始为所有答案单词~2300个。每获得一次反馈就根据反馈过滤这个集合只保留与所有历史反馈一致的单词。计算猜测单词的信息价值对于一个候选的猜测单词g我们考虑它针对当前可能单词集合中每一个可能的秘密单词s会产生什么样的反馈f。我们将产生相同反馈f的秘密单词s归为一组。计算熵Entropy分组后每个组的大小不同。信息增益的期望与猜测后剩余的不确定性熵减少量相关。一个“好”的猜测会将可能单词集合均匀地分割成许多小分组这意味着无论秘密单词是什么这个猜测都能极大地缩小范围。其期望信息增益公式可以简化为计算猜测单词的“熵”H(g) - Σ (p_i * log2(p_i))其中p_i是猜测g导致第i种反馈模式的概率用当前可能集合中的单词频率估算。选择策略在每一轮从所有允许猜测的单词中选择能使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也会暴露出一些有趣的缺陷词汇量幻觉与过度推理LLM的词汇知识来源于训练语料它可能“知道”一些极其生僻的单词。有时当所有常见单词都被排除后LLM会选择一个完全符合字母约束但极其罕见的单词如“XYLYL”而不是意识到自己的过滤逻辑可能有误或者当前可能单词集合其实已经为空说明之前推理出错。这反映了LLM缺乏对自身知识边界和问题现实性的判断。对重复字母规则的混淆尽管在提示词中明确说明了规则LLM在处理重复字母的反馈时仍然比规则型智能体更容易出错。例如它可能理解“有一个黄色‘S’”意味着单词中至少有一个‘S’但无法准确推断出具体有几个‘S’。无法进行长程规划信息论智能体会选择那些即使猜不中也能最大化信息增益的单词例如即使知道“A”在单词里也可能故意去猜一个没有“A”的词来测试其他字母。LLM则更倾向于“贪心”策略总是优先猜测它认为最可能是答案的单词缺乏为未来回合收集信息的主动规划。5. 评估体系与实验结果分析为了科学地评估不同智能体我设计了一个自动化的评估流水线。5.1 评估指标平均尝试次数在成功猜出的游戏中平均需要多少轮。这是核心效率指标。成功率在最大尝试次数默认为6内猜出单词的游戏比例。尝试次数分布统计在1次、2次、…、6次尝试下猜中的游戏数量。这能更细致地反映智能体的表现。失败案例分析对于失败的游戏超过6次未猜中记录其游戏历史分析智能体在哪一步推理出现了问题。5.2 基准测试结果我对几种智能体在1000个随机秘密单词上进行了测试结果摘要如下智能体类型具体实现平均尝试次数成功率关键特点规则基线固定首词“CRANE”后续随机从符合约束的词中选4.876%实现简单表现不稳定。搜索型信息论熵最大化搜索3.5599.5%性能天花板计算成本高。LLM驱动型GPT-4 结构化推理提示4.0595.2%无需预编程策略依赖提示词质量有推理过程。LLM驱动型GPT-3.5 基础提示4.8282.1%成本低但逻辑错误明显更多。混合型用LLMGPT-4对信息论智能体筛选出的Top3候选词做最终选择3.6898.8%结合了搜索的严谨性和LLM的语义知识表现接近纯搜索型。5.3 结果分析与洞察纯搜索算法目前仍是王者在规则完全明确、状态空间可枚举的领域基于信息论或穷举搜索的算法智能体在性能和稳定性上碾压LLM智能体。这印证了“符号AI”在特定封闭问题上的优势。LLM展现了强大的零样本推理能力尽管不如专用算法但LLM在没有任何游戏特定训练、仅凭自然语言指令和上下文学习的情况下达到了接近人类高手的水平人类高手的平均尝试次数大约在3.8-4.2之间。这证明了其强大的模式识别和逻辑推理潜力。提示词即“代码”LLM智能体的性能极度依赖于提示词的设计。一个好的提示词相当于为LLM编写了高效的“软件”。从简单指令到分步推理再到模拟工具调用提示词的进化直接带来了性能的跃升。混合智能是可行方向“混合型”智能体的尝试表明将LLM的语义理解、灵活性与传统算法的精确性、可靠性相结合可以取长补短。例如让搜索算法负责繁重的逻辑过滤和候选词生成让LLM负责基于词频、词根、常见搭配等语义知识做最终微调选择效果显著。6. 项目扩展与未来方向这个“AI智能体Wordle”平台已经成为一个有趣的试验场。基于现有框架可以探索更多方向多智能体对战与协作让多个智能体同时玩同一个Wordle谜题可以设计成竞争模式看谁先用更少次数猜出也可以设计成协作模式智能体们可以交换信息或投票决定猜测。强化学习智能体训练将Wordle环境封装成标准的Gym环境使用强化学习算法如PPO、DQN来训练一个智能体从零开始学习猜词策略。观察它是否能自发地学到“信息增益”的概念。词汇与语言特性的探究通过分析不同智能体在不同类型单词如元音多、重复字母、特定后缀上的表现差异可以反推LLM对英语词汇知识的掌握程度和潜在偏见。更复杂的游戏变体可以引入“困难模式”黄色字母必须在后续猜测中使用、增加单词长度、或者使用非英语词库来测试智能体的泛化能力和适应能力。可视化与解释性工具开发一个前端界面不仅展示游戏过程还能可视化LLM智能体的“思考过程”其内部生成的推理文本让它的决策逻辑变得透明这对于理解和调试AI行为非常有帮助。这个项目从一个小小的想法开始最终成为了一个剖析AI智能体推理能力的多面棱镜。它让我深刻体会到即使是在Wordle这样一个简单的游戏中也蕴含着序列决策、信息论、搜索算法和语言理解等多个AI核心课题。将LLM置于这样一个受控且可评估的环境中是理解其能力边界和失败模式的绝佳方式。对于任何想要深入智能体领域的朋友我的建议是从这样一个具体、有趣且有明确规则的小项目入手亲手搭建环境实现不同的智能体并在对比中收获最直观的认知。