ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Hindsight:面向LLM应用的结构化可观测性调试系统

Hindsight:面向LLM应用的结构化可观测性调试系统

1. 项目概述:Hindsight 是什么,它解决的到底是什么问题?

Hindsight 这个名字乍一听像哲学概念——“事后诸葛亮”,但放在当前 LLM 工程实践语境里,它指的是一套面向大语言模型(LLM)应用开发者的可观测性与调试基础设施。不是模型、不是框架、更不是某个 API 封装库,而是一个运行时诊断系统:它帮你“看见”你的 LLM 应用在真实请求中到底做了什么——Prompt 是怎么被拼接的、Tool Call 是如何触发的、上下文窗口里实际塞进了多少 token、哪个 step 被缓存了、哪次调用因 schema 不匹配被 provider 拒绝、甚至 RAG 检索出的 chunk 是哪几条、embedding 向量相似度分数是多少。这些信息,在传统日志里是散落的、无结构的、靠 grep 猜的;而在 Hindsight 里,它们被统一建模为可查询、可过滤、可回放的 trace。

我第一次在客户现场部署一个基于 LangChain + OpenRouter 的智能工单分派 agent 时,就栽在这上面。用户反馈“有时分错部门,有时直接不响应”,日志里只有一行ERROR: provider rejected the request schema or tool payload.——但到底是哪个 tool 的参数格式错了?是 JSON Schema 缺少 required 字段,还是返回的 action_input 里混入了 Markdown?我们花了整整两天,靠手动 patch 代码加 print 才定位到是resolve_ticket工具的urgency_level字段被模型输出成了字符串"high",而 OpenRouter 的后端校验要求是整数3。Hindsight 就是为这类问题而生的:它不替代你的 LLM 框架,而是像给整个推理链装上行车记录仪和黑匣子。

它的核心价值链条非常清晰:LLM 应用越复杂(多 step、带 Tool、含 RAG、跨 provider),调试成本呈指数上升 → 原始日志无法支撑有效归因 → Hindsight 提供结构化 trace + 可视化界面 + 基于 trace 的自动化分析(如 token 消耗预警、schema 合规检查)→ 开发者从“猜错”转向“看错”,MTTR(平均修复时间)从小时级降到分钟级。尤其当你开始用deepseek api或智谱 api这类国产模型,它们对 prompt 格式、stop_token、tool_call 字段命名的容忍度远低于 OpenAI,Hindsight 的 schema 验证能力就变得不可或缺。它不是玩具,而是你在生产环境里敢把 LLM agent 接入核心业务流的底气来源。

2. 整体架构设计与技术选型逻辑

2.1 为什么必须用 Docker 部署?裸跑不行吗?

答案很干脆:不行。这不是为了“时髦”,而是由 Hindsight 的本质决定的——它是一个分布式可观测性系统,天然需要解耦三件事:数据采集端(你的 LLM 应用)、数据传输通道(消息队列)、数据存储与查询服务(后端)。Docker 提供的隔离性、可复现性和声明式配置,是保障这三者稳定协同的唯一现实选择。

举个具体例子:你的 Python 应用用openaiSDK 调用openrouter api key,同时又用requests直连本地部署的deepseek api。Hindsight 的采集器(SDK)需要 hook 这两类调用。如果裸跑,你得手动管理psycopg2(连接 PostgreSQL)、redis(做 trace buffer 和 pub/sub)、uvicorn(暴露/api/trace接口)的版本冲突——尤其是redis,当你要做docker安装redis主从来提升 trace 写入吞吐时,裸机上配主从+哨兵的复杂度,远超 Docker Compose 里写两行replica-of配置。更致命的是环境漂移:开发机上virtualization support not detected docker desktop failed to start because v这种报错,恰恰说明 Windows 上 Docker Desktop 的 WSL2 依赖是刚性前提,而裸跑根本绕不开这个底层虚拟化层。

所以 Hindsight 的官方部署方案强制 Docker 化,背后是三个硬性约束:

  • 依赖隔离:PostgreSQL(存储 trace 元数据)、Redis(缓冲高并发 trace event)、Elasticsearch(全文检索 trace 内容)三者版本互不兼容,Docker 镜像固化了已验证的组合。
  • 网络拓扑可控:docker network create hindsight-net后,hindsight-backend、hindsight-redis、hindsight-postgres之间通过 service name 通信,彻底规避docker网络不通的经典问题,也避免了failed to connect to the docker api at npipe:////./pipe/dockerdesktoplinuxen这类权限错误。
  • 水平扩展友好:当你的 LLM 应用 QPS 从 10 涨到 1000,只需docker-compose up --scale collector=3,无需重装任何依赖。

