独自LLMをオープンソースRAGに実装する(前編)

みなさん、こんにちは
CerebrasプリセールスエンジニアのNakadaです。
これまで、ブログにて大規模自然言語モデル(以下、LLM)についてフォーカスし紹介させていただきました。今回は独自LLMやオープンソースLLMをオープンソースのRAGに実装する方法を試し、前編と後編に分けて紹介させて頂きます。
■オープンソースのRAGパイプライン
Llamaモデルを筆頭にオープンソースLLMが日本語モデルも含めリリースされています。どのモデルも大量のデータセットを学習し、更にはInstructチューニング、DPOチューニングなどのファインチューニングを実施したモデルもリリースされていて、言語生成としての精度も良いものとなっています。これらのオープンソースLLMの活用については、簡単なChat形式で質疑応答するのであれば、実装もある程度簡単に行うことができます。
ただ、最近のトレンドとしてはやはり、RAG(検索拡張生成)を使って、会社のドキュメントなどを検索対象とし、LLM+RAGで回答させたいと考える方もいらっしゃるのではないでしょうか。RAGの利用については、OpenAIなどのクローズドLLMを使ったRAGサービスも多数あり、お客様はそれらを契約するだけで、すぐにLLM+RAG環境を利用することも可能です。
話を戻して、オープンソースLLMをRAGで利用するために必要なものですが、以下のように準備が必要です。
オープンソースLLMをAPI化する |
RAG用のVectorDBを用意する |
VectorDBへ登録する際に必要なEmbedding用LLMを用意する |
登録するドキュメントに合わせてOCRなどの読み込み方法を用意する |
より検索精度を高めるためにリランキングモデルやKnowledge Graphなどの最新検索手法を用意する |
入力内容のベクトル化からVectorDB検索、検索結果からオープンソースLLMへの問い合わせの処理を行うRAGパイプラインを用意する |
オープンソースLLMをAPI化するにはこちらもオープンソースのOllamaやNVIDIA NIM for LLMなどを使い、比較的簡単に量子化やAPI化することもできます。ただ、RAGを一から準備するのは上記のようにハードルが高くなります。
※NVIDIA NIM for LLMでは、RAGパイプラインもコンテナ化されて簡単に利用可能ですが、当初はオープンソースLLMについてはNVIDIAがNGCで用意している学習済みモデルのみ利用が可能でした。
そのため、RAGパイプラインもオープンソースを利用することで、簡単に構築でき、構築のハードルを下げることができます。
■RAGflow
今回は、オープンソースのRAGflowを使い、どのくらい簡単に構築できるかを紹介したいと思います。なお、利用するLLMはオープンソースLLMのLlama3-8をベースに当社が独自LLMとして開発したllama3-tedllm-8bを利用します。
なお、RAGflowですが、大きく5つの機能が利用できます。
ナレッジベース |
ドキュメントの登録や管理を行う。 様々なドキュメントタイプをサポートし、OCR読み込みやチャンク方法の指定、文章のチャンク時にLLM要約(RAPTOR)なども可能です。また、VectorDBに読み込んだドキュメントの検索テスト(類似度チェック)も可能。Knowledge Graphも利用できるようです。 |
チャット |
設定したLLMを使い、ナレッジベースで登録した情報検索と共にチャットができる |
検索 |
ナレッジベースで登録した情報検索ができる。検索文は文章でも入力することができる。検索結果のマインドマップも確認できる |
エージェント |
LLMとRAGを組み合わせてチャットボットエージェントをノーコードで作成できる |
ファイル管理 |
登録したファイルの管理 |
RAGとしての機能は十分実装されていると思います。
■RAGflow利用の流れ
RAGflowをチャットで利用するまでの流れは以下となります。
利用するLLMの設定を行ったあとに、実際に利用するデータ(pdf、excel、word、pptなど)を登録し、登録した情報がVectorDBで検索できることを確認し、チャットで実際にRAG検索を利用します。
これらは、以下のRAGflowGUI上で操作することが可能です。なお、APIもサポートしていますのでRAGflowで作成した環境を外部からAPIアクセスすることも可能です。
■LLMとRAGはどのように連携する?
RAGflowでRAG実装は簡単にできますが、RAGflowの中でどのようにLLMと連携するのでしょうか。RAGflowは入力された文章を元にベクトル検索し、検索結果を元にプロンプトでLLMに対し、「検索結果を要約して回答してください」というようなプロンプトを投げて、LLMに回答させるようです。
実際のデフォルトのプロンプトは以下です。
あなたはインテリジェントなアシスタントです。質問に答えるためにナレッジベースの内容を要約してください。ナレッジベースのデータをリストし、詳細に答えてください。すべてのナレッジベースの内容が質問に関連しない場合、回答には「ナレッジベースにはお探しの回答が見つかりません!」という文を含める必要があります。回答はチャット履歴を考慮する必要があります。 こちらがナレッジベースです: {knowledge} 上記がナレッジベースです。 |
後半の{Knowledge}部分に検索結果が入力され、このプロンプトがLLMに投げられます。
おそらく、OpenAIなどの優秀なLLMはこのプロンプト内容が理解でき、正しく要約してくれるでしょう。ただ、今回は、オープンソースLLMを利用するため、この質問を正しく理解できるかが、RAG精度に直結すると思われます。特にSLM(Small Language Model)を利用する際には注意が必要です。もちろん、RAGの検索結果についてもLLMが検索した結果を要約するため、類似度が高い正しい情報を出力する必要があります。
■最後に
今回は前編ということで、オープンソースのRAGflowについて簡単に説明しました。後編は実際にオープンソースLLMとRAGflowを組み合わせて使った結果を紹介させて頂きます。最後に、このブログをお読みになり、LLM及びAIアクセラレータ製品にご興味がある方は当社までお問合せ頂ければ幸いです。