模型目前还没有记忆力
模型每一手都只看当下的棋盘来作答。它不记得几手之前哪些棋子被提走、哪里发生过劫争, 也不记得开局时约定了什么规则。因此,它有时会给出已经有棋子的位置、自杀着法, 或者刚被提劫就立刻提回的着法。
目前由网页上的规则引擎来填补这一空缺。如果模型选择的坐标违反规则,就把它放入拒绝列表后重新询问; 如果仍然得不到合法着法,就如实显示错误。我们绝不会悄悄换成随机的一手。
对局的每一手都会记录在服务器上。但模型并不会读取这些记录再下棋。写在笔记本上和记在脑子里,是两回事。
话虽如此,我们并不打算把记忆力交给单一模型。指出仅靠 RAG 和 LLM 无法解决这类问题的研究也时常出现。 因此,我们尝试把角色分配给多个引擎,以此构建记忆力。
- 提劫后立即提回、自杀这类绝对不允许的着法,由规则引擎拦截。即使写进提示词,模型也可能无视。 这一部分现在已经在运行。
- 征子、单官、能做出两只眼的棋形等可以根据棋盘和着法顺序重新计算的内容,由分析引擎每一手重新计算。 如果记下来,棋盘变化后就会留下过时的信息。
- 只有开局约定的规则、正在进行的计划、之前犯下的失误等棋盘上看不到的内容,才作为事件记录下来。 每个事件都设定了出现的手数和失效的时机,在提问之前,只挑选与当前棋盘相关的事件放入提示词。
- 训练数据中也会附上同样的备注。从未见过带备注棋盘的模型,即使在对局中收到备注也无法善加利用。
完成这一结构,是 MariaGO 仍需完成的功课。
MariaGO 围棋一览
19×19 标准棋盘 · 人执黑 / AI 执白 · 每手不限时 · 每一手自动保存 · 前后翻看棋谱 · 从任意一手续下 · 支持手动数目和双方连续停一手后数目。
更稳妥地判断征子和虎口
2026 年 9 月 28 日,我们修正了 AI 会直接选择战术上吃亏着法的两种情况。模型提出的坐标会根据棋盘上的棋子和气再次检查, 如果是被征子的棋子徒劳逃跑,或者是走进会被立刻吃掉的虎口,就改选其他合法着法。
征子:避免徒劳逃跑和草率停一手
我们会沿着着法顺序推演,判断被打吃的棋子即使逃出一格,是否仍会被对方连续打吃、最终被吃掉。 如果没有引征、无法逃脱,就把这步逃跑从候选中排除。我们还修正了明明有地方可下、却为了躲避征子而停一手的情况, 让 AI 选择棋盘上的其他合法着法。
虎口:分清何时该进、何时该补
AI 不会走进三面被对方棋子包围、落子后立刻被打吃的虎口。对于自己棋子形成的虎口,也会避免无故去补。 不过,如果这一手能吃掉对方棋子,或者周围己方棋子气紧,它可能是必要的战术,因此仍保留为正常候选。
当前适用范围
这些修正应用于 AI 最终选择着法的阶段。它并不是能完美解决所有征子和死活问题的通用计算, 我们会持续记录并修补实战中发现的例外情况。
2026 年 9 月开发变更记录
我们依次处理了实战中发现的停一手、非法着法和战术选择问题,并加入了按用户区分的级位功能。 以下变更与模型本身的训练表现无关,适用于验证模型答案、运行对局的服务器和网页规则。
不再在进行中的棋局里草率停一手
如果棋盘上仍有足够的空地和未解决的战斗,即使模型回答停一手,也不会立即接受,而是重新评估紧急的合法候选。 反之,当棋局确实已经收束、没有值得再下的地方时,允许终局停一手,并将其与正常的双方连续停一手结束区分开来。
候选评估纳入双打吃和被切断的风险
我们会检查仅靠斜线相连的棋形:一旦对方从中间切断,两块棋中就会有一块被打吃。 对于会让对方下一手形成双打吃的推进会扣分,并优先选择连接弱子或先救弱子的着法。
根据当前棋形区分打劫与紧气后提子
我们修正了一个问题:曾被拒绝过一次的坐标,在之后的手数中也一直被禁止。现在禁止坐标只适用于当前的棋盘和轮次, 当有棋子被提、棋形发生变化时,会重新计算是否合法。因此,立即提回、造成同一棋盘的劫会被拦截, 但紧一口气提子后,在新空出的位置上落下的合法着法是允许的。
按客户端 ID 保存级位和总战绩
即使是未登录的用户,也会以浏览器的客户端 ID 为准,保存胜、负、和以及总对局数。 对局结果的处理被包在事务中,确保同一结果不会被重复计入。
| 当前级位 | 升降级规则 |
|---|---|
| 18 级 – 11 级 | 积分 +3 时升级,−3 时降级 |
| 10 级 – 5 级 | 积分 +5 时升级,−5 时降级 |
| 4 级 – 1 级 | 积分 +10 时升级,−10 时降级 |
| 段位 | 积分 +15 时升段,−15 时降段 |
升级或降级后,该区间的积分会重置为 0,并且不会降到 18 级以下。和棋不改变积分,只记入战绩。
改善评估用启发式在中腹乱撒棋子的问题
原来的评估对手在没有可提的棋子时,往往会在靠近中腹的候选中随机选择,把棋子撒得到处都是。 我们将其替换为综合评分的方式,同时考虑角部三、四线布局、提子、摆脱打吃、连接、压迫对方弱子以及避免自紧气。 与 MIX R5 进行的最初 3 局全部由 R5 获胜,但以第 80 手为准,R5 的平均提子数从最近 100 局旧对局的 5.98 颗降到了 3.0 颗。
如何解读评估结果
启发式对局目前在第 80 手中止并进行临时数目,因此不能解读为正式胜率或级位。 要了解准确的棋力差距,需要另外进行黑白交替、下完全局并包含死活判定的长期评估。
启发式、R5 和 Gemma 4 是分开记录的
2026年10月9日,把计分函数选点的棋和模型自己下的棋分开了。启发式执黑对 R5 执白的五局不限手数,启发式一胜四负,全部以双方停着结束。Gemma 4 对 R5 时,落到棋盘上的棋绝大多数是计分函数重选的,所以那不是模型之间的对局。之后用启发式的实战着法训练 Gemma 4,并关掉计分函数下了三局。KataGo 判断黑棋领先 76.2、74.0 和 69.7 目。对局画面可以选择 Gemma 4、本地 AI 和 R5。本地 AI 就是启发式,选择只保存在该浏览器里。
我们如何教会 AI 19×19 坐标
训练数据的起点是高段业余棋手和职业棋手下的 SGF 棋谱。我们不让模型整盘背诵,而是把每一手之前的棋盘与实际的下一手配成一对。 优先使用胜方的棋谱,更多地收录打吃等需要战术判断的局面,并去除重复,避免同一棋盘反复出现。
在早期实验中,模型一直重复棋盘右下方的坐标。训练用棋盘虽然标有数字,但空格和对齐方式与实际对局服务器不同, 模型误读了从两位数列号开始的第 10 列之后的内容。这并不是“棋谱不够”的问题,而是训练与运行时输入格式不一致的问题。
现在,训练和实战都使用同样的对齐网格,行和列统一用两位数表示,从 00 到 18。在正式训练之前,我们会进行坐标测试, 让模型找出随机放置的棋子,并分别查看左上、右上、左下、右下四个象限的准确度。因为即使整体平均不错, 只要在某一个角崩溃,实战中就会变成方向偏差。
| 输入 | 行列 00–18 对齐的 19×19 棋盘,以及当前对局条件 |
|---|---|
| 目标 | 实际棋谱中选择的下一手落子坐标或停一手 |
| 训练 | 以 LoRA 方式在基础模型上追加学习围棋着法选择模式 |
| 验证 | 观察坐标识别、合法着法、方向偏差、过早停一手和填自己的目 |
所以,MariaGO 的 AI 并不是一台完美的答案机器。它学习了棋谱中的选择,但在陌生的局面中可能会下出坏棋或非法坐标。 把这些失败留在对局日志中,并据此改进下一批数据构成和规则检查,是这个项目的重要组成部分。
不限时,安全落子
为了避免在小小的手机屏幕上误触的一手被确认,我们采用两步落子。轻触一次空的交叉点,会显示一颗金色的预览棋子。 只有再次轻触同一点,或按下屏幕上的“落子”按钮,这一手才会保存到服务器,并轮到 AI 下棋。 轻触其他点只会移动预览棋子。
轮到人下棋时,没有读秒,也没有时间限制。即使长时间开着页面,也不会因为超时而自动停一手。 不过在 AI 计算着法期间,为防止重复请求,输入会暂时等待,响应时间也可能因网络状况而有所不同。
不必着急。选好一手,确认标出的位置后再确定。自杀、打劫等规则上不允许的着法,会在确认阶段给出提示。
棋谱的用途不止是记录
开始对局时,会生成一个六位的对局代码和访问密钥。每次落子时,棋盘、下一位行棋方、提子、劫的位置和完整的着法顺序都会保存到服务器数据库中。 在同一个浏览器中,无需另行搜索就会载入最近一盘进行中的棋局,在棋谱页面还可以按时间和手数查看以往的对局列表。
对局中使用前进和后退箭头,可以在不改变当前手数的情况下复盘过去的局面。回到最后一手即可继续原来的对局。 如果在查看过去某一手时选择“从这里续下”,之后的着法会被舍弃,并从该局面开始新的变化图。 这项功能把实战复盘和假设变化连接在了同一个画面上。
保存的信息由浏览器的临时标识符和访问密钥保护。仅知道对局代码无法打开其他用户的棋盘,要在其他设备上续下, 需要包含访问密钥的链接。清除浏览器数据可能会让设备忘记原有的标识符,因此重要的进行中棋局,最好另外保存好链接。
自动数目会计算什么、会漏掉什么
当双方连续停一手,或用户按下“数目”时,MariaGO 会计算一个接近韩国式数目法的参考分数。 它会搜索空白区域:如果边界只由黑子围成,就算作黑方的目;如果只由白子围成,就算作白方的目。 再加上对局中提掉的对方棋子,并给白方加上 6.5 目贴目,然后显示差值。
难点不在于数空点,而在于识别棋盘上的死子。人们会先约定没有两只眼的棋块或注定被吃的棋子是死棋, 再把它们拿掉,但目前的自动数目并不能完全判定死活。如果死子留在棋盘上,周围区域的边界就会混杂, 导致无法算作目,或得出与实际结果不同的数值。
因此,中途数目只是大致判断形势的工具,终局结果也不应被视为正式的裁判判定。尤其是还剩下大官子, 或者双方棋子混杂在同一区域内时,未被计算的中立点会增多。这种情况下,比起数值,直接查看棋盘更为重要。
如何解读数目结果
黑方得分 = 黑方围住的目 + 提掉的白子。白方得分 = 白方围住的目 + 提掉的黑子 + 贴目 6.5 目。 目前尚不支持自动判定死活,因此在终局仍有死子残留时,请仅将得分作为参考。
开始对局之前
- 目前网页对局使用 19×19 棋盘,人执黑,AI 执白。
- 轻触一次空点,确认预览棋子后再次轻触即可确定。
- 你的落子没有时间限制,每落一手都会保存着法顺序。
- 用同一个浏览器重新访问,即可自动继续最近一盘进行中的棋局。
- 自动数目是一项无法完全判定死活的参考功能。