プロキシ環境下のローカルPCに"Dify"と"Ollama"を導入して、インターネットを通らない「完全ローカルRAGアプリ」を作る

# はじめに
お疲れ様です。yuki_inkです。

「生成AIでRAGやりたい！」と言われると、反射神経で「S3！Kendra！Bedrock！」などと言ってしまうのですが、いざRAGで扱うドキュメントが自社やお客様の機密文書レベルになってくると、途端にその声のトーンは小さくなってしまいます。
```
え、そもそもこのドキュメント、クラウドに上げられます、、？
```
なるほど、ローカルPCで全部完結すれば万事解決ですわ！！
というモチベーションで色々やってみたという記事です。

# 前提条件
以下2点を前提条件とさせていただきます。
- 固定IPがPCに割り当てられていること
- PC（Windows）の管理者権限が利用できること

なお、この記事では、プロキシの IP アドレスを `192.168.11.9`、プロキシのポートを `3128` として説明します。
この記事を参考にされる際は、実際のプロキシの情報に置き換えて設定してください。

:::note
以下の手順は、PC（Windows）の管理者権限を持つローカルユーザで操作を行ってください。
ドメインユーザの場合、ドメインポリシーによる制限がかかり、想定通りの操作ができない場合があります。
※特にOllamaが謎のエラーを吐く場合があります。
:::

# 事前準備
**Difyの導入までは、以下の記事を参照してください！！**
（ついでに「いいね」と「ストック」もお願いしますw）

https://qiita.com/yuki_ink/items/1367e0b2bb09c95c0570

:::note
参照いただきたい箇所は以下の通りです。
- [1. WSL 導入](https://qiita.com/yuki_ink/items/1367e0b2bb09c95c0570#1-wsl-%E5%B0%8E%E5%85%A5)
- [2. Docker 導入](https://qiita.com/yuki_ink/items/1367e0b2bb09c95c0570#2-docker-%E5%B0%8E%E5%85%A5)
- [3. Git 導入](https://qiita.com/yuki_ink/items/1367e0b2bb09c95c0570#3-git-%E5%B0%8E%E5%85%A5)
- [4. Dify 導入](https://qiita.com/yuki_ink/items/1367e0b2bb09c95c0570#4-dify-%E5%B0%8E%E5%85%A5)

以下に記載する手順は、Dify導入までが完了していることを前提としています。
:::

# やったこと
1. 環境変数の設定
1. Ollama のインストール
1. Dify の設定（モデルの追加）
1. Dify でRAGアプリを作成
1. PC起動時にWSLが自動起動するようにしておく

本題は #1〜#4 。#5 はついでです。

## (1) 環境変数の設定
こちらの記事を参考に、PCの環境変数を設定します。

https://qiita.com/ryo-sato/items/e24c81eca6ffe9db3fb0

設定する環境変数は以下の通り。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/07beb425-c6ba-33ad-d0ae-8f680bd365a7.png)


|変数  |値  |
|---|---|
|HTTP_PROXY  |http://192.168.11.9:3128  |
|HTTPS_PROXY  |http://192.168.11.9:3128  |
|NO_PROXY  |0.0.0.0  |
|OLLAMA_HOST  |0.0.0.0  |

ユーザ環境変数の設定が終わったら、設定反映のためOS再起動をしておきます。

**【参考にした記事】**

https://github.com/ollama/ollama/blob/main/docs/faq.md#how-do-i-use-ollama-behind-a-proxy

https://qiita.com/a_ogura/items/b29c22f3009c093d58f4


## (2) Ollama のインストール
:::note
[(1) 環境変数の設定](https://qiita.com/yuki_ink/items/c3125f45fb725612910e#1-%E7%92%B0%E5%A2%83%E5%A4%89%E6%95%B0%E3%81%AE%E8%A8%AD%E5%AE%9A) で作業したユーザと同じユーザで作業してください。
:::

[こちらのWebページ](https://ollama.com/download/windows)からOllamaのインストーラを入手します。

https://ollama.com/download/windows

`Download for Windows (Preview)`　ボタンをクリックして、インストーラ `OllamaSetup.exe` を取得。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/66d741a7-21fe-c6f3-4bb9-adfde5439fd5.png)

インストーラ `OllamaSetup.exe` を起動し、`Install` ボタンをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/9d743542-2de5-7bb1-512a-79a7eb20c053.png)

「完了しました」的な画面は表示されませんでしたが、インストールは完了した模様。
スタート画面のアイコンがかわいい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/4a22004e-0050-05ec-87d7-73d74c298156.png)

続いてモデルをダウンロード。
今回はphi3を利用します。

https://ollama.com/library/phi3

コマンドプロンプトを立ち上げて、以下のコマンドを打鍵。
※カレントディレクトリはどこでも大丈夫です（カレントディレクトリにモデルの各種ファイルがダウンロードされるということはなかった）
```
ollama run phi3
```

初回はモデルのダウンロードに少し時間がかかります。
モデルのダウンロードが完了したら、自動でチャットセッションが開始されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/f1520f18-9d90-c5a5-9468-8fe4d11afe6f.png)

「大規模言語モデルについて簡潔に教えて」と聞いてみます。
日本語で回答を返してくれました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/d69dfb3d-7b58-5ead-a00c-873a25aa94b9.png)

