langchain-patterns
LangChain、LangGraph、LiteLLMのパターン — チェーン構成(LCEL)、モデルサイズ横断的な構造化出力、RAG、モデルルーティング、Ollmaローカルモデル、およびプロバイダーに依存しない設計に対応しています。これらのツールを活用することで、複数のLLMモデルを組み合わせた複雑なワークフローの構築、様々なサイズのモデルからの一貫性のある出力形式の取得、検索拡張生成(RAG)による精度の高い回答生成、用途に応じた最適なモデルの自動選択、ローカル環境でのモデル実行、そして特定のLLMプロバイダーに縛られない柔軟なシステム設計が可能になります。
description の原文を見る
LangChain, LangGraph, LiteLLM patterns — chain composition (LCEL), structured output across model sizes, RAG, model routing, Ollama local models, and provider-agnostic design
SKILL.md 本文
重要: 使用前に必ず langchain-docs MCP に対してインポートとメソッドシグネチャを確認してください。LangChain API は頻繁に変更されます。
チェーン構成 (LCEL)
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough, RunnableParallel
from langchain_core.output_parsers import StrOutputParser
prompt = ChatPromptTemplate.from_messages([
("system", "You are a {role}."),
("human", "{input}")
])
chain = prompt | llm | StrOutputParser()
# Parallel execution
parallel = RunnableParallel(summary=summary_chain, keywords=keyword_chain)
# Branching
from langchain_core.runnables import RunnableBranch
branch = RunnableBranch(
(lambda x: x["type"] == "code", code_chain),
default_chain,
)
構造化出力 (デュアルモデル)
from pydantic import BaseModel, Field
class Entity(BaseModel):
"""Keep flat for small models. Use Field descriptions as implicit instructions."""
name: str = Field(description="Entity name as it appears in text")
entity_type: str = Field(description="One of: person, place, organization")
confidence: float = Field(ge=0.0, le=1.0)
# Works across all providers (preferred)
structured = llm.with_structured_output(Entity, method="json_schema")
# For small Ollama models — force JSON mode:
from langchain_ollama import ChatOllama
small_llm = ChatOllama(model="qwen3:4b-instruct", format="json", temperature=0)
重要なポイント: method="json_schema" (JSON_MODE) は Ollama を含むすべてのプロバイダーで確実に動作します。method="function_calling" (TOOL) は小規模モデルの複雑なスキーマでは None を返す可能性があります。
LiteLLM ルーティング
# LiteLLM プロキシ経由 (マルチモデル構成に推奨)
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(base_url="http://litellm-proxy:4000", model="claude-sonnet-4-20250514")
# フォールバック付きダイレクト
from litellm import completion
response = completion(
model="claude-sonnet-4-20250514",
messages=messages,
fallbacks=["gpt-4o", "ollama/qwen3:8b"],
)
Ollama / ローカルモデル
from langchain_ollama import ChatOllama
llm = ChatOllama(
model="qwen3:4b-instruct",
base_url="http://ollama:11434",
temperature=0,
format="json", # Essential for structured output on small models
# num_ctx=8192, # Set explicitly if needed
)
ローカルモデルの重要なポイント:
- 4B 命令チューニングモデルは、制約付き生成により 8B 以上のモデルより構造化タスクで優れたパフォーマンスを発揮できます。
- 構造化出力の場合は思考モードを無効化してください。
- VRAM を監視してください: 並行リクエストは OOM を引き起こします。
- 命令チューニング済みのバリアントを使用し、ベースモデルは決して使わないでください。
LangGraph (ステートフルワークフロー)
from langgraph.graph import StateGraph, END
from typing import TypedDict
class State(TypedDict):
input: str
draft: str
iteration: int
graph = StateGraph(State)
graph.add_node("generate", generate_node)
graph.add_node("review", review_node)
graph.set_entry_point("generate")
graph.add_conditional_edges("review", should_revise, {"revise": "generate", "accept": END})
app = graph.compile()
よくある落とし穴
- シンプルな API 呼び出しで十分な場合に LangChain を使わないでください。
- 常に
max_tokensを明示的に設定してください。 OutputParserExceptionを処理してください — 構造化出力は時々失敗します。- オブザーバビリティには コールバックまたは LangSmith を使用してください。
- 決定論的な呼び出し (temp=0, 同じ入力) をキャッシュしてください。
- LangChain のインポートは安定していないと仮定しないでください — 常にドキュメントに対して確認してください。
ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- pvliesdonk
- リポジトリ
- pvliesdonk/agents.md
- ライセンス
- MIT
- 最終更新
- 2026/3/21
Source: https://github.com/pvliesdonk/agents.md / ライセンス: MIT