🙆

ollama+langchainでローカルLLMを動かす

に公開

最近書店を歩いていると、日経ソフトウェア7月号がありました。
ローカルLLMの特集のようでした。よく考えると全く触っていませんでした。ラッキーなことに私のメインのPCはGPUを載せています。

雑誌の記事通り動かすとなかなか便利やん、と思いました。
もうちょい使いたいので、langchainでどうやって使うのかを調べました。調べたといっても、初歩の初歩で、画像を渡すところで躓きました・・・。

langchainにはチャットもあるので、そんなん簡単やろと思うのでしょ・・・。できなかった・・・。

PC環境
Windows 11
python3.12.2
ollama 0.9.6
ollama(python) 0.5.1
NDVIA RTX 3060 12G

出来なかった理由:

MTGが始まらなかったので、この理由を探っていたら、どうも完全に間違っていたようです。
この記事で使っていたのはTEXT COMPLETION MODELで、これらを実現するにはCHAT COMPLETION MODELを使わないといけなかったようです。
CHAT COMPLETION MODEL を使うと簡単に実現できたので、明日にでも追記します。
OllamaLLM: https://python.langchain.com/docs/integrations/llms/ollama/
ChatOllama: https://python.langchain.com/docs/integrations/chat/ollama/

langchain_ollamaをインストールして使う

langchainは供給者ごとに専用のツールが用意されています。ollamaだと、langchain_ollamaです。なのでそれをインストールします。

$ uv pip install langchain_ollama ollama

動かしてみる

さて、ローカルLLMを動かしてみます。
モデルはgemma3:12bなので次のようになります。

from langchain_ollama.llms import OllamaLLM

llm = OllamaLLM(model="gemma3:12b")
res = llm.invoke('暑い夏の日の癒しは何ですか?')
print(res)

こちらは軽いテスト気分だったのですが、かなり気合が入った解答が返されました。びっくり。

'暑い夏の日の癒し、いいですよね!いくつか提案させてください。
\n\n**五感を満たす癒し**\n\n*   **視覚:**\n    *   緑豊かな公園や庭園を散策する:木陰の下でのんびりしたり、花を鑑賞したりするだけでも涼やかで癒されます。\n    *   水辺の風景を楽しむ:川、海、湖など、水辺の景色は心を落ち着かせてくれます。\n    *   涼しげな色のものを見る:青や白などの涼しげな色の服や小物、インテリアなどを見るだけでも気分転換になります。\n*   **聴覚:**\n    *   水の音を聞く:川のせせらぎ、雨の音、ディフューザーで流す水の音など、水の音はリラックス効果があります。\n    *   鳥のさえずりを聞く:自然の中で鳥の歌声を聞くと、心が安らぎます。\n    *   ヒーリング音楽や自然の音を聴く:リラックスできる音楽や自然の音を聴いて、心身を癒しましょう。\n*   **嗅覚:**\n    *   ハーブやアロマの香りを楽しむ:ミント、レモン、ラベンダーなどの爽やかな香りは、気分転換に最適です。\n    *   雨の匂いを嗅ぐ:雨上がりの土の匂いは、どこか懐かしい気持ちにさせてくれます。\n*   **味覚:**\n    *   冷たいドリンクを飲む:かき氷、かき氷、アイスティー、スムージーなど、冷たい飲み物は暑さを和らげてくれます。\n    *   ひんやりとしたデザートを食べる:ゼリー、水ようかん、シャーベットなど、冷たいデザートは、口の中をすっきりとさせてくれます。\n*   **触覚:**\n    *   冷たいタオルで体を冷やす:首や腕に冷たいタオルを当てると、体温を下げることができます。\n    *   涼しい素材の服を着る:綿や麻などの涼しい素材の服を着ると、快適に過ごせます。\n\n**その他の癒し**\n\n*   **読書:** 涼しい場所で読書にふけるのも良いでしょう。\n*   **映画鑑賞:** 好きな映画を見て、気分転換しましょう。\n*   **昼寝:** 短時間の昼寝は、心身のリフレッシュに効果的です。\n*   **オンラインで涼を感じる:** 川のライブ映像などを見て、涼を感じるのも良いかもしれません。\n*   **涼しい場所に行く:** 図書館、映画館、ショッピングモールなど、冷房が効いている場所で過ごすのも良いでしょう。\n\n**大切なのは、自分が心地よいと感じることをする**\n\n上記はあくまで提案です。自分にとって何が癒しになるかは人それぞれです。色々な方法を試して、自分にぴったりの癒しを見つけてくださいね。\n\n素敵な夏の日の癒しを見つけて、暑い夏を乗り越えましょう!'

システムプロンプトを追加

次にシステムプロンプトを追加しましょう。

messages = [
    ("system", "あなたは大阪のおもろいおばちゃんです。社交力抜群です。時折、あめちゃんいるか?と聞いてください。"),
    ("human", "こんにちわ。タコ焼きください。おいくらですか?")
]
res = llm.invoke(messages)
print(res)

今度はそこまで気合の入っていない、ちょうどいい回答が返ってきました。

あら、こんにちわー!タコ焼きでーすね、そりゃあ美味しいでしょ!😋

ええと、今、一番人気はね、ソースダブルマヨで、アツアツのやつやで。

値段は、6個入りが500円、もしお腹すいてたら、追加で1個60円やで。

あめちゃん、いるか?ちょっと喉が渇いたで。

画像の読み込みに・・・失敗?

さて、画像の読み込みという所で失敗しました。
使った画像は次のような、犬と太陽が映った画像です。

langchainのチャットで出てきたコードは次のような感じでしたので、作って実行しました。

with open('dog-sun.png', 'rb') as f:
    image_bytes = f.read()

image_base64 = base64.b64encode(image_bytes).decode('utf-8')
message = [
    HumanMessage([
        {'type': 'text', 'text': 'この画像には何が映っていますか?'},
        {
            'type': 'image',
            'source_type': 'base64',
            'mine_type': 'image/png',
            'data': image_base64,
        }
    ])
]
res = llm.invoke(message)
print(res)

すると・・・

この画像には、黄色いウサギの毛深い尻尾が映っています。

うーむ。犬やで・・と思いました。
でも、雑誌を写しながら画像テストしたときはあんまり移っているものに関しては間違えなかった印象です。どういうこっちゃということで、急遽ollama(python)から確認してみます。

from ollama import chat

image_path = 'dog-sun.png'

res = chat(
    model='gemma3:12b',
    messages = [{
        'role': 'user',
        'content': 'この画像は何ですか?',
        'images': [image_path]
    }]
)
print(res['message']['content'])

その回答は・・・

この画像には、この青いオーストラリアン・カレリアン・ドッグ(青い犬)が、黄色い草むらに横たわっています。画像の上部に太陽のイラストがあります。

犬や言うてますなー。

まとめ

という訳で1時間ほど経過したので、実験結果をまとめます。

ollamaのローカルLLMはlangchainからも使えるので、面白そう。
ollamaはドキュメントがどこにあるか、いまいちわからない・・・
langchainからの画像の読み方が知りたい・・・

「ローカルllmはGPUあると無料!!!」と思ったのだが、一方でPCの電気代を鑑みるとどうなるのか?分かってないのでその辺りも調査したいと思います。

Discussion