🦙

【Ollama】インストールから日本語モデル導入まで

2024/06/29に公開

なぜOllama?

これまでopenaiのモデルを使ってきましたが、openaiは有料です。
一言二言のやり取りや短いテキストの処理だとそれほど費用はかからないのですが、大量の資料を読み解くとなるととんでもない金額となってしまいます。

Meta社が出しているllamaというモデルはオープンソースのため基本的に無料です。
またopenAIを動かすのは基本サーバーサイドで、これまたサーバー運用にお金がかかるのですが、Ollamaを使えばローカルで動かせるためサーバー代もかかりません。

もちろんgpt-4と比べれば性能的には劣るのですが、費用を少しでも節約するのであればllamaという無料のモデルを使い、動作環境もollamaを使ってローカルとすることで無料で動かしましょう

Ollamaのインストール

以下のサイトからインストール
https://ollama.com/

コマンドを実行してインストールしましょう
ちなみにストレージは10GB以上空きがある必要があります。
(no spaceエラーが出たら空き容量不足ですので、どうにか空き容量を作ってください)

このようなアイコンが表示されたら成功です。

CUIで試してみる

さきほどのアイコンにあった

% ollama run llama3

というコマンドはollamaをCUIで実行することを意味します。

ollamaではモデルを選べまして、2024年6月時点ではデフォルトでllama3というモデルがインストールされて使えるようになっています。

ローカルにインストールされたモデルを確認するのは以下コマンド

% ollama li

NAME            ID              SIZE    MODIFIED      
llama3:latest   365c0bd3c000    4.7 GB  8 minutes ago

※ モデルはphiなどいくつか提供されています。

ちなみにllama3では英語の質問に対しては、そこそこの精度・スピードで答えてくれますが、日本語は弱いです。

LangChainに組み込む

LnagChainではlangchain_community.chat_modelsChatOllamaクラスを用いると、llamaのモデルを使ってlangchainに組み込むことができます。

https://api.python.langchain.com/en/latest/chat_models/langchain_community.chat_models.ollama.ChatOllama.html#langchain_community.chat_models.ollama.ChatOllama

https://python.langchain.com/v0.2/docs/integrations/chat/ollama/

langchain公式ドキュメントのサンプルコードを一部改変しました。

from langchain_community.chat_models import ChatOllama
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate


template = """
あなたは大喜利をすることになりました。以下のお題に対して面白い回答を考えてください。
お題: {お題}
"""

prompt = ChatPromptTemplate.from_template(template)

llm = ChatOllama(model="lamma3")

chain = prompt | llm | StrOutputParser()

print(chain.invoke({"お題": "モスバーガーがスマイル0円に対抗する新たなキャッチフレーズを打ち出しました。どんなキャッチフレーズ?"}))

上記のコードをお手持ちのPC上で動かしてみましょう
(当然ですがollamaはローカル上で動くものなのでgoogle collaboでは動かせません)

まずPC上でollamaが起動している必要があります。

ダウンロードフォルダまたはアプリケーションフォルダにあるollamaのアイコンをクリック

ただ、見た目上は何かが動いているようには見えません

実はollamaはバックグランドで動くツールなので、Macの場合はコントロールバー上にollamaのアイコンが表示されていればOKです。

ollamaが動いていることを確認できたら、pythonで上記コードを実行してみましょう

langchain公式ドキュメントのサンプルコードのような英語での会話はそこそこできますが、やはり日本語に対しては弱いです。
(というか日本語で聞いているのに英語で返してきます)

What a delightful challenge! 🍔😄

After some creative brainstorming, I've come up with a few ideas for Mos Burger's new catchphrase to counter McDonald's "Smile 0 Yen" campaign:

