Ubuntu 22.04でEmacs29をビルドし、EllamaというElispパッケージの導入に成功した。導入方法と使用してみた感想などをメモしておきたい。まだ使い込んでいないのと、非常にマニアックな環境なため強くオススメはできないが、ローカルLLM実行環境としては最強かもしれない、というのが私の現在の印象だ。

導入環境
今回はWindowsのWSLのUbuntu環境ではなく、純粋なUbuntu環境(Ubuntu 22.04)に導入している。その理由は、Ellamaを動作させるにはEmacs28以上が必要なためだ。
私のWSL環境ではEmacs27までは簡単に導入できる(sudo apt install emacsでできる)のだが、どうしてもEmacs28、Emacs29を導入することができなかった。
下記ページを参考にソースからビルドする方法も試したができなかった。下記ページではWSLにEmacs29が導入できているので、導入できれば、WSLのUbuntu環境でも問題はないはずだ。
純粋なUbuntu環境でも、ビルド済みアプリの導入(sudo apt install emacs28)はうまくできなかった。仕方ないので最終手段であるソースからのビルドにチャレンジしたところ、無事に導入することができた。
Emacs27が導入されている環境でも問題なくEmacs29に置き換えてくれた。素晴らしい!!
上記ページの通りであるが、実行したコマンドは以下の通り。
- ソースコードの取得
$ git clone --depth 1 --branch emacs-29.2 git://git.savannah.gnu.org/emacs.git emacs-29.2
- ビルドに必要なツールとライブラリの取得
$ sudo apt install autoconf make texinfo gnutls-bin libgccjit-10-dev gcc $ sudo apt install zlib1g-dev \ libncurses-dev \ libgtk-3-dev \ xorg-dev \ libjpeg-dev \ libgif-dev \ libtiff-dev \ libgnutls28-dev \ librsvg2-dev \ libcairo-5c-dev \ liblcms2-dev \ libgpm-dev \ libacl1-dev \ libxml2-dev \ libm17n-dev \ libotf-dev \ libsystemd-dev \ libjansson-dev \ libsqlite3-dev - Makefileの生成
cd emacs-29.2 ./autogen.sh CFLAGS='-I/usr/lib/gcc/x86_64-linux-gnu/10/include -L/usr/lib/gcc/x86_64-linux-gnu/10' ./configure --with-pgtk --with-native-compilation --without-pop --with-mailutils
- make
$ make -j8
- make install
$ sudo make install
余談であるが、私は30年ほど前に会社のUnixマシン(会社の独自仕様のUnix)にEmacsを導入しようとしてできなかった苦い経験がある。それがトラウマとなってそれ以降はずっとビルド済みアプリを導入してきたのだが、30年経ってようやくEmacsビルドに成功し、トラウマから開放された気分だ(笑)。
OllamaとLlama3-ELYZA-JP-8Bの導入
先日のWSL環境への導入方法と同じなので説明は割愛する。
Emacs29へのEllamaパッケージの導入
パッケージ導入のためのpackageライブラリが初期設定ファイルに設定済みであれば、Ellamaパッケージの導入は簡単だ。
Emacsを立ち上げ、インストール可能なパッケージ一覧を取得する。
M-x list-packages
一覧の中にellamaが表示されるので、i(小文字)で選択し、x(小文字)で実行する。(Emacs27でllamaは表示はされるが、statusが「imcompat(ible)」と表示されてインストールできない)
EllamaのカスタマイズとOllamaの起動
Ellamaで使用するLLMのモデルを指定したい場合、EllamaのGitHubページに書かれているelispで行う。このelispをemacsの初期設定ファイル(.emacs等)で記述する。
;; YOU DON'T NEED NONE OF THIS CODE FOR SIMPLE INSTALL ;; IT IS AN EXAMPLE OF CUSTOMIZATION. (use-package ellama :init ;; setup key bindings (setopt ellama-keymap-prefix "C-c e") ;; language you want ellama to translate to (setopt ellama-language "German") ;; could be llm-openai for example (require 'llm-ollama) (setopt ellama-provider (make-llm-ollama ;; this model should be pulled to use it ;; value should be the same as you print in terminal during pull :chat-model "llama3:8b-instruct-q8_0" :embedding-model "nomic-embed-text" :default-chat-non-standard-params '(("num_ctx" . 8192)))) ;; Predefined llm providers for interactive switching. ;; You shouldn't add ollama providers here - it can be selected interactively ;; without it. It is just example. (setopt ellama-providers '(("zephyr" . (make-llm-ollama :chat-model "zephyr:7b-beta-q6_K" :embedding-model "zephyr:7b-beta-q6_K")) ("mistral" . (make-llm-ollama :chat-model "mistral:7b-instruct-v0.2-q6_K" :embedding-model "mistral:7b-instruct-v0.2-q6_K")) ("mixtral" . (make-llm-ollama :chat-model "mixtral:8x7b-instruct-v0.1-q3_K_M-4k" :embedding-model "mixtral:8x7b-instruct-v0.1-q3_K_M-4k")))) ;; Naming new sessions with llm (setopt ellama-naming-provider (make-llm-ollama :chat-model "llama3:8b-instruct-q8_0" :embedding-model "nomic-embed-text" :default-chat-non-standard-params '(("stop" . ("\n"))))) (setopt ellama-naming-scheme 'ellama-generate-name-by-llm) ;; Translation llm provider (setopt ellama-translation-provider (make-llm-ollama :chat-model "phi3:14b-medium-128k-instruct-q6_K" :embedding-model "nomic-embed-text")))
私は、翻訳先言語が「German」となっているところを「Japanese」に変更し、「chat-model」が「llama3:8b-instruct-q8_0」となっているところを「llama3:latest」に変更し、「Translation llm provider」の指定を「elyza:jp8b」にした。
なお、LLMの切り替えはEllamaからできるが、初回のみ端末からOllamaを起動しておく必要があるようだ。
Emacs+Ollama=Ellamaの活用
いろんな活用方法があると思うが、一つだけ例を示したい。プログラム開発での活用が個人的にはおもしろそうだと思うので、私の個人的趣味で「将棋AI」の開発を例とする。
題材としてdlshogi開発者の山岡忠夫氏がブログで公開されている、Pythonの最少のコードで動作する将棋エンジン(USIプロトコルで動作)のサンプルを使わせていただく。
プログラムの概要の把握
サンプルプログラムをEmacsで開き、そのバッファにカーソルを置いた状態で「M-x ellama-summarize」と入力すると、隣のバッファに概要が表示される。

llama3:latestがデフォルトのため英語での回答になったが、概要を説明してくれている。しっかりαβ法を使っていることも把握しているようだ。これで自力でコードを読まなくても概要把握ができる(はずだ)。
プログラム改善方法の相談
この将棋プログラムを強くする方法をAIに相談できる。バッファにカーソルを置いた状態で「M-x ellama-ask-about」と入力すると、ミニバッファで入力を求められるので「この将棋プログラムを更に強くするための案を考えてください。」と入力する。すると隣のバッファに案が表示される。

また英語での回答になってしまったが問題ない。elyza:jp8bに翻訳してもらえばいい。
英語文章の翻訳
範囲を指定した状態で「M-x ellama-translate」と入力すると、隣のバッファに翻訳用LLM(私はelyza:jp8bを指定)による日本語訳が表示される。LLMの切り替えはこのようにOllamaが自動でしてくれる場合もあるし、コマンドで指定することもできる。

ここから先は、LLMを使う側が具体的に指示する必要がある。「優秀な大学生」がスタッフとして手伝ってくれているという感覚だろうか。将棋エンジンを更に強くする道はかなり険しそうだが、この大学生スタッフをうまく使えれば、将棋エンジンをすこしづつ強くすることもできるかもしれない。
Ellamaの印象
冒頭述べたようにかなりマニアックな環境ではあるが、この環境を整えて、使い込んでいけば「最強のローカルLLM実行環境」になる可能性がある。
普段は応答速度優先で複数の7〜8BクラスのLLMを使い分け、高品質の回答が欲しい時だけ、70BクラスのLLMに切り替えて回答まで時間がかかるのを覚悟して使う、という運用が現時点ではいいのではないか、と思い始めている。
この運用は、速度と品質をある意味妥協しているのだが、それを補うだけのメリットがEllamaにはある。私が感じるメリットは大きく以下の2つである。
- LLMとの連携がシームレスにできる
プログラム開発では、調査、企画立案、要件定義、設計、開発、テストなどの各種フェーズがある。それら全てのフェーズで、LLMとの連携がEmacsという統合環境の中でシームレスにできる(気がする)。 - Ellamaにコマンドを追加できる
コマンドはテンプレートとして提供されている。追加方法はElispでほぼパターン化されているらしい。更にLLMへの指示は標準は英語だが、日本語でも記述できる。従ってテンプレートを追加することで無限にコマンドを追加できる(と思う)。
まとめ
急ぎ足でEmacs+Ollama=Ellama のLLM実行環境を紹介してみた。
そもそもOllamaを使い出した経緯は、①高品質な回答が期待できる70BクラスのLLMが快適に動く環境が欲しい→②それにはVRAM48GB以上のGPUを搭載した130万円以上の高価なマシンが必要→③代わりにGoogle ColabでGPUを借りてOllamaを導入して試してみよう→④その前に自分のマシンに導入してみよう、という経緯だった。その結果、Ellama というLLM実行環境があることを知った。
しばらくこのEllamaで遊んでみようと思う。そのためにはUbuntu環境を整備する必要がありそうだ。今はかなり昔に買った2.5インチHDDをUSB接続してUbuntu環境を作っている。このため立ち上げまでにかなり時間もかかっている。
内蔵スロットに1TBのSSDを挿し、快適なUbuntu環境と最強のローカルLLM環境をそこに構築してみたい。