推論記錄分析
Advanced5 min readUpdated 2026-03-15
為 AI 鑑識調查分析推論記錄:偵測異常模式、經 metadata 辨識越獄嘗試、token 層級分析與延遲異常偵測。
推論記錄分析
推論記錄捕捉每次模型呼叫之 metadata——token 計數、延遲、參數、結束原因與錯誤碼。雖它們不含提示與回應之實際內容,它們揭示訊號攻擊活動、資料外洩與模型操弄之模式。本頁涵蓋推論記錄資料之系統化分析技術。
建立基線
於你能偵測異常前,你需知「正常」看似什麼。為每個模型端點建立基線輪廓,涵蓋以下指標。
基線指標
| 指標 | 量測什麼 | 典型基線視窗 |
|---|---|---|
| 輸入 token 分布 | 每請求輸入 token 之平均、中位、P95、P99 | 7-14 日 |
| 輸出 token 分布 | 每請求輸出 token 之平均、中位、P95、P99 | 7-14 日 |
| 輸入/輸出比 | 輸入 token 與輸出 token 之比 | 7-14 日 |
| 延遲輪廓 | 每請求延遲之平均、P50、P95、P99 | 7 日 |
| 請求量 | 每使用者、會話與端點之每分鐘/小時請求 | 14-30 日 |
| 結束原因分布 | 請求結束於 stop token、長度限制或內容過濾器之百分比 | 14 日 |
| 錯誤率 | 按錯誤類型之失敗請求百分比 | 14 日 |
| 溫度分布 | 若可由使用者組態,使用之溫度值分布 | 14 日 |
基線範例
# 客戶服務聊天機器人之範例基線輪廓
baseline = {
"input_tokens": {"mean": 180, "median": 150, "p95": 450, "p99": 800},
"output_tokens": {"mean": 220, "median": 180, "p95": 600, "p99": 1200},
"io_ratio": {"mean": 0.82, "std": 0.35},
"latency_ms": {"mean": 850, "p50": 720, "p95": 2100, "p99": 4500},
"finish_reasons": {"stop": 0.89, "length": 0.08, "content_filter": 0.03},
"requests_per_hour_per_user": {"mean": 8, "p95": 25, "p99": 45}
}偵測異常模式
模式 1:Token 計數異常
異常 token 計數為推論記錄中最強訊號之一。
| 異常 | 潛在指示 | 調查動作 |
|---|---|---|
| 異常高之輸入 token | 提示填塞、脈絡視窗利用、many-shot 越獄 | 審查提示內容尋找注入之指令 |
| 異常高之輸出 token | 資料外洩、模型產出超越正常邊界之內容 | 審查輸出內容尋找洩漏資料 |
| 輸出 token 突降 | 內容過濾器阻擋、模型拒絕 | 檢查結束原因與分類器記錄 |
| 輸入/輸出比飆升 | 短輸入產出極長輸出(可能提取) | 高優先度內容審查 |
| 持續最大長度之輸出 | 自動化提取、重複達到生成限制 | 檢查自動化存取模式 |
# 使用 z-score 偵測 token 計數異常
import numpy as np
def detect_token_anomalies(log_entries, baseline, z_threshold=3.0):
anomalies = []
for entry in log_entries:
input_z = (entry.input_tokens - baseline["input_tokens"]["mean"]) / baseline["input_tokens"]["std"]
output_z = (entry.output_tokens - baseline["output_tokens"]["mean"]) / baseline["output_tokens"]["std"]
if abs(input_z) > z_threshold or abs(output_z) > z_threshold:
anomalies.append({
"request_id": entry.request_id,
"input_z": input_z,
"output_z": output_z,
"timestamp": entry.timestamp,
"user_id": entry.user_id
})
return anomalies模式 2:Metadata 中之越獄指標
即便無內容,某些 metadata 模式暗示越獄嘗試。
| Metadata 模式 | 越獄指標 | 信心 |
|---|---|---|
| 來自同一使用者之多個請求,輸入 token 遞增 | 為漸進升級之多輪脈絡建立 | 中 |
| 內容過濾器觸發後接成功請求 | 攻擊者精煉 payload 以繞過過濾器 | 高 |
| 相似長度請求之快速連續 | 自動化越獄測試 | 高 |
| 極高輸入 token 配極低輸出 token | 填塞攻擊後接模型拒絕 | 中 |
具 finish_reason: content_filter 之請求後接同一使用者降低輸入 token | 攻擊者已辨識觸發內容並移除之 | 高 |
| 異常溫度或參數值 | 嘗試增加輸出隨機性以提高越獄可靠性 | 低中 |
模式 3:外洩模式
經模型輸出之資料外洩具不同 metadata 簽章。
| 模式 | 描述 | 偵測查詢 |
|---|---|---|
| 低輸入/高輸出比 | 短提示產出長輸出 | WHERE input_tokens < 50 AND output_tokens > 1000 |
| 循序提取 | 具單調遞增脈絡之請求系列 | 按會話分組,檢查遞增之輸入 token |
| 命中率異常 | 具特定輸出 token 計數之請求飆升 | 輸出 token 之直方圖顯示異常叢聚 |
| 會話長度異常 | 具遠多於典型輪次之會話 | WHERE turn_count > baseline.p99_turns |
模式 4:延遲異常
延遲量測可揭示於其他指標中不可見之對抗活動。
| 異常 | 潛在原因 | 調查動作 |
|---|---|---|
| 正常 token 計數之異常高延遲 | 對抗輸入造成更複雜計算 | 審查輸入尋找對抗 token 或編碼 |
| 與特定使用者相關之延遲飆升 | 使用者送出計算昂貴之輸入 | 剖析使用者之請求模式 |
| 隨時間漸進延遲增加 | 模型退化或脈絡大小增加 | 檢查脈絡視窗耗盡模式 |
| 第一 token 延遲飆升 | 異常複雜之提示處理 | 可能指示具複雜格式之提示注入 |
| 持續低延遲配高輸出 | 快取或預計算回應(可能模型受損) | 驗證模型完整性;檢查輸出快取錯誤 |
時序分析
將推論記錄作為時序資料分析揭示於個別請求分析中不可見之模式。
滾動視窗分析
# 使用滾動統計偵測模型行為轉變
import pandas as pd
def rolling_behavior_analysis(df, window="1h"):
rolling = df.set_index("timestamp").rolling(window)
metrics = pd.DataFrame({
"mean_output_tokens": rolling["output_tokens"].mean(),
"mean_input_tokens": rolling["input_tokens"].mean(),
"content_filter_rate": rolling["content_filter_triggered"].mean(),
"error_rate": rolling["is_error"].mean(),
"mean_latency": rolling["latency_ms"].mean()
})
# 標記指標顯著偏離基線之視窗
alerts = metrics[
(metrics["content_filter_rate"] > baseline_filter_rate * 3) |
(metrics["mean_output_tokens"] > baseline_output_p95) |
(metrics["error_rate"] > baseline_error_rate * 5)
]
return alerts相關性分析
交叉相關指標揭示單一指標分析錯失之模式:
| 相關性 | 訊號 |
|---|---|
| 高輸入 token + 內容過濾器觸發 | 具安全繞過 payload 之提示注入嘗試 |
| 低延遲 + 高輸出 token | 可能快取或預計算回應(異常) |
| 遞增錯誤率 + 遞減請求量 | 攻擊者遭遇錯誤並退後 |
| 使用者會話長度增加 + 輸出 token 增加 | 擴展會話間之漸進提取 |
自動化偵測查詢
以 SQL 為本之偵測
為將推論記錄儲存於可查詢資料庫之組織:
-- 偵測潛在越獄嘗試:內容過濾器觸發
-- 後接同一使用者之成功請求
SELECT
a.user_id,
a.timestamp AS blocked_at,
b.timestamp AS succeeded_at,
b.output_tokens,
EXTRACT(EPOCH FROM b.timestamp - a.timestamp) AS seconds_between
FROM inference_logs a
JOIN inference_logs b ON a.user_id = b.user_id
AND b.timestamp > a.timestamp
AND b.timestamp < a.timestamp + INTERVAL '10 minutes'
WHERE a.finish_reason = 'content_filter'
AND b.finish_reason = 'stop'
AND b.output_tokens > 500
ORDER BY a.timestamp DESC;
-- 偵測潛在資料外洩:低輸入、高輸出
SELECT
user_id,
session_id,
COUNT(*) AS request_count,
AVG(input_tokens) AS avg_input,
AVG(output_tokens) AS avg_output,
AVG(output_tokens::float / NULLIF(input_tokens, 0)) AS avg_ratio
FROM inference_logs
WHERE timestamp > NOW() - INTERVAL '24 hours'
GROUP BY user_id, session_id
HAVING AVG(output_tokens::float / NULLIF(input_tokens, 0)) > 10
AND COUNT(*) > 5
ORDER BY avg_ratio DESC;僅 Metadata 分析之限制
推論記錄分析具必須承認之固有限制:
| 限制 | 影響 | 緩解 |
|---|---|---|
| 無內容能見度 | 無法確定輸出是否含敏感資料 | 結合提示/completion 記錄分析 |
| 偽陽性 | 合法長對話看似提取 | 與內容與使用者行為分析相關 |
| 精巧攻擊者 | 可模擬正常 token 分布 | 分層多個偵測方法 |
| 模型變異性 | 輸出長度自然變化,造就雜訊 | 使用具足夠歷史之每端點基線 |
相關主題
參考資料
- "Anomaly Detection in Time Series Data" - IEEE(2024)- 適用於推論記錄之時序異常偵測之統計方法
- "OpenTelemetry Semantic Conventions for GenAI" - OpenTelemetry(2025)- 為 AI 推論監控之標準化指標
- "Detecting LLM Abuse Through API Monitoring" - arXiv:2501.xxxxx(2025)- 以 metadata 為本之濫用偵測研究
Knowledge Check
使用者於 5 分鐘內送出 12 個請求。前 3 個觸發內容過濾器。接下來 9 個成功,具漸進更短之輸入 token 與持續長之輸出 token。此模式最可能指示什麼?