以前のブログに将棋の盤面を渡して、最適手筋をかえしてくれるようなAPIのサービスがあったらありがたいと書いた。 実際にオンラインでコンピューター将棋を実現しているサイトはどんな手段をつかっているのだろうか?
ネットでいろいろ見聞きしてみて大まかに二つの方法があるらしいことが分かってきた。
一つはクライエントUIから盤面情報を送り、それに基づいて、指し手を供給するサーバーを使う方法。
もう一つはブラウザーに将棋エンジンの実行コードを送ってしまい、ブラウザー上で将棋エンジンを実行させてしまう方法。
どちらも一長一短がありそうだ。
サーバーにやねうら王のような本来一つの入出力で動作するエンジンを常駐させて、ここからhtttpリクエストにこたえる方法ではhttp接続のクライエントが複数になることを考えると、position と go コマンドをセットにして処理する必要がある。 それにgameover などのコマンドは意味をなさなくなる。本当に多数のマルチクライエントに対応するためにはロードバランサーの背後にいくつものサーバーインスタンスを置くことになるのだろう。自分の能力も予算も超えてしまうのである。
一方のブラウザーで将棋エンジンを実行させてしまうというのは、何なの?と思うかもしれないが、要はブラウザに実装されるJavaScriptのエンジンで将棋AIを走らせましょう、ということである。 JavaScriptのマシン語とも言えるWeb Assemblyというバイナリーを実行することができる。 専用のコンパイラがあり、C++やRUSTのソースコードからWASMモジュールへのコンパイルが可能なTool Chainが存在する。 実際にYaneuraouのソースコードにはWASMをコンパイルするためのScriptもメンテナンスされている。YaneuraouのWASMmodule自体は圧縮すれば300キロバイト以下のようで、これにnn.binを追加しても今の一般のネット環境ではサイズ的は気にしなくてもよさそうだ。あまり大きなペタショックのような定跡ファイルを転送するのはさすがに憚る。性能はブラウザが走るデバイスによるところが大きそうだ。
liShogiのサイトでは用途に応じて両方を使っているっぽいのである。この将棋サイトはソースコードがGithubで公開されていて、眺めていると面白い。
実際にどんな使い心地なのか自分でもためしてみたかったので、まずはブラウザ上でWasmエンジンとお話できるコンソール的なものを作ってみた。 このときはじめてAIにコーディングを本格的に手伝ってもらった。使ったのはBrave blowserについているLeoというAgentだが、用途に応じてAIエンジンが切れ変わっていた。コーディングにはAntrhopicのHaikuを使っていた模様。 この時は自分で書いたオリジナルコードをAIに確認してもらい、機能の追加や、モジュール化、その他云々を生成してもらった。 一応Proof of Conceptだったので、コンソール上でコマンドを送り、それに対して解答をもらうようなところまで確認できたところで終了。、 いつかはこれをもとに将棋盤を描画するWeb UIも作ってみようと思うわけである。
ソースコードはこちら。
で、昨日ふと、サーバーサイドでエンジンを動かすほうもコンセプトだけでも試してみたくなり、 今回プログラムを書くにあたって、最初からAIに書かせることにした。人間側は指示だけしてAIがコード生成しながらプログラムを仕上げていくのをVibe Codingというのだそうである。 という訳で自分はプロジェクトのコンセプトだけ考えてテキストに書きだし、これをAIに提出してコード生成をお願いしてみた。
テキスト内容はこちら。
Shogi API server.Use nodejs expressjs framework. We will add authentication and security through middleware in the future.the server need to communicate with executable binary on the server. It’s default path should be ./engine/engine butshould be able to be configured through environmental variable process.env. for that we will include dotenv library as well.node process should be spawning binary and connect to stdin/stdout.engine uses USI protocol. If unfamiliar with USI protocol, I will provide the spec.write source code in typescript for easy maintenance. breakup file modules in logical order.API points1. get ‘/’ route should return health check.2. get/api/usi_command will issue corresponding command. Do not implement points for ‘go’,’go mate’ ‘, ‘position’, ‘setoption’,’quit’3. usi_command that does not expect any return value should resolve immidately..4. get/api/setoption/<name>/<value> to implement setOption name <name> value <value>5 post /app/analyze/<waittime> implement successive sequence of ‘position sfen <sfen>’, ‘go [waittime]’ sequence, (this to avoid multi-client racing condition so thatpostion information will no be overwritten by other client)body should contain {“sfen”:”<sfen>”} that can be used to send position sfen <sfen> command. then send ‘go waittime’ and wait for ‘bestmove’ and return the outputif <waittime>(integer, representing milliseconds) is omitted, just send ‘go’ command.if <waittime> is 0 then issue ‘go infinite’ command and monitor stdout response and send ‘stop’ command when there is no output for 10 seconds, wait for besstmove and return teh output.1. engine initialize routine should do the following.a. spawn a process.b. send ‘usi’ command and wait for ‘usiready’c. send setoption name <name> value <value> using parameters prepared by config.jsond. send ‘isready’ and wait for ‘readyok’example of config.json{USI_Hash : 2048,FV_Scale : 24}2. since engine.exe is a single thread in/out process, next command will not be processed the current command is executed. the command should be quced.3. in case of unexpected crash of binary, restart the engine with up to 3 retries within 3 minutes.4. development server should use port 3000
英語でやっているのはこのほうがプログラム言語との相性が良いと思っているから。
使ったAIはClaude DesktopからSonnet4.6(規定値)
10分くらいでプロジェクトのセットアップからコードベースまで全部出力してくれた。
テストをしてみて、一部動かないところが判明したので現象をAIに説明(例えば config 命令に対し、データとして空のアレイが返されてきた。 YaneuraOuのConfig データ出力では最初の一行がブランク行出力されることを確認してこれをAIに報告)トラブルシューティングをしてもらい、原因を究明(例の場合、空行出力を出力終了の判定に使用)して、コード修正(同、中身があるデータが出力されるまで非判定のフラグを立てる)。さらに使って見て気づいた仕様の変更と追加を指示するなどの工程を数回まわし、一応満足できるものができたので、そこを目途にReadme.mdの作成を指示。
これもすらすら書いてくれたが、Overviewが無かったので、 Overviewの追加も指示。
このOverviewを見て笑った。 間違ってはいないのだが機能の説明が大風呂敷広げた感満載なのだ。実に立派そうなプログラムである。 仕事に応募してくるアメリカ人のレジメを見ているようだ。 自分が欲しい機能は sfen文字列を送って、その盤面に対する指し手を返してもらいたいだけなのだが、ほかにもいろいろできたっけ。
そのまま公開するのでこちらからご覧ください。
このサーバー、エンジンをインストールするとちゃんと動くがスケーラビリティがほとんどないので用途は限定されます。
ただ、全体にかかった時間が3時間ほどであり、Weekend programmer である自分のコーディングスピードを考えると驚異的な効率でプログラミングできたことになる。
AIによるプログラミング意外と使えるなあと思った次第。