お疲れ様です。
前回gpt-ossでMCPサーバを動かすという内容
で記事を書いたのですが、その中でlangchain-ollamaには
OllamaLLMとChatOllamaの2つのモデルが使えることを知りました。
今回はこの2つの違いをざっくり調べてみました。
公式ドキュメント
OllamaLLM
python.langchain.comChatOllama
python.langchain.com
違いについて
違いについて調べた内容をまとめるとこんな感じ。
| 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でも出力は文字列で同じです。

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とそれほど違いはなさそうに思いますね。入力の内容が良くなかったかな…。

Messagesについては以下の公式ドキュメントを参照ください。
python.langchain.com
前回のMCPの実装の記事でChatOllamaでないと"bind_tools"の機能が使えない問題があったのですが、ChatOllamaが継承しているBaseChatModelにbind_toolsのメソッドがあったのでこれによる違いかと思います。
こういう意味でもBaseChatModelにチャット形式で扱うための機能が揃っているのだとわかりますね。
ChatOllamaに限らず、チャット形式で使いたい場合はBaseChatModelを継承したものをつかうようにすると覚えておくと良さそうです。
github.com