Open WebUIのドキュメントの参照(RAG)の実装を確認してみた

# はじめに

この記事では、**Open Web UI**の**Retrieval Augmented Generation (RAG)** の実装に焦点を当て、特に**ベクトルデータベース**の使用方法とその重要性について掘り下げます。RAGは、情報検索と生成を組み合わせた強力な手法であり、ドキュメント参照によって、より正確な情報を生成することが可能になります。

## Open Web UIとは何か？

Open WebUIは、完全にオフラインで操作できる拡張性が高く、機能豊富でユーザーフレンドリーな自己ホスティング型のWebUIです。OllamaやOpenAI互換のAPIを含むさまざまなLLMランナーをサポートしています。

https://docs.openwebui.com/

<iframe width="560" height="315" src="https://www.youtube.com/embed/4WoO_DOWd5s?si=BwKI7m3Eft1ib8Oy" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

## RAGの役割

RAGは、質問に対する答えを生成する際に、関連するドキュメントを検索し、その内容を参照して回答を生成する技術です。これにより、回答の質が大幅に向上し、より信頼性の高い情報提供が可能になります。

## ベクトルデータベースの重要性

ベクトルデータベースは、大量のデータを効率的に処理し、検索するための技術です。RAGの実装においては、このデータベースがドキュメントの検索と参照のプロセスを支える重要な役割を果たします。

この記事を通じて、GitHubリポジトリの具体的な分析を通じて、実際のコードの見方と理解の仕方を示すことができるでしょう。

# Open Web UIの概要

## ドキュメントの登録
Open Web UIには、ユーザーが問い合わせた内容に関連するドキュメントを検索し、その情報を基に回答を生成するドキュメント登録機能が備わっています。この機能は、AIが提供する情報の精度を高めるために重要な役割を果たします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/f1c149fc-4943-b9cb-9977-2555cc6a88f6.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/03ed8778-c349-3fda-8b03-765b9a8d9c56.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/eaf7cff0-fd94-ec69-7c50-912c0b723441.png)

+でドキュメントを登録できる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/6a0ede2e-2a66-967b-22ba-58c11c37da6e.png)

## チャットでのドキュメントの参照方法

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/b4ee2efe-00b5-500a-240c-9f8cf1c573bc.png)

#で登録したドキュメントを参照できる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/9d72af08-47cb-005c-fc28-ec3a5c2c24e2.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/ab9f691d-7f58-9ebe-7b0e-8d3310e89a45.png)

ローカルPCにインストールされたollamaというプラットフォームを使用し、llama3モデルを活用して、ドキュメントの内容に基づいて回答を生成しています。

もっと複雑なドキュメントになると、精度がどうなるかわからないが、これくらいの文章量だと抽出できてそう。

# Open Web UIのRAGの実装の確認

機能が期待通りに動作していることに驚きました。この機能が実際にRAGを使用しているか疑問に思ったため、公式ドキュメントを確認しました。

## 公式サイトの確認

[Open WebUIのRAGの説明](https://docs.openwebui.com/tutorial/rag)

ちゃんと機能として実装されているようだ。ドキュメントをパースする、実装のリンクもしめされていた。

## コードの確認

https://github.com/open-webui/open-webui/blob/2fa94956f4e500bf5c42263124c758d8613ee05e/backend/apps/rag/main.py#L328

get_loader関数でファイルの拡張子ごとに分岐して処理しているようだ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/7fa48c12-cc05-b665-7753-9a5624930d26.png)

langchainの関数を使用してなど、ベクトルDBに登録した情報を蓄積しているようだ。TextLoaderなど。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/62b2d5d2-e9d3-2b50-653a-0783c29425f3.png)

store_data_in_vector_db関数を通じて、テキストデータをベクトルデータベースに組み込む処理が行われているようだ。この関数では、テキストを分割し、各ドキュメントをベクトル化し、CHROMA_CLIENTを用いてデータベースにデータを追加しています。これにより、ベクトルデータベースに文書を格納し、後でチャットから参照が可能になっています。

# まとめ

**Open Web UI**の**Retrieval Augmented Generation (RAG)** と**ベクトルデータベース**の統合は、AIによる情報提供の精度を革新します。実装の分析と検証を通じて、これらの技術を適用するための方法論を確認しました。

# 参考

[RAGを使ったChatbotの実践と実装](https://qiita.com/menon/items/97350aa0b5e89f661852)
[open-webui github](https://github.com/open-webui/open-webui)