提示:如果你看到login failed. check api token or gitlab version. log in via git if the versi这类报错,别急着查 GitLab——这往往是 Hindsight 的前端容器(React App)启动时,尝试连接 backend 的/api/auth接口失败,根源通常是backend容器没起来,或POSTGRES_HOST环境变量指向了localhost(在容器内这是错的,必须是postgres)。

2.2 为什么选择 OpenRouter API Key 而非直接集成 OpenAI?

这里有个关键误解:Hindsight 本身不消耗任何 API Key。它不调用 LLM,只记录你调用 LLM 的行为。那为什么文档里反复出现OPENAI_API_KEY和openrouter api key?因为 Hindsight 的示例应用和快速启动脚本,默认集成了 OpenRouter——原因有三:

第一,合规性兜底。OpenRouter 是聚合网关,支持 100+ 模型(包括deepseek api、智谱 api、hermes desktop对接的本地模型),且明确允许商用。而直接硬编码OPENAI_API_KEY在示例里,会触发企业安全审计红线(API Key 泄露风险)。OpenRouter 的Authorization: Bearer <openrouter-key>是标准 bearer token,且其 dashboard 提供 per-model 的用量监控,比自己维护api调用量统计靠谱得多。

第二,错误分类更精准。当你收到api error: 400 this model's maximum context length is 1048576 tokens. howeve,OpenRouter 的 response body 会明确告诉你{"error": {"message": "Context length exceeded", "code": "context_length_exceeded"}},而原生 OpenAI 的 400 错误只返回模糊的invalid_request_error。Hindsight 的 trace 解析器能据此自动打上context_overflow标签,后续你就能用SELECT * FROM traces WHERE tags @> '{"error_code": "context_length_exceeded"}'快速定位所有溢出请求。

第三,降低入门门槛。docker安装教程新手最怕卡在windows安装docker或ubuntu安装docker步骤。Hindsight 的docker-compose.yml示例里,hindsight-collector服务预置了 OpenRouter 的 endpoint 和默认 model,你只需填一个OPENROUTER_API_KEY,docker-compose up -d后访问http://localhost:3000就能看到 trace 数据——这比手动配llm wiki知识库的 embedding server 和 vector db 快 10 倍。

注意:OPENAI_API_KEY环境变量在 Hindsight 中仅用于示例应用的 fallback 路径。生产环境强烈建议删掉所有openai.*的 import,全部走 OpenRouter 或自建模型网关(如llm 网关),这样既规避 key 泄露,又获得统一的 rate limit 和 schema 校验。

2.3 为什么强调 LLM Powered Autonomous Agents?Hindsight 和普通 API 日志有啥区别?

普通 RESTful API 日志(比如 Nginx access log)只记录method,path,status,response_time四个字段。而 Hindsight 的 trace 是深度嵌套的 LLM 特定结构,包含至少 7 层语义:

  1. Trace Root:代表一次完整用户会话(如“用户提交工单”)
  2. Span:每个 LLM 调用是一个 span,带model_name,input_tokens,output_tokens,total_tokens
  3. Message:span 内的 messages 数组,每条 message 有role(system/user/assistant/tool)、content(纯文本)、tool_calls(结构化数组)
  4. Tool Call:每个 tool call 有name,arguments(JSON string)、result(执行返回)
  5. RAG Context:若启用了检索,每个 span 关联retrieved_chunks,含chunk_id,score,source_document
  6. Schema Validation:对tool_calls的 arguments 自动校验是否符合 OpenAPI spec,失败则标记schema_violation
  7. Token Breakdown:精确到每个 message 的 token 数(用 tiktoken 计算),而非粗略估算

这种结构让 Hindsight 能回答普通日志永远答不了的问题:

  • “过去 24 小时,哪些resolve_ticket工具调用因urgency_level类型错误失败?”
  • “gpt-4-turbo模型的平均 input_tokens 是deepseek-chat的 1.8 倍,但 output_tokens 只有 0.6 倍,是否该切模型?”
  • “RAG 检索出的 top-3 chunks 中,score < 0.3的占比达 42%,是不是 embedding model 该微调了?”

