RAGFlowでRAGシステムを構築する:インストールから効果的な本番環境デプロイまで

Artificial Intelligence tutorial - IT technology blog
Artificial Intelligence tutorial - IT technology blog

はじめに: RAGFlowでLLMの能力を強化する

AIの急速な発展に伴い、GPT、Claude、Geminiなどの大規模言語モデル(LLM)は多くの新しい可能性を切り開きました。しかし、それらには依然として固有のいくつかの制約があります。LLMは誤った情報(ハルシネーション)を出力したり、知識が学習データに限定されたり、リアルタイムの最新情報にアクセスできない場合があります。Retrieval-Augmented Generation(RAG)技術は、これらの問題に対する解決策です。

RAGは、LLMが外部データソース(社内文書、ウェブサイト、データベースなど)から情報を「検索」し、それらを使用してより正確で信頼性の高い回答を生成することを可能にします。RAGについて調べたことがある方なら、LangChainとPythonでRAGを構築することに慣れているはずです。

しかし、複雑なRAGシステムを管理し、最適化し、本番環境にデプロイすることは、まったく別の課題です。実際の作業を通じて、これがAIアプリケーションを具現化するための不可欠なスキルであると私は認識しました。

この記事では、RAGFlowという専用ツールを使用して、完全なRAGシステムを構築する手順を説明します。RAGFlowは、RAGフローの構築プロセスを簡素化するだけでなく、RAGアプリケーションを効果的に管理、評価、デプロイするために必要なツールを提供します。特に本番環境において強力です。

コアコンセプト: RAGとRAGFlowの利点

RAGとは?

RAG、すなわちRetrieval-Augmented Generationは、LLMが外部データソースからの情報にアクセスし、それを利用することを可能にすることで、LLMの能力を向上させるアーキテクチャです。基本的なRAGプロセスは以下の通りです。

  1. Retrieval (情報検索): 質問(クエリ)を受け取ると、システムは外部データストア(通常はVector Database)から最も関連性の高い情報断片(チャンク)を検索します。
  2. Augmentation (補強): 検索された情報断片は、ユーザーの元の質問に「結合」されます。
  3. Generation (回答生成): その後、LLMは元の質問と補強された情報断片の両方を受け取り、最終的な回答を生成します。これにより、LLMはより完全で正確な「コンテキスト」を持つことができ、ハルシネーションの発生を低減します。

製品の取扱説明書が大量にあると想像してみてください。顧客が特定の機能について質問した際、LLMが自分で「推測」したり一般的な回答をする代わりに、RAGは関連する文書の正確な部分を見つけ出し、それを使って顧客に回答するのを助けます。これにより、回答は常に利用可能な情報に基づいており、非常に正確で信頼性の高いものとなります。

なぜRAGFlowを使用すべきか?

Pythonライブラリを使用して基本的なRAGを構築することは可能ですが、それを実際のアプリケーション、特に本番環境で活用するには多くの課題があります。

  • データ管理: 複数のソースからデータをどのように取り込むか?データを継続的に更新する方法は?
  • RAGフロー管理: フローが複雑になる(多数の処理ステップ、複数のLLM、複数のVector Database)と、管理とデバッグが困難になります。
  • 品質評価: RAGシステムが適切に機能しているか、どのように判断するか?調整すべきパラメータはあるか?
  • デプロイと拡張: RAGシステムを、使いやすく高負荷に耐えられるAPIとしてどのようにデプロイするか?

RAGFlowはこれらの問題を解決するために開発されました。以下のためのプラットフォームを提供します。

  • 直感的なRAGフロー設計: ドラッグ&ドロップインターフェースまたはコードによる設定で、RAGプロセスの各ステップを簡単に定義できます。
  • 多様なデータソース管理: さまざまな種類のローダー、チャンカーをサポートし、一般的なVector Databaseと統合します。
  • 評価と最適化: RAGのパフォーマンスをテストし、コンポーネントを微調整するためのツールを提供します。
  • 簡単なデプロイ: 数ステップでRAGフローをAPIに変換します。

RAGFlowを使用することで、インフラストラクチャの構築に時間を費やすことなく、新しいRAGのアイデアの実験に集中できます。これにより、製品の市場投入までの時間を短縮することもできます。

詳細な実践: RAGFlowでRAGを構築しデプロイする

