RAG(Retrieval Augmented Generation)を簡単に構築する方法とは?
2023-09-16

今話題のRAG(retrieval augmented generation)について、そもそもどんな技術なのかから、実際の実装まで詳しく解説していきたいと思います。
サンプルコードも記載しているので、ぜひ、試してみてください!
※ GitHubには、そのほかのサンプルコードもあります。
RAG(retrieval augmented generation)とは?
外部の知識リソースから情報を検索し、その情報に基づき、大規模言語モデルに回答を生成させる技術のことをRAG(retrieval augmented generation)と呼びます。

ChatGPTなどの大規模言語モデルは、直近の最新情報をモデルに取り込めていないため、回答に含まれる情報が少し古くなってしまいます。
ChatGPTは2021年9月までの情報しか取り込めていません!意外と、2年以上前までの情報しか回答できないんです。
そこで、モデル内に含まれていない情報も加味した回答を生成できるようにするため、RAGが開発されました。
大規模言語モデルの弱点とRAGの強み
大規模言語モデルは、以下のような弱点をもっています。
大規模言語モデルの弱点
- モデル内に含まれていない直近の最新情報などは回答生成時に考慮されない
- 機密性の高い社内の情報などはモデル内に取り込むことができない
- モデルの再学習は時間も費用もかかるため、頻度が限られる
そのような弱点を補うために、考案されたのが、RAG(retrieval augmented generation)です。
外部の知識リソースから情報を取ってくることで、モデル内に含まれていない情報を回答に組み込むことができるのが最大の強みです。
自社で大規模言語モデルを開発していない限り、どのような情報を学習させるかをコントロールすることはできず、それでは少し不便ですよね?かといって、自社で開発するのは、お金も時間もかかり、得策ではありません。
そのため、最新情報であったり、社内の情報であったり、モデル内に含まれていない情報に基づいて回答が欲しい場合、RAGを活用することが一番コスパの良い選択肢になります。
RAGの実装方法をサンプルコードともに解説

最新情報に基づいて、回答を生成するRAGを構築してみたいと思います。
「自動運転は、どこまで実用化されている?」などの質問に、直近の最新情報を加味して、回答することができるようになります!
今回は、大規模言語モデルとしてChatGPTを、最新情報のデータベースとしてEnjigraph APIを利用して実装することにします。

■ STEP 1. Enjigraph APIの準備
API利用のため、Enjigraphアカウントをまず作成しましょう。
※ ブラウザ版からのみ、API KEYの設定ができます。

次に、「拡張機能」に移動し、「Enjigraph APIの利用」からAPI KEYを作成しましょう。


作成されたAPI KEYをヘッダーに認証情報として付与することで、最新情報を取得できるようになります。
■ STEP 2. OpenAI APIの準備
OpenAI APIのアカウントを作成しましょう。
アカウントを作成後、「View API keys」からAPI KEYを発行することができます。

■ STEP 3. Enjigraph APIからデータを取得し、プロンプトをOpenAI APIに送信することで、回答を生成
Enjigraph APIから特定のテーマに関する最新情報を取得し、それらの情報を含めたプロンプトをOpenAI APIに送信するプログラムをPythonで作成します。
今回は、例として、「自動運転は、どこまで実用化されている?」というクエリに対する回答を生成してみます。
この場合、「自動運転」に関する最新情報をEnjigraph APIで取得し、それらの情報を含めたプロンプトをOpenAI APIに送信することになります!
それでは、Enjigraph APIから情報を取得する部分のコードを書いていきます。下記条件を満たすような記事を取得したいと思います。
欲しい記事の条件
- 自動運転に関する記事
- 日本語の記事
- ドメインパワーが強い記事
それらの条件を加味して、リクエストクエリを設定します。
リクエストクエリの設定
- q=urllib.parse.quote("自動運転")
- lang=ja
- filter=domainAuthority
qに日本語を使いたい場合は、URLエンコードする必要があるので注意!
API KEYを付与して、Enjigraph APIのエンドポイントにGETリクエストを送信するコードは、以下のようになります。
次に、返ってきたレスポンスの中から、記事のタイトルと概要を含んだ下記のようなプロンプトをOpenAI APIに送信すると、回答が生成されます。
実際に生成された回答は、下記です。
自動運転技術の開発は現在、世界中で急速に進んでいます。各大手企業や研究機関が自動運転車両を開発し、実証実験や商用化に向けた取り組みを行っています。以下にいくつかの具体的な事例を示します。
日本国内では、北海道の苫小牧市や佐賀県の嬉野市、広島県の東広島市などで自動運転バスの実証運行が実施されています。北海道苫小牧市では、片道約2.5kmの区間を1日5便運行しています。嬉野市では、嬉野温泉駅と嬉野温泉バスセンターの間を往復する車両が公道で実証実験を行っています。広島県東広島市では、ソフトバンクとJR西日本がBRT(Bus Rapid Transit)の実証実験を公道で開始しています。
また、アメリカのカリフォルニア州サンフランシスコでは、ドライバーレスの自動運転タクシーが実用化されており、一般道でも自動運転が可能なバスの運行が茨城県日立市で始まる予定です。
さらに、自動運転技術の進化に伴い、中速・中型の配送ロボの社会実装を後押しするために、経済産業省が調査を行っています。また、自動運転車向けの「人間には見えない塗料」の開発も行われており、路面標示や景観を損ねずに自動運転を実現する取り組みも行われています。
これらの事例からも、自動運転技術の開発は実用化に向けて進展しており、近い将来、私たちの社会で自動運転が一般的になる可能性が高まっていると言えます。しかし、まだまだ課題も多く残されており、安全性や法律・倫理面の課題などが解決される必要があります。
自動運転の開発は現在、世界中の多くの企業と研究所で進められています。主要な自動車メーカーや技術企業、大学などがそれぞれ独自の技術を開発しています。
具体的な事例としては、ソフトバンクと西日本旅客鉄道(JR西日本)が自動運転技術と隊列走行技術を用いたBRT(Bus Rapid Transit)の開発プロジェクトを進めています。これにより、自動運転の「連節バス」を使った公道での実証実験が行われました。
また、神戸市では一般市民を対象にした「自動運転レベル4」に対応できる小型バスの体験乗車会が行われました。エストニア企業のAuve Tech(オーブテック)製の自動運転車両「MiCa」が使用され、日本初の試みとなりました。
さらに、最近では北海道苫小牧市で自動運転バスの実証運行が開始されました。市街地エリアからウォーターフロントエリアまでの2.5kmの区間を運行しており、乗車は無料で行われています。
これらの具体的な事例からもわかるように、自動運転の開発は段階的に進んでおり、実用化に向けた実証実験が行われています。技術の向上や法整備の進展により、自動運転の普及が加速していると言えます。
企業や自治体での最新の取り組みを幅広く含めたうえで、要点をうまくまとめた回答になっていることがわかります。
OpenAI APIに渡す最新情報の数を増やしたり、制約条件や命令文などプロンプトの文章を調整することで、生成される回答を調整することができるので、好みに応じて色々試してみてください。
全体のコードは下記のようになります。
まとめ
ChatGPTとEnjigraph APIを活用して、retrieval augmented generationのシステムを構築する方法を紹介しました。
簡単な構成ですが、社内の情報検索システムなどにも十分活用できるクオリティの回答が得られます。
Pythonのコードをコピペするだけで簡単に使えるので、ぜひ試してみてください。
Enjigraph APIを利用する