【langchain-ollama】OllamaLLMとChatOllamaの違いを調査【備忘録】

お疲れ様です。

前回gpt-ossでMCPサーバを動かすという内容 で記事を書いたのですが、その中でlangchain-ollamaには OllamaLLMChatOllamaの2つのモデルが使えることを知りました。
今回はこの2つの違いをざっくり調べてみました。

公式ドキュメント

違いについて

違いについて調べた内容をまとめるとこんな感じ。

ChatOllama OllamaLLM
用途 チャット形式の出力 文章の生成
入力 Messagesのリスト 文字列
出力 AIMessage 文字列
継承クラス BaseChatModel BaseLLM

ざっくりとOllamaLLMは文書生成用のモデル、ChatOllamaはチャット用のモデルという認識で良さそうです。
どちらかというと継承クラスによる違いな気がします。モデルはOllamaから使うというのは同じで使用用途が違うというイメージです。

それぞれ実際の実装してみてみます。 ユーザの入力は同じ内容で、出力のデータ型と内容を確認してみます。

OllamaLLM

from langchain_ollama.llms import OllamaLLM

message = "Ollamaについて200字程度で簡潔に教えて"
llm = OllamaLLM(model='gpt-oss:20b')
response = llm.invoke(message)

print(type(response))
print(response)

入力は文字列としていますが、この後に示すChatOllamaと同じくMessagesのリストでも入力可能です。 過去の記事 の実装でもMessagesの方を使っていました。

出力はこんな感じ。 str型(文字列)で返ってきていますね。 入力が文字列でもMessagesでも出力は文字列で同じです。 ollamallm

ChatOllama

from langchain_ollama import ChatOllama
from langchain_core.messages import HumanMessage

messages = [HumanMessage(content="Ollamaについて200字程度で簡潔に教えて")]
llm = ChatOllama(model='gpt-oss:20b')
response = llm.invoke(messages)

print(type(response))
print(response)

入力はLangChainのMessagesのうちユーザの入力を表すHumanMessageをリストに格納した形です。 他AIMessageを含めたこれまでのやりとりの履歴をリストとして格納する形でも可能ですし、SystemMessageでシステムプロンプトを追加することも可能です。

出力はこんな感じ。 返答内容とメタデータがAIMessageに格納されて出力されています。 返答内容のみを取り出したい場合はresponse.contentとすればOKです。
出力の内容的にはOllamaLLMとそれほど違いはなさそうに思いますね。入力の内容が良くなかったかな…。 chatollama

Messagesについては以下の公式ドキュメントを参照ください。
python.langchain.com

前回のMCPの実装の記事でChatOllamaでないと"bind_tools"の機能が使えない問題があったのですが、ChatOllamaが継承しているBaseChatModelにbind_toolsのメソッドがあったのでこれによる違いかと思います。

こういう意味でもBaseChatModelにチャット形式で扱うための機能が揃っているのだとわかりますね。 ChatOllamaに限らず、チャット形式で使いたい場合はBaseChatModelを継承したものをつかうようにすると覚えておくと良さそうです。 bind_tools github.com