はじめに
RAGFlowは、OCR や TSR (Table Structure Recognition)を駆使して、様々な文章を深く理解することのできる RAG の Web アプリです。Rerank モデルが組み込まれているだけでなく、RAPTOR や Self-RAG と言った RAG の改善技術も利用できます。また、Ollama と Xinference に対応しているので、ローカルLLM で動作させることができます。
セットアップ
インストール
公式ドキュメントに従い、まずは Linux のパラメータを変更します。
単発の場合(再起動すると元に戻る)は、
sudo sysctl -w vm.max_map_count=262144
恒久的に変更する場合は、
echo "vm.max_map_count=262144" | sudo tee -a /etc/sysctl.conf
他のOSの場合は、公式ドキュメントをご確認ください。
次に、リポジトリからコードを取得して、ファイルに実行権限を付与します。
git clone https://github.com/infiniflow/ragflow
cd ragflow/docker
chmod +x ./entrypoint.sh
また、 docker-compose.yml
に以下を追記して、Ollama と Xinference が同時に起動する様にすると便利です。
services:
# ... (中略) ...
ollama:
image: ollama/ollama
container_name: ollama
ports:
- 11434:11434
volumes:
- $HOME/.ollama:/root/.ollama
networks:
- ragflow
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: all
capabilities: [gpu]
xinference:
image: xprobe/xinference
container_name: xinference
ports:
- 9997:9997
volumes:
- $HOME/.xinference:/root/.xinference
- $HOME/.cache/huggingface:/root/.cache/huggingface
- $HOME/.cache/modelscope:/root/.cache/modelscope
command: "xinference-local -H 0.0.0.0"
networks:
- ragflow
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: all
capabilities: [gpu]
設定が済んだら、起動します。
docker compose up -d
設定
docker logs -f ragflow-server
で実行ログを確認し、以下の様に表示されたら、http://localhost/
にアクセスします。
____ ______ __
/ __ \ ____ _ ____ _ / ____// /____ _ __
/ /_/ // __ `// __ `// /_ / // __ \| | /| / /
/ _, _// /_/ // /_/ // __/ / // /_/ /| |/ |/ /
/_/ |_| \__,_/ \__, //_/ /_/ \____/ |__/|__/
/____/
* Running on all addresses (0.0.0.0)
* Running on http://127.0.0.1:9380
* Running on http://x.x.x.x:9380
INFO:werkzeug:Press CTRL+C to quit
ログイン画面が表示されるので、Sign up
からアカウントを作ります。
ローカルなので、メアドは適当で大丈夫です。
アカウントを作成するとログイン画面に戻るので、Sign in
します。
右上のアイコンから設定画面に移動し、モデルを設定します。
今回は、Ollama の command-r(chat) と llava(Image2text)、 Xinference の bge-m3(embedding) を登録しました。
登録が完了すると以下の様になります。初期に登録されていた Tongyi-Qianwen は使わないので、削除しました。
右上の System Model Settings
からデフォルトモデルを設定します。
Embedding model は、RAGFlow に組み込まれているモデルもありますが、多言語対応ではない (RAGFlowが組み込みに用いている FastEmbed は多言語モデルにも対応しているけど...) ため、Xinference のモデル(bge-m3)を用います。
Rerank model は、組み込みのモデル(BAAI/bge-reranker-v2-m3)を使います(Xinference の Rerank には未対応)。
以上で、初期設定が完了です。
RAG実行
文章登録
まずは、RAGで使う文章を登録します。今回は下記の情報通信白書の全体版を使わせていただきました。
画面上部の Knowledge Base
から知識ベース画面に遷移し、右上の Create knowledge base
から 知識ベースを作成します。
Knowledge base name
を設定(何でもOK)、 Language
や Embedding model
などを選択します。Language
は、英語と中国語しか選べないので、日本語に近いであろう中国語を選択しました。
Chunk method
は文章の処理方法です(付録参照)。今回の場合、Paper か Manual のどちらかが良いと考え、Manual にしました。
ここで、Use RAPTOR to enhance retrieval
を on にすると、RAG の 改善技術である RAPTOR が使用できます。RAPTOR の詳細は元論文などを確認してください。
RAPTOR の Prompt
は デフォルトでは英語なので、日本語へ翻訳したものに置き換えました。
以下の段落を日本語で要約してください。数字には注意してください。段落は以下の通り:
{cluster_content}。
上記が要約すべき内容です。
以上で知識ベースのパラメータ設定が完了したので、ファイルを追加します。
追加すると、下記の様に表示されるので、Parsing Status
の ▷
を押して、知識ベースへの取り込み処理を行います。
完了すると Parsing Status
が SUCCESS
になり、そこにカーソルを合わせると、処理のログが表示されます。RAPTOR 処理が実行されたことも確認できます。
Retrieval testing
から、テストします。Rerank Model
から使用の有無が選択できます。
チャット
上部の Chat
からチャット画面に遷移し、左上の Create an Assistant
から、設定を行います。
Assistant Setting
タブでは、 Assistant name
や Set an opener
などを設定します(何でもOK)。Knowledgebases
で、使用する知識ベースを選択します。
また、Self-RAG
で、RAG の 改善技術である Self-RAG のon/offが選択できます。Self-RAG の詳細は元論文などを確認してください。
Prompt Engine
タブでは、System
でシステムプロンプトなどを設定します。デフォルトでは英語なので、日本語へ翻訳したものに置き換えました。
あなたは日本語で会話ができる知的なアシスタントです。質問に答えるために、知識ベースの内容を要約してください。知識ベースのデータを列挙し、詳細に答えてください。すべての知識ベースの内容が質問と無関係である場合、あなたの回答には "その質問に関する情報は知識ベースに含まれていませんでした!" という一文が含まれていなければなりません。回答はチャット履歴を考慮する必要があります。
ここに知識ベースがあります:
{knowledge}
上記が知識ベースの内容です。
Model Setting
タブでは、Model
などを設定します。Freedom
は、Copilotなどにもある会話スタイルの選択です。
以上で、アシスタントの設定は完了です。作成したアシスタントを選択すると、チャットが始まります。質問等を入力すると知識ベースを元に回答が得られました。
情報源の確認もできます。
これだと見にくいので、元のpdfの該当箇(p.76)所を確認してみました。
比べてみると金額は合っていましたが、前の章の図表の文に引っ張られて、余計な文言「令和4年度の総務省の調査によると」が入ってしまいました。知識ベース作成時に章の区切りが上手くいかなかった事が原因の一つでしょう。Chunk method を Manual ではなく、Paper にした方が良かったのかもしれません。
なお、この例では回答が短いため問題なく動作している様に見えますが、回答がもう少し長くなると表示が途中で打ち切られる現象が発生しました。内容的には正しそうだったので、生成側ではなくアプリ側の問題な気がします。
まとめ
RAGFlowでRAPTORやSelf-RAGを試しました。今回の例ではこれらの有効性は確認していませんが、一般的な RAG だけでなく、その改善技術まで簡単に扱えるのはとても便利です。(日本語の README があるのに)英語・中国語以外の対応が不十分なのは残念ですが、日本語でも一応動作したので、色々と試すことはできそうです。今後、扱える文章に html が追加されたり、Web から直接文章を取得できたりする様になると更に便利になると感じました。
付録
RAGFlowの文章処理方法