RAGFlowでRAGの改善技術であるRAPTORやSelf-RAGを試す

# はじめに

RAGFlowは、OCR や TSR (Table Structure Recognition)を駆使して、様々な文章を深く理解することのできる RAG の Web アプリです。Rerank モデルが組み込まれているだけでなく、[RAPTOR](https://arxiv.org/abs/2401.18059) や [Self-RAG](https://arxiv.org/abs/2310.11511) と言った RAG の改善技術も利用できます。また、Ollama と Xinference に対応しているので、ローカルLLM で動作させることができます。

https://ragflow.io/

https://github.com/infiniflow/ragflow

# セットアップ

## インストール

公式ドキュメントに従い、まずは Linux のパラメータを変更します。
単発の場合(再起動すると元に戻る)は、

```sh
sudo sysctl -w vm.max_map_count=262144
```

恒久的に変更する場合は、

```sh
echo "vm.max_map_count=262144" | sudo tee -a /etc/sysctl.conf
```

他のOSの場合は、公式ドキュメントをご確認ください。

次に、リポジトリからコードを取得して、ファイルに実行権限を付与します。

```sh
git clone https://github.com/infiniflow/ragflow
cd ragflow/docker
chmod +x ./entrypoint.sh
```

また、 `docker-compose.yml` に以下を追記して、Ollama と Xinference が同時に起動する様にすると便利です。

```yaml
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]
```

設定が済んだら、起動します。

```sh
docker compose up -d
```

## 設定

```sh
docker logs -f ragflow-server
```
で実行ログを確認し、以下の様に表示されたら、`http://localhost/` にアクセスします。

```log
    ____                 ______ __
   / __ \ ____ _ ____ _ / ____// /____  _      __
  / /_/ // __ `// __ `// /_   / // __ \| | /| / /
 / _, _// /_/ // /_/ // __/  / // /_/ /| |/ |/ /
/_/ |_| \__,_/ \__, //_/    /_/ \____/ |__/|__/
              /____/

 * 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` からアカウントを作ります。

![ragflow_01](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3791334/1083720c-c546-a2ba-844c-bec3c6dbc50d.png)

ローカルなので、メアドは適当で大丈夫です。

![ragflow_02](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3791334/ee1936ad-95b7-563a-eb9b-190e460619ff.png)

アカウントを作成するとログイン画面に戻るので、`Sign in` します。

![ragflow_03](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3791334/f8044d16-fcae-2fa9-0aee-dc536c5f5c33.png)

右上のアイコンから設定画面に移動し、モデルを設定します。
今回は、Ollama の command-r(chat) と llava(Image2text)、 Xinference の bge-m3(embedding) を登録しました。

![ragflow_04](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3791334/c1042512-816e-89ce-e2fd-75df887174fc.png)

![ragflow_05](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3791334/47bfe50a-849b-e6c5-59bc-e31ac3da0b9d.png)

![ragflow_06](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3791334/c9e02828-3043-1637-1eca-f2967d64dd88.png)

登録が完了すると以下の様になります。初期に登録されていた Tongyi-Qianwen は使わないので、削除しました。

![ragflow_07](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3791334/cabbe7ba-9420-bdd2-37a3-0beb6a6d33be.png)

右上の `System Model Settings` からデフォルトモデルを設定します。
Embedding model は、RAGFlow に組み込まれているモデルもありますが、多言語対応ではない (RAGFlowが組み込みに用いている [FastEmbed](https://github.com/qdrant/fastembed/) は[多言語モデルにも対応している](https://qdrant.github.io/fastembed/examples/Supported_Models/)けど...) ため、Xinference のモデル(bge-m3)を用います。

![ragflow_08](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3791334/0dde45f1-c918-135b-6565-c10fedc2dbdc.png)

Rerank model は、組み込みのモデル(BAAI/bge-reranker-v2-m3)を使います(Xinference の Rerank には未対応)。

![ragflow_09](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3791334/88944273-fc81-b623-26fa-0dd1798cc76f.png)

以上で、初期設定が完了です。

# RAG実行

## 文章登録

まずは、RAGで使う文章を登録します。今回は下記の情報通信白書の全体版を使わせていただきました。

https://www.soumu.go.jp/johotsusintokei/whitepaper/ja/r05/pdf/index.html

画面上部の `Knowledge Base` から知識ベース画面に遷移し、右上の `Create knowledge base` から 知識ベースを作成します。

![ragflow_10](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3791334/b1cf68c0-3c48-3970-2c50-594b9b061292.png)

`Knowledge base name` を設定(何でもOK)、 `Language` や `Embedding model` などを選択します。`Language` は、英語と中国語しか選べないので、日本語に近いであろう中国語を選択しました。
`Chunk method` は文章の処理方法です([付録参照](#付録))。今回の場合、Paper か Manual のどちらかが良いと考え、Manual にしました。

![ragflow_11](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3791334/761bba75-032d-9433-be7f-12fa538ecc77.png)

ここで、`Use RAPTOR to enhance retrieval` を on にすると、RAG の 改善技術である RAPTOR が使用できます。RAPTOR の詳細は元論文などを確認してください。

https://arxiv.org/abs/2401.18059

RAPTOR の `Prompt` は デフォルトでは英語なので、日本語へ翻訳したものに置き換えました。

```text
以下の段落を日本語で要約してください。数字には注意してください。段落は以下の通り：
      {cluster_content}。
上記が要約すべき内容です。
```

![ragflow_12](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3791334/d73053d4-0127-65ec-8ada-a712f98b43eb.png)

以上で知識ベースのパラメータ設定が完了したので、ファイルを追加します。

![ragflow_13](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3791334/26ffc4fe-1917-cc9a-ebe0-98909e71c134.png)

追加すると、下記の様に表示されるので、`Parsing Status` の `▷` を押して、知識ベースへの取り込み処理を行います。

![ragflow_14](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3791334/77079cee-a636-18a0-52bd-fd23a43b62e4.png)

完了すると　`Parsing Status` が `SUCCESS` になり、そこにカーソルを合わせると、処理のログが表示されます。RAPTOR 処理が実行されたことも確認できます。

![ragflow_15](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3791334/3a36ddf8-ad2a-a862-fd8c-3f1228c6c0bc.png)

`Retrieval testing` から、テストします。`Rerank Model` から使用の有無が選択できます。

![ragflow_16](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3791334/a615cac3-18b4-68b1-20fa-1d2d345ee7a6.png)

## チャット

上部の `Chat` からチャット画面に遷移し、左上の `Create an Assistant` から、設定を行います。

![ragflow_17](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3791334/c260e53b-1df6-47e5-1346-4b58111991f0.png)

`Assistant Setting` タブでは、 `Assistant name` や `Set an opener` などを設定します(何でもOK)。`Knowledgebases` で、使用する知識ベースを選択します。

![ragflow_18](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3791334/e2fb3e9e-5783-4004-2fa0-4e53a0aca29e.png)

また、`Self-RAG` で、RAG の 改善技術である Self-RAG のon/offが選択できます。Self-RAG の詳細は元論文などを確認してください。

https://arxiv.org/abs/2310.11511

`Prompt Engine` タブでは、`System` でシステムプロンプトなどを設定します。デフォルトでは英語なので、日本語へ翻訳したものに置き換えました。

```text
あなたは日本語で会話ができる知的なアシスタントです。質問に答えるために、知識ベースの内容を要約してください。知識ベースのデータを列挙し、詳細に答えてください。すべての知識ベースの内容が質問と無関係である場合、あなたの回答には "その質問に関する情報は知識ベースに含まれていませんでした！" という一文が含まれていなければなりません。回答はチャット履歴を考慮する必要があります。
      ここに知識ベースがあります：
      {knowledge}
      上記が知識ベースの内容です。
```

![ragflow_19](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3791334/8a9ee8c7-3c1a-2802-328b-b52f0c9933a0.png)

`Model Setting` タブでは、`Model` などを設定します。`Freedom` は、Copilotなどにもある会話スタイルの選択です。

![ragflow_20](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3791334/c3a8ec2c-e551-b936-3ee6-055b93d14744.png)

以上で、アシスタントの設定は完了です。作成したアシスタントを選択すると、チャットが始まります。質問等を入力すると知識ベースを元に回答が得られました。

![ragflow_21](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3791334/8ac8a359-1ff6-f552-9576-49b8f01d8d41.png)

情報源の確認もできます。

![ragflow_22](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3791334/8c38d9a1-65a0-d329-d728-445564c5f02d.png)

これだと見にくいので、元のpdfの該当箇(p.76)所を確認してみました。

![ragflow_23](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3791334/ae7c7cc9-33b3-a0c0-a518-6972ec5b0d7a.png)

比べてみると金額は合っていましたが、前の章の図表の文に引っ張られて、余計な文言「令和4年度の総務省の調査によると」が入ってしまいました。知識ベース作成時に章の区切りが上手くいかなかった事が原因の一つでしょう。Chunk method を Manual ではなく、Paper にした方が良かったのかもしれません。

なお、この例では回答が短いため問題なく動作している様に見えますが、回答がもう少し長くなると表示が途中で打ち切られる現象が発生しました。内容的には正しそうだったので、生成側ではなくアプリ側の問題な気がします。

# まとめ

RAGFlowでRAPTORやSelf-RAGを試しました。今回の例ではこれらの有効性は確認していませんが、一般的な RAG だけでなく、その改善技術まで簡単に扱えるのはとても便利です。(日本語の README があるのに)英語・中国語以外の対応が不十分なのは残念ですが、日本語でも一応動作したので、色々と試すことはできそうです。今後、扱える文章に html が追加されたり、Web から直接文章を取得できたりする様になると更に便利になると感じました。

# 付録

RAGFlowの文章処理方法

* General
  ![General](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3791334/64b18dd0-89a6-de51-2f58-edac5783964f.png)
* Q&A
  ![Q&A](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3791334/7d59f5c2-5e6a-086c-a0ab-3e922789adb6.png)
* Resume
  ![Resume](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3791334/078cd423-c7ae-44d2-1a36-e60cae6f3894.png)
* Manual
  ![Manual](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3791334/b8d6b7b3-3400-7899-2a83-5ded83ff3b9b.png)
* Table
  ![Table](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3791334/5146ba16-e537-a412-0eba-4994678f22d4.png)
* Paper
  ![Paper](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3791334/4855b0d6-b501-6eb4-ab42-25901beec9d8.png)
* Book
  ![Book](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3791334/9c80d079-04f4-282e-cdb3-6a20f1830962.png)
* Laws
  ![Laws](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3791334/32dd0595-b07e-afe4-3228-8fe8744c25d1.png)
* Presentation
  ![Presentation](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3791334/c8b2441e-8bd6-571d-7077-79934d572713.png)
* Picture
  ![Picture](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3791334/98f78c8a-c629-6cf5-9e39-443823568515.png)
* One
  ![One](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3791334/f5358454-0372-4c0b-329a-d34e750b407e.png)