かりんちゃんの随心遊戯日誌

ゲームの日記、たまに政治の話、香港の話

RAGシステム開発記

うちの会社はAI関連のノウハウは全くありません。なのに唐突に某自治体のRAGシステム開発の担当となり、しかも一知半解の営業たちが無茶のリクエストをめちゃくちゃ提案し、そして全ての開発作業をこっちに押し付けた…

と、まあ以前でも愚痴したことです。

実はプロトタイプがすでに出来上がり、自治体がすでにある程度満足した。なので、あとは「詰め」だけだろう。この案件のお陰で、RAGやChatGPTにめちゃ詳しくなったのは、まあそうではある。なので、今日が記事にしたいのは、愚痴ではなく、この開発の感想。

現在仕事で使われているモデルは4o-miniです。最初は3.5なんですが、3.5だと正直性能がいまいちで、複雑な分析もうまく対処できませんし、返答もいまいち満足できない。とりわけ、自治体なのであれこれの制限を要求するし、ふざけな言葉は受け入れないなど、生成した文章のチェックは何よりも重要です。そこで分析のパフォーマンスがよくないと、やはり破綻しやすい。3.5のメリットは、コストよりも計算も日本のデータセンターで行うだが、正直Googleなどの検索計算も常に日本で行う訳では無いし、自治体とはいえそこまで拘る理由がない。また、3.5はAzureではほぼ廃止する方向で、今後、計算も「日本のデータセンターでないとだめだ!!」という要求でない限り、コスパが一番いいのは4o-miniであることは間違いないだろう。

ちなみに、うちの会社はそんなに予算がなく、自治体から受け取る金も有限ではっきりにいうとショボいから、従量制であるAIとは相性がめちゃ悪い。なので貧乏くじとはこのことです。実際、APIもLambdaというめちゃ厳しいものを使わないといけない。理由は安いからです。なによ、僕はDockerのほうがいいのによー。しかもLambdaだと、制限が多く、FastAPIを乗せるにも苦労した。初期はSSTとのバトルが本当に厳しかった。

さて、ChatGPTはみなよく使われているが、RAGだとChatGPTだけでは成り立たない。まずナレッジのデータベースだが、予算のこともあって最初はVectorDBを使いました。しかもPostgresでのVectorDB。しかし、精度が悪く、なかなかうまく検索できません。とくに自治体の需要では紛らわしい言葉が多いので、そこはどうにもならなかった。まあ、うちにノウハウがないから。参考書のAzure AI Searchを使いたいが、ナレッジは流石に日本のデータセンターでないとだめなので、日本エリアではなんと、普通の価格プランはどれも好評につき新規は受け付けません、とのこと。使えるプランはもうコスト的に無理です。色々の駄々こねと試行錯誤の結果、東部はだめですが日本西部は普通の価格プランが使えると気付き、そこで全面的にAzure AI Searchに切り替えた、と今に至る。

正直、RAGはChatGPTにこの検索結果テキストから質問を答えるテキストを生成する、ということなんですから、検索結果は何よりも大事です。検索結果がおかしいだとレスポンスもおかしい、検索結果がまともであればレスポンスもまとも。AIはそういうものです。微妙に違う検索結果ですら区別できない可能性があるし、ゆえにChatGPTのRAGは、正直思ったより賢くないと自分は思いました。

とはいえ、検索システムのことをこれで一旦解決しましたが、その後はナレッジです。これもまた、とんでもない(苦笑)。

自治体からの要望は自治体のウェブサイトと税に関する説明を返答できるようにしてほしいとのことだが、自治体のウェブサイトと国税庁のウェブサイトにウェブスクレイピングを実施した結果、国税庁は10万ページ以上があると判明(そこで止まったので実は未知数です)。自治体自身のウェブサイトも数万ページとのこと。

あっこれはあかんな、ウェブスクレイピングはいいとして、どう管理するんだ?もちろん自治体はそんなこと知らない。こっちが引き続き管理するなんてとんでもない。完全に赤字じゃないか???

一旦議論したが、重要なページ以外は、Web検索の結果を利用することにした。もちろんAzure Bing Custom Searchです。Googleを使わない理由は、単純にBillingの管理です。とりあえず、指定した情報以外は、Bing Custom Searchのままに済ませた。さすがに10万のナレッジを管理することは、我らには無理のことです。

このRAGシステムは機能や要望の増加につれ、一回の問い合わせのChatGPT利用回数もどんどん増えていく。なぜなら、ChatGPTは実はよく指示を無視することですし、確率ですから想定した返答が帰ってこない可能性が多いです。例えば、「答えられない質問なら自治体の電話を追加する」との指示だが、結局答える質問でも自治体の電話を追加した。又は、ナレッジの引用元を最後に追加してほしいとの指示も、従うかどうかは完全にChatGPTの気まぐれです。こういうのは結局、特定目的だけのChatGPT利用を増やすしかないという。例えば引用元は、もらった返答とナレッジを再度ChatGPTに投げて、引用した情報の番号を返すように指示することで、確実に引用元を返答の文末に追加することが出来た。

まさに、出来が悪い子を教育することです。

ChatGPT利用回数を増やすと、精度も上がるしやれることも増える、というのは確かだが、一回の問い合わせのトークン数も勿論、めちゃ増えます。だから、あんな予算じゃもう現状確実に赤字ではないか…。しかし契約(あのむちゃくちゃのリクエスト群と共に)はすでにした、上司も半分諦め、予算は気にしないでくれ、と妥協した。まあ僕のせいではないですからね(笑)

ただ、RAG以外に、ChatGPTの良い利用方法も、この案件で改めてわかるようになった。まずは単体テストやDocStringの生成、このへんは以前ではかなり苦労したし、モックとかカバレッジとかも面倒だったが、ChatGPTにコードを与えると、生成した単体テストは100%使えるわけでもないが、多少アレンジすればカバレッジ100%は難しくない。しかも、一般Googleの検索では似たような状況から解決策を推測するしかないが、ChatGPTはかなりピンポイントの答えと解決策を提示してくれる。このへんを今後、うまく利用したい。

とくに、今まで使ったことないライブラリの利用や、知らない分野だと、かなり精度が高いものが返ってくる。一例として、この案件では音声入力との要望…ではなく、営業が勝手に提案したものがあったが、ChatGPTのおかげでやり方は一筋ではないとわかった途端、スマホ既存の機能使えよとこのむちゃくちゃのタスクを上司に突き返した。だって、スマホだとすでに実装されてるじゃん?少なくとも自分のXperiaはそんなものがある。ならばこんなことでわざわざコストと努力をかける理由は見当たらない。

さて、この地獄の案件はまだまだ続くが、少なくともこの分野に関してはかなりの知識を積めた。まあ、社内にノウハウがないからこそ、自分が覚えることが多いのはそうですけど、スケジュールまで厳しくするのはやめてくれ。