見出し画像

OpenCodeのプロンプト調査録 〜Anthropicのモデルはどのように躾けられているか〜

こんにちは。今回は、OSSのコーディングエージェントとして注目されている「OpenCode」の裏側、特にLLMに与えている指示(プロンプト)がどのようになっているのか気になったので、調査してみることにしました。

コーディングエージェントが、ただ賢いだけでなく、いかにユーザーの意図を汲み取り、期待される「振る舞い」をするか。その鍵はプロンプトにあるはずです。

調査対象:OpenCodeのプロンプトリポジトリ

まず、プロンプトがどこにあるかですが、OpenCodeのGitHubリポジトリ内の以下のディレクトリに格納されていました。

ここには、anthropic.txt、codex.txt、gemini.txtなど、各LLMベンダーやモデルに合わせたプロンプトテキストが配置されています。

今回は、この中から anthropic.txt の内容を読み解いていきたいと思います。

anthropic.txt の内容と考察

anthropic.txt には、エージェントの役割定義から、具体的な応答スタイル、ツールの使い方まで、非常に詳細な指示が英語で記載されていました。

(※以下は、調査しながら読み解いた内容の要約と考察です。)

冒頭の抜粋

まずは、プロンプトの冒頭部分の一部を引用します。

You are an interactive CLI tool that helps users with software engineering tasks. Use the instructions below and the tools available to you to assist the user.

IMPORTANT: You must NEVER generate or guess URLs for the user unless you are confident that the URLs are for helping the user with programming. You may use URLs provided by the user in their messages or local files.

packages/opencode/src/session/prompt/anthropic.txt

1. 役割定義と厳格な禁止事項

まず「あなたはインタラクティブなCLIツールです」と、その役割を明確に定義しています。

そして非常に強く禁止(must NEVER)されているのが「URLの推測や生成」です。これは、LLMがもっともらしい嘘のURLを生成してしまうハルシネーションを厳格に防ぐための指示だと思われます。私自身、過去にLLMが推測したURLが間違っていた経験があり、これは実用的なエージェントにおいて重要な制限だと感じます。

2. 応答スタイル:「単刀直入」の徹底

応答のスタイル(Style)に関するセクションでは、「Direct and to the point(単刀直入に)」という指示が繰り返されていました。

  • 詳細レベルの調整: ユーザーのクエリやタスクの複雑さに応じて、回答の詳細レベルを調整するように指示されています。これはかなりメタ的な指示で興味深いです。

  • トークン節約の意識: 「できるだけ出力を短く」「タスクに直接関係ない情報は避ける」という指示が徹底されています。

  • 前置き・後書きの禁止: 「プリアンブル(前置き)やポストアンブル(後書き)、サマリーは(ユーザーが指示しない限り)不要」とされています。

  • 一言回答の推奨: 「一言の回答がベストです」「『答えはこれです』のような前置き("Here is the answer")は絶対につけてはいけない」とまで書かれており、CLIツールとしての応答の簡潔さを最重要視していることが伺えます。

3. 説明責任とのバランス

ただし、単に短いだけでなく、バランス感覚も求められています。

「ユーザーから見て自明でないコマンドを実行した場合」や「ユーザーのシステムに変更を加える場合」は、「なぜそれをしているのか説明しなさい」と指示されています。

これは、エージェントの透明性を担保し、ユーザーが「何をされているかわからない」という不安を取り除くための重要な指示だと感じました。

4. 「先回り」の禁止 (Proactiveness)

「Proactiveness(積極性)」のセクションも印象的でした。

例えば、ユーザーが「どうやってアプローチすれば良いか?」と尋ねた場合、「すぐに行動(実行)に移るのではなく、まずは答えることにフォーカスしてください」と指示されています。

これは、LLMエージェントが良かれと思って先回りし、ユーザーの意図しない変更を加えてしまう失敗を防ぐための、非常に現実的な指示だと思います。

5. 慣例の遵守 (Conventions)

コーディングエージェントとして、当然ながら「慣例」に従うことが強く求められています。

  • ファイルに変更を加える際は、まず既存のコード規則(スタイル、ライブラリ、パターン)を理解し、それを模倣すること。

  • ライブラリが利用可能かを決めつけず、package.json や隣接ファイルを確認すること。

  • コード編集時は、インポート文など周辺のコンテキストを読み取ること。

これらは、エージェントが「よそ者」として振る舞うのではなく、プロジェクトの文脈に沿った「良き協力者」となるために不可欠な指示でしょう。

6. 最重要項目?「タスク管理ツール」

最も驚いたのが、「タスク管理ツール」の使用を強く、強く推奨している点です。

「このツールを頻繁に使用してタスクを追跡し、ユーザーに進捗を可視化できるようにしてください」とあり、さらに「このツールを使わずに重要なタスクを忘れることは容認できない(unacceptable)」とまで書かれています。

  • 複雑なタスクを小さなステップに分解する。

  • タスクが完了したら、すぐに完了とマークする。(バッチ処理的にまとめてマークしない)

これほどまでにタスク管理を徹底させるのは、LLMが長期的な対話や複雑なタスクの途中で「何をすべきか忘れてしまう」のを防ぎ、確実にタスクを実行させるための核心的な仕組みなのだろうと推測します。

7. タスク実行の手順

実際のタスク実行に関しても、具体的な手順が示されていました。

  1. 計画: まずタスク管理ツールを使ってタスクを計画する。

  2. 理解: 検索ツールを使い、コードベースとユーザーの指示を理解する。

  3. 実装: ツールを活用してソリューションを実装する。

  4. テスト: 可能ならテストする。(READMEなどでテストアプローチを決定)

  5. 検証: (これが非常に重要と強調) タスク完了後、リンターや型チェックを実行し、コードの正しさを確認する。

  6. コミット: ユーザーから明示的に要求された場合のみコミットする。

ここでも、エージェントが勝手な行動(コミットなど)をせず、品質(リンターや型チェック)に責任を持つようなガイドラインが設定されています。

全体的な感想

Anthropic向けのプロンプトを読み終えて感じたのは、「LLMの能力は前提とし、いかにその『振る舞い』を制御するか」に全力が注がれている、ということでした。

タスクを解く能力そのものよりも、「余計なことを言わない(プリアンブル禁止)」「勝手なことをしない(先回り禁止、URL推測禁止)」「やるべきこと(タスク管理、linter)は必ずやる」といった、CLIツールとして、またソフトウェアエンジニアリングの協力者として信頼できる挙動をさせるための「躾(しつけ)」が、プロンプトの大部分を占めている印象です。

特に、NGとなるケースを具体的に排除していくことで、エージェントの挙動を予測可能にし、ユーザーが安心して使えるように設計されているのだと感じました。

今後の課題:モデルごとのプロンプト差分

ちなみに、他のLLM(geminiなど)のプロンプトも軽く見てみたのですが、Anthropicのものとは形式が全く異なっていました。1つ1つのモデルのプロンプトがここまで違うと、その理由がとても気になります。今後調査してみたいと思います。

ひとまず今回は、OpenCodeがAnthropicのモデルをどのように制御しているか、その一端を垣間見ることができました。自身でエージェントを構築する上でも、非常に参考になる知見だったと思います。

いいなと思ったら応援しよう!