ブラウザを起動し、`http://(PCのIPアドレス):11434/` にアクセスします。
`Ollama is runnning` と表示されればOK！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/f71d504a-531d-a5ec-7e5f-f252a2f4112e.png)


なお、PCのIPアドレスは、コマンドプロンプトで `ipconfig` コマンドを実行して確認できます。
以下の例だと `172.19.11.1` がPCのIPアドレスになります。
※WSLと書いてある方ではないことに注意
```
> ipconfig

Windows IP 構成

イーサネット アダプター イーサネット 2:
   接続固有の DNS サフィックス . . . . .:
   IPv4 アドレス . . . . . . . . . . . .: 172.19.11.1
   サブネット マスク . . . . . . . . . .: 255.255.xx.xx
   デフォルト ゲートウェイ . . . . . . .: 172.19.xx.xx

イーサネット アダプター vEthernet (WSL):
   接続固有の DNS サフィックス . . . . .:
   リンクローカル IPv6 アドレス. . . . .: 1234:567:890a::bcde:f1a2:b3c4
   IPv4 アドレス . . . . . . . . . . . .: 172.20.22.2
   サブネット マスク . . . . . . . . . .: 255.255.xx.xx
   デフォルト ゲートウェイ . . . . . . .:
```

:::note
Ollamaインストール後、このような画面が表示された場合、`アクセスを許可する` ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/37ee42df-76b1-66d7-cd05-1405f297796c.png)
私の場合、Ollamaインストール後の初回OS再起動後にこの画面が表示されました。
まだこの画面が表示されていない場合、念のためOS再起動しておくといいかも。
:::

**【参考にした記事】**

https://qiita.com/ishidahra01/items/16e560105137d41a79f0

https://qiita.com/kiyotaman/items/1aeb098b5ff0d6d5e641

> Windows WSL2 dockerでOllamaを起動し検証をしたが最初の読み込みの時間が遅く、使い勝手が悪かったので、docker抜きで検証することにした。結論、ロードのスピードが早くなり、レスポンスも向上した。
プロダクションでOllamaを使う場合は、Dockerは使わないほうがよいかなといった印象。そもそも、Docker使う場合、色々とケアする項目（Dockerの設定など）増えるので、プロダクションでのOllama利用は、サーバーに直接Ollamaをインストールして扱うほうが無難かも。

[WSL上のDockerを使ってOllamaを導入する](https://zenn.dev/toki_mwc/articles/d1ebbd634ff488)という手段もありましたが、この記事を読んで、PCに直接インストールしようと思い至りました。

**【余談】**

https://twitter.com/matsuu/status/1791420648457380080

おお！！確かに！！

## (3) Dify の設定（モデルの追加）
:::note
Difyへのログインがまだの場合、ブラウザから `http://localhost/signin` にアクセスし、Difyにログインします。
:::

画面右上のユーザー名をクリックし、表示されるメニューから `設定` を選択。
左のメニューから `モデルプロバイダー` を選択します。

Ollamaがいました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/792b5f06-725c-4d03-1747-1d9246b9df51.png)

