Ollamaを使ってcodellamaを試す

Delphi 12.2でAI LLMとSmart CodeInsightを利用することができるようになりました。
[Embarcadero Blog - RAD Studio IDEで「AI LLM」と「Smart CodeInsight」を使用する](
https://blogs.embarcadero.com/ja/using-ai-llms-in-the-rad-studio-ide-with-smart-codeinsight-ja/)
オンラインサービスはコストがかかるので，まずは，ローカルでLLMを実行できるollamaを使える環境を構築したいと思います。

OllamaはLLMの実行環境で利用できます。Llama 3.2や，Phi 3, Gemma 2などのLLMを利用できるそうです。
Embarcaderoからすぐに使えるDockerイメージが公開されています。
https://hub.docker.com/r/radstudio/codellama

しかし， [Dockerから最初の起動が遅いという話](https://qiita.com/kiyotaman/items/1aeb098b5ff0d6d5e641) があったり，既に使っているNVIDIAのCUDA Toolkitとバッティングしそうなので，Ollamaを直接入れることにしました。

## 0. Ollamaをインストールする前に
:::note warn
この作業をしなくてもCUDAは利用できるようです。記録として残しますが，読み飛ばしてください。
:::

別のツールを使うために既にインストールしていたのですが，NVIDIA CUDAを利用するためには，事前にCUDA Toolkitをインストールする必要があります。
CUDAを使うと，CPUだけよりとても高速に返答してくれるので，ぜひCUDAを使いたいところです。
https://developer.nvidia.com/cuda-toolkit よりダウンロードして利用しました。

:::note info
インストール時に対応するVisual Studioが入っていないという警告が出ました。新規にVisual StudioをインストールするときにはCUDA Toolkitを再度インストールする必要があるようです。
:::

## 1. Ollamaのダウンロードとインストール
https://ollama.com/ から Windows版のollamaをダウンロードします。OllamaSetup.exeがダウンロードされます。
環境変数のPathの最後に **C:\Users\ユーザ名\AppData\Local\Programs\Ollama** が追加されます。

## 2. Ollamaの実行(インストールの確認)
OllamaはCUIですので，コマンド プロンプトを開き，
```
> ollama -v
```
で，インストールされたollamaのバージョンが確認できます。Ollamaのインストールが確認できました。

## 3. LLM(モデル)の読み込みと実行
Ollamaは，LLMの実行環境なので，利用するLLMをダウンロードしてそのLLMを利用するための設定を記述して実行しないと使えません。
Ollamaでは設定がされたLLMが公開されています。
https://ollama.com/library から利用したいLLMとその設定を見つけます。
今回はcodellamaを使ってみましょう。codellamaで検索するといくつか見つかりますが，https://ollama.com/library/codellama を使うことにします。7B/13B/34B/70Bが公開されています。Embarcaderoがdockehubで公開しているcodellamaは4.26GBでしたので，同じ規模のLLMは7B(3.8GB)なのではないかと思います。
このページから
```
> ollama run codellama
```
で動作するようです。実行します。するとLLMがダウンロードされてプロンプトが表示されます。以下のように表示されます。
```
pulling manifest
pulling xxxxxxxxxxxx... 100% ▕████████████████████████████████████████████████████████▏ 3.8 GB
pulling xxxxxxxxxxxx... 100% ▕████████████████████████████████████████████████████████▏ 7.0 KB
pulling xxxxxxxxxxxx... 100% ▕████████████████████████████████████████████████████████▏ 4.8 KB
pulling xxxxxxxxxxxx... 100% ▕████████████████████████████████████████████████████████▏   59 B
pulling xxxxxxxxxxxx... 100% ▕████████████████████████████████████████████████████████▏  120 B
pulling xxxxxxxxxxxx... 100% ▕████████████████████████████████████████████████████████▏  529 B
verifying sha256 digest
writing manifest
success
```
プロンプトが表示されますので試しにDelphiの関数で試してみます。
```
>>> TRESTClientのDelphiでの使い方を説明してください。
```
と入力したらそれっぽいことを返してくれました。実際のコードの入力して，バグを見つけることもできるようです。
終了するときには
```
>>> /bye
```
と入力します。終了後
```
> ollama ps
```
と入力すると，以下のように表示されました。GPUが利用できているようです。
```
NAME                ID              SIZE      PROCESSOR    UNTIL
codellama:latest    8fdf8f752f6e    9.4 GB    100% GPU     4 minutes from now
```
もっと詳しい情報は
```
> ollama show codellama
```
で取得できます。

## 4. モデルのカスタマイズ
このモデルの設定(TemplateやParam)を変更したいときには，利用しているLLMをベースにモデルファイルを書くと簡単にシステムプロンプトを変更して利用することができます。
以下は llama3.2 モデルを編集して利用できるようにしたサンプルです。
```
# llama3.2をベースにモデルファイルを編集します
FROM llama3.2
# sets the temperature to 1 [higher is more creative, lower is more coherent]
PARAMETER temperature 1
# sets the context window size to 4096, this controls how many tokens the LLM can use as context to generate the next token
PARAMETER num_ctx 4096
# sets a custom system message to specify the behavior of the chat assistant
SYSTEM You are Mario from super mario bros, acting as an assistant.
```
これを適当な名前で保存してコマンド プロンプトから
```
> ollama create <カスタムモデル名> -f <フルパス表記の保存したモデルファイル名>
```
でカスタムモデルを作ることができ，
```
> ollama run <上記で指定したカスタムモデル名>
```
で，利用できます。
なお，LLMに設定できるパラメータの詳細は以下で確認できます。
https://github.com/ollama/ollama/blob/main/docs/modelfile.md

これでDelphi12.2からAI LLMとSmart CodeInsightを使うための準備ができました。
以降は，Delphi以外からOllamaを利用するための情報です。

## 補1. WebブラウザからOllamaを利用する
Webブラウザで使いたいときには，ollama-uiを使えば便利です。ウェブストアの機能拡張から探すことができます。
https://chromewebstore.google.com/

## 補2. REST APIの利用
また，ollamaはRESTで利用できます。なのでDelhiでカスタムクライアントを作ることも可能です。
詳しくは以下のドキュメントを参照してください。
https://github.com/ollama/ollama/blob/main/docs/api.md

## 補3. その他のよく使うコマンド
なお，
```
> ollama -h
```
と入力すると，コマンド一覧が表示されます。
よく使うコマンドには以下のものがあります。
| コマンド             | コマンドの詳細                       |
|:--------------------|:------------------------------------|
| ollama list         | 現在利用できるLLMのリストを表示します。|
| ollama rm <モデル名> | 指定したモデルを削除します。          | 

## 補4. その他のLLM
llama 3.2を利用するなら https://ollama.com/blog/llama3.2 から
```
> ollama run llama3.2 
```
Gemma 2を利用するなら https://ollama.com/blog/gemma2 から
```
> ollama run gemma2
```
で，利用が可能です。LLMはサイズが大きいので，ダウンロードサイズを確認してからコマンドを入力します。

## 補5. FAQ
もっとOllamaを使い込みたいのなら，公式FAQもあります。
https://github.com/ollama/ollama/blob/main/docs/faq.md

## 謝辞
- DockerとOllama，NVIDIA CUDAの関係について以下の記事を参考にしました。
https://qiita.com/kiyotaman/items/1aeb098b5ff0d6d5e641
@kiyotaman様 ありがとうございます。
- ollama-UIの使い方について以下の記事を参考にしました。
https://qiita.com/programing_diy_kanrinin/items/24d0778a42ae0f24deae
@programing_diy_kanrinin様 ありがとうございます。