貧困から富裕へ:ローカルAIチャットボットをよりスマートにするための実践ガイド

Table of Contents

貧困から富裕へ:ローカルAIチャットボットをよりスマートにするための実践ガイド

実践企業における AI の導入を追跡してきた方なら、「RAG」という言葉を耳にしたことがあるはずです。

検索拡張生成の略であるこの技術は、比較的高価な GPU やアクセラレータへの投資を正当化するほど AI モデルを有用なものにするものとして、Nvidia の Jensen Huang 氏から Intel の救世主 Pat Gelsinger 氏まで、あらゆる人々から称賛されている。

RAG の背景にある考え方はシンプルです。限られた量の公開情報で事前にトレーニングされたモデルに頼るのではなく、LLM の人間の言語を解析する機能を利用して、外部データベース内に保存されている情報を解釈および変換することができます。

重要なのは、このデータベースはモデルとは独立して更新できるため、新しい情報が追加されたり古いデータが削除されたりするたびにモデルを再トレーニングしたり微調整したりする必要がなく、LLM ベースのアプリを改善したり更新したりできることです。

しかし、RAG を使用して Llama3 や Mistral などの事前トレーニング済みの LLM をより便利で有能にする方法をデモする前に、その仕組みについてもう少し詳しく説明しましょう。

RAGは、非常に高レベルでは、埋め込みモデルを用いてユーザーのプロンプトを数値形式に変換します。このいわゆる埋め込みは、ベクターデータベースに格納されている情報と照合されます。このデータベースには、企業の内部プロセス、手順、サポートドキュメントなど、あらゆる種類の情報が含まれています。一致が見つかった場合、プロンプトと一致する情報は大規模言語モデル(LLM)に渡され、LLMはそれらを用いて応答を生成します。

これは本質的に、LLMの出力が、モデルが汎用的なトレーニング中に学習した内容のみに依存するのではなく、与えられたデータベースの特定のコンテキストに、より焦点を絞ったものになることを意味します。理想的には、これにより、より関連性が高く正確な回答が得られ、より有用なものになるはずです。

もちろん、舞台裏では他にも多くのことが起こっています。もし本当に興味があれば、Hugging Faceによるこのテーマに関する詳細な記事を読むことをお勧めします。しかし、重要なのは、RAGによって事前学習済みのLLMが学習データの範囲を超えた応答を生成できるようになるということです。

AIチャットボットをRAGタイムの友達に変える

RAGを使用して事前学習済みモデルを拡張する方法は、ユースケースや最終目標に応じていくつかあります。すべてのAIアプリケーションがチャットボットである必要はありません。しかし、このチュートリアルでは、RAGを使用して市販のLLMを、社内サポートドキュメントの参照やWeb検索が可能なAIパーソナルアシスタントに変える方法を見ていきます。

これを実現するために、少し前に取り上げた Ollama LLM ランナーと Open WebUI プロジェクトを組み合わせて使用​​します。

Open WebUIはその名前が示す通り、OllamaなどのLLM対応デバイスや、OpenAI互換APIなどと連携するためのセルフホスト型Web GUIです。Dockerコンテナとしてもデプロイできるため、この人気のコンテナランタイムをサポートするあらゆるシステムで問題なく動作します。

私たちの目的にとってさらに重要なのは、Open WebUI は、Mistral、Meta の Llama3、Google の Gemma などの LLM や、好みのモデルで RAG をデモするための最も簡単なプラットフォームの 1 つであるということです。

前提条件

  1. LLama3-8Bなどの低速LLMを4ビット量子化で実行できるマシンが必要です。このためには、互換性のあるGPU(OllamaはNvidiaと一部のAMDカードに対応しており、完全なリストはこちらで確認できます)と6GB以上のvRAMを搭載したマシンを推奨しますが、Gemma 2Bのような小型モデルに切り替えれば、それよりも少ない容量でも対応できる可能性があります。Apple Silicon Macの場合は、16GB以上のメモリを搭載したマシンを推奨します。
  2. このガイドは、Ollamaが既に対応システム上でセットアップされ、動作していることを前提としています。まだの場合は、こちらのガイドをご覧ください。10分以内にセットアップが完了し、動作を開始できます。
  3. また、お使いのマシンに最新バージョンのDocker EngineまたはDesktopがインストールされていることを前提としています。この点についてご不明な点がある場合は、こちらのドキュメントをご覧ください。

