はじめに
最近はAzureでAdd your data機能が登場するなど、ちょっと今更感もありますが備忘録も兼ねて記事にしました。
ベースとしてMicrosoftのサンプルデモを使っています。
- あくまで個人的な所感です
- 基本的なアプリ構築方法や機能の詳細については公式のサンプルデモの方に記述があるため、割愛させていただきます
1. インデックス作成時にはチャンクを細かくする
インデックス作成時には、出典(Citation)とインデックス(Supporting content)の内容が乖離するのを避けるために、チャンクを細かくすることが大事です。
元のサンプルデモは英語PDF向けですが、日本語PDFの場合、チャンクサイズがそのままだと回答内容と出典のページ数がズレてしまう問題が発生しました。
チャンクを細かくするとChatGPTのトークン数制限にも対応できるし、一石二鳥ですね。(もしモデルとしてGPT-4が使えるのであれば、トークン数についてはそこまで気にしなくてもいいのかも。)
消費トークン数の合計は、
システムロール + 質問内容 + ChatGPT回答 + 参照インデックス*$n$ + 履歴(チャット形式の場合)
となるため、主にユースケースに応じて、システムロール、参照するインデックスの数 $n$ 、チャット履歴の長さを調整することになると思います。
2. とりあえずの日本語対応は意外と簡単
元々ChatGPT自体が多言語で使えることもあり、サンプルデモの日本語対応はそこまで負担ではありません。
システムロールを修正したり、チャンクやセンテンスの区切り文字を日本語向けにしたり、Azure Cognitive Searchのアナライザーを変更したぐらいです。
厳密な日本語対応をするとなると、また話が変わってくるのかもしれません。
(文章の区切りを形態素解析で判別するとか)
3. やっぱり具体的・明示的な質問がベスト
具体的な質問をすると、良質な回答と出典が得られる印象です。
逆にアバウトな質問だと、例えば該当するソースがいくつかある場合に、ChatGPT的にはどちらの情報を提供すればいいか分からず回答の質が下がります。
例えば「海外出張時の宿泊費」について質問したい場合に、単純に宿泊費について聞くと、
国内出張に関する回答が返ってきてしまいました…
以下のように質問すれば、所望の海外出張に関する回答が得られます。
この辺はプロンプトエンジニアリングの話題になってしまいますが、質問内容の粒度として最低限「〇〇における△△について教えて。」程度は必要だと思いました。
4. 「厳密な出典の要求」と「回答の容易さ」はトレードオフ
当然ですが、システムロールで出典の要求を厳密にすると、ChatGPTが回答しない場合が増えます。
例としては、
システムロール:回答内容の全てに出典を紐づけてください、出典が不足する場合は回答しないでください。
ユーザ質問:就業規則について教えてください。
ChatGPT回答:わかりません。
といった具合ですね。
このあたりはトレードオフなため、導入するユースケースに応じて柔軟に調整する必要があるかと思います。
おわりに
以上が、社内ドキュメントとChatGPTを連携させる際に分かったポイントです。
個人的な所感を多々含んでますが、どなたかの参考になれば幸いです。
参考文献
https://github.com/Azure-Samples/azure-search-openai-demo
https://qiita.com/nohanaga/items/803c09b5a3a4e2d1776f
https://qiita.com/nohanaga/items/a3e236fdbb3ef5878012