langchain-cost-tuning
LangChain APIのコストとトークン使用量を最適化できます。 LLM APIの費用削減、コスト管理の実装、本番環境でのトークン消費の最適化が必要な場合に使用してください。 「langchain cost」「langchain tokens」「reduce langchain cost」「langchain billing」「langchain budget」といったフレーズで起動します。
description の原文を見る
Optimize LangChain API costs and token usage. Use when reducing LLM API expenses, implementing cost controls, or optimizing token consumption in production. Trigger with phrases like "langchain cost", "langchain tokens", "reduce langchain cost", "langchain billing", "langchain budget".
SKILL.md 本文
LangChain コスト最適化
概要
LangChainアプリケーションで品質を保ちながらLLM APIコストを削減するための戦略です。
前提条件
- 本番環境で稼働しているLangChainアプリケーション
- APIの使用状況ダッシュボードへのアクセス
- トークン価格設定の理解
手順
ステップ1: トークン価格設定を理解する
# Current approximate pricing (check provider for current rates)
PRICING = {
"openai": {
"gpt-4o": {"input": 0.005, "output": 0.015}, # per 1K tokens
"gpt-4o-mini": {"input": 0.00015, "output": 0.0006},
"gpt-3.5-turbo": {"input": 0.0005, "output": 0.0015},
},
"anthropic": {
"claude-3-5-sonnet": {"input": 0.003, "output": 0.015},
"claude-3-haiku": {"input": 0.00025, "output": 0.00125},
},
"google": {
"gemini-1.5-pro": {"input": 0.00125, "output": 0.005},
"gemini-1.5-flash": {"input": 0.000075, "output": 0.0003},
}
}
def estimate_cost(
input_tokens: int,
output_tokens: int,
model: str = "gpt-4o-mini"
) -> float:
"""Estimate API cost for a request."""
provider, model_name = model.split("/") if "/" in model else ("openai", model)
rates = PRICING.get(provider, {}).get(model_name, {"input": 0.001, "output": 0.002})
return (input_tokens / 1000 * rates["input"]) + (output_tokens / 1000 * rates["output"])
ステップ2: トークンカウント機能を実装する
import tiktoken
from langchain_core.callbacks import BaseCallbackHandler
class CostTrackingCallback(BaseCallbackHandler):
"""Track token usage and costs."""
def __init__(self, model: str = "gpt-4o-mini"):
self.model = model
self.total_input_tokens = 0
self.total_output_tokens = 0
self.requests = 0
def on_llm_end(self, response, **kwargs) -> None:
"""Track tokens from LLM response."""
if response.llm_output and "token_usage" in response.llm_output:
usage = response.llm_output["token_usage"]
self.total_input_tokens += usage.get("prompt_tokens", 0)
self.total_output_tokens += usage.get("completion_tokens", 0)
self.requests += 1
@property
def total_cost(self) -> float:
return estimate_cost(
self.total_input_tokens,
self.total_output_tokens,
self.model
)
def report(self) -> dict:
return {
"requests": self.requests,
"input_tokens": self.total_input_tokens,
"output_tokens": self.total_output_tokens,
"total_tokens": self.total_input_tokens + self.total_output_tokens,
"estimated_cost": f"${self.total_cost:.4f}"
}
# Usage
tracker = CostTrackingCallback()
llm = ChatOpenAI(model="gpt-4o-mini", callbacks=[tracker])
# After operations
print(tracker.report())
ステップ3: プロンプト長を最適化する
import tiktoken
def optimize_prompt(
text: str,
max_tokens: int = 2000,
model: str = "gpt-4o-mini"
) -> str:
"""Truncate text to fit within token budget."""
encoding = tiktoken.encoding_for_model(model)
tokens = encoding.encode(text)
if len(tokens) <= max_tokens:
return text
# Truncate and add indicator
truncated = encoding.decode(tokens[:max_tokens - 10])
return truncated + "... [truncated]"
def summarize_context(long_text: str, llm) -> str:
"""Summarize long context to reduce tokens."""
if count_tokens(long_text) < 2000:
return long_text
summary_prompt = ChatPromptTemplate.from_template(
"Summarize this text in 500 words or less, preserving key facts:\n\n{text}"
)
chain = summary_prompt | llm | StrOutputParser()
return chain.invoke({"text": long_text})
ステップ4: モデルの層別化戦略
from langchain_openai import ChatOpenAI
from langchain_core.runnables import RunnableBranch
# Define model tiers
llm_cheap = ChatOpenAI(model="gpt-4o-mini", temperature=0) # $0.15/1M tokens
llm_medium = ChatOpenAI(model="gpt-4o", temperature=0) # $5/1M tokens
llm_powerful = ChatOpenAI(model="o1", temperature=0) # $15/1M tokens
def select_model(input_data: dict) -> str:
"""Route to appropriate model based on task."""
task_type = input_data.get("task_type", "simple")
if task_type in ["chat", "faq", "simple"]:
return "cheap"
elif task_type in ["analysis", "summary", "medium"]:
return "medium"
else:
return "powerful"
router = RunnableBranch(
(lambda x: select_model(x) == "cheap", prompt | llm_cheap),
(lambda x: select_model(x) == "medium", prompt | llm_medium),
prompt | llm_powerful
)
# Simple chat: ~$0.0001 per request
# Complex analysis: ~$0.01 per request
# Cost reduction: 100x for simple tasks
ステップ5: キャッシング機能を実装する
from langchain_core.globals import set_llm_cache
from langchain_community.cache import RedisSemanticCache
from langchain_openai import OpenAIEmbeddings
# Semantic caching - finds similar queries
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
set_llm_cache(RedisSemanticCache(
redis_url="redis://localhost:6379",
embedding=embeddings,
score_threshold=0.95 # High similarity required
))
# Example savings:
# - "What is Python?" and "What's Python?" -> Same cached response
# - 100 similar queries -> 1 API call + 99 cache hits
# - Potential 99% cost reduction for repetitive queries
ステップ6: 予算上限を設定する
class BudgetLimitCallback(BaseCallbackHandler):
"""Enforce budget limits."""
def __init__(self, daily_budget: float = 10.0, model: str = "gpt-4o-mini"):
self.daily_budget = daily_budget
self.model = model
self.daily_spend = 0.0
self.last_reset = datetime.now().date()
def on_llm_start(self, serialized, prompts, **kwargs) -> None:
"""Check budget before request."""
today = datetime.now().date()
if today != self.last_reset:
self.daily_spend = 0.0
self.last_reset = today
if self.daily_spend >= self.daily_budget:
raise RuntimeError(f"Daily budget of ${self.daily_budget} exceeded")
def on_llm_end(self, response, **kwargs) -> None:
"""Update spend after request."""
if response.llm_output and "token_usage" in response.llm_output:
usage = response.llm_output["token_usage"]
cost = estimate_cost(
usage.get("prompt_tokens", 0),
usage.get("completion_tokens", 0),
self.model
)
self.daily_spend += cost
# Usage
budget_callback = BudgetLimitCallback(daily_budget=50.0)
llm = ChatOpenAI(model="gpt-4o-mini", callbacks=[budget_callback])
コスト最適化の概要
| 戦略 | 削減効果 | 実装の難度 |
|---|---|---|
| モデルの層別化 | 50~100倍 | 中程度 |
| レスポンスキャッシング | 50~99% | 低い |
| プロンプト最適化 | 10~50% | 低い |
| セマンティックキャッシング | 30~70% | 中程度 |
| 予算上限設定 | リスク軽減 | 低い |
出力
- トークンカウントとコスト追跡
- プロンプト最適化ユーティリティ
- コスト効率を重視したモデルルーティング
- 予算執行用コールバック
リソース
次のステップ
スケーラブルな本番運用パターンについては langchain-reference-architecture を使用してください。
ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- Brmbobo
- リポジトリ
- Brmbobo/Web2podcast
- ライセンス
- MIT
- 最終更新
- 2026/1/26
Source: https://github.com/Brmbobo/Web2podcast / ライセンス: MIT
関連スキル
agent-browser
AI エージェント向けのブラウザ自動化 CLI です。ウェブサイトとの対話が必要な場合に使用します。ページ遷移、フォーム入力、ボタンクリック、スクリーンショット取得、データ抽出、ウェブアプリのテスト、ブラウザ操作の自動化など、あらゆるブラウザタスクに対応できます。「ウェブサイトを開く」「フォームに記入する」「ボタンをクリックする」「スクリーンショットを取得する」「ページからデータを抽出する」「このウェブアプリをテストする」「サイトにログインする」「ブラウザ操作を自動化する」といった要求や、プログラマティックなウェブ操作が必要なタスクで起動します。
anyskill
AnySkill — あなたのプライベート・スキルクラウド。GitHubを基盤としたリポジトリからエージェントスキルを管理、同期、動的にロードできます。自然言語でクラウドスキルを検索し、オンデマンドでプロンプトを自動ロード、カスタムスキルのアップロードと共有、スキルバンドルの一括インストールが可能です。OpenClaw、Antigravity、Claude Code、Cursorに対応しています。
engram
AIエージェント向けの永続的なメモリシステムです。バグ修正、意思決定、発見、設定変更の後はmem_saveを使用してください。ユーザーが「覚えている」「記憶している」と言及した場合、または以前のセッションと重複する作業を開始する際はmem_searchを使用します。セッション終了前にmem_session_summaryを使用して、コンテキストを保持してください。
skyvern
AI駆動のブラウザ自動化により、任意のウェブサイトを自動化できます。フォーム入力、データ抽出、ファイルダウンロード、ログイン、複数ステップのワークフロー実行など、ユーザーがウェブサイトと連携する必要があるときに使用します。Skyvernは、LLMとコンピュータビジョンを活用して、未知のサイトも自動操作可能です。Python SDK、TypeScript SDK、REST API、MCPサーバー、またはCLIを通じて統合できます。
pinchbench
PinchBenchベンチマークを実行して、OpenClawエージェントの実世界タスクにおけるパフォーマンスを評価できます。モデルの機能テスト、モデル間の比較、ベンチマーク結果のリーダーボード提出、またはOpenClawのセットアップがカレンダー、メール、リサーチ、コーディング、複数ステップのワークフローにどの程度対応しているかを確認する際に使用します。
openui
OpenUIとOpenUI Langを使用してジェネレーティブUIアプリを構築できます。これらはLLM生成インターフェースのためのトークン効率的なオープン標準です。OpenUI、@openuidev、ジェネレーティブUI、LLMからのストリーミングUI、AI向けコンポーネントライブラリ、またはjson-render/A2UIの置き換えについて述べる際に使用します。スキャフォルディング、defineComponent、システムプロンプト、Renderer、およびOpenUI Lang出力のデバッグに対応しています。