ジェネレーティブAIを探求する
ジェネレーティブAI、特にLLM(大規模言語モデル)は、一般の意識の中に急速に広がっています。多くのソフトウェア開発者と同様に、私もその可能性に興味をそそられますが、長期的には私たちの職業にとって正確に何を意味するのか確信が持てません。現在、私はThoughtworksで、このテクノロジーがソフトウェアデリバリーの実践にどのように影響するかについての私たちの取り組みを調整する役割を担っています。同僚と私が学んで考えていることを説明するさまざまなメモをここに投稿する予定です。
過去のメモ
ツールチェーン(2023年7月26日)
中央値 - 3つの関数の物語(2023年7月27日)
インラインアシスタンス - より役立つのはいつか? (2023年8月1日)
インラインアシスタンス - どのように邪魔になるのか? (2023年8月3日)
コーディングアシスタントはペアプログラミングの代わりにはならない(2023年8月10日)
GitHub Copilotを使用したTDD(2023年8月17日)
GenAIは他のコードジェネレーターとどう違うのか?(2023年9月19日)
最新のメモ:コーディングアシスタントの信頼性の低さにどう対処するか
2023年11月29日
コーディングアシスタントの有用性のトレードオフの1つは、その信頼性の低さです。基盤となるモデルは非常に汎用的であり、手元のタスクに関連するデータと関連性のないデータを含む、膨大な量のトレーニングデータに基づいています。また、大規模言語モデルは物事を捏造し、一般的に「幻覚」と呼ばれるものを起こします。(余談ですが、「幻覚」という用語については、これがこれを説明するのに実際には正しい心理学的な比喩ではないということ、また、そもそもモデルを擬人化するため、心理学用語を使用すること自体について、多くの議論があります。)
その信頼性の低さは、2つの主なリスクを生み出します。コードの品質に悪影響を与える可能性があり、時間を浪費する可能性があります。これらのリスクを考慮すると、コーディングアシスタントの入力に対する信頼度を迅速かつ効果的に評価することが重要です。
アシスタントの入力に対する信頼度をどのように判断するか
以下は、提案を使用することの信頼性とリスクを評価しようとするときに、私の頭の中で通常浮かぶ質問の一部です。これは、コードを入力中の「自動補完」の提案と、チャットからの回答の両方に当てはまります。
迅速なフィードバックループがあるか?
回答または生成された情報が機能するかどうかをすぐに確認できればできるほど、アシスタントが時間を無駄にしているリスクは低くなります。
- IDEはフィードバックループを支援できるか?構文強調表示、コンパイラーまたはトランスパイラーの統合、リンティングプラグインがあるか?
- テスト、または提案されたコードを手動で実行する簡単な方法があるか?あるケースでは、HTMLページで折りたたみ可能なJSONデータ構造を最適に表示する方法を調査するために、コーディングアシスタントチャットを使用していました。チャットは、私が聞いたことのないHTML要素について教えてくれたので、それが存在するかどうか確信が持てませんでした。しかし、それをHTMLファイルに入れてブラウザで読み込むのは簡単だったので、確認できました。反対の例を挙げると、聞いたことのないインフラストラクチャコードの検証のためのフィードバックループは通常、はるかに長くなります。
信頼できるフィードバックループがあるか?
AI入力のフィードバックループの速度だけでなく、そのフィードバックループの信頼性についても考えています。
- テストがある場合、そのテストにどれほど自信があるか?
- 自分でテストを書いたか、それともAIアシスタントで生成したか?
- AIがテストを生成した場合、これらのテストの有効性をレビューする能力にどれほど自信があるか?書いている機能が比較的シンプルでルーチンであり、使い慣れた言語である場合は、より複雑または大規模な機能よりも、もちろんはるかに自信があります。
- アシスタントを使用しているときに誰かとペアリングしているか?彼らはAI入力に対して追加の意見とレビューを提供し、私の信頼を高めます。
- テストカバレッジに確信が持てない場合は、アシスタント自身を使用して自信を高め、テストするエッジケースをさらに要求することもできます。これは、以前のメモで説明した中央値関数の重要な欠落テストシナリオを見つけることができた方法です。
誤差範囲はどれくらいか?
また、行っていることに対する誤差範囲はどれくらいかについても考えています。誤差範囲が小さいほど、AI入力に対してより批判的になります。
- 新しいパターンを導入するときは、コードベースの全体的な設計にとって、より大きな影響範囲であると考えています。チームの他の開発者はそのパターンを採用し、コーディングアシスタントもコードに入ると、チーム全体でそのパターンを再現します。たとえば、CSSでは、GitHub Copilotがflexboxレイアウトを頻繁に提案することに気づきました。しかし、レイアウトアプローチを選択することは大きな決定であるため、これを使用する前にフロントエンドの専門家やチームの他のメンバーと相談したいと考えています。
- セキュリティに関連するものはすべて、当然、誤差範囲が小さくなります。たとえば、Webアプリケーションに取り組んでおり、「Content-Security-Policy」ヘッダーを設定する必要がありました。私はこの特定のヘッダーについては何も知らなかったので、最初にCopilotチャットに尋ねました。しかし、その主題の性質上、その回答に依存したくなかったので、代わりにインターネット上の信頼できるセキュリティ情報源に行きました。
- このコードはどのくらい長く使われるのか?プロトタイプや使い捨てのコードに取り組んでいる場合は、実稼働システムに取り組んでいる場合よりも、あまり疑問を持たずにAI入力を使用する可能性が高くなります。
非常に最新の情報が必要か?
回答がより最新で、より具体的(例:フレームワークのバージョン)である必要があるほど、その回答が間違っているリスクが高くなります。これは、探している情報がAIにとって利用できないか、区別できない可能性が高いためです。この評価では、手元のAIツールが、トレーニングデータだけでなく、より多くの情報にアクセスできるかどうかを知ることも重要です。チャットを使用している場合は、オンライン検索を考慮に入れる機能があるのか、それともトレーニングデータに限定されているのかを認識しておきたいと考えています。
アシスタントに時間制限を与える
時間を無駄にするリスクを軽減するために、私が採用するアプローチの1つは、一種の最後通告を与えることです。提案が少しの追加労力で私に価値をもたらさない場合は、先に進みます。入力がすぐに役に立たない場合は、アシスタントを擁護してさらに20分かけて機能させようとするのではなく、常にアシスタントについて最悪のことを想定します。
私が思い浮かべる例は、AIチャットを使ってmermaid.jsのクラス図を生成しようとしたときのことです。私はmermaid.jsの構文にあまり詳しくなく、提案されたものをなんとか動かそうと試行錯誤し、もしかしたらマークダウンファイルへの記述方法が間違っているのかと思っていました。結局のところ、構文が完全に間違っていたのですが、それには10分ほど経ってからオンラインドキュメントを確認してようやく気づきました。
アシスタントのペルソナを作る
このメモを準備するにあたり、アシスタントのペルソナを作ることで、責任を持って、できるだけ時間を無駄にせずに利用する方法を考えるのに役立つのではないかと思い始めました。もしかしたら、AIを擬人化することが、この場合には実際に役立つかもしれません。
信頼性の低さの種類について考えると、AIのペルソナは次のような特性を持つと想像できます。
- 手助けしたがっている
- 頑固
- 非常に博識だが、経験不足(ダンジョンズ&ドラゴンズのファン向けに言うと、知能は高いが、賢さは低い)
- 自分が何かを「知らない」ときにそれを認めない
私は画像生成ツールを使って、熱心なビーバーや頑固なロバのバリエーションをいくつか試しました。これが一番気に入ったものです(Midjourneyで「熱心な頑固なロバ、幸せな本、コンピューター、漫画風、ベクターベース、フラットな色面」)。
ペルソナに楽しい名前をつけて、チームで話すこともできます。「ダスティはセッション中にうるさい知ったかぶりだった、しばらくオフにしなければならなかった」とか、「ダスティがいてくれてよかった、昼食前にタスクが終わった」とか。しかし、「ダスティがそのインシデントを引き起こした!」とは絶対に言ってはいけません。なぜなら、ダスティは基本的に未成年であり、コミットする資格がないからです。私たちは最終的にコミットに責任を持つ親のようなものであり、「親は子供に対して責任を負う」のです。
結論
状況評価のリストは、コーディングアシスタントを使用するたびにすべて適用するには多すぎるように思えるかもしれません。しかし、これらのツールを使えば使うほど、私たちは皆、上達していくと信じています。私たちは、経験に基づいて、コーディングをするときに、このような多次元的な要素を考慮した迅速な評価を常に行っています。私は、上記のような状況に遭遇すればするほど、いつアシスタントを使用し、いつ信頼すべきかの判断がうまくなってきました。いわば、「熱いストーブに触れる」回数が増えるほどということです。
また、「もしAIアシスタントが信頼できないなら、なぜそもそもそれを使う必要があるのか?」と思うかもしれません。Generative AIツールを使用する際には、私たちが持つべき考え方の転換があります。「通常の」ソフトウェアと同じ期待を持って使用することはできません。GitHub Copilotは、必要なものを100%提供してくれる従来型のコードジェネレーターではありません。しかし、40〜60%の状況では、目的の40〜80%まで達成できます。これは依然として有用です。これらの期待を調整し、熱心なロバの行動と癖を理解する時間を与えれば、AIコーディングアシスタントからより多くのものを得られるでしょう。
フィードバックと意見をくれたBrandon Cook、Jörn Dinkla、Paul Sobocinski、Ryder Dainに感謝します。
このメモは、GitHub Copilotを有効にして、マークダウンファイルで書かれました。アイデアや言い回し、行き詰まった時に役立ちますが、提案が最終的なテキストに残ることはめったにありません。私はChatGPTを類語辞典として、そしてロバの良い名前を見つけるために使用しました。