それでは、RAGFlowを使ってシンプルなRAGシステムを構築してみましょう。インストールから基本的なRAG APIの稼働までをガイドします。

1. RAGFlowのインストール

RAGFlowはDockerを介してインストールおよび実行できるため、環境設定プロセスが簡素化されます。

要件:

  • DockerとDocker Composeがシステムにインストールされていること。

インストール手順:

まず、作業ディレクトリを作成し、RAGFlowのDocker Compose設定サンプルファイルをダウンロードします。

mkdir ragflow-tutorial
cd ragflow-tutorial
wget https://raw.githubusercontent.com/run-ai/ragflow/main/docker-compose.yaml

次に、RAGFlowサービスを起動します。

docker-compose up -d

このプロセスには、必要なDockerイメージのダウンロードに数分かかる場合があります。コンテナが起動すると、RAGFlowはあなたのマシンの`8080`ポートで利用可能になります。ブラウザを開き、http://localhost:8080にアクセスしてRAGFlowのユーザーインターフェースにログインしてください。

2. データの準備

デモンストレーションとして、PDFドキュメントに基づいて質問に回答するRAGシステムを構築します。サンプルPDFファイルを使用します。このファイルを、作成したばかりのディレクトリ(例: `ragflow-tutorial/documents/sample.pdf`)に配置してください。

mkdir documents
# documentsディレクトリにサンプルPDFファイルをダウンロードするか、独自のファイルを作成してください。
# 例: wget -O documents/sample.pdf https://www.africau.edu/images/default/sample.pdf

3. RAGFlowでRAGアプリケーションを作成する

RAGFlowインターフェースで、新しいRAGアプリケーションを作成します。

  1. 「Applications」 -> 「Create Application」を選択します。
  2. アプリケーションに名前を付けます(例: `MyFirstRAGApp`)。アプリケーションタイプとして`Chat`または`Question Answering`を選択します。
  3. 作成後、アプリケーション設定ページに移動します。

4. データソースとVector Storeの設定

これは、RAGFlowがどこにデータがあり、どのようにベクトル埋め込みを保存するかを認識するための重要なステップです。

  1. データソースの追加:

    • アプリケーションの「Data Source」タブに移動します。
    • 「Add Data Source」をクリックします。
    • データソースの種類を選択します。PDFファイルの場合、`File Upload`または`Local File System`(RAGFlowコンテナがマウントされたボリューム経由で`documents`ディレクトリにアクセスできる場合)を使用できます。簡単にするため、`File Upload`を使用します。
    • `sample.pdf`ファイルをアップロードします。
    • RAGFlowは自動的にファイル内のテキストチャンク(分割)し、埋め込みを生成します。
    • 「Vector Store」を選択します: RAGFlowはMilvus、Pinecone、ChromaDBなど多くの種類をサポートしています。デフォルトでは内部のVector Storeを使用できます。ニーズに合った種類を選択してください。
  2. チャンキングの設定:

    • RAGFlowでは、ドキュメントが分割される方法(チャンキング戦略)を設定できます。情報検索を最適化するために、チャンクサイズやオーバーラップを調整できます。
    • 簡単にするため、デフォルト設定のままで進めます。

5. LLMと埋め込みモデルの設定

RAGFlowは、回答生成に使用するLLMと、データおよび質問の埋め込み生成に使用するモデルを認識する必要があります。

  1. 「Models」タブに移動します。

  2. 埋め込みモデル: 適切な埋め込みモデル(例: OpenAIの`text-embedding-ada-002`、または`sentence-transformers`などのオープンソースモデル)を選択します。APIキーをお持ちの場合は、ここで設定してください。

    {
      "model_type": "openai",
      "api_key": "YOUR_OPENAI_API_KEY",
      "model_name": "text-embedding-ada-002"
    }
    
  3. LLM: 使用したい大規模言語モデル(例: `gpt-3.5-turbo`、`gpt-4`、またはプロバイダーのAPI経由で他のオープンソースモデル)を選択します。同様に、必要であればAPIキーを設定します。

    {
      "model_type": "openai",
      "api_key": "YOUR_OPENAI_API_KEY",
      "model_name": "gpt-3.5-turbo"
    }
    

    OpenAI APIキーがない場合、Ollamaを使用するローカルモデルや、RAGFlowがサポートする他のサービスの使用を検討できます。

