大模型观测
大模型是机器人智能的核心。当机器人执行任务时,大模型负责理解指令、规划行动、处理异常情况。如果大模型的响应出现偏差,机器人的行为就会出错。
因此,观测大模型的调用质量至关重要:
- 响应准确性:大模型是否正确理解了用户意图?
- 延迟监控:响应时间是否影响了机器人的实时性?
- 成本追踪:Token 消耗是否在预算内?
- 故障排查:当机器人行为异常时,能否回溯到具体的对话记录?
Ticos Flux 提供两种方式来观测大模型调用。
| 模式 | 记录内容 | 适用场景 |
|---|---|---|
| 代理模式 ⭐ | 完整对话内容 + 元数据 | 调试、审计、故障排查 |
| 遥测模式 | 仅元数据(Token、延迟) | 成本监控、性能统计 |
推荐:对于机器人应用,建议使用代理模式。因为调试机器人行为需要查看完整的对话内容,而不仅仅是统计数据。
模式一:代理模式 (Proxy)
Flux 作为中间代理,拦截并记录所有 LLM 请求。
配置参数
- Base URL:
http://<flux-host>:2860/v1/llm - API Key: 使用您的 OpenRouter API Key (通常以
sk-or-开头) - Headers:
Authorization:Bearer <your-openrouter-key>(标准认证)x-robot-id: (可选) 关联的机器人 ID
Python 示例
from openai import OpenAI
client = OpenAI(
base_url="http://localhost:2860/v1/llm",
api_key="sk-or-...",
default_headers={"x-robot-id": "robot-123"}
)
response = client.chat.completions.create(
model="anthropic/claude-3-opus",
messages=[{"role": "user", "content": "Hello!"}]
)工作原理
Client → Flux (/v1/llm) → OpenRouter → Flux → Client
↓
ClickHouse (llm_logs)记录的数据
| 字段 | 说明 |
|---|---|
request_body | 完整的请求 JSON(包含 messages) |
response_body | 完整的响应 JSON(包含 assistant 回复) |
model | 使用的模型 |
prompt_tokens | 输入 Token 数 |
completion_tokens | 输出 Token 数 |
latency_ms | 响应延迟 |
robot_id | 关联的机器人 |
模式二:遥测模式 (OTLP)
OpenRouter 通过 Broadcast 功能直接推送遥测数据到 Flux,无需代理。
注意:此模式不记录对话内容,仅用于统计和监控。
配置步骤
- 登录 OpenRouter 控制台
- 添加 Broadcast 目标:OTel Collector
- 配置端点:
https://<your-flux-host>/v1/otel/v1/traces
记录的数据
| 字段 | 说明 |
|---|---|
model | 使用的模型 |
prompt_tokens | 输入 Token 数 |
completion_tokens | 输出 Token 数 |
latency_ms | 响应延迟 |
❌ request_body | 不可用 |
❌ response_body | 不可用 |
模式选择建议
| 场景 | 推荐模式 | 原因 |
|---|---|---|
| 调试机器人行为 | 代理模式 | 需要查看对话内容 |
| 审计和合规 | 代理模式 | 需要完整记录 |
| 仅统计 Token 成本 | 遥测模式 | 无需对话内容 |
| 生产环境高可用 | 代理模式 + 降级 | 见下文 |
生产环境建议
在生产环境中,可以使用代理模式并配置降级策略:
- 正常情况下通过 Flux 代理
- 如果 Flux 不可用,客户端自动切换到 OpenRouter 原生 URL
常见问题
Q: 遥测模式为什么不记录对话内容? A: 这是 OpenRouter Broadcast 的设计限制。它基于 OpenTelemetry 标准,只发送 Span 元数据,不包含完整的请求/响应体。
Q: 如果 Flux 宕机了怎么办?
- 代理模式: 客户端请求会失败,需要切换回 OpenRouter 原生 URL。
- 遥测模式: 客户端请求不受影响,仅日志丢失。