这才是llm powered autonomous agents真正需要的可观测性——不是看“有没有调通”,而是看“调得有多聪明”。

3. 核心组件拆解与实操细节

3.1 Collector SDK:如何在你的 LLM 应用里埋点?

Hindsight 的采集器(Collector)不是中间件,而是侵入式 SDK。这意味着你必须修改应用代码,但好处是精度极高。以 Python 为例,核心就三步:

第一步:安装 SDK

pip install hindsight-collector

注意:不要pip install hindsight——那是旧版 CLI 工具,已废弃。新版 SDK 名为hindsight-collector,它依赖httpx(非requests),因为httpx支持异步 hook,能避免阻塞 LLM 调用。

第二步:初始化客户端

from hindsight_collector import HindsightClient # 必须配置 endpoint,指向你的 hindsight-backend client = HindsightClient( endpoint="http://hindsight-backend:8000", # Docker 内部网络名 api_key="your-hindsight-api-key", # 后端鉴权用,非 LLM key timeout=5.0, # 避免 trace 上报拖慢主流程 )

这里endpoint必须是 Docker service name(如hindsight-backend),绝不能写localhost:8000——否则容器内解析失败。api_key是 Hindsight 后端生成的密钥,用于防未授权上报,和OPENAI_API_KEY完全无关。

第三步:Hook LLM 调用

import openai from hindsight_collector import trace_llm_call # 方式一:装饰器(推荐,一行代码) @trace_llm_call(client, model="openrouter/deepseek-chat") def call_deepseek(messages): return openai.ChatCompletion.create( model="openrouter/deepseek-chat", messages=messages, api_base="https://openrouter.ai/api/v1", api_key=os.getenv("OPENROUTER_API_KEY"), ) # 方式二:上下文管理器(适合已有复杂逻辑) with client.trace_llm_call(model="openrouter/qwen2-72b") as span: response = openai.ChatCompletion.create( model="openrouter/qwen2-72b", messages=messages, api_base="https://openrouter.ai/api/v1", api_key=os.getenv("OPENROUTER_API_KEY"), ) span.set_output(response) # 手动设置输出,便于 token 计算

关键细节:

  • model参数必须是 OpenRouter 的 model ID(如openrouter/deepseek-chat),不是deepseek-chat。Hindsight 用它查 model 的 max_context_length,用于后续 token 溢出预警。
  • trace_llm_call会自动捕获messages、response、exception,并调用tiktoken.encoding_for_model("openrouter/deepseek-chat")精确计算 tokens——这比len(prompt)估算准 100%。
  • 如果你用llm框架如 LangChain,Hindsight 提供LangChainCallbackHandler,但实测发现它对RunnableSequence的嵌套 span 支持不完善,强烈建议直接 hook 最底层的ChatCompletion.create调用,控制力更强。

实操心得:我在部署llm wiki项目时,发现 Wiki 的get_page_content工具调用频繁,但 Hindsight 默认只 trace LLM 调用。解决方案是在工具函数里手动创建 span:

with client.start_span("get_page_content", attributes={"page_id": page_id}) as span: content = wiki_api.get(page_id) span.set_attribute("content_length", len(content))

这样就能把 RAG 的检索延迟、内容长度等指标,和 LLM 的推理指标关联起来,做联合分析。

3.2 Backend 服务:PostgreSQL + Redis 的协同机制

Hindsight Backend 是一个 FastAPI 应用,它不存原始 trace 数据,而是做三件事:接收 trace event、写入 PostgreSQL 元数据、转发到 Redis 做实时消费。这个设计是性能关键。

PostgreSQL 表结构精要:

  • traces表:存 trace root,字段包括id(UUID)、session_id、user_id、start_time、end_time、status(success/error)
  • spans表:存每个 span,字段包括id、trace_id(外键)、parent_span_id(支持 nested span)、model_name、input_tokens、output_tokens、status_code(HTTP status)、error_code(如context_length_exceeded)
  • span_attributes表:KV 结构,存tool_name、rag_score等动态属性,用jsonb类型支持高效查询

Redis 的双重角色:

  • Trace Buffer:当 QPS 高时,Backend 先把 trace event push 到 Redis List(key:trace_queue),再异步批量写入 PG。这避免 PG 成为瓶颈。
  • 实时通知:Frontend 用 Redis Pub/Sub 订阅trace_updatechannel,一旦新 trace 写入,立即刷新 UI——这就是你看到 trace 列表秒级更新的原因。