6. RAGフローのテストと最適化

データとモデルの設定が完了したら、RAGアプリケーションをテストできます。

  1. 「Test」または「Playground」タブに移動します。
  2. PDFファイルの内容に関連する質問を入力します。
  3. RAGFlowは、情報検索プロセスとLLMによって生成された回答を表示します。

このステップでは、回答の品質を最適化するために、検索されるドキュメントの数(top-k)や類似度閾値などのパラメータを調整できます。たとえば、回答が正確でない場合、情報検索が不十分であったり、検索された情報が適切でなかったりする可能性があります。検索されたドキュメントを追跡することは、調整を行う上で非常に役立ちます。

7. 本番環境へのデプロイ

RAGFlowの強みの一つは、デプロイが容易であることです。

  1. APIエンドポイントの作成:

    • アプリケーションの「Deploy」タブに移動します。
    • RAGFlowは、RAGアプリケーション用のAPIエンドポイントを自動的に作成します。
    • URLエンドポイントとサポートされているHTTPメソッドに関する情報を確認できます。
  2. APIの使用:

    これで、APIを介してRAGシステムと対話できます。以下は、RAGFlow APIを呼び出すための簡単なPythonの例です。

    import requests
    import json
    
    # RAGFlowアプリケーションのAPI URLに置き換えてください
    API_URL = "http://localhost:8080/v1/applications/MyFirstRAGApp/chat"
    HEADERS = {
        "Content-Type": "application/json"
    }
    
    def chat_with_ragflow(message):
        data = {
            "query": message,
            "stream": False # ストリーミング結果を受け取りたい場合はTrueに設定
        }
        try {
            response = requests.post(API_URL, headers=HEADERS, data=json.dumps(data))
            response.raise_for_status() // HTTPエラーに対して例外を発生させる
            result = response.json()
            if ("answer" in result) {
                console.log("RAGFlow Answer:", result["answer"]);
            } else if ("choices" in result && result["choices"][0]["message"]["content"]) {
                console.log("RAGFlow Answer:", result["choices"][0]["message"]["content"]);
            } else {
                console.log("Unexpected response format:", result);
            }
        } catch (requests.exceptions.RequestException as e) {
            console.log(`Error calling RAGFlow API: ${e}`);
        }
    }
    
    if (__name__ == "__main__") {
        while (true) {
            let user_query = prompt("何を質問しますか(終了するには'exit'と入力)? ");
            if (user_query.toLowerCase() == 'exit') {
                break;
            }
            chat_with_ragflow(user_query);
        }
    }
    

    注意: APIエンドポイントと応答形式はRAGFlowのバージョンによって変更される可能性があるため、最新情報についてはRAGFlowの公式ドキュメントを確認してください。

  3. 本番環境への最適化:

    • リソース管理: RAGFlowコンテナ、特に埋め込みモデルとLLM(ローカルで実行する場合)に十分なリソース(CPU、RAM)がDocker Composeで設定されていることを確認してください。
    • 負荷分散: 大量のアクセスがある場合、リバースプロキシ(Nginx、Caddy)の後ろにRAGFlowをデプロイするか、Kubernetesを使用してRAGFlowのインスタンスをスケーリングする必要があります。
    • 監視: RAGFlowをPrometheus、Grafanaなどの監視ツールと統合し、パフォーマンスを監視しエラーを検出します。
    • セキュリティ: 認証/認可によってAPIエンドポイントを保護します。RAGFlowは通常、APIキーメカニズムまたはOAuthとの統合を提供します。
    • データ更新: 定期的にソースデータを更新するための自動パイプラインを構築し、RAGが常に最新の情報を持つようにします。

結論

この記事では、RAGと、RAGFlowがRAGシステムの構築と管理をいかに簡素化するかについて学びました。また、基本的なRAGアプリケーションのインストール、設定、デプロイの手順についても説明しました。

RAGFlowは、アイデアからRAGアプリケーションを本番環境にデプロイするまでのギャップを埋める効果的なソリューションです。特にAIに慣れていないジュニア開発者にとって、RAGFlowのようなプラットフォームを習得することは多くの機会を開くと信じています。RAGFlowはLLMアプリケーションの実現を助け、よりスマートで信頼性の高いAIアプリケーションを作成し、製品開発のスピードを加速します。

Share: