ChatGPT APIリリースの衝撃から(およそ)3ヶ月。
私が所属する旅行系スタートアップのAVA Intelligenceでは、APIリリース以降、ミッション"Discover the Best For You"を実現するための重要技術と位置付け、様々に活用してきました。
中でも、自然言語で旅行について聞くことができるLINEボットがご好評をいただいています。
3ヶ月間、ChatGPTのAPIを使って目的を達成する方法を模索する中で、重要だと考えることを整理しました。
指針1.分割して各個撃破する
あなたはAIでどのような問題を解決しようとしていますか?
大抵の解くべき問題は、複雑で難しいです。
大きくて難しい問題を分割し、解けるサイズに分けて、扱いやすくすることは、ChatGPTを使う開発において大きな効果を発揮します。
課題を分割することで、AIではなくルールベースで解くべき課題を抽出できた場合、パフォーマンスの向上や良質な出力につながる場合があります。
- テキストの抽出タスクは正規表現の方が早く、性能が高いかもしれない
- 固有名詞の抽出は、形態素解析ライブラリの方が早く、性能が良いかもしれない
- 提案対象の生成を検索システムに切り出すことで、事実に根差した回答ができる(ReAct 後述します)
私はAVA Travelチャットを実装する上で、 AIが解くべき問題は以下の二つと位置付けています。
- ユーザーが、何を求めているかを特定すること
- 理由付きで、ユーザーに寄り添った提案を生成すること
提案内容を決定することは、AIが解くべきタスクとはせず、検索システムと協力します。これによって、素のChatGPTでは不可避な嘘の対策を行いました。
LLMに検索システム等で知識を与えることで、良い出力を目指す構成は"ReAct"と呼ばれ、私たちも"ReAct"を参考にした設計としました。
- ReAct参考スライド(実装を行う上で何度もお世話になりました)
https://speakerdeck.com/hirosatogamo/da-gui-mo-yan-yu-moderudebian-warumlsisutemukai-fa?slide=27
この指針は、「分割統治法」「Devide and Conquer」と呼ばれる指針に近いと思います。
これらは「ゆるコンピュータ科学ラジオ」というポッドキャストで知りました。以来AI開発以外でも、エンジニアリングを行う上で重要な指針だと考えています。
指針2.首尾一貫した目的を与える
課題(を解決するためのプロンプト)を分割するアプローチを紹介しました。
課題を分割した際に重要なのが、「首尾一貫した目的」です。
一貫して良質なアウトプットを担保するためには、各個のコンポーネントが、最終目的を意識する必要があります。
同じ矢印を向いた組織は強いですよね。それ以外にも、現実社会の似た状況を考えてみましょう。
- 組織の目標と個人の目標を関連づけることで、効率的な目標達成と高い従業員エンゲージメントを目指すOKR
- ユーザーストーリーに集中することで、顧客にとっての価値を最大化するためのアジャイル開発
何だかAIに向き合っていると、マネジメントの勉強になっているような気がします。この辺りからもシンギュラリティを感じます。
例えば、「大量の観光スポットの旅行記事を作る」というタスクを、下記のタスクに分解したとしましょう。
- 検索エンジンに投げるクエリを生成する
- 大量に収集した検索結果のスニペットを要約する
- 中間生成物の要約から記事を生成する
この時、中間生成物の質が成果物の質に大きな影響を及ぼします。
具体的には、以下のような調整を行うことで、アウトプットの質が向上します。
- 検索エンジンは、旅行にフォーカスした記事を返すべきだから、検索ワードに「旅行」「観光」等のキーワードを入れる
- 検索結果のスニペットを要約する際のプロンプトでは、「旅行者目線での要約」を依頼する
指針3.良質な例を与える
当初、目的の出力を得るために大量の詳細な条件を指定しました。
ところが、与える条件が増えるにつれ、出力に指示が反映されなくなりました。
それを解決してくれたのが例を与えるアプローチ。Few-shot learningを採用し、いくつかの出力例を与えることで、期待する回答にグッと近づきました。
▼ OpenAIが提供するFew-shot learningの説明
https://github.com/openai/openai-cookbook/blob/main/techniques_to_improve_reliability.md#few-shot-examples
大量の詳細な指示よりも、良質な出力例と、一貫した目的。もし僕がAIだったとしても、そんな指示の方が良いアウトプットを目指して楽しく仕事できそう。
まとめ
ここまで、現時点で重要だと感じることを書きましたが、日々模索と改善を続けています。
LLMとシステムを組み合わせることは、まだ確立しきっていない技術ですし、今後も良質な出力を求める過程で新たな発見や、技術の進歩に伴う変化があるはずです。
今後もユーザーの要望を満たすために真摯に開発を続けていきたいと思っています。
Matzさんのスピーチに引用された言葉を胸に秘めつつ。
The best way to predict feature is to invent it.
(@RubyKaigi2023)