はじめに
本対応については、OCIやAWSのGenerativeAIでの開発をベースとしている場合の参考事例となります。Azureベースでの開発を行っている開発者の方はこんなことしなくても開発できるのに、と疑問に思われるかもしれません。著者はAzureでの開発は経験していない為、その点はご容赦ください。
こんな方にお勧め
・GenerativeAIの利用を始めた方
・RAGのシステムをこれから作ろうと思っている方
Rerankとは
検索システムの精度を向上させる処理のことをさします。
RAGにおける検索とは、セマンティック検索のことですが、セマンティック検索による検索はCOSINE類似度を用いたベクトルの向きを測るパターンが多く、純粋な数値のみで並び順が、決まることが多いです。
それだと、ユーザーが求める最適な並びとならない事が多く、よりユーザーの質問に対して関連性の高い文書を文脈から理解してランキングに落とし込んでくれる。
これを可能とするのが、Rerankという機能です。
主にCohereが提供しているイメージが強く、CohereへのAPI連携やLangChainで実装が可能です。
個人的には、RAGを実装するうえでRerankを行わないのはないと思えるほど、精度に影響する処理です。
イメージとしては、セマンティック検索でざっくり順位付けした後に、その中で更に詳細にRerankで順位付けさせることでより正確な順位付けが出来ると考えています。
Rerankの書き方
ぼくが実施したのは、API連携でした。
Cohereのサイトでアカウント登録することでAPIキーを取得出来る為、そのAPIキーを取得したうえで、
co = cohere.Client(api_key)
としてcoへの接続を行ったうえで、
results = co.rerank(query=text, documents=texts, top_n=5, model="rerank-multilingual-v3.0", return_documents=True)
このような記載をします。
query:質問(プロンプト)
documents:文書(事前に取り込んだ資料)
top_n:取得したいランキング数
model:rerankに使用するモデル
return_documents:返却される配列にdocumentを含めるか否か
Rerankすると文書のみになる
さて、そんなRerankですが当然といえば当然ながら文書に対してランキングを付ける意図しかない為、Rerank後は文書のみしか抽出されない為、その文書がどの資料の文書なのかなどの付属情報を取得することは叶いません。
その為、例えば参考資料などを回答生成後に表示したい場合、工夫が必要となります。
そこで今回の主題となります。
CohereのRerank後に参照した資料を表示する手法として、
セマンティック検索を行った際に文書の頭に【資料名+:】を付属させる
これを1つの手段として提案したいと思います。
ぼくの場合は、
セマンティック検索時に
SELECT doc_id , document_name || ':' ||embed_data AS embed_data, embed_id
このような記載で、ドキュメント名:チャンキング済み文書が一塊として抽出されるようにします。
その後に、
##リランキング
results = co.rerank(query=text, documents=texts, top_n=30, model="rerank-multilingual-v3.0", return_documents=True)
<中略>
##参考資料抽出
additional_titles = [r.document.text.split(':')[0] for r in results.results if r.relevance_score >= 0.95 and ':' in r.document.text]
このような記載で、リランキングによりランキング上位に上がった文書の中で一致率が高く文書の最初に:が来るまでの資料名を取得するようにプログラムを組んで、抽出された資料名を取得するようにしていました。
取得するのは、あくまで資料名のみですので実際のファイルを画面へ表示したい場合は、資料名と一致したものをAutonomousDBより直接呼び出す、GoogleドライブやOCIオブジェクトストレージなどに資料を格納したものを呼び出すなど、更なる工夫をこらしてください。
終わりに
今回は、Rerank後の資料の呼び出し方についてのお話でした。
セマンティック検索での抽出の場合、どうしても100%正しい資料のみを抽出したいという要望からは1歩届かない話となりますが、限りなく近いものを抽出することが可能です。
特にリランキングはほぼ必須となるRAGという技術においては、このような工夫が必ずに必要だと思っています。
他の方法があれば是非教えていただけると嬉しいです。
それでは、また次回の記事で!