← 返回首页
🧠

LLM日志管理

📂 llm ⏱ 2 min 329 words

--- title: "LLM日志管理" description: "介绍LLM应用的日志管理策略,包括日志设计、存储方案和分析工具的最佳实践。" tags: ["日志", "LLM", "管理"] category: "llm" icon: "🧠"

LLM日志管理

为什么日志管理对LLM应用至关重要

日志是理解LLM应用行为的基础。与传统应用不同,LLM应用的日志不仅记录系统事件,还需要捕获模型的输入输出、推理过程和质量评估结果。

有效的日志管理可以帮助团队:

日志设计原则

结构化日志格式

使用JSON格式存储日志,便于后续查询和分析:

import json
import logging
from datetime import datetime
from typing import Any, Dict

class StructuredLogger:
    def __init__(self, service_name: str):
        self.service_name = service_name
        self.logger = logging.getLogger(service_name)
    
    def log(self, level: str, message: str, **kwargs):
        log_entry = {
            "timestamp": datetime.utcnow().isoformat(),
            "service": self.service_name,
            "level": level,
            "message": message,
            **kwargs
        }
        self.logger.log(getattr(logging, level.upper()), json.dumps(log_entry))

# 使用示例
logger = StructuredLogger("chatbot")
logger.log("info", "LLM请求开始", 
    trace_id="abc-123",
    user_id="user-456",
    model="gpt-4",
    prompt_tokens=150
)

日志分级策略

根据日志的重要性和用途进行分级:

级别 用途 示例
DEBUG 开发调试 提示词完整内容、模型参数
INFO 正常业务流程 请求成功、响应完成
WARN 潜在问题 模型降级、重试请求
ERROR 错误和异常 API调用失败、解析错误
CRITICAL 严重故障 系统不可用、数据丢失

核心日志内容

请求/响应日志

记录完整的LLM交互过程:

@dataclass
class LLMLogEntry:
    trace_id: str
    timestamp: datetime
    request: Dict[str, Any]
    response: Dict[str, Any]
    metadata: Dict[str, Any]
    
    def to_dict(self) -> dict:
        return {
            "trace_id": self.trace_id,
            "timestamp": self.timestamp.isoformat(),
            "request": {
                "model": self.request.get("model"),
                "messages": self.request.get("messages"),
                "max_tokens": self.request.get("max_tokens"),
                "temperature": self.request.get("temperature")
            },
            "response": {
                "content": self.response.get("content"),
                "finish_reason": self.response.get("finish_reason"),
                "usage": self.response.get("usage")
            },
            "metadata": self.metadata
        }

审计日志

满足合规要求的审计日志应包含:

class AuditLogger:
    def log_access(self, user_id: str, action: str, resource: str, 
                   result: str, ip_address: str):
        audit_entry = {
            "timestamp": datetime.utcnow().isoformat(),
            "user_id": user_id,
            "action": action,
            "resource": resource,
            "result": result,
            "ip_address": ip_address,
            "service": "llm-platform"
        }
        self._store(audit_entry)

日志存储方案

本地开发环境

使用文件日志配合日志轮转:

from logging.handlers import RotatingFileHandler

def setup_file_logging():
    handler = RotatingFileHandler(
        "logs/llm-app.log",
        maxBytes=10*1024*1024,  # 10MB
        backupCount=5
    )
    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    handler.setFormatter(formatter)
    return handler

生产环境

生产环境推荐使用集中式日志系统:

日志分析技巧

关键指标提取

从日志中提取有价值的指标:

class LogAnalyzer:
    def __init__(self, logs: List[dict]):
        self.logs = logs
    
    def get_error_rate(self, time_window: timedelta) -> float:
        cutoff = datetime.utcnow() - time_window
        recent_logs = [l for l in self.logs 
                      if datetime.fromisoformat(l["timestamp"]) > cutoff]
        errors = [l for l in recent_logs if l["level"] == "ERROR"]
        return len(errors) / len(recent_logs) if recent_logs else 0
    
    def get_avg_latency(self) -> float:
        latencies = [l["metadata"]["latency_ms"] 
                    for l in self.logs if "latency_ms" in l.get("metadata", {})]
        return sum(latencies) / len(latencies) if latencies else 0

异常模式识别

通过日志分析发现潜在问题:

最佳实践

  1. 保持日志简洁:避免记录过多冗余信息,聚焦关键数据
  2. 脱敏处理:对用户敏感信息进行脱敏,保护隐私
  3. 上下文关联:使用trace_id串联相关日志,便于追踪
  4. 定期归档:设置合理的日志保留策略,平衡存储成本
  5. 监控告警:对异常日志模式设置自动告警

通过科学的日志管理,你可以构建一个透明、可调试、可审计的LLM应用系统。