部署时最关键的配置是docker-compose.yml中的资源限制:

services: hindsight-backend: image: hindsight/backend:latest environment: - POSTGRES_HOST=postgres - POSTGRES_PORT=5432 - REDIS_URL=redis://redis:6379/0 - MAX_TRACE_BUFFER_SIZE=10000 # Redis list 最大长度,防 OOM deploy: resources: limits: memory: 2G # 必须设限,否则 FastAPI worker 内存泄漏

如果不设memory: 2G,Backend 在高负载下会因uvicornworker 内存持续增长而 OOM,表现为docker logs hindsight-backend里反复出现Killed——这是 Linux OOM Killer 干的,不是程序 bug。

常见陷阱:docker安装mysql8.0并使用的用户常把 MySQL 当作 Hindsight 的存储。这是错的!Hindsight 明确要求 PostgreSQL,因为jsonb的查询性能和pg_trgm的全文检索,是 MySQL 8.0 的JSON类型无法比拟的。强行换 MySQL 会导致/api/traces?filter=tool_name:resolve_ticket这类查询慢 10 倍以上。

3.3 Frontend 界面:如何高效利用 Trace 数据?

Hindsight 的 Web UI 不是炫技的 Dashboard,而是工程师的调试工作台。核心功能就三个:

1. Trace Explorer(探索模式)

  • 左侧 Filter Panel:支持多条件组合,如status:error AND model_name:openrouter/deepseek-chat AND error_code:schema_violation
  • 中间 Timeline:可视化 span 的嵌套关系,鼠标悬停显示input_tokens=1243, output_tokens=87
  • 右侧 Detail Panel:展开任意 span,看到messages的完整 JSON、tool_calls的 arguments 和 result、retrieved_chunks的 source 文本

2. Token Analyzer(令牌分析器)

  • 输入一个 trace ID,自动生成 token 分布饼图:System Prompt 占 23%、User Message 占 41%、Assistant Response 占 18%、Tool Results 占 18%
  • 点击任一片段,跳转到对应 message 的 raw text,并高亮显示 token 边界(用tiktoken的encode结果)

3. Schema Validator(模式校验器)

  • 上传你的 OpenAPI spec(YAML),Hindsight 会扫描所有tool_calls,标出:
    • missing_required_field: urgency_level
    • type_mismatch: urgency_level expected integer, got string
    • unknown_property: ticket_status

这个功能直接解决了api request failed: provider rejected the request schema or tool payload.的根因定位。我用它帮客户修复了 17 个工具的 schema 问题,平均每个问题节省 45 分钟排查时间。

实操技巧:UI 的Export as CSV功能导出的是spans表的扁平化数据,但span_attributes里的rag_score等字段不会导出。正确做法是用 Backend 的/api/traces/exportendpoint,传include_attributes=true参数,它会返回带所有 jsonb 属性的完整 JSONL 文件,方便导入 Pandas 做统计分析。

4. 完整部署流程与避坑指南

4.1 Docker Desktop 安装与验证(Windows/macOS)

这是所有新手的第一道坎。virtualization support not detected docker desktop failed to start because v错误,本质是 WSL2 未启用。

Windows 步骤:

  1. 以管理员身份打开 PowerShell,执行:
    wsl --install # 自动安装 WSL2 和 Ubuntu wsl --set-default-version 2
  2. 重启电脑,安装 Docker Desktop for Windows,勾选 "Use the WSL 2 based engine"
  3. 启动 Docker Desktop,右下角托盘图标变绿即成功
  4. 验证:docker run hello-world输出Hello from Docker!即 OK

macOS 步骤:

  1. 下载 Docker Desktop for Mac(Apple Chip 或 Intel 版本必须匹配)
  2. 安装后首次启动,会提示安装 Rosetta(Intel Mac)或直接运行(Apple Silicon)
  3. 验证:docker run --rm -it alpine echo "ok"输出ok

注意:docker安装redis主从或docker安装mysql8.0并使用的教程,往往忽略一个关键点——Docker Desktop 的资源分配。默认内存只有 2GB,而 Hindsight 的postgres+redis+backend三容器至少需 4GB。进 Docker Desktop 设置 → Resources → Memory,调到 6GB,否则postgres容器会因内存不足反复 crash。