セットアップ画面を開き、パラメータを入れていきます。
`Base URL` には、先ほどの手順でブラウザに入れたURL `http://(PCのIPアドレス):11434/` を入れます。
```
> Model Name
phi3

> Base URL
http://(PCのIPアドレス):11434/

※他はひとまずデフォルト値
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/a1ec8c98-531d-127e-cddb-0d06c4cdcec1.png)

:::note
各パラメータの詳細は[こちらの記事](https://qiita.com/vb-long/items/97d8ab51ff6c44a85cd4#ollama%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B)に詳しく記載されていました。
是非参照してください。
:::

**【余談】**
今回の検証で一番詰まったところがここの手順でした、、
最後の章「[苦労したこと](https://qiita.com/yuki_ink/items/c3125f45fb725612910e#%E8%8B%A6%E5%8A%B4%E3%81%97%E3%81%9F%E3%81%93%E3%81%A8)」にまとめていますので、よかったらお目通しください。
特に、「なんでIPアドレスで通信させとん？」と思った方は是非！w

## (4) Dify でRAGアプリを作成
[前回](https://qiita.com/yuki_ink/items/1367e0b2bb09c95c0570#5-dify-%E3%81%A7%E3%83%AF%E3%82%A4%E3%81%AE%E3%81%8B%E3%82%8F%E3%82%8A%E3%81%AB%E6%A4%9C%E7%B4%A2%E3%81%8F%E3%82%93%E3%82%92%E4%BD%9C%E3%82%8B)は「ワークフロー」を利用したので、今回は「チャットボット」を使ってみたいなと！！

▼「チャットボット」を触ってみたかった！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/e54a4fba-f826-907c-b0d5-7f94e58c68cf.png)

今回は以下の記事を参考に、RAGを活用したチャットボットを作っていきます。

https://zenn.dev/acntechjp/articles/0b2891bbcb6152

### ナレッジにするドキュメントの用意
ナレッジにするドキュメントとして、今回はQiita CLIの README を利用します。
[Qiita CLIのリポジトリ](https://github.com/increments/qiita-cli/blob/main/README.md)から `README.md` をダウンロード。

一応、拡張子を `txt` に変えておきます。
ファイル名を `README.txt` として、一応文字化けがないか確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/41e4b5fe-d9b0-3a33-8d33-575853d2cf1e.png)

### ナレッジの準備
>まずは、ナレッジを準備しましょう。
上部のナビゲーションに「ナレッジ」があるのでクリックします。
「知識を作成」をクリックします。
ナレッジにするドキュメントをアップロードして、「次へ」をクリックします。

先ほど用意した `README.txt` をアップロードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/6210c7a2-3012-2dee-18a7-c55c2311547c.png)


`TXT, MARKDOWN, PDF, HTML, XLSX, XLS, DOCX, CSVをサポートしています。1つあたりの最大サイズは15MBです。` とのことで、PDFに加え、Excel、Wordファイルにも対応しているようです。
素敵！ついでにPowerPointも対応してほしいw

`次へ` ボタンをクリックすると、「テキストの前処理とクリーニング」画面に遷移します。
今回はデフォルト値を維持します。
右横のプレビュー画面で、どんな感じでチャンクが切られているか確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/e05c0d99-231d-5241-6d59-6cffb87f5da6.png)

:::note
Ollama経由でphi3のみを利用する環境では、`インデックスモード` で `高品質` は選べないようです。

以下の記事では `高品質` or `経済的` による動作の違いが分かりやすく記載されていましたので、参考までに。
【参考】[Dify やってみた](https://note.com/hima2b4/n/n7948b9f634d3)
:::


`保存して処理` ボタンをクリックすると、「ナレッジが作成されました」と表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/b27ab5c6-ae65-cfca-e2d1-951cf2a504ac.png)


### チャットボットの作成
> 上部のナビゲーションの「スタジオ」をクリックします。
「最初から作成」をクリックします。
「チャットボット」を選択して「作成する」をクリックします。

今回アプリ名は「RAGチャットくん」にしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/8b1839e3-a900-3553-c2fc-1749f317563e.png)


> 「コンテキスト」の「追加」をクリックします。
先ほど追加したナレッジを選択して、「追加」をクリックします。

`README.md` をコンテキストに追加しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/d69d6d91-6fa1-49d8-a5cb-6d6b95f2cfe6.png)

> 下の方にある「機能を追加」をクリックします。
「引用と帰属」をOnにします。
Onにすることで、チャットボットの回答に引用元が表示されるようになります。

今回は「引用と帰属」に加えて「フォローアップ」もOnにしてみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/432d65e5-f2a9-9db1-c7d4-dadc4d3c4d43.png)


仕上げに、「手順」のところに以下の "おまじない" を書いておきます。
```
あなたはQiitaの専門家です。
ルール(<rules>)に基づいて、質問に答えてください。