Docker を使用した Open Web UI のデプロイ

Open WebUIを自分のマシンで実行する最も簡単な方法は、Dockerを使うことです。これにより、さまざまなシステムに必要な多様な依存関係を管理する必要がなくなり、作業がスムーズに進みます。

システムに Docker Engine または Desktop がインストールされていると仮定すると (テストには Ubuntu Linux 24.04 を使用していますが、Windows と macOS でも動作するはずです)、次のコマンドを実行して新しい Open WebUI コンテナーを起動できます。

docker run -d --network=host -v open-webui:/app/backend/data -e OLLAMA_BASE_URL=http://127.0.0.1:11434 --name open-webui --restart always ghcr.io/open-webui/open-webui:main

システムによっては、このコマンドを昇格した権限で実行する必要がある場合があります。Linuxマシンの場合はsudo docker run、 または場合によってはを使用しますdoas docker run

Open-WebUIを一般公開されている本番環境で使用する予定の場合は、OllamaとOpen-WebUIの両方をコンテナとしてデプロイする必要がある可能性があるため、プロジェクトのデプロイメントドキュメントを詳しく確認することをお勧めします。ただし、これを行うにはGPUを介してDockerコンテナに渡す必要がありますが、これはこのチュートリアルの範囲外です。

注意: Windows および macOS ユーザーは、Docker Desktop 設定パネルの「開発中の機能」タブでホスト ネットワークを有効にする必要があります。

Mac および Windows ユーザーは、Open-WebUI コンテナを起動する前に、Docker Desktop でホスト ネットワークを有効にする必要があります。

Mac および Windows ユーザーは、Open-WebUI コンテナを起動する前に、Docker Desktop でホスト ネットワークを有効にする必要があります (画像をクリックすると拡大します)

約1分後、コンテナが起動し、http://localhost:8080 にアクセスしてダッシュボードにアクセスできるようになります。Open WebUI を別のマシンまたはサーバーで実行している場合は、localhost をそのIPアドレスまたはホスト名に置き換え、そのファイアウォールでポート8080が開いているか、ブラウザからアクセスできることを確認してください。

すべてが正常に動作していれば、Open WebUI のログインページが表示されます。ここでサインアップボタンをクリックしてアカウントを作成できます。最初に作成したアカウントは自動的に管理者ユーザーに昇格されます。

Open WebUI で最初に作成したユーザーは、自動的に管理者に昇格されます。

Open WebUIで最初に作成したユーザーは自動的に管理者に昇格されます

Open WebUI を Ollama に接続する