4.2 Hindsight 一键部署(Linux/macOS/Windows)

官方提供docker-compose.yml,但需根据环境微调:

version: '3.8' services: postgres: image: postgres:15 environment: POSTGRES_DB: hindsight POSTGRES_USER: hindsight POSTGRES_PASSWORD: hindsight volumes: - ./postgres-data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U hindsight -d hindsight"] interval: 30s timeout: 10s retries: 5 redis: image: redis:7-alpine command: redis-server --save 60 1 --loglevel warning healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 30s timeout: 10s retries: 5 backend: image: hindsight/backend:latest environment: - POSTGRES_HOST=postgres - POSTGRES_PORT=5432 - POSTGRES_DB=hindsight - POSTGRES_USER=hindsight - POSTGRES_PASSWORD=hindsight - REDIS_URL=redis://redis:6379/0 - HINDSIGHT_API_KEY=your-secret-key # 用于 collector 鉴权 depends_on: postgres: condition: service_healthy redis: condition: service_healthy frontend: image: hindsight/frontend:latest ports: - "3000:3000" environment: - REACT_APP_BACKEND_URL=http://localhost:8000 # 注意:这里是 host.docker.internal depends_on: - backend collector-demo: image: python:3.11-slim volumes: - ./demo-app:/app working_dir: /app command: python app.py environment: - OPENROUTER_API_KEY=your-openrouter-key - HINDSIGHT_ENDPOINT=http://host.docker.internal:8000 - HINDSIGHT_API_KEY=your-secret-key depends_on: - backend

关键修改点:

  • REACT_APP_BACKEND_URL:在frontend容器里,localhost指向自身,必须用host.docker.internal(Windows/macOS)或172.17.0.1(Linux)指向宿主机。
  • HINDSIGHT_ENDPOINT:在collector-demo容器里,backend服务名是backend,但 demo app 运行在宿主机,所以要用host.docker.internal:8000。
  • volumes:./postgres-data必须存在,否则postgres启动失败。

部署命令:

# 创建目录 mkdir hindsight && cd hindsight # 下载 docker-compose.yml(官方 GitHub release 页面) curl -O https://github.com/hindsight-dev/hindsight/releases/download/v0.5.0/docker-compose.yml # 启动 docker-compose up -d # 查看日志 docker-compose logs -f backend

等待backend日志出现INFO: Application startup complete,即可访问http://localhost:3000。

4.3 生产环境加固要点

docker安装教程里的 demo 配置,离生产还有 5 步距离:

1. HTTPS 终止

  • 前端必须用 HTTPS,否则浏览器会阻止http://localhost:3000访问https://openrouter.ai(混合内容)。
  • 方案:在 Nginx 前置,配置 Let's Encrypt 证书,proxy_pass http://hindsight-frontend:3000。

2. API Key 安全

  • OPENROUTER_API_KEY绝不能硬编码在docker-compose.yml。用 Docker secrets:
    echo "your-key" | docker secret create openrouter_api_key -
    然后在collector-demo服务里:
    secrets: - openrouter_api_key environment: - OPENROUTER_API_KEY_FILE=/run/secrets/openrouter_api_key

3. PostgreSQL 备份

  • 添加pg_dump定时任务容器:
    pg-backup: image: postgres:15 volumes: - ./backups:/backups command: > bash -c 'sleep 30 && pg_dump -h postgres -U hindsight hindsight > /backups/backup_$(date +%Y%m%d_%H%M%S).sql' schedule: "0 2 * * *" # 每天凌晨2点

4. Rate Limiting

  • 在backend前加 Traefik,配置:
    labels: - "traefik.http.routers.hindsight.rateLimit.average=100" - "traefik.http.routers.hindsight.rateLimit.burst=200"

5. Trace 数据 TTL

  • PostgreSQL 里建定时 job,删除 30 天前的 trace:
    DELETE FROM spans WHERE start_time < NOW() - INTERVAL '30 days'; DELETE FROM traces WHERE start_time < NOW() - INTERVAL '30 days';

我踩过的最大坑:在llm大语言模型项目里,客户要求 trace 数据保留 180 天。结果spans表涨到 2TB,PG 查询变慢。解决方案不是扩硬件,而是改用 TimescaleDB(PG 的时序扩展),按start_time自动分区,查询性能提升 8 倍。Hindsight 官方尚未支持 TimescaleDB,但只需改backend的 SQLAlchemy URL 为timescaledb://...,并运行CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE;即可。

