AnythingLLMとOllamaでwebから情報を取得してRAGを実行する

# はじめに

AnythingLLMは、コードやインフラストラクチャの煩わしさなしにRAGやAIエージェントなどを実行できる、オールインワンなAIアプリです。ローカルLLMに対応しているため、[Ollama](https://ollama.com/)などを用いてRAGを手軽に試すことができます。

https://useanything.com/

# セットアップ

## インストール

インストール方法は以下から選べます。

1. 公式からDesktop版をダウンロードする
1. Docker版 Imageをダウンロードする
1. Docker版 Imageをビルドする

Desktop版とDocker版では機能に若干の違いがあります。

https://docs.useanything.com/installation/overview#you-want-anythingllm-docker-if

今回は3番目の方法を試します。
公式ドキュメントの通りに、以下のコマンドでdocker imageを作成して実行します。

```sh
git clone https://github.com/Mintplex-Labs/anything-llm.git
cd anything-llm
touch server/storage/anythingllm.db
cp .env.example .env
docker compose up -d --build
```

なお、 `.env` を環境に合わせて変更する必要はありません。後でWebUIから設定できます。
また、 `docker-compose.yml` に以下の様に追記してOllamaが同時に立ち上がる様にしておくと便利です。

```yaml
services:
# ... (中略) ...
  ollama:
    image: ollama/ollama
    container_name: ollama
    ports:
      - 11434:11434
    volumes:
      - $HOME/.ollama:/root/.ollama
    networks:
      - anything-llm
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: all
              capabilities: [gpu]
```

## 初期設定

dockerが立ち上がったら、 `http://localhost:3001` にアクセスします。
初回は以下の様に表示されるので、Get started から先に進みます。

![allm_01](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3791334/721da954-0997-8c74-5df5-d776715f1d8b.png)

次は、LLMの選択画面です。今回は、Ollamaを使用するので選択して、Ollama Base URLを設定すると、利用可能なモデル一覧がChat Model Selectionに表示されますので、AnythingLLMで使用したいモデルを選択します。また、Token context windowsに値を設定します。
設定ができたら、`→` を押して先に進みます。

![allm_02](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3791334/a09b1272-3bd7-1d2e-cbe3-fc4320c5171d.png)

Docker版のAnythingLLMはマルチユーザーやパスワードによる保護に対応しているので、必要な場合は設定します(今回は個人利用のパスワード無し)。

![allm_03](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3791334/078ab2cf-114b-5e4c-fa37-a74a599ee942.png)

以上で初期設定は完了です。以下の様にLLMとEmbeddingとVectorDBが設定されたことが確認できます。EmbeddingとVectorDBを変更したい場合は、後から設定することになります。

![allm_04](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3791334/df6f9475-535c-d2e2-c385-68a7193829e6.png)

アンケートの様なものがありますが、何も入力しなくても先に進めます。

![allm_05](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3791334/5a34565d-80c3-d88b-d7a5-1abe34ad17e4.png)

ワークスペースの名前を入力すると、通常画面に進めます。

![allm_06](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3791334/dd00b83e-d5d0-6e64-2d33-7f224bacc238.png)

![allm_07](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3791334/232d5569-e240-bc94-e974-dff33d54bba1.png)

左下の工具アイコンから設定画面に進み、Embeddingのモデルをアプリ埋め込みモデルからOllamaのモデルに変えることもできます。

![allm_08](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3791334/06ef72a3-9526-fb4c-dd53-4c62addbce74.png)

# RAG実行

準備が整ったので、RAGを試してみます。

## 埋め込み

まず、ドキュメントを追加します。 `upload a document` や 左側のアイコンからドキュメント管理画面に遷移します。

![allm_09](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3791334/cdff07c1-0e94-698f-f881-28e0a5b7677b.png)

![allm_10](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3791334/6d4ac66e-4978-0bf5-a1f6-7f166dd25b8b.png)

今回は、webから情報を取り込みたいので、 `Data Connectors` タブに移ります。
`Bulk Link Scraper` を選択し、対象のURL (今回は AnythingLLM のドキュメントサイト) などを設定して、`Submit`を押すと、Webに情報を取りに行ってくれます。

![allm_11](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3791334/fec046cf-b850-ed3a-b104-2fbff0741af5.png)

ダウンロードが終わると `Documents` タブの `MyDocuments` にファイルが追加されているので、 `Move to Workspace` を押して、workspaceに追加します。

![allm_12](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3791334/37fada63-1eff-9fe0-b8d8-605351860d32.png)

その後、右下の `Save and Embed` を押すと、情報の埋め込みが行われます。

![allm_13](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3791334/0bde8b64-6c71-4ffb-7035-65446a1d2e0e.png)

埋め込みが完了すると、以下の様な画面になります。

![allm_14](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3791334/2d3cfa09-21ee-5874-0124-d0c2b4f5421f.png)

## チャット

チャット画面に戻り、「どのモデルプロバイダが(AnythingLLMで)使えるのか」を聞いてみました。

![allm_15](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3791334/e29f5b76-b4bc-c183-0ba2-46d9eb832ec1.png)

KoboldCPP が Local LLM ではなく Cloud LLM になってしまった以外は正しく答えてくれました。

参照したドキュメントも表示されおり、その内容も確認できます。合わせて、元のwebへのリンクも上部にあります。

![allm_16](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3791334/406b5ce0-0e46-5914-6a8c-f1f15c30fd0e.png)

# まとめ

AnythingLLMとOllamaでwebから情報を取得してRAGを実行してみました。一切コードを書かずに利用できるのは便利ですね。ローカルLLMを使うとEmbeddingモデルの用意に悩むこともありますが、最初からアプリに組み込まれているのも楽です (all-minilm-l6-v2 なので日本語は厳しいですが…)。