LangChain 1.0 α : コアコンポーネント – モデル

LLM は強力な AI ツールで、人間のようにテキストを解釈して生成することができます。
テキスト生成に加えて、多くのモデルはツール呼び出し、構造化出力、マルチモーダル、推論をサポートしています。

LangChain 1.0 alpha : コアコンポーネント – モデル

作成 : クラスキャット・セールスインフォメーション
作成日時 : 09/22/2025
バージョン : 1.0.0a6

* 本記事は docs.langchain.com の以下のページを独自に翻訳した上で、補足説明を加えてまとめ直しています。スニペットはできる限り日本語を使用しています :

* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。

 

 

LangChain 1.0 alpha : コアコンポーネント – モデル

LLM は強力な AI ツールで、人間のようにテキストを解釈して生成することができます。LLM は、コンテンツの作成、言語の翻訳、要約、質問への回答など、各タスクに特化したトレーニングを必要とすることなく、十分に多機能です。

テキスト生成に加えて、多くのモデルは以下をサポートしています :

  • ツール呼び出し – (データベース・クエリや API 呼び出しのような) 外部ツールを呼び出して結果をレスポンスで利用します。

  • 構造化出力 – モデルのレスポンスが、定義済みの形式に従うように制約されます。

  • マルチモーダル – 画像、音声や動画のような、テキスト以外のデータを処理して返します。

  • 推論 – モデルは、結果に到達するために他段階の推論を行います。

プロバイダー固有の統合情報と機能については、プロバイダーの 統合ページ をご覧ください。

 

基本的な使用方法

LangChain のモデルを使い始める最も簡単な方法は、init_chat_model を使用して選択した プロバイダー のモデルを初期化することです。

チャットモデルの初期化

from langchain.chat_models import init_chat_model

model = init_chat_model("openai:gpt-5-nano")
response = model.invoke("Why do parrots talk?")

See init_chat_model for more detail.

 

主要メソッド

  • Invoke – モデルは入力としてメッセージを受け取り、完全なレスポンスを生成後にメッセージを出力します。

  • Stream – モデルを invoke しますが、生成される出力をリアルタイムにストリーミングします。

  • Batch – より効率的な処理のために、複数のリクエストをモデルにバッチで送信します。

Note : In addition to chat models, LangChain provides support for other adjacent technologies, such as embedding models and vector stores. See the integrations page for details.

 

パラメータ

チャットモデルは、その動作を構成設定するために使用できるパラメータを受け取ります。サポートされるパラメータの完全なセットはモデルとプロバイダーにより様々ですが、標準的なものは以下のようなものです :

  • ​model – string, required
    プロバイダーとともに使用したい特定のモデルの名前または識別子。

  • api_key – string
    モデルのプロバイダーとの認証に必要なキー。これは通常は、モデルへのアクセスにサインアップする際に発行されます。多くの場合、環境変数の設定でアクセスできます。

  • temperature – number
    モデルの出力のランダム性を制御します。より大きい数値がレスポンスを創造的にします; 小さい数値はより決定論的にします。

  • stop – string[]
    モデルが出力の生成を停止すべきときを示す文字のシークエンス。

  • timeout – number
    リクエストをキャンセルする前に、モデルからのレスポンスを待機する最大時間 (秒)。

  • max_tokens – number
    レスポンスの合計トークン数を制限し、出力の長さを効果的に制御します。

  • max_retries – number
    ネットワーク・タイムアウトやレート制限のような問題によりリクエストが失敗した場合、システムがリクエストを再送信する試行数の最大数。

Note : To find all the parameters supported by a given chat model, head to the reference docs.

 

Invocation (呼び出し)

出力を生成するには、チャットモデルを呼び起こす (invoke) 必要があります。主に 3 つの呼び出しメソッドがあり、それぞれ異なるユースケースに適しています :

Note : 各呼び出しメソッドは非同期な同値があり、通常は文字 ‘a’ で prefix されます。
例えば: ainvoke(), astream(), abatch().

A full list of async methods can be found in the reference docs.

 

Invoke

モデルを呼び出す最も簡単な方法は、単一のメッセージかメッセージのリストを引数として持つ invoke() を使用することです。

単一メッセージ

response = model.invoke("Why do parrots have colorful feathers?")
print(response)

メッセージのリストは、会話履歴を表すためにモデルに提供できます。各メッセージは、会話内で誰がメッセージを送信したかモデルが示すために使用するロール (役割り) を持ちます。ロール、タイプとコンテンツの詳細については メッセージ ガイドをご覧ください。

