本チュートリアルは、LangChainの公式ドキュメントに基づいて、整理したり補足したりした内容です。
本記事は、LangChainのChat Model, Messages, Toolsという三つの重要な概念について、その定義、使い方、注意点などに対して具体例を交えながら解説していきます。
1. Chat Model
1.1 Chat Modeとは?
Chat Model は、通常の言語モデル(LLM)が「テキスト入力 → テキスト出力」をやるところを、「メッセージの列(sequence of messages)を入力として受け取り、メッセージを出力する」インタフェースを持つモデルのことを指します。
Chat ModelでのChat Modelは、「チャット形式(message-based)」 である。「チャット形式(message-based)」というのは、単なる一つのプロンプト(テキスト)ではなく、 SystemMessage, HumanMessage, AIMessageなどの やりとりを含む履歴(コンテキスト) を保持できるような構造です。これにより、対話の流れや文脈を考慮した応答が可能になります。
また、Chat Modelはツール呼び出し(tool calling)や構造化出力(structured outputs)などの機能とも連携できるようになっており、単なる自由文を生成するだけでなく、一定フォーマットでの応答や外部処理の呼び出しを含めることができます。
このように、Chat Modelは「対話形式+コンテキスト管理+外部ツールや構造に応じた応答」がしやすい枠組みを提供するもの、というのが公式の定義です
1.2 マルチモーダル
LangChainのChat Modelは、単純なテキスト入力だけでなく マルチモーダル入力 をサポートしています。
マルチモーダルとは?
マルチモーダルとは、「複数のモダリティ(形式・媒体)」を扱えることを指します。例えばテキストだけでなく、画像、音声、動画、ファイル(PDFなど)といったデータを入力あるいは出力で扱えることです。
なぜマルチモーダルが必要か
(1) 現実のデータが多様である
多くの場合では、人間とのインタラクションやドメインデータはテキストだけではなく、音声、画像、PDFなどのドキュメントを含むことが多いです。
(2) ユーザ体験の向上
例えば、ユーザが「この写真に写っている植物は何ですか」と聞きたいとき、頑張って写真の説明をテキスト化するより、直接画像をモデルに渡すほうがUXが良いです。
(3) 応用範囲の拡大
例えば以下のように、テキストと画像を同時に入力することができます。
from langchain_core.messages import HumanMessage
message = HumanMessage(
content=[
{"type": "text", "text": "この画像の天気を説明してください"},
{
"type": "image",
"source_type": "url",
"url": "https://...",
},
],
)
response = model.invoke([message])
このように、content はリスト型で複数のモードを保持可能です。
注意点:
(1) 現時点では、入力(input)としてマルチモーダルをサポートするモデルはたくさんありますが、出力(output)としてマルチモーダルを完全にサポートするモデルは非常に限られています
(2) どのプロバイダーのモデルがどのモダリティをサポートしているかは異なるので、モデルごとにドキュメントを確認する必要があります
ただし現状(2025年時点)では、Embedding Model や Vector Storesはテキスト以外のデータを直接扱うことはできません。画像や音声のベクトル化は外部処理が必要です。
1.3 キャッシュ機能
キャッシュ機能とは?
LangChainにおけるキャッシュ (Cache) は、LLM/Chat Modelに対するリクエスト/プロンプトとその応答を保存し、再利用できるようにする仕組みです。
なぜキャッシュ機能が必要か
(1) コストの削減
多くのLLM/Chat Modelは外部API利用やクラウドサービス利用であり、呼び出し毎に料金がかかる場合が多い。頻繁に同じプロンプトを行うと無駄が生じるため、キャッシュで応答を再利用できればコストを抑えられる。
(2) 応答時間の短縮
キャッシュがあればネットワーク往復を回避できるので、応答を返すまでの時間が短くなる
ほかの理由としては、レート制限/外部API制限を回避できる・一貫性などが挙げられます。
LLMの呼び出しはコストが高いため、LangChainではキャッシュ機能を簡単に利用できます。
キャッシュは何種類もありますが、ここではインメモリキャッシュとSQLiteキャッシュを紹介します:
(1) インメモリキャッシュ
from langchain_core.caches import InMemoryCache from langchain.chat_models import init_chat_model from langchain.globals import set_llm_cache llm = init_chat_model("gemini-2.5-flash", model_provider="google_genai") set_llm_cache(InMemoryCache()) llm.invoke("Tell me a joke") # 初回は時間がかかる(2) SQLiteキャッシュ
from langchain_community.cache import SQLiteCache set_llm_cache(SQLiteCache(database_path=".langchain.db"))
2. Messages
2.1 基本構造:
LangChainの対話は「Message」のやり取りで構成されます。ルールは以下の通りです:
(1) 最初は必ず SystemMessage または HumanMessage
(2) 最後は必ずHumanMessage か、tool呼び出しを含むAIMessage
2.2 主なMessagesの種類:
LangChainには5種類の標準Messageがあります。
SystemMessage
定義:役割やトーンを定義するメッセージ
例:
from langchain_core.messages import SystemMessage
SystemMessage(content="あなたは日本語だけで答えるアシスタントです。")
HumanMessage
定義:ユーザーからの入力
例:
HumanMessage(content="こんにちは!")
HumanMessage(content=[
{"type": "text", "text": "この画像を説明して"},
{"type": "image", "source_type": "url", "url": "https://..."}
])
AIMessage
定義:モデルからの出力、またはtool呼び出しリクエスト
例:
from langchain_core.messages import AIMessage
AIMessage(content="これはジョークです。")
tool呼び出しを含む例:
ai_tool_msg = AIMessage(
content="",
tool_calls=[
{
"name": "search_products",
"args": {"min_price": 10, "max_price": 50, "category": "electronics"}
}
]
)
AIMessageChunk
定義:ストリーミング出力時に逐次生成される小片
例:
for chunk in model.stream([HumanMessage("空の色は?")]):
print(chunk)
ToolMessage
定義:Toolの実行結果をモデルに返すためのメッセージ
3. Tools
Toolとは
LangChainにおける Tool は、以下のようなものです:
(1) Python関数を「名前」「説明」「引数スキーマ(どんな引数を受け取るか)」という形式でラップしたもの。
(2) 単純にモデルがテキストを生成するだけでなく、「必要ならこのツールを呼び出して処理してほしい」という操作をモデルが行えるようにする拡張機能。ツール呼び出し(tool calling)をサポートするチャットモデルで使われる。
Toolsの使い方:
Toolsを使うには、「直接利用」と「モデル組み合わせて利用」という二種類のパターンがあります。
直接利用
例えば、掛け算を実行するtoolが存在しているとしたら、直接利用の場合、このtoolを呼び出すことに必要な引数をオブジェクトで囲んだらOK
from langchain_core.tools import tool
@tool
def multiply(a: int, b: int) -> int:
"""Multiply two numbers."""
return a * b
multiply.invoke({"a": 2, "b": 3})
モデルと組み合わせて利用
モデルと組み合わせる時、以下の四ステップがあります:
(1) Tool Creation: @toolを使うことでこの関数をToolとして宣言する
(2) Tool Binding: モデルのbing_tools()を呼び出すことで必要なtoolsを紐づける
(3) Tool Calling: モデルはユーザからの質問を受けて、toolを呼び出す必要があるかどうかを判断して、必要な場合は自動的に適切なtoolを呼び出す
例えばユーザから「今日の天気を教えてほしい」という質問を受けた時、もしTool Bindingで天気を調べるtoolが紐づけられていたらモデルは自動的にこのtoolを呼び出すかもしれない
(4) Tool Execution
モデルが提供するパラメータを使いながら必要なtoolを実行する
@tool(response_format="content_and_artifact")
def generate_random_ints(min: int, max: int, size: int):
import random
array = [random.randint(min, max) for _ in range(size)]
content = f"{size}個の乱数を生成しました。"
return content, array
llm = init_chat_model("gemini-2.5-flash", model_provider="google_genai")
llm_with_tools = llm.bind_tools([generate_random_ints])
ai_msg = llm_with_tools.invoke("25以下の正の整数を6個生成して")
tool_objs = ai_msg.tool_calls
artifact = generate_random_ints.invoke(tool_objs[0]).artifact # 実際の乱数配列
まとめ
・Chat Model はマルチモーダル入力やキャッシュに対応しており、高速で柔軟な対話システムを構築できます。
・Messages は対話の最小単位であり、System/Human/AI/Chunk/Toolの5種類を理解することが重要です。
・Tools はLangChainの特徴的な仕組みで、LLMが外部処理を自動的に呼び出す強力な拡張性を提供します。
今回はここまでです。次回はStructured Output、Memory、Runnable Interfaceなどについて解説していきたいと思います。