0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

LangChainチュートリアル (1)

0
Posted at

本チュートリアルは、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 OutputMemoryRunnable Interfaceなどについて解説していきたいと思います。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?