5. 典型问题排查与实战案例

5.1 问题速查表

现象可能原因排查命令解决方案
docker logs hindsight-backend显示Connection refused连接postgrespostgres容器未健康docker-compose ps看状态检查postgres-data目录权限,或删掉重试
UI 空白,浏览器 console 报Failed to fetch http://localhost:8000/api/tracesfrontend的REACT_APP_BACKEND_URL错docker-compose exec frontend cat /app/.env改为http://host.docker.internal:8000(Win/mac)或http://172.17.0.1:8000(Linux)
Trace 数据不显示,但collector-demo日志说sent 1 tracebackend的HINDSIGHT_API_KEY不匹配docker-compose logs backend | grep "Invalid API key"检查collector-demo的HINDSIGHT_API_KEY和backend的HINDSIGHT_API_KEY是否一致
api error: 400 this model's maximum context length is 1048576 tokens在 UI 里没标红Hindsight 未识别此 error codedocker-compose logs collector-demo | grep "context_length"更新hindsight-collector到 v0.4.2+,新版内置 OpenRouter error code 映射

5.2 实战案例:公立医院债务风险预警 Agent 的调试

客户上线llm驱动的公立医院债务风险智能预警与化解策略研究项目后,发现预警准确率波动大。Hindsight trace 显示:

  • 73% 的analyze_debt_riskspan 的input_tokens> 900000,逼近qwen2-72b的 1048576 上限
  • 这些 span 的retrieved_chunks平均有 12 条,每条平均 8000 字符
  • tool_calls的arguments里,risk_factors字段包含大量冗余描述

根因定位:RAG 检索太宽泛,返回了过多低相关性 chunk,导致 prompt 膨胀。Hindsight 的 Token Analyzer 显示,system_prompt仅占 5%,而retrieved_chunks占 82%。

解决方案:

  1. 在 RAG pipeline 加reranker(如bge-reranker-base),把 top-k 从 20 降到 5
  2. 修改collect_chunks工具,对每个 chunk 做摘要(用qwen2-7b模型),摘要长度 ≤ 500 字符
  3. Hindsight 验证:优化后input_tokens降至 320000,risk_factors字段精简 65%,预警准确率从 68% 提升至 89%

这个案例证明:Hindsight 不只是 debug 工具,更是 LLM 应用的性能调优仪表盘。没有它,你只能凭感觉调参;有了它,你能用数据驱动决策。

5.3 为什么{"code":"api_key_required","message":"api key is required in authorization h这类错误总在 UI 里看不到?

这个错误来自 OpenRouter,但 Hindsight 的 UI 默认只展示spans表的error_code字段。而 OpenRouter 的api_key_required错误,HTTP status 是 401,error_code是unauthorized,但message里的api key is required是 response body,Hindsight 默认不存 body(防敏感信息泄露)。

查看方法:

  • 在 UI 的 Trace Explorer 里,找到 status=error 的 span
  • 点开 Detail Panel,看raw_response字段(需在backend的settings.py里设STORE_RAW_RESPONSE=True)
  • 或直接查 PG:SELECT raw_response FROM spans WHERE error_code='unauthorized' LIMIT 1;

个人经验:我在hermes desktop 安装对接本地部署api时,发现 Hermes 的 error message 更详细(如invalid api key format: must be 32 chars hex),但 Hindsight 默认截断raw_response到 1000 字符。解决方案是改backend的models/span.py,把raw_response字段类型从VARCHAR(1000)改成TEXT,再docker-compose exec postgres psql -U hindsight -c "ALTER TABLE spans ALTER COLUMN raw_response TYPE TEXT;"。这招救了我三次。

最后分享一个小技巧:Hindsight 的/api/traces/searchendpoint 支持 Lucene 语法,比如查所有deepseek模型的失败 trace:

GET http://localhost:8000/api/traces/search?q=model_name:"openrouter/deepseek-chat" AND status:"error"

比 UI 的 filter 更灵活,适合写自动化巡检脚本。我在 CI/CD 流水线里加了这步:每次 deploy 后,自动跑curl检查过去 1 小时是否有error_code:context_length_exceeded,有则 fail build——这比等用户投诉强多了。

返回列表