Open WebUIはフロントエンドに過ぎず、チャットボットとして機能するには、API経由でローカルでOllamaに接続するか、OpenAIを使用してリモートで接続する必要があります。Open WebUIコンテナを作成したときに、Ollamaウェブサーバー(http://127.0.0.1:11434)を検索するように設定されているはずです。ただし、Ollamaが別のポートまたはマシンで実行されている場合は、設定メニューの「接続」でこの設定を変更できます。

Open WebUI はデフォルトのポートで Ollama に自動的に接続するはずですが、接続されない場合は設定で API アドレスを手動で設定できます。

Open WebUIはデフォルトのポートでOllamaに自動的に接続するはずですが、接続しない場合は設定でAPIアドレスを手動で設定できます。

モデルのダウンロード

Open WebUI が Ollama と通信できるようになったので、モデルをダウンロードして質問することで、実際に動作しているかどうかをテストして確認できます。

WebUI ホームページから、まずモデルの選択をクリックし、使用するモデルの名前とタグを入力して、「プル」をクリックし、システムにダウンロードします。

モデルのダウンロードは簡単です。必要なLLMの名前を入力して、

モデルのダウンロードは簡単です。必要なLLMの名前を入力して「pull」を押すだけです。

利用可能なモデルの完全なリストはOllamaのウェブサイト(こちら)でご覧いただけますが、このチュートリアルでは、Metaが最近発表したLlama3 8Bモデルの4ビット量子化バージョンを使用します。接続速度と選択したモデルによっては、数分かかる場合があります。

LLama3-8B の実行に問題がある場合は、GPU の vRAM が不足している可能性があります。代わりに Gemma:2B のような小型モデルをお試しください。

次に、ランダムな質問でチャットボットにクエリを実行し、Open WebUI と Ollama が実際に相互に通信していることを確認しましょう。

すべてが正しく設定されていれば、モデルは vRAM にロードされるとすぐにプロンプ​​トに対して応答を返すはずです。

すべてが正しく設定されていれば、モデルはvRAMにロードされるとすぐにプロンプ​​トに応答するはずです。

RAGの統合

チャットボットが動作するようになったので、RAGベクターデータベースにドキュメントを追加できます。「ワークスペース」タブに移動し、「ドキュメント」を開きます。そこからPDFを含むあらゆる種類のドキュメントをアップロードできます。

「Workplace」タブの「ドキュメント」ページでドキュメントをアップロードできます。

ドキュメントは、Workplaceタブのドキュメントページでアップロードできます。

この例では、さまざまなシナリオで Podman コンテナ ランタイムをインストールおよび構成するための手順が記載された PDF サポート ドキュメントをアップロードしました。

Open WebUIはデフォルトでSentence-Transformers/all-MiniLM-L6-v6モデルを使用して、ドキュメントをLlama3または使用しているLLMが理解できる埋め込みモデルに変換します。「ドキュメント設定」(Open WebUIの最新リリースでは「管理者設定」内にあります)で、代わりにOllamaまたはOpenAIの埋め込みモデルを使用するように変更できます。ただし、このチュートリアルではデフォルトのままとします。

別の方法を試したい場合は、「ドキュメント設定」で埋め込みモデルを変更することもできます。

異なるものを試したい場合は、「ドキュメント設定」で埋め込みモデルを変更することもできます。

テストしてみる

ドキュメントをアップロードしました。WebUIはLlama3などの好みのモデルを使用して、ニューラルネットワークがトレーニングされていない可能性のある情報に関するクエリに回答できます。

これをテストするために、まずは先ほどアップロードしたドキュメントに関連する質問をチャットボットに投げかけます。今回はLlama3に「Rocky LinuxのようなRHELベースのディストリビューションにPodmanをインストールするにはどうすればよいですか?」と尋ねます。

モデルにドキュメントを参照するように指示しない限り、モデルは独自に何かを作成します。

モデルにドキュメントを参照するように指示しない限り、モデルは独自に何かを作成します

この場合、Llama3はすぐに一般的な回答を返し、大部分は正確であるように見えます。これはLlama3がいかに広範囲に学習されているかを示していますが、実際にはまだRAGを使って回答を生成しているわけではありません。

そのためには、クエリの先頭に「#」と入力し、ドロップダウンからファイルを選択することで、検索するドキュメントをモデルに伝える必要があります。

ドキュメントを照会するには、プロンプトを # で開始し、ドロップダウンから選択します。

ドキュメントを照会するには、プロンプトを「#」で開始し、ドロップダウンからファイルを選択します。

今では、同じ質問をすると、はるかに凝縮されたバージョンの手順が得られます。これは、Podman サポート ドキュメントの内容を厳密に反映しているだけでなく、podman-composedocker-compose ファイルを使用して Podman コンテナーを起動できるようにインストールするなど、有用と思われる追加の詳細も含まれています。

文書を選択すると、その文書に含まれる情報に基づいてモデル応答が生成されます。

文書を選択すると、その文書に含まれる情報に基づいてモデル応答が生成されます。

Open WebUIにレスポンスの元となったドキュメントが表示されているため、モデルがRAGを使用してレスポンスを生成していることがわかります。また、クリックすると、使用されている具体的な埋め込みを確認できます。

ドキュメントのタグ付け

当然のことながら、質問するたびに探しているファイルの名前を具体的に指定するのは、どのドキュメントを検索すればよいかが事前に分かっていなければ、あまり役に立ちません。この問題を回避するには、Open WebUI に「Podman」や「Support」といった特定のタグが付いたすべてのドキュメントを検索するように指示します。

これらのタグを適用するには、「ワークスペース」タブの「ドキュメント」パネルを開きます。そこから、タグ付けしたいドキュメントの横にある編集ボタンをクリックし、ダイアログボックスにタグを追加して「保存」をクリックします。

複数のドキュメントをクエリする場合は、「support」などの共通のフレーズでタグ付けできます。

複数のドキュメントをクエリする場合は、「サポート」などの一般的なフレーズでタグ付けできます。

プロンプトの先頭に「#」に続けてタグを入力することで、そのタグを持つすべてのドキュメントをクエリできます。例えば、Podmanドキュメントに「Support」というタグを付けたので、プロンプトの先頭に「#Support」と入力します。

  • 激怒したパット・ゲルシンガーがクアルコムとエヌビディアを激しく批判
  • GoogleがGemmaをリリース – パソコンで実行できるほど小型のLLM
  • Nvidia: チャットボットをいくつかつなげて作れるのに、なぜコードを書く必要があるのでしょうか?
  • クラウドではなくPCでLLMを10分以内で実行する方法

あなたの個人的な困惑

Open WebUI の RAG 実装は、アップロードされたドキュメントに限定されません。いくつかの調整を加えることで、Perplexity AI サービスと同様に、RAG と大規模言語モデルを組み合わせて Web を検索・要約できます。

Perplexityは、入力されたプロンプトを検索クエリに変換し、最も関連性の高いと思われる結果を要約し、脚注でそのソースへのリンクを付与することで機能します。OllamaとOpen WebUIを使えば、Googleなどの検索プロバイダーで検索し、上位3つの結果からプロンプトへの引用回答を生成することで、非常に似たような機能を実現できます。

このチュートリアルでは、Googleのプログラマブル検索エンジン(PSE)APIを使用して、El Regの記事を検索するウェブベースのRAGシステムを作成します。ただし、ウェブ全体または特定のサイトを検索するように設定することもできます。そのためには、PSE APIキーとエンジンIDの両方を取得する必要があります。両方の生成方法については、Googleのドキュメントをご覧ください。

次に、PSE API キーとエンジン ID を取得し、Open WebUI の「管理者設定」ページの「Web 検索」セクションで Web 検索を有効にし、検索エンジンとして「google_pse」を選択し、関連するフォームに API とエンジン ID を入力して、「保存」をクリックします。

Web 検索ベースの RAG を活用するには、検索プロバイダーの API とエンジン ID を取得する必要があります。

ウェブ検索ベースのRAGを利用するには、検索プロバイダのAPIとエンジンIDを取得する必要があります。

このセクションでは、プロンプトに関連する情報を確認するサイトの数を調整することもできます。

テストしてみる

設定が完了したら、Open WebUIにウェブ検索を指示するだけです。新しいチャットで「+」ボタンをクリックし、「ウェブ検索」にチェックを入れ、通常通りプロンプトを入力します。

Open WebUI の Web 検索機能はデフォルトでは有効になっていないため、プロンプトを入力する前に必ず有効にしてください。

Open WebUIのウェブ検索機能はデフォルトでは有効になっていませんので、プロンプトを入力する前に必ず有効にしてください。

この例では、Llama3に、モデルの学習後に発生したイベントについて質問しています。そのため、モデルはそのイベントに関する知識を持っていません。しかし、モデルはオンライン記事を要約しているだけなので、回答することができます。

モデルの応答を生成するために使用されたソースは下部にリストされています。

モデルの応答を生成するために使用されたソースは下部にリストされています

ここで重要なのは、これらの結果を解釈するのはあくまでもLLMであり、間違いを犯したり、幻覚を起こしたりする可能性があるということです。この例では、Llama3は関連情報を抽出しているように見えますが、ご覧のとおり、Googleにもインデックスされているフォーラム投稿は除外されていません。

コメントや意見を、不正確、誤解を招く、あるいは偏った情報で抽出・要約してしまう可能性も十分にあります。そのため、情報源をきちんと確認する必要があります。あるいは、クエリに含めたくないURLをブロックリストに登録しておくのも良いでしょう。

The Registerは、 LLMやその他のAIテクノロジーの活用について、誇大広告ではなく、より深く掘り下げた情報を近日中にお届けする予定です。これらのテクノロジーがどのように連携するのかを、その真髄までお見せしたいと考えています。AIインフラ、ソフトウェア、モデルについて、何か気になる点がありましたら、ぜひ下のコメント欄にお寄せください。®

完全な開示:私たちが実用的なAIアプリケーションの報道に興味を示した後、NVIDIAはThe Registerに対し、今回のような記事の制作に使用できるよう、RTX 6000 Ada世代グラフィックカードを貸与しました。NVIDIAは他に一切関与していません。

Discover More