【ITニュース解説】Setting up RAG Locally with Ollama: A Beginner-Friendly Guide
2025年09月04日に「Dev.to」が公開したITニュース「Setting up RAG Locally with Ollama: A Beginner-Friendly Guide」について初心者にもわかりやすいように丁寧に解説しています。
ITニュース概要
LLMに独自文書を読み込ませるRAG技術を、Ollamaを使いローカルPCで構築する手順を解説。外部APIを使わないため、情報漏洩やコストの心配なく安全にLLMの応用を学べる。Pythonによる具体的な実装コードも紹介する。
ITニュース解説
大規模言語モデル(LLM)は、インターネット上の膨大なテキストデータから学習し、人間のような自然な文章を生成できる非常に強力なAI技術である。しかし、LLMにはいくつかの課題も存在する。一つは、学習済みのデータにない最新の情報や、企業内部の独自のデータについては回答できないこと。もう一つは、時として事実に基づかない情報を生成してしまう「ハルシネーション」と呼ばれる現象である。これらの課題を解決し、LLMをより正確で実用的にするための技術として、「Retrieval-Augmented Generation(RAG)」、日本語では「検索拡張生成」が注目されている。
RAGは、LLMが外部の知識源、例えばPDFファイル、社内文書、データベースなどから必要な情報を「検索(Retrieval)」し、その検索した情報に基づいて回答を「生成(Generation)」する技術である。これにより、LLMは自身の学習済みの知識だけでなく、ユーザーが提供した特定の情報源を根拠として、より正確で文脈に即した回答を生み出すことが可能になる。例えば、会社の120ページある規定集について「出張旅費の精算ポリシーは何ですか?」と質問すると、RAGシステムはその規定集から関連する段落を素早く探し出し、その情報をもとにLLMが明確な回答を生成するといった活用ができる。
RAGの仕組みは、主に二つの段階に分かれる。最初の段階は「ドキュメント検索フェーズ」である。ここでは、まずユーザーが用意した文書(PDFファイルなど)を、コンピューターが理解しやすいように数値の羅列である「ベクトル」に変換する。この変換は「埋め込みモデル」と呼ばれるAIによって行われる。変換されたベクトルは、「ベクトルデータベース」という特別なデータベースに保存される。このデータベースは、似たような意味を持つ情報を素早く探し出すことに特化している。ユーザーが質問をすると、その質問も同様にベクトルに変換され、ベクトルデータベース内で質問のベクトルと意味的に最も似ている文書の断片(「チャンク」と呼ばれる)が検索される。これにより、質問に関連性の高い情報だけが厳選される。
二番目の段階は「応答生成フェーズ」である。ドキュメント検索フェーズで探し出された関連性の高い文書のチャンクは、LLMへの指示文(「プロンプト」と呼ばれる)の一部として渡される。LLMは、この検索されたチャンクを自身の知識の「文脈(コンテキスト)」として利用し、その情報に基づいて自然な文章で回答を生成する。このときLLMは、検索された情報を根拠として、質問に対する具体的な答えを作り出すため、ハルシネーションを抑制し、より信頼性の高い情報を提供できる。
このようなRAGシステムを構築する際、外部のクラウドサービスを利用することもできるが、今回のニュース記事では「ローカルRAG」という、自分のコンピューター上で全てを完結させる方法が提案されている。このローカルRAGにはいくつかの大きな利点がある。まず「プライバシーとデータセキュリティ」が確保される点だ。企業秘密や個人情報を含む機密性の高い文書を外部のサービスに送信する必要がなく、データが自分のマシンから外に出る心配がない。次に「コスト効率」の良さだ。クラウドサービスを利用する場合に発生するAPI利用料が一切かからず、無料で何度でも、大量に利用できるため、開発や実験に最適である。また、「モデル実験」の自由度も高い。Llama 3.1やMistral、CodeLlamaといった様々なオープンソースのLLMを簡単に切り替えて試すことができ、自分の用途に最適なモデルを見つけやすい。「オフライン機能」も重要な利点だ。一度必要なモデルをダウンロードしてしまえば、インターネットに接続していなくてもRAGシステムが利用可能になる。これらのローカル環境でのLLMの実行を非常に簡単にしてくれるのが「Ollama」というツールである。Ollamaは、最適化されたオープンソースのLLMを最小限のセットアップでローカルマシン上で動かすためのシンプルで強力なインターフェースを提供する。
それでは、実際にRAGシステムをローカルで構築するための具体的な手順を説明する。まず、Ollamaを公式ウェブサイトからダウンロードし、インストールする。インストール後、コマンドラインでollama --versionと入力し、正しく動作しているか確認する。次に、RAGシステムで必要となる二種類のモデルをOllama経由でダウンロードする。一つは文書をベクトルに変換するための「埋め込みモデル」で、ollama pull nomic-embed-textというコマンドでダウンロードする。もう一つは、実際に質問応答を行うための「言語モデル(LLM)」で、ollama pull llama3.1:latestといったコマンドでダウンロードする。ダウンロードが完了したら、ollama listで利用可能なモデルを確認できる。最後に、RAGシステムがこれらのモデルを利用できるように、ollama serveコマンドを実行してOllamaサービスを開始する。これにより、OllamaがAPIとして利用可能になる。
次に、Python環境の準備が必要だ。Python 3.9以降がインストールされていることを確認し、RAGシステムを構築するために必要な複数のPythonライブラリをインストールする。これらのライブラリは、pip install -r requirements.txtというコマンドで一括インストールできる。主要なライブラリとその役割は以下の通りだ。llama-index-coreは、文書の読み込み、インデックス作成、クエリ処理といったRAGシステムの中心的な機能を提供するフレームワークである。llama-index-embeddings-ollamaは、Ollamaの埋め込みモデルをRAGシステムに統合するためのライブラリで、文書をベクトルに変換する際に利用する。llama-index-llms-ollamaは、Ollamaの言語モデルをRAGシステムに統合するためのライブラリで、回答の生成を担当する。llama-index-vector-stores-chromaとchromadbは、ベクトルデータベースとして「ChromaDB」を利用するためのもので、ベクトル化された文書を保存し、高速な検索を可能にする。pypdfは、PDFファイルからテキストを抽出するために使用される。
これらの準備が整ったら、RAGシステムの実装を進める。まず、プロジェクトのディレクトリ内にdataというフォルダを作成し、ここに質問させたいPDFファイルを配置する。そして、test_rag.pyというPythonスクリプトを作成する。このスクリプトは、まずOllama経由でダウンロードした埋め込みモデルとLLMを初期化する。ここで、大規模な文書を扱う場合に備えて、処理のタイムアウト時間を長めに設定したり、LLMの応答の多様性を制御する「温度(temperature)」を低めに設定して、より事実に基づいた回答が出やすいように調整する。
次に、load_and_index_documentsという関数で、dataフォルダ内のPDFファイルを読み込み、それらを埋め込みモデルを使ってベクトルに変換し、「ベクトルインデックス」と呼ばれる検索可能なデータ構造を作成する。このインデックスは、質問に対して関連情報を素早く見つけるための地図のような役割を果たす。create_query_engineという関数では、このベクトルインデックスとLLMを使って、「クエリエンジン」と呼ばれる質問応答の窓口を作成する。このエンジンは、ユーザーからの質問を受け取り、インデックスから関連情報を探し、LLMに回答を生成させる一連の流れを管理する。ここでは、いくつの関連情報を検索するか(similarity_top_k)といった検索パラメータも設定できる。
最後に、test_rag_system関数がRAGシステムの全体的な動作を確認する。この関数は、用意したPDFファイルを読み込んでインデックスを作成し、クエリエンジンを構築した後、事前に定義されたいくつかのテスト質問(例えば「この文書を3行で要約してください」など)を実行する。それぞれの質問に対してシステムがどのように応答したか、エラーが発生しなかったかなどを表示し、システムが正しく機能しているかどうかをユーザーに知らせる。
このシステムを使ってみるには、まず自分のPDFファイルをdata/フォルダに入れる。その後、コマンドラインでpython test_rag.pyを実行するだけだ。これにより、RAGシステムが文書を読み込み、インデックスを作成し、サンプルクエリを実行して結果を表示する。もしテストが成功すれば、自分のコンピューター上でプライベートなRAGシステムが構築できたことになる。
さらに高度な設定として、文書をベクトルに変換する際の「チャンクサイズ」や「チャンクの重なり」を調整することもできる。チャンクサイズは、文書をどれくらいの塊に区切るかを示し、チャンクの重なりは、塊と塊の間でどの程度重複させるかを示す。これらを調整することで、文書の内容をより適切に捉え、検索精度を向上させることが可能だ。また、クエリエンジンにおける「similarity_top_k」の値を増やすことで、より多くの関連情報を検索させたり、「response_mode」を変更して、より長い文書に対する要約方法を変えたりすることもできる。
このローカルRAGの構築は、プライバシーを保護し、コストをかけずに自分のデータに基づいた高度な質問応答システムを運用するための堅固な基盤となる。将来的に本番環境での利用を考える場合は、さらに性能の最適化、システムの監視、より大規模なデータセットに対応できるストレージ(例えばFAISS)の検討、そして利用目的に合った最適なモデルの選定といった点も考慮する必要がある。この基本的なセットアップは、文書ベースの質問応答機能を完全にプライベートな環境で実現するための出発点となるだろう。