<rules>
必ず日本語で回答すること。
誤字・脱字がなく、日本語の文法として正しい文章であること。
答えを知っているか、あるいは十分な推測ができる場合のみ、質問に回答すること。
</rules>
```
ここまでの手順で、こんな感じの画面になっているはず。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/3cf27630-b94b-5702-a42d-ebc0e5d06235.png)


最後に、画面右上に表示されているモデルが、[(3) Dify の設定](https://qiita.com/yuki_ink/items/c3125f45fb725612910e#3-dify-%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AE%E8%BF%BD%E5%8A%A0) で追加したものになっていることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/b9bc716f-07fe-d36f-71d6-1e9f4d1fad8a.png)

:::note warn
**ここでBedrockなどが指定されていると、ドキュメントに記載された機密情報がインターネットを通ってしまう可能性があります。**
**注意！！！**

▼例：Bedrockの Claude 3 Sonnet が指定されている場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/d61d7877-85e0-3f35-11a6-ebb67478f9d3.png)
:::

問題なければ、右上の `公開する` ボタンをクリックし、続いて `更新` ボタンをクリックして、設定を保存しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/7336e3e8-019e-de1c-f995-39d0971562eb.png)


### 動かしてみる
まずは、スタジオ画面右横の「デバックとプレビュー」ですぐに動かしてみます！
「Qiita CLI の導入条件は？」と聞いてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/ed093a42-01b7-5727-3cf4-e5804d5e7bca.png)
お～、よさげ！
プレビュー段階では大丈夫そうですね！

続いて、先ほどクリックした `更新` ボタンの下にある `アプリを実行` ボタンをクリックして、専用のチャット画面を開いてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/9b0209e2-33cc-47e0-4819-1ca2d47bfc99.png)

開いたチャットで「Qiitaで新しい記事を作成する際のコマンドを教えてください。」と聞いてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/2b76ba6c-b277-d129-af55-dc25ce791b07.png)
お～～～～！！！よさげ～～～～！！！
次の質問のリコメンドもちゃんと出してくれました（ちょっと微妙ですがw）


**【参考にした記事】**

https://qiita.com/sey323/items/8921bb767e2b0656f1cc

https://qiita.com/Tadataka_Takahashi/items/21824cc20394e24c96e4

https://note.com/npaka/n/nca849f1a23f1

https://note.com/hima2b4/n/n7948b9f634d3

https://zenn.dev/itella_blog/articles/a87911e5e04bf7


## (5) PC起動時にWSLが自動起動するようにしておく
:::note
本題は以上なんですが、ここからはちょっと横道にそれて、ついでに作業しておきたい内容です。
:::

作業中にWindows Updateが走ってしまったので、PCを再起動して、Difyに再度接続しようとしたら、接続できませんでした。
どうやら、WSLはPCを起動しただけでは起動しないらしい。
PCを起動し、ログイン後、WSLのターミナルを立ち上げて初めて起動するとのこと。

……面倒くさ！
ということで、以下の記事を参考に、PC起動時にWSLが自動起動するようにしておきます。

https://zenn.dev/quantum/articles/b1de629aca3cf0#%E3%83%91%E3%82%BD%E3%82%B3%E3%83%B3%E8%B5%B7%E5%8B%95%E6%99%82%E3%81%ABwsl%E3%82%A6%E3%82%A3%E3%83%B3%E3%83%89%E3%82%A6%E3%82%92%E6%9C%80%E5%B0%8F%E3%81%A7%E9%96%8B%E3%81%8F

> **WSLの場所**
WSLを起動する実行ファイルは `%userprofile%\AppData\Local\Microsoft\WindowsApps` の中に "ubuntu2204.exe" のようなファイルで存在します。
>
>**スタートアップへの設置**
起動したいWSLのディストリビューションのショートカットをスタートアップに置きます。
>
>スタートアップフォルダーは、ファイルを指定して実行 (Windows + R キー)で開いて、以下を入力します。
`shell:common startup`
>
>ショートカットを設置したら、プロパティの「実行時の大きさ」を「最小化」にしておけばあまり邪魔になりません。
これで、WSLのターミナルが自動起動するようになりました。

環境の都合で、`shell:common startup` で開いたフォルダ上にショートカットを配置できなかった場合、`shell:startup` で開いたフォルダで代替します。

**【参考にした記事】**

https://atmarkit.itmedia.co.jp/ait/articles/1701/18/news029.html

# 苦労したこと
:::note
以下の記述は今回の構築には役に立ちませんが、色々試行錯誤した結果を供養します。。
:::

### DNSエラーとの遭遇
DifyにOllamaをモデルとして追加する際、`Base URL` には `http://host.docker.internal:11434` という値を入れるんですよ、と案内されている記事が多く見られました。
（例1） [ノーコードLLM統合アプリのdifyでollamaと連携してみた](https://qiita.com/Tadataka_Takahashi/items/ba832511bd4fd5cd46f1)
（例2） [🐢Dify | インストール](https://qiita.com/vb-long/items/97d8ab51ff6c44a85cd4)

いざその通りにモデルを追加しようとすると、DNSエラーが発生し、モデルの追加ができませんでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/8321640f-8364-f1e0-8b70-663e30147c58.png)

`docker exec -it (コンテナID) bash` で起動しているコンテナに入り、`/etc/hosts` を見てみると、うーん、確かにダメそう。
※例として `docker-nginx-1` のコンテナ
```
# cat /etc/hosts
127.0.0.1       localhost
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.18.xx.xx      a24698b8a393
```

### docker-compose.yaml をいじってみる（うまくいかなかった）
色々調べて、以下の情報にたどり着きました。

> Ollamaと同じマシンで動かしているため、OllamaのBASE URLをDifyに設定しやすいように、Difyのdocker-compose.yamlにhost側を見る様に設定する。
docker-compose.yamlのservices:api:以下にextra_hostsを加える。
>```
>    extra_hosts:
>      - host.docker.internal:host-gateway
>```

https://bwgift.hatenadiary.jp/entry/2024/05/12/232531

ということで、`docker-compose.yaml` の各サービス配下に、上記の通り `extra_hosts` を追加していった。
コンテナを再作成した後、再び `/etc/hosts` を確認すると、それらしきエントリを確認。
※例として `docker-nginx-1` のコンテナ
```diff
    # cat /etc/hosts
    127.0.0.1       localhost
    ::1     localhost ip6-localhost ip6-loopback
    fe00::0 ip6-localnet
    ff00::0 ip6-mcastprefix
    ff02::1 ip6-allnodes
    ff02::2 ip6-allrouters
+   172.17.0.1      host.docker.internal
    172.18.xx.xx      75d51a410196
```
しかし、改めて `Base URL` に `http://host.docker.internal:11434` を入れてリトライしても、エラーが再発し、DifyからOllamaの連携はうまくいかなかった。。


### 原因と対応
さらに調査を進めると、どうやら今回作った環境がイケてないことが分かりました。
**WSL上で稼働しているDocker（Docker CE）では、"host.docker.internal" はWindows PC（ホスト）ではなく、WSLインスタンスを指すらしい。**

理解のために、こちらの図が大変分かりやすかったです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/caaada0b-855f-755f-ad2a-af399f876938.png)
（出典）[WSLとは？「WSL1とWSL2の違い」などをわかりやすく解説！](https://it-infomation.com/wsl/)

図の上にイメージを補記させていただきました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/731275/73152abf-eeb3-5064-1df8-b67a788e4c7c.png)