会話履歴

from langchain.messages import HumanMessage, AIMessage, SystemMessage

conversation = [
    SystemMessage("You are a helpful assistant that translates English to French."),
    HumanMessage("Translate: I love programming."),
    AIMessage("J'adore la programmation."),
    HumanMessage("Translate: I love building applications.")
]

response = model.invoke(conversation)
print(response)  # AIMessage("J'adore créer des applications.")

参考 (訳註) : messages パッケージは実際には langchain_core に含まれます。従って、動作例としては :

from langchain_core.messages import HumanMessage, AIMessage, SystemMessage
from langchain.chat_models import init_chat_model

model = init_chat_model(
    "anthropic:claude-3-7-sonnet-latest",
    temperature=0
)

conversation = [
    SystemMessage("You are a helpful assistant that translates English to Japanese."),
    HumanMessage("Translate: I love programming."),
    AIMessage("私はプログラミングが好きです。"),
    HumanMessage("Translate: I love building applications.")
]

response = model.invoke(conversation)
print(response.content) 

出力例

私はアプリケーションを作るのが好きです。

 

Stream

殆どのモデルは、出力コンテンツを生成しながらストリーミングできます。出力を段階的に (progressively) 表示することで、ストリーミングは特に長いレスポンスに対してユーザエクスペリエンスを大幅に向上させます。

stream() は、出力チャンクを生成しながら yield するイテレータを返します。各チャンクをリアルタイムで処理するためにループを使用できます :

基本的なテキスト・ストリーミング

for chunk in model.stream("Why do parrots have colorful feathers?"):
    print(chunk.text, end="|", flush=True)

sample snippet

from langchain.chat_models import init_chat_model

model = init_chat_model(
    "anthropic:claude-3-7-sonnet-latest",
    temperature=0
)

for chunk in model.stream("なぜオウムはカラフルな羽を持つのですか?"):
    print(chunk.content, end="|", flush=True)

出力例

|オウムが|カラフルな|羽を持つ|理由はいくつかあ|ります:

1.| 繁殖と|求愛行動 |- 鮮やかな色|は異性を引き|つけるのに役立ち|ます。特にオスは派|手な羽で|自分の健康状態や|遺伝的な|質の高さを|アピールします。|

2. 種|の識別 - 異|なる色彩パ|ターンは、同|じ種のオウム|同士が互いを識|別するのを助けます。|

3. 迷彩効果| - 意外に|思えるかもしれませ|んが、熱帯|雨林の色と|りどりの環境では|、カラフル|な羽が|捕食者から身|を隠すのに役立つ|ことがあります。|

4. 社|会的コミュニケー|ション - 羽|の色は群れ|内での社会的|地位や感情状態を示|すこともあります。|

5. |紫外線保護 - 一|部の色素|は有害な紫外|線から保護する機能があ|ります。

これ|らの特|徴は、オ|ウムが|熱帯や|亜熱|帯の環境に|適応した結|果として進化して|きたものです。||

Stream tool calls, reasoning, and other content

for chunk in model.stream("What color is the sky?"):
    for block in chunk.content_blocks:
        if block["type"] == "reasoning" and (reasoning := block.get("reasoning")):
            print(f"Reasoning: {reasoning}")
        elif block["type"] == "tool_call_chunk":
            print(f"Tool call chunk: {block}")
        elif block["type"] == "text":
            print(block["text"])
        else:
            ...

モデルが完全なレスポンスの生成を終了した後に単一の AIMessage を返す invoke() とは対照的に、stream() は複数の AIMessageChunk オブジェクトを返します、その各々は出力テキストの一部を含みます。重要なのは、ストリームの各チャンクは合計することで完全なメッセージにまとめられるように設計されていることです :

Construct an AIMessage

full = None  # None | AIMessageChunk
for chunk in model.stream("What color is the sky?"):
    full = chunk if full is None else full + chunk
    print(full.text)

# The
# The sky
# The sky is
# The sky is typically
# The sky is typically blue
# ...

print(full.content_blocks)
# [{"type": "text", "text": "The sky is typically blue..."}]

結果としてのメッセージは、invoke() で生成されたメッセージと同じように扱うことができます – 例えば、メッセージ履歴に集約して、モデルに会話コンテキストとして返すことができます。

 

Batch

モデルへの独立したリクエストのコレクションのバッチ処理は、処理が並列に実行できるので、パフォーマンスを大幅に向上させてコストを削減させることができます :