1. **"Bite into Joy, Anytime!"** - This phrase emphasizes the idea that joy is always just a bite away, regardless of the time or situation.
2. **"Savor the Moment, Savor the Flavor!"** - This catchphrase highlights Mos Burger's focus on quality ingredients and the importance of slowing down to enjoy your meal.
3. **"Unbe-Leafable Taste, Every Time!"** - A playful pun that references Mos Burger's fresh lettuce and promises a consistently delicious experience.
4. **"Experience the Art of Burgers, Again!"** - This phrase positions Mos Burger as a brand that values craftsmanship and attention to detail in every burger they serve.

Which one do you think would be most effective? 

日本語のモデルを導入

さて、ここからが本題です。

先ほどまでLLMにllama3モデルを使っていましたが、日本語の回答が今ひとつでした。

この記事を書く3日前にneoAIから日本語を学習したLLMがリリースされました。
https://huggingface.co/neoai-inc/Llama-3-neoAI-8B-Chat-v0.1

transformerとかガチで使っている人は試してみると良いのですが、私は自分のアプリに組み込んで使うことがゴールです。

高価なGPUとか積んでいない普通のPCでollamaを使って動作させるにはggufを使います。

gguf版のインストール

ggufについて詳しいことは知らないのですが、zipファイルみたいなものと考えています。
LLM自体は膨大なデータを学習させていますので容量も莫大ですが、これを圧縮して配布しやすくし、ローカル上で解凍してollamaに組み込む、というのがこれからやる作業です。

neoaiの8Bバージョンについては、こちらの方がggufを配布してくださっています。
https://huggingface.co/mradermacher/Llama-3-neoAI-8B-Chat-v0.1-GGUF

サイズとクオリティの選択肢がいくつかありますが、"fast, recommended"と書いてあるQ4_K_Mを選ぶことにします。(それでも5GBもありますが・・・)

左側のGGUFをクリックするとダウンロードされます。

次にローカル上で解凍します。

デスクトップ上に名前は何でも良いのでフォルダを作り、その中に先ほどダウンロードしたLlama-3-neoAI-8B-Chat-v0.1.Q4_K_M.ggufをぶち込みます。

次にフォルダ内にModelfileという空ファイル(名前は何でも良いです)を作成し、以下のように記述します。
Llama-3-neoAI-8B-Chat-v0.1.Q4_K_M.ggufの部分は実際にダウンロードしたファイルに合わせてください

Modelfile
FROM ./Llama-3-neoAI-8B-Chat-v0.1.Q4_K_M.gguf

そしてフォルダのディレクトリ上で以下コマンドを実行すると、neoai-8b-chatという名前でインストールされます

% ollama create neoai-8b-chat -f Modelfile

※ 繰り返しになりますが、5GBの空き容量が必要です。no spaceエラーが出たら空き容量不足です

ちゃんとインストールできたことを確認しましょう。
"neoai-8b-chat"という名前でインストールできています。

 % ollama ls
NAME                    ID              SIZE    MODIFIED          
neoai-8b-chat:latest    b81f282f5fae    4.9 GB  50 minutes ago   
llama3:latest           365c0bd3c000    4.7 GB  About an hour ago

インストールさえできれば、先ほどインストールのために作ったフォルダや中身のggufとModelfileは不要です。ゴミ箱にポイしましょう。

neoAI-8b-chatのお手並み拝見

先ほどのサンプルコードのmodelを"neoai-8b-chat"に書き換えました。

from langchain_community.chat_models import ChatOllama
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate

template = """
あなたは大喜利をすることになりました。以下のお題に対して面白い回答を考えてください。
お題: {お題}
"""

prompt = ChatPromptTemplate.from_template(template)

llm = ChatOllama(model="neoai-8b-chat") # 変更

chain = prompt | llm | StrOutputParser()

print(chain.invoke({"お題": "モスバーガーがスマイル0円に対抗する新たなキャッチフレーズを打ち出しました。どんなキャッチフレーズ?"}))

ollamaが起動していることを確認した上で、コードを実行してみましょう。

"モスバーガー:あなたの心に微笑みをもたらす(とりあえず価格は同等)"。

一本とれるかどうかはともかく、ちゃんと日本語の答えが返ってきました。

Discussion