
2026/01/17 6:02
**Claudeでテキストアドベンチャーを楽しむ方法** 1. **環境構築** - Python(3.8以上)をインストールします。 - テキストアドベンチャーのリポジトリをクローンまたはダウンロードします。 - 仮想環境を作成し、起動します。 2. **依存パッケージのインストール** ```bash pip install -r requirements.txt ``` 3. **ゲームエンジンを実行** ```bash python run_game.py ``` 4. **Claudeと対話** - ターミナルに `look`、`go north`、`take key` などのコマンドを入力します。 - Claudeは自然言語で応答し、冒険を案内してくれます。 5. **進行状況の保存・読み込み** - `save <名前>` で現在の状態を保存します。 - 戻ってきたら `load <名前>` でロードできます。 6. **トラブルシューティング** - ゲームが停止した場合、欠損しているアセットやパス設定を確認してください。 - 起動前に必要なファイルがすべて揃っていることを再度チェックします。 Claudeが創り出した世界をぜひ探検してみてください!
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
Summary:
著者は、大規模言語モデル(LLM)が複雑なテキストアドベンチャー「Anchorhead」をプレイできるようにする、メモリ認識型ハーネスを構築しています。Claude に対して毎ターンの会話全体を与える代わりに、新しい手法ではコンテキストを5ターンに限定し、有用な事実を保存するセマンティック・メモリ層を追加します。これによりトークン使用量は削減されますが、Claude が関係のない部屋で立ち往生したり重要情報を忘れたりするため、全体的にはターン数が増加します。この研究は AI ハッカソン中に始まり、単純な脱出ゲームでモデルの限界を試さなかった以前の試みを経て進められました。将来的には、TODOリストや位置図といったドメイン固有のメモリ構造の作成や、ゲーム出力から自動的に地理情報を抽出する機能、
link(room,direction,other_room) のような手動ツールも活用しつつ、エピソディック体験を要約して次回実行を高速化する計画です。成功すれば、この技術は LLM がより複雑なインタラクティブフィクションやその他の連続的意思決定タスクに挑むことを可能にし、AI 計画、ゲーム、および教育的ナラティブシステムにおける研究に貢献するでしょう。
Summary Skeleton
What the text is mainly trying to say (main message)
著者は、大規模言語モデルが複雑なテキストアドベンチャー「Anchorhead」をプレイできるように、メモリ認識型ハーネスを開発しており、知覚構造と構造化されたメモリを活用して性能向上を目指しています。
Evidence / reasoning (why this is said)
彼らは Claude に全てのターンを与える単純な「チャット履歴」方式と、5 ターンに限定しセマンティック・メモリを追加したメモリ認識版を比較し、トークン節約はあるもののターン数が増加することを指摘しています。Claude が関係ない部屋に固執したり記憶が制御不能になる観察結果が、より良いスキャフォールドの必要性を裏付けています。
Related cases / background (context, past events, surrounding info)
この作業は「mech interp」をテーマにした AI ハッカソンで始まり、線形 Inform 6 の脱出ゲームでは十分な挑戦が得られなかったという以前の試みを経て進められました。選択されたベンチマークは長期的かつ Lovecraft スタイルのパズルゲーム「Anchorhead」です。
What may happen next (future developments / projections written in the text)
将来的には、TODOリストや位置図といったドメイン固有のメモリ構造を作成し、ゲーム出力から自動的に地理情報を抽出する機能、
link(room,direction,other_room) のような手動ツール、およびエピソディック要約による次回実行加速が計画されています。
What impacts this could have (users / companies / industry)
改良されたハーネスは LLM がより複雑なインタラクティブフィクションやその他の連続的意思決定タスクを扱えるようにし、AI 計画、ゲーム、および教育用ナラティブ環境への応用が期待されます。
本文
AI ハッカソン – テキストアドベンチャーエージェント設計
最近、リウシアとマリンが主催したハッカソンに参加しました。
テーマは mech interp でしたが、PyTorch にあまり精通していないため、モデル層ではなく API 層に集中することにしました。
私にとって繰り返し出てくるアイデアは、Soar や ACT‑R のような認知アーキテクチャです。これらは GOFAI 研究の拡張であり、認知科学からインスピレーションを得ています。GOFAI は実用的なシステムを提供できませんでしたが、LLM を「cog‑arch」風にハーネス化することでその限界を克服できるかもしれないと考えています。
Claude Code のような LLM エージェントは、本質的には「偶発的」な認知アーキテクチャです。実務者によって構築され、理論家ではありませんが、メモリ管理・ツール使用・タスクアジェンダなど共通のニーズを持っています。認知科学に基づく原則ある設計は、より高い性能をもたらす可能性があります。
評価課題の選定
Soar のアーキテクチャを LLM エージェントに適応させる方法をブレインストーミングした後、「どうやってベースラインより優れていることを証明するか?」と問いました。評価が必要でした。
| 候補 | 長所 | 短所 |
|---|---|---|
| 数学問題 | ワンショットで解ける | 長期的ではない |
| チャットボット | インタラクティブ | 継続対話が必要 |
| コーディングエージェント | 柔軟性が高い | ツール使用量が多く、自由形式 |
| テキストアドベンチャー | 構造化された世界、長期的ゴール、パズル、探索 | パースと計画が必要 |
テキストアドベンチャーは条件を満たします。文字だけでアクセスできる階層構造の世界で、長期間にわたる目標とパズルがあります。Michael S. Gentry の Anchorhead はその典型例です。何百ターンにわたり複数の日を経て進行します。
Frotz とのインターフェース
Frotz インタープリタはコマンドラインで動作します。その「ダム」なインタフェース、dfrotz は ncurses の余計な部分を除去し、シンプルな CLI を提供します。
$ dfrotz games/anchor.z8 ... Outside the Real Estate Office day one ANCHORHEAD An interactive gothic by Michael S. Gentry
Python でラップして
stdin / stdout 経由でインタープリタを制御しました。
class Interpreter: """dfrotz Z‑マシンインタープリタプロセスを管理します。""" p: Popen def __init__(self): log("Starting dfrotz.") p = Popen( ["dfrotz", "-m", GAME], stdin=PIPE, stdout=PIPE, stderr=PIPE, ) log(f"Started dfrotz with PID={p.pid}.") # stdout/stderr を非ブロッキングモードに設定 for stream in [p.stdout, p.stderr]: assert stream is not None fd = stream.fileno() flags = fcntl.fcntl(fd, fcntl.F_GETFL) fcntl.fcntl(fd, fcntl.F_SETFL, flags | os.O_NONBLOCK) self.p = p def read(self) -> str: assert self.p.stdout is not None b: bytes | None = self.p.stdout.read() return b.decode("utf‑8") if b else "" def write(self, t: str) -> None: assert self.p.stdin is not None self.p.stdin.write(t.encode("utf-8")) self.p.stdin.flush() time.sleep(0.1) # インタープリタが応答する時間を確保
このラッパーにより、Python からコマンドを送信しゲーム出力を受け取れます。
プレイヤーインターフェースの定義
class Player(ABC): """ゲームプレイエージェント用インタフェース。""" @abstractmethod def cycle(self, text: str) -> str: """ ゲーム出力をエージェントに渡し、 実行する次のコマンドを返す。 """
単純ハーネス
最も単純なハーネスは、LLM / ゲームのやり取りをチャット履歴として扱います。LLM はゲーム出力を読み込み、推論トークンを追加し、
stdin 経由で送られるコマンドを書きます。
SYSTEM_PROMPT = """ Hello Claude. Your task is to play an adventure game. I've hooked up your output to the dfrotz interpreter. The structure of your output is fairly freeform. The first line that starts with `>` (and only the first line!) is interpreted as a game command; everything else is uninterpreted commentary, e.g.: We should go north to explore the church. >go north If you write multiple `>` lines in one response, all but the first will be ignored. Have fun! 😊 """
class SimplePlayer(Player): """最も単純なゲームプレイエージェント:全履歴をインコンテキストで保持。""" client: Anthropic history: list[tuple[EntryType, str]] def __init__(self): self.client = Anthropic() self.history = [] def cycle(self, text: str) -> str: self.history.append((EntryType.GAME, text)) messages = [] for entry_type, entry_text in self.history: role = "user" if entry_type == EntryType.GAME else "assistant" messages.append({"role": role, "content": entry_text}) response: Message = self.client.messages.create( max_tokens=512, model=MODEL, system=trim(SYSTEM_PROMPT), messages=messages, ) log(f"Tokens: {response.usage.input_tokens}") cmd_line = [line for line in response.content[0].text.split("\n") if line][0] cmd = cmd_line[1:] # '>' を除去 self.history.append((EntryType.COMMAND, response.content[0].text)) return cmd
このハーネスで Claude(Haiku 4.5)はマップをさまよい、Sonnet 4.5 と Opus 4.5 は約200ターンで最初のパズルを解決します。
コスト問題
単純ハーネスはクレジットをすぐに使い果たします。第2日には各ターンが数万入力トークンのコストになります。より経済的な手法が必要です。
メモリ認識型ハーネス
私は「メモリ認識型」ハーネスを試しました。Claude に対しては最新5ターン(知覚作業記憶)だけを提示し、シンプルな語義メモリ—文字列のリストで追加・削除が可能—を用意しました。これによりトークン使用量を抑えました。
しかし狭い視野は性能低下につながります。Claude はリアルエステートオフィスへ入るまで約40ターンかかり、単純ハーネスでは約10ターンです。また町中をさまよい回ってターン制限に達し、家を見つけられませんでした。
小規模世界実験
Anchorhead の広大さは進捗を素早く測定するのが難しいため、Inform 6 で小さいゲームを作りました。
- Escape‑the‑room – < 100 行;Claude は10ターン未満でクリア。
- Multi‑room heist – より複雑だが単純ハーネスで解決可能。
ヘストでは Claude が自分のメモリにのみ追加し、削除は行いませんでした。その結果、赤信号ルーム(井戸のある庭)に固執し、何度も下りようとして多くのターンを費やしました。最終的に無駄だと悟ったあとで動き出し、勝利直前の2ターンだけ遅れました。
線形で退屈なゲームが Anchorhead の自然な複雑さより魅力的ではないため、この「小規模世界」アプローチは諦めました。
今後の作業(TODO)
- ドメイン固有メモリ
Todo リスト、ロケーショングラフなど Soar スタイルで別々に管理。 - 自動地理情報構築
ゲーム出力をパースして部屋と接続のグラフを作り、コンテキストへフィード。 - 手動地理ツール
のようなツールを提供し、自動解析が失敗した際に Claude を支援。link(room, direction, other_room) - エピソディックメモリ
ランの後、トランスクリプト(成功/失敗)を要約し、「ウォークスルー」を次回実行時に提示。
リポジトリ
完全なコードベースは GitHub にあります。