こりゃ "host.docker.internal" にこだわって頑張るのは大変そう！
ポートフォワーディングとか頑張ればどうにかなるのかもですが、、
~~面倒くさいしローカルPC内の通信だし、IPベースでやったらええかw~~

という経緯で [(3) Dify の設定（モデルの追加）](https://qiita.com/yuki_ink/items/c3125f45fb725612910e#3-dify-%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%83%A2%E3%83%87%E3%83%AB%E3%81%AE%E8%BF%BD%E5%8A%A0)で記載した手順に至りました。
以上、供養でした🙏

:::note
こんな設定いれたら"host.docker.internal" でもいけるよ、というご指摘があれば、コメントいただけるととても嬉しいです！！
:::

**【参考にした記事】**

https://it-infomation.com/wsl/

https://qiita.com/shigeokamoto/items/62a368668d221bf12b4e

https://touch-sp.hatenablog.com/entry/2024/05/12/110240

https://qiita.com/7shi/items/65741fa8ab0a553f51be

色々調べる中で、「そもそもDocker Composeって何だっけ、、？」となり、以下の記事に助けられました。

https://qiita.com/gon0821/items/77369def082745d19c38


# 終わりに
以上、プロキシ環境下のローカルPCに "Dify" と "Ollama" を導入して、インターネットを通らない「完全ローカルRAGアプリ」を作ってみました！

今回の検証に着手する前は、「Ollama入れて、Difyのモデルに追加するだけやろ？楽勝~~」と思っていましたが、思わぬ沼にはまり、結局今回も大変でしたw
が、沼から得られた知識も結構あり、この学びこそが「やってみた」の良いところだなと思ったりもします。

今回の検証のなかで、インデックスモードで `高品質` が選べないという発見もありました。
どうにかローカルLLMで `高品質` を利用する方法がないか、探ってみたいと思います！

最後までお目通しいただき、ありがとうございました。