responses = model.batch([
    "Why do parrots have colorful feathers?",
    "How do airplanes fly?",
    "What is quantum computing?"
])
for response in responses:
    print(response)

sample snippet

from langchain.chat_models import init_chat_model

model = init_chat_model(
    "anthropic:claude-3-7-sonnet-latest",
    temperature=0
)

responses = model.batch([
    "なぜオウムはカラフルな羽を持つのでしょう?",
    "飛行機はどのように飛ぶのでしょうか?",
    "量子コンピューティングとは何か?"
])
for response in responses:
    print("\n---", response.content)

出力例

--- オウムがカラフルな羽を持つ理由はいくつかあります:

1. 繁殖と求愛行動:鮮やかな色は異性を引きつけるのに役立ちます。特にオスは美しい羽で自分の健康状態や遺伝的な質の高さをアピールします。

2. 種の識別:同じ種類同士が互いを認識しやすくなります。

3. 警戒色:一部の鮮やかな色は捕食者に「私は毒がある」または「私は危険」というメッセージを送ります。

4. カモフラージュ:意外に思えるかもしれませんが、熱帯雨林の色とりどりの環境では、カラフルな羽が隠れ蓑になることもあります。

5. 社会的コミュニケーション:群れの中での意思疎通に役立ちます。

これらの特徴は長い進化の過程で自然選択によって発達してきました。

--- 飛行機が飛ぶ原理は主に「揚力」によるものです。簡単に説明すると:

1. 翼の形状:飛行機の翼は上面が膨らみ、下面がより平らな形状をしています。

2. 揚力の発生:飛行機が前進すると、空気が翼の上下を流れますが、上面を流れる空気は下面より速く移動する必要があります。ベルヌーイの原理により、速く流れる空気は圧力が低くなるため、翼の上面は下面より圧力が低くなります。

3. 圧力差:この上下の圧力差が「揚力」を生み出し、飛行機を上に持ち上げます。

4. 推進力:エンジンが前進するための推進力を提供し、これにより必要な空気の流れが維持されます。

5. 制御:パイロットは方向舵、昇降舵、補助翼などを使って飛行機の方向や高度を制御します。

これらの要素が組み合わさることで、何百トンもある飛行機が空を飛ぶことができるのです。

--- # 量子コンピューティングとは

量子コンピューティングは、量子力学の原理を利用して情報処理を行うコンピューティング技術です。従来の古典的なコンピュータが0と1の二進法(ビット)で情報を処理するのに対し、量子コンピュータは「量子ビット」または「キュービット」と呼ばれる単位を使用します。

## 主な特徴

- **重ね合わせ**: キュービットは0と1の状態を同時に取ることができます
- **量子もつれ**: 複数のキュービットが互いに関連し合い、一方の状態が変化すると瞬時に他方にも影響します
- **並列計算**: 多数の計算を同時に実行できる可能性があります

## 応用分野

- 暗号解読
- 創薬・材料科学
- 機械学習の高速化
- 最適化問題の解決

現在、量子コンピュータは発展途上の技術であり、実用的な量子コンピュータの開発には、量子ノイズや誤り訂正などの課題を解決する必要があります。IBM、Google、Intelなどの大手テクノロジー企業や研究機関が開発に取り組んでいます。

Note : このセクションは、クライアント側でモデル呼び出しを並列化する、チャットモデルのメソッド batch() について説明しています。これは、OpenAIAnthropic のような、推論プロバイダーによりサポートされるバッチ API とは異なります。

 
デフォルトでは、batch() はバッチ全体に対する最終的な出力だけを返します。各個別の入力に対する出力を、生成が終了した時点で受け取りたい場合には、batch_as_completed() を使用して結果をストリーミングできます :

Yield batch responses upon completion

for response in model.batch_as_completed([
    "Why do parrots have colorful feathers?",
    "How do airplanes fly?",
    "What is quantum computing?"
]):
    print(response)

For more details on batching, see the reference.

 

ツール呼び出し

モデルは、データベースからのデータの取得、web 検索、コードの実行のようなタスクを実行するツールの呼び出しをリクエストできます。ツールは以下のペアです :

  1. ツール名、説明 and/or 引数定義 (多くの場合 JSON スキーマ) を含む、スキーマ

  2. 実行する関数またはコルーチン

