前言
过去的国庆节中难得整理完自己的事情之后可以休息一下,闲来无事学了点国际象棋,感觉还挺有意思的,与中国象棋还是有些许差别的,看着手里的ChatGPT,想着可不可以整一点好玩的?
简单讲一下国际象棋的规则与符号术语吧,照顾一下没时间又想学的同学们
国际象棋规则与符号术语
国际象棋是一款两人对战游戏,双方各有16个棋子,包括一个国王(王)、一个王后(后)、两个主教(象)、两个骑士(马)、两个战车(车)和八个兵(兵),目标是将对方的国王将死(即没有任何合法走法能拯救国王)。
棋子和走法:
- 国王(K):每次走一格,任意方向。
- 皇后(Q):任意方向,任意格数。
- 车(R):直线(横或竖),任意格数。
- 象(B):对角线,任意格数。
- 马(N):走“日”字,跳过其他棋子。
- 兵(P):直走一格(首次可走两格),斜吃对方棋子。
特殊情况:
- 将军:你的棋子攻击对方国王。
- 将死:对方国王被攻击且无路可逃,胜利。
- 和棋:双方无法取胜时平局。
游戏中白棋先走,双方需要通过使用不同棋子的走法来保护自己的国王,并试图将死对方国王。
在国际象棋中,PGN(Portable Game Notation)是用来记录棋局的一种标准格式。以下是解释一些常见的国际象棋符号和术语:
棋子符号:
- N:骑士(Knight)。在国际象棋中,“N”代表骑士,因为“K”已经用于国王(King)
- B:象(Bishop)
- R:车(Rook)
- Q:皇后(Queen)
- K:国王(King)
移动方式:
例如,Nc6表示骑士(N)移到c6这个格子。
Bh4表示主教(B)移到h4这个格子。
只有d4格子,则默认为兵的行动。
O-O:短易位(Kingside castling),国王向右(王翼)移动两格,然后车子越过国王放在国王旁边。
O-O-O:长易位(Queenside castling),国王向左(后翼)移动两格,然后车子越过国王放在国王旁边。
g8=Q:兵升变,白兵走到 g8 并升变为皇后(Queen),当一个兵走到对方棋盘的最后一排(对黑棋来说是第1行,对白棋来说是第8行)时,它可以升变为其他棋子,通常是皇后,因为皇后是最强的棋子,能最大化提升实力。不过,玩家也可以选择将兵升变为车(Rook)、象(Bishop)或马(Knight)。
特殊符号:
#:代表"将死"(checkmate)。例如,Qe7# 表示皇后移动到e7格,结束棋局,将死对方国王。
+:代表"将军"(check)。这个符号表示对方的国王被将军,但还没有将死。
其他符号:
dxc4:表示用d线上的兵吃掉c4格上的棋子。“x"表示"吃子”(capture)。所以dxc4表示d线的兵移动并吃掉c4格上的棋子。
如何让LLM下棋?
如果是尝试通过简单的聊天让 ChatGPT 下棋,那可能会与预想有差别。因为该模型只在内存中保存大约十步棋,而且经常做出非法动作。
为了使像 ChatGPT 这样的语言模型 (LLM) 正常工作,我们需要利用它的一个特性:它以统计方式再现了它在训练期间学到的东西。
在国际象棋中,有一种称为"PGN"(便携式游戏符号)的格式,它是一种长文本,包括一个包含有关游戏的一般信息(结果、玩家、ELO 等)的标题和一个包含一系列所走棋步的正文,也就是我们上面说的符号术语
通过提供 PGN 文件的开头并要求 LLM 生成后续内容,它可以更连贯地下棋。
使用"bresse"库进行实验
Bresse
是一个用于国际象棋 AI 等 LLM(大型语言模型)的库。该库利用了 LLM 可以重现表示国际象棋游戏的格式(称为 PGN)这一事实。
可以利用各种工具来促进实验、推理过程中的 PGN 修改以及各种有用的信息。
该第三库可以允许 LLM 使用该chess
库下棋。
而该库是怎么促进移动生成的呢?
- 处理棋谱文件(PGN)
国际象棋的棋局通常记录在PGN文件中,里面详细记录了每一步棋的走法。
我们需要先对这些文件进行处理,以便让人工智能模型更好地理解它们。因为现有的棋库(chess library)主要是给人和程序员用的,不是专门为AI模型设计的。
- 优化棋步的合法性:
在让AI选择下一步棋的时候,我们可以用一种“温度”的概念。这就像是让AI尝试一些变化的可能性,而不是总是选择最明显的一步。
然后,我们可以让AI尝试多个走法,看看它最常推荐哪一步。这样就能提高选出的棋步的准确性,确保AI走的棋更符合规则。
- 选择使用的AI模型
我们可以选择不同的AI模型来帮忙,比如OpenAI、HuggingFaceHub或MistralAI。这就像是选择不同的工具,每个工具在性能和特点上都有不同。
- 了解使用这些模型的成本
使用这些AI模型通常是按生成的数据量收费的。
比如,我们可以计算出用这些模型花1美元能生成多少次预测,这样我们就能知道使用这些模型的费用大概是多少。
- 检测非法的走法
即使AI建议了一些走法,我们也需要用棋库来检查这些走法是否合法。就像一个裁判一样,确保每一步棋都符合国际象棋的规则。
如果AI给出了非法的走法,棋库就会指出来,这样我们就可以再调整AI的预测,直到得到符合规则的走法。
与 ChatGPT 下棋
以下是使用该库让用户与 ChatGPT 进行游戏的示例代码:
import os
from dotenv import load_dotenvfrom bresse import generate_pgn, game_play_san
from bresse.models import OpenAIModel
# 加载环境变量
load_dotenv()
# 生成 PGN 游戏
game = generate_pgn(
white= "Alpha Zero" ,
black= "Stockfish"