プロダクション環境でLLM应用を構築する際、最大の問題の一つが呼び出しの可视化管理です。「APIがタイムアウトしたけど原因がわからない」「トークン消費をリアルタイムで追踪したい」「エラー発生時に即座にアラートを受け取りたい」——这样的需求在实际开发中极为普遍。

本稿では、LangChainのコールバック機構を活用した実践的なモニタリング・ログ記録の手法を、HolySheep AIを活用した具体的な実装例と共に解説します。

问题场景:错误日志缺失导致的障害

私の実際のプロジェクトでは、プロダクション環境にLLM統合をデプロイした直後、次のエラーに遭遇しました:

ConnectionError: HTTPSConnectionPool(host='api.openai.com', port=443): 
Max retries exceeded with url: /v1/chat/completions
(Caused by NewConnectionError('<urllib3.connection.HTTPSConnection object at 0x7f...>:
Failed to establish a new connection: [Errno 110] Connection timed out'))

TimeoutError: Request timed out after 30 seconds
Total tokens: unknown | Prompt tokens: unknown | Completion tokens: unknown

このエラーから何も情報が得られず、どこで何が起きているのか全く追踪できませんでした。LangChainのコールバック機構を活用することで、このような地狱から解放されました。

LangChainコールバック机制详解

LangChainはBaseCallbackHandler抽象クラスを中心とした灵活的回调系统を持ちます。これにより、LLM调用の全过程をモニタリングできます。

基础回调处理器实现

import os
from datetime import datetime
from typing import Any, Dict, List, Optional
from langchain.callbacks.base import BaseCallbackHandler
from langchain.schema import AgentAction, AgentFinish, LLMResult
from langchain_openai import ChatOpenAI

HolySheep AI設定

os.environ["OPENAI_API_KEY"] = "YOUR_HOLYSHEEP_API_KEY" os.environ["OPENAI_API_BASE"] = "https://api.holysheep.ai/v1" class ComprehensiveLoggingHandler(BaseCallbackHandler): """ 包括 토큰消费、延迟测量、错误追踪的综合回调处理器 対応モデル: GPT-4.1 $8/MTok、Claude Sonnet 4.5 $15/MTok、Gemini 2.5 Flash $2.50/MTok """ def __init__(self, log_file: str = "llm_calls.log"): self.log_file = log_file self.call_count = 0 self.total_tokens = 0 self.total_cost = 0.0 # 各モデルの价格($/MTok) self.model_prices = { "gpt-4": 30.0, "gpt-4-turbo": 10.0, "gpt-3.5-turbo": 2.0, "gpt-4.1": 8.0, "claude-3-sonnet": 15.0, "claude-3-opus": 75.0, "gemini-2.5-flash": 2.50, "deepseek-v3": 0.42, } def _log(self, message: str, level: str = "INFO"): timestamp = datetime.now().isoformat() log_entry = f"[{timestamp}] [{level}] {message}\n" with open(self.log_file, "a", encoding="utf-8") as f: f.write(log_entry) print(log_entry.strip()) def on_llm_start( self, serialized: Dict[str, Any], prompts: List[str], **kwargs ) -> None: self.call_count += 1 model = serialized.get("name", "unknown") self._log(f"LLM调用开始 #{self.call_count} | 模型: {model} | プロンプト長: {len(prompts[0])}文字") def on_llm_end(self, response: LLMResult, **kwargs) -> None: if response.llm_output and "token_usage" in response.llm_output: usage = response.llm_output["token_usage"] prompt_tokens = usage.get("prompt_tokens", 0) completion_tokens = usage.get("completion_tokens", 0) total_tokens = usage.get("total_tokens", prompt_tokens + completion_tokens) self.total_tokens += total_tokens # 模型价格计算(支持HolySheep的全部モデル) model = response.llm_output.get("model_name", "gpt-4") price_per_mtok = self.model_prices.get(model, 30.0) cost = (total_tokens / 1_000_000) * price_per_mtok self.total_cost += cost self._log( f"LLM调用完成 | " f"Prompt: {prompt_tokens}tok | " f"Completion: {completion_tokens}tok | " f"合計: {total_tokens}tok | " f"コスト: ${cost:.4f} | " f"累計コスト: ${self.total_cost:.4f}" ) def on_llm_error(self, error: Exception, **kwargs) -> None: error_type = type(error).__name__ error_message = str(error) self._log( f"LLMエラー発生 | 型: {error_type} | メッセージ: {error_message}", level="ERROR" )

实际应用例

handler = ComprehensiveLoggingHandler("production_llm.log") llm = ChatOpenAI( model="gpt-4.1", api_key=os.environ["OPENAI_API_KEY"], base_url=os.environ["OPENAI_API_BASE"], callbacks=[handler], request_timeout=60 ) response = llm.invoke("Hello, explain LangChain callbacks in Japanese.") print(f"回应: {response.content}")

高级监控:自定义中间件与实时アラート

先ほどの基本ハンドラーに加え、プロダクション環境ではリアルタイム监控とアラートが不可欠です。以下は、WeChat Webhook統合と自定义アラート条件を持つ高级実装です:

import json
import time
import threading
from collections import defaultdict
from dataclasses import dataclass, field
from typing import Dict, Optional
import requests
from langchain.callbacks.base import BaseCallbackHandler
from langchain.schema import LLMResult

@dataclass
class MonitoringMetrics:
    """监控指标聚合格类"""
    total_calls: int = 0
    successful_calls: int = 0
    failed_calls: int = 0
    total_tokens: int = 0
    total_latency_ms: float = 0.0
    error_counts: Dict[str, int] = field(default_factory=lambda: defaultdict(int))
    latency_by_model: Dict[str, list] = field(default_factory=lambda: defaultdict(list))

class ProductionMonitoringHandler(BaseCallbackHandler):
    """
    HolySheep AI対応 プロダクション级监控处理器
    特点:
    - 实时延迟追踪(<50msレイテンシ目标监控)
    - エラー率アラート(閾値超过时通知)
    - コスト上限アラート
    - Webhook通知(WeChat/ Slack対応)
    """
    
    def __init__(
        self,
        webhook_url: Optional[str] = None,
        cost_alert_threshold: float = 10.0,
        error_rate_alert_threshold: float = 0.1,
        latency_alert_threshold_ms: float = 5000,
    ):
        self.metrics = MonitoringMetrics()
        self.webhook_url = webhook_url
        self.cost_alert_threshold = cost_alert_threshold
        self.error_rate_alert_threshold = error_rate_alert_threshold
        self.latency_alert_threshold_ms = latency_alert_threshold_ms
        self._start_time: Optional[float] = None
        self._lock = threading.Lock()
        
        # HolySheep推奨价格表(2026年1月更新)
        self.cost_per_mtok = {
            "gpt-4.1": 8.0,
            "gpt-4-turbo": 10.0,
            "claude-sonnet-4-5": 15.0,
            "gemini-2.5-flash": 2.50,
            "deepseek-v3-2": 0.42,
        }
        self.total_cost = 0.0
    
    def _send_alert(self, title: str, message: str, level: str = "warning"):
        """Webhook通知发送(支持企业微信等)"""
        if not self.webhook_url:
            return
        
        payload = {
            "msgtype": "markdown",
            "markdown": {
                "content": f"## 🚨 LLM监控アラート [{level.upper()}]\n\n"
                          f"**{title}**\n\n{message}\n\n"
                          f"---\n*HolySheep AI 监控通知*"
            }
        }
        
        try:
            response = requests.post(
                self.webhook_url,
                json=payload,
                timeout=5
            )
            response.raise_for_status()
            print(f"[ALERT] 发送成功: {title}")
        except requests.RequestException as e:
            print(f"[ALERT ERROR] 发送失败: {e}")
    
    def _calculate_cost(self, tokens: int, model: str) -> float:
        """トークン消费コスト計算"""
        price = self.cost_per_mtok.get(model, 8.0)  # デフォルトはGPT-4.1
        return (tokens / 1_000_000) * price
    
    def on_llm_start(self, serialized: Dict, prompts: List, **kwargs):
        self._start_time = time.time()
    
    def on_llm_end(self, response: LLMResult, **kwargs):
        if self._start_time is None:
            return
            
        latency_ms = (time.time() - self._start_time) * 1000
        model = response.llm_output.get("model_name", "unknown")
        
        with self._lock:
            self.metrics.total_calls += 1
            self.metrics.successful_calls += 1
            self.metrics.total_latency_ms += latency_ms
            self.metrics.latency_by_model[model].append(latency_ms)
            
            # トークン消费記録
            if response.llm_output and "token_usage" in response.llm_output:
                usage = response.llm_output["token_usage"]
                tokens = usage.get("total_tokens", 0)
                self.metrics.total_tokens += tokens
                
                # コスト計算
                cost = self._calculate_cost(tokens, model)
                self.total_cost += cost
                
                # コスト上限チェック
                if self.total_cost >= self.cost_alert_threshold:
                    self._send_alert(
                        "コスト上限接近",
                        f"現在のコスト: ${self.total_cost:.2f}\n"
                        f"閾値: ${self.cost_alert_threshold:.2f}\n"
                        f"モデル: {model}"
                    )
        
        # 延迟监控(HolySheep目标<50ms)
        if latency_ms > self.latency_alert_threshold_ms:
            self._send_alert(
                "高延迟警告",
                f"延迟: {latency_ms:.2f}ms\n"
                f"モデル: {model}\n"
                f"目標: <50ms(HolySheep AI実績値)"
            )
    
    def on_llm_error(self, error: Exception, **kwargs):
        with self._lock:
            self.metrics.total_calls += 1
            self.metrics.failed_calls += 1
            error_type = type(error).__name__
            self.metrics.error_counts[error_type] += 1
        
        error_rate = self.metrics.failed_calls / self.metrics.total_calls
        
        if error_rate > self.error_rate_alert_threshold:
            self._send_alert(
                "エラー率上昇",
                f"エラー率: {error_rate*100:.1f}%\n"
                f"失敗回数: {self.metrics.failed_calls}\n"
                f"エラー型: {error_type}\n"
                f"最新エラー: {str(error)[:100]}"
            )
    
    def get_summary(self) -> Dict:
        """监控サマリー取得"""
        with self._lock:
            avg_latency = (
                self.metrics.total_latency_ms / self.metrics.successful_calls
                if self.metrics.successful_calls > 0 else 0
            )
            
            return {
                "総呼び出し数": self.metrics.total_calls,
                "成功": self.metrics.successful_calls,
                "失敗": self.metrics.failed_calls,
                "エラー率": f"{self.metrics.failed_calls / max(1, self.metrics.total_calls) * 100:.2f}%",
                "合計トークン": self.metrics.total_tokens,
                "平均レイテンシ": f"{avg_latency:.2f}ms",
                "総コスト": f"${self.total_cost:.4f}",
                "エラー内訳": dict(self.metrics.error_counts),
            }

使用例

monitor = ProductionMonitoringHandler( cost_alert_threshold=5.0, error_rate_alert_threshold=0.05, latency_alert_threshold_ms=3000, ) llm = ChatOpenAI( model="deepseek-v3-2", # $0.42/MTok — 最安値 api_key="YOUR_HOLYSHEEP_API_KEY", base_url="https://api.holysheep.ai/v1", callbacks=[monitor], )

批量调用监控

for i in range(10): try: response = llm.invoke(f"タスク {i} の結果を生成してください") except Exception as e: print(f"タスク {i} 失敗: {e}")

输出监控サマリー

print("\n📊 监控サマリー:") for key, value in monitor.get_summary().items(): print(f" {key}: {value}")

LangChain Expression Language(LCEL)との統合

LangChain Expression Languageを使用する場合でも、コールバックは自然に統合できます:

from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_openai import ChatOpenAI

HolySheep AI設定

llm = ChatOpenAI( model="gpt-4.1", api_key="YOUR_HOLYSHEEP_API_KEY", base_url="https://api.holysheep.ai/v1", )

监控用プロンプト

prompt = ChatPromptTemplate.from_messages([ ("system", "あなたは专业的技術ライターです。"), ("human", "{topic}について简潔に説明してください。") ])

链式调用 with 监控

chain = prompt | llm | StrOutputParser()

回调处理器設定(LCELでも同样的接口)

monitor_handler = ComprehensiveLoggingHandler()

invoke時にコールバックを渡す

response = chain.invoke( {"topic": "LangChain回调机制"}, config={"callbacks": [monitor_handler]} ) print(f"\n回应内容:\n{response}")

HolySheep AIの监控最适合场景

私自身の实践では、HolySheep AIのプロキシ服务を活用することで、监控実装の suivantsな利点を実感しています:

よくあるエラーと対処法

エラー1: 401 Unauthorized — API鍵认证失败

# 错误示例
os.environ["OPENAI_API_KEY"] = "YOUR_HOLYSHEEP_API_KEY"
os.environ["OPENAI_API_BASE"] = "https://api.holysheep.ai/v1"

base_urlに/v1が含まれているか确认すること

正しい実装

import os from langchain_openai import ChatOpenAI

必ず/v1で终了するURLを使用

os.environ["OPENAI_API_KEY"] = "YOUR_HOLYSHEEP_API_KEY" os.environ["OPENAI_API_BASE"] = "https://api.holysheep.ai/v1" llm = ChatOpenAI( model="gpt-4.1", api_key=os.environ["OPENAI_API_KEY"], base_url=os.environ["OPENAI_API_BASE"], )

认证確認

try: response = llm.invoke("ping") print("认证成功") except Exception as e: if "401" in str(e): print("API键无效。请确认:") print("1. HolySheep AIでの注册完了") print("2. API键的正确复制") print("3. 信用额的残量確認")

エラー2: ConnectionError — ネットワークタイムアウト

# タイムアウト设定の重要性
from langchain_openai import ChatOpenAI
import os

プロダクション环境では必ずタイムアウトを設定

llm = ChatOpenAI( model="gpt-4.1", api_key=os.environ.get("OPENAI_API_KEY"), base_url="https://api.holysheep.ai/v1", request_timeout=60, # 60秒タイムアウト max_retries=3, # リトライ回数 )

リトライ逻辑を実装

from tenacity import retry, stop_after_attempt, wait_exponential @retry( stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=2, max=10) ) def call_llm_with_retry(prompt: str) -> str: try: return llm.invoke(prompt).content except Exception as e: print(f"呼び出し失敗: {e}") raise #HolySheepの低延迟を活かしたタイムアウト设定 #目安: 预计延迟の2倍 + 缓冲时间

エラー3: RateLimitError — APIレート制限

# レート制限对策:セマフォによる并发制御
import asyncio
from collections import deque
from time import time

class RateLimitHandler:
    """
    简单的レートリミッター実装
    HolySheep AIのレート制限に対応
    """
    def __init__(self, max_calls: int = 60, window_seconds: int = 60):
        self.max_calls = max_calls
        self.window = window_seconds
        self.calls = deque()
    
    def acquire(self) -> bool:
        """呼び出し許可判定"""
        now = time()
        
        # 古い记录を削除
        while self.calls and self.calls[0] < now - self.window:
            self.calls.popleft()
        
        if len(self.calls) < self.max_calls:
            self.calls.append(now)
            return True
        return False
    
    def wait_time(self) -> float:
        """次の呼び出し可能までの時間(秒)"""
        if not self.calls:
            return 0
        return max(0, self.calls[0] + self.window - time())

使用例

rate_limiter = RateLimitHandler(max_calls=60, window_seconds=60) async def call_llm_with_rate_limit(prompt: str): while not rate_limiter.acquire(): wait = rate_limiter.wait_time() print(f"レート制限待ち: {wait:.2f}秒") await asyncio.sleep(wait) return await llm.ainvoke(prompt)

エラー4: ContextWindowExceededError — コンテキスト長超過

# 長い对话のコンテキスト管理策略
from langchain_core.messages import HumanMessage, AIMessage, SystemMessage
from langchain_core.chat_history import InMemoryChatHistory

class SlidingWindowChatHistory(InMemoryChatHistory):
    """
    滑动窗口方式の聊天历史记录
    古いメッセージを自动削除してコンテキスト長を管理
    """
    def __init__(self, max_messages: int = 20, max_tokens: int = 8000):
        super().__init__()
        self.max_messages = max_messages
        self.max_tokens = max_tokens
    
    def add_user_message(self, message: str) -> None:
        super().add_user_message(message)
        self._prune_if_needed()
    
    def add_ai_message(self, message: str) -> None:
        super().add_ai_message(message)
        self._prune_if_needed()
    
    def _prune_if_needed(self) -> None:
        # メッセージ数での修剪
        while len(self.messages) > self.max_messages:
            self.messages.pop(0)
        
        # トークン数での修剪(概算)
        total_chars = sum(len(m.content) for m in self.messages)
        while total_chars > self.max_tokens * 4 and len(self.messages) > 2:
            removed = self.messages.pop(0)
            total_chars -= len(removed.content)

使用例

chat_history = SlidingWindowChatHistory(max_messages=10) for i in range(50): user_input = f"ユーザー入力 {i}" chat_history.add_user_message(user_input) # AI响应 response = llm.invoke( [SystemMessage(content="你是助手。保持简洁。")] + chat_history.messages ) chat_history.add_ai_message(response.content) print(f"对话 {i}: 消息数={len(chat_history.messages)}")

まとめ:监控的最佳实践

本稿では、LangChainのコールバック机制を活用したLLM呼び出しの监控・ログ記録の手法を解説しました。关键的なポイント:

HolySheep AIを活用すれば、¥1=$1のレート(公式比85%節約)で经济的にプロダクション级监控を実現できます。WeChat Pay/Alipay対応により、日本円建てでのコスト管理も容易です。

特にDeepSeek V3.2($0.42/MTok)のような低成本モデルを活用すれば、大量呼び出しの监控コストも大幅に削減できます。

👉 HolySheep AI に登録して無料クレジットを獲得