Note : 「関数呼び出し」という述語を聞いたことあるかもしれません。これを「ツール呼び出し」と互換的に使用します。

 
定義したツールをモデルで使用できるようにするには、bind_tools() を使用してツールをバインドする必要があります。続く呼び出しでは、モデルは必要に応じてバインドされたツールのいずれかを呼び出すことを選択できます。

一部のモデルプロバイダーは、モデルパラメータで有効化できる組み込みツールを提供しています。Check the respective provider reference for details.

Note : See the tools guide for details and other options for creating tools.

Binding user tools

from langchain_core.tools import tool

@tool
def get_weather(location: str) -> str:
    """Get the weather at a location."""
    return f"It's sunny in {location}."


model_with_tools = model.bind_tools([get_weather])

response = model_with_tools.invoke("What's the weather like in Boston?")
for tool_call in response.tool_calls:
    # View tool calls made by the model
    print(f"Tool: {tool_call['name']}")
    print(f"Args: {tool_call['args']}")

sample snippet

from langchain.chat_models import init_chat_model
from langchain_core.tools import tool

model = init_chat_model(
    "anthropic:claude-3-7-sonnet-latest",
    temperature=0
)

@tool
def get_weather(location: str) -> str:
    """Get the weather at a location."""
    return f"It's sunny in {location}."


model_with_tools = model.bind_tools([get_weather])

response = model_with_tools.invoke("What's the weather like in Boston?")
print(response)
for tool_call in response.tool_calls:  # type: ignore
    # View tool calls made by the model
    print(f"Tool: {tool_call['name']}")
    print(f"Args: {tool_call['args']}")

出力例

Tool: get_weather
Args: {'location': 'Boston'}

ユーザ定義ツールをバインドする場合、モデルのレスポンスにはツールを実行するリクエストが含まれます。要求されたアクションを実行し、結果をモデルに返して後続の推論で使用するのは、ユーザの責任です。

 

構造化出力

モデルは、指定のスキーマに一致する形式でレスポンスを提供するようにリクエストできます。これは、出力が簡単にぱパースし、続く処理で使用できることを確実にするのに役立ちます。LangChain は、構造化出力を強制するために複数のスキーマタイプとメソッドをサポートしています。

  • Pydantic – Pydantic モデルは、フィールド検証、説明とネストされた構造を持つ、最もリッチな機能セットを提供します。

    from pydantic import BaseModel, Field
    
    class Movie(BaseModel):
        """A movie with details."""
        title: str = Field(..., description="The title of the movie")
        year: int = Field(..., description="The year the movie was released")
        director: str = Field(..., description="The director of the movie")
        rating: float = Field(..., description="The movie's rating out of 10")
    
    model_with_structure = model.with_structured_output(Movie)
    response = model_with_structure.invoke("Provide details about the movie Inception")
    print(response)  # Movie(title="Inception", year=2010, director="Christopher Nolan", rating=8.8)
    

  • TypedDict – TypedDict は Python の組み込み型付けを使用した単純な代替を提供します。これは実行時の検証を必要としない場合に最適です。

    from typing_extensions import TypedDict, Annotated
    
    class MovieDict(TypedDict):
        """A movie with details."""
        title: Annotated[str, ..., "The title of the movie"]
        year: Annotated[int, ..., "The year the movie was released"]
        director: Annotated[str, ..., "The director of the movie"]
        rating: Annotated[float, ..., "The movie's rating out of 10"]
    
    model_with_structure = model.with_structured_output(MovieDict)
    response = model_with_structure.invoke("Provide details about the movie Inception")
    print(response)  # {'title': 'Inception', 'year': 2010, 'director': 'Christopher Nolan', 'rating': 8.8}
    

  • JSON スキーマ – 最大限の制御や相互運用性のために、raw JSON スキーマを提供できます。

    import json
    
    json_schema = {
        "title": "Movie",
        "description": "A movie with details",
        "type": "object",
        "properties": {
            "title": {
                "type": "string",
                "description": "The title of the movie"
            },
            "year": {
                "type": "integer",
                "description": "The year the movie was released"
            },
            "director": {
                "type": "string",
                "description": "The director of the movie"
            },
            "rating": {
                "type": "number",
                "description": "The movie's rating out of 10"
            }
        },
        "required": ["title", "year", "director", "rating"]
    }
    
    model_with_structure = model.with_structured_output(
        json_schema,
        method="json_schema",
    )
    response = model_with_structure.invoke("Provide details about the movie Inception")
    print(response)  # {'title': 'Inception', 'year': 2010, ...}
    

 

以上