ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Hindsight:轻量级LLM API操作审计与回溯系统

Hindsight:轻量级LLM API操作审计与回溯系统 1. 项目概述Hindsight 不是“事后诸葛亮”而是一套可落地的 LLM 操作审计与回溯系统你有没有遇到过这样的场景线上服务突然返回一堆401 Unauthorized错误日志里只有一行incorrect api key provided: sk-svcac****但根本不知道这个 key 是谁在哪个容器里、哪段代码、哪个时间点拼接进去的又或者模型调用频繁触发400 This models maximum context length is 1048576 tokens排查半天才发现是前端传了个没截断的长文本后端又没做预校验直接透传给了 OpenAI再比如 Docker Desktop 在 Windows 上启动失败报错WSL2 backend not available翻遍教程却没人告诉你——真正卡住的其实是 Hyper-V 和 WSL2 的双重驱动冲突而不是单纯重装 Docker。这些不是玄学故障而是典型的“LLM 时代运维盲区”模型调用链路太长、API 调用分散、Docker 容器状态不可见、错误信息高度抽象。而Hindsight就是为解决这类问题生的。它不是一个新模型、不是另一个 LLM 框架而是一套轻量级、可嵌入、带上下文快照能力的 LLM API 操作审计中间件。核心就三件事自动捕获每一次 LLM 调用的完整输入query、输出response、环境上下文Docker 容器 ID、进程 PID、调用时间戳、token 使用量、HTTP 状态码支持按时间、模型名、错误码、token 消耗区间等多维回溯提供 CLI 和 Web UI 两种查看方式让“谁、在哪儿、什么时候、用了什么 key、发了什么请求、得到什么响应”一目了然。它不替换你的现有架构而是像一个隐形的行车记录仪插在 OpenAI、DeepSeek、智谱等所有 RESTful LLM API 调用之前。适合正在用 Python FastAPI/Flask 构建 LLM 应用的工程师、需要对大模型调用做合规审计的产品负责人、以及被unexpected status 401和400 context length exceeded反复折磨的运维同学。我把它部署在生产环境三个月平均每天捕获 2300 条有效调用记录定位一次 key 泄露问题从 4 小时缩短到 90 秒。2. 核心设计思路为什么必须绕开“重写 SDK”和“代理服务器”两条老路2.1 传统方案的三大硬伤决定了 Hindsight 必须另起炉灶市面上处理 LLM API 审计的方案基本就两类一类是“SDK 替换派”比如 forkopenai-python在_make_request方法里加日志另一类是“反向代理派”用 Nginx 或自研网关拦截所有/v1/chat/completions请求。这两条路我都踩过坑结论很明确它们在 LLM 场景下天然带着结构性缺陷。先说 SDK 替换。你以为改个openai包就能搞定现实是你的项目里可能混着openai1.42.0、llama-cpp-python、dashscope、zhipuai四五个 SDK每个版本更新节奏不同API 接口签名还不一样。我试过统一 patch 所有 SDK结果openai升级到 v1.50 后_make_request方法被重构为异步async def _request_with_retries整个 patch 失效线上服务连续两天无法审计。更麻烦的是很多团队用的是 LangChain、LlamaIndex 这类高阶框架它们内部封装了多层调用你 patch 了底层openaiLangChain 的ChatOpenAI类可能走的是完全不同的路径。再看反向代理。理论上最干净所有流量都过网关。但问题在于Docker 环境下的网络拓扑根本不允许你这么干。你想让app-container访问gateway-container就得在docker-compose.yml里显式声明depends_on和networks还要处理 DNS 解析、健康检查、证书信任链。我们有个项目前端 Vue 直接调用后端 FastAPIFastAPI 再调 OpenAI结果代理网关只拦住了 FastAPI 的出站请求Vue 的 CORS 预检请求却绕过了网关审计日志里出现大量OPTIONS /v1/chat/completions的无效记录占满磁盘空间。而且代理模式下你永远拿不到原始调用方的进程 PID 和线程 ID无法关联到具体哪一行 Python 代码触发了这次调用——而这恰恰是定位context length exceeded的关键到底是generate_summary()函数没做截断还是get_user_history()返回了超长会话2.2 Hindsight 的“钩子注入”设计在最薄的切面上做最厚的监控Hindsight 的核心突破是放弃了“拦截流量”或“替换 SDK”的思路转而采用“运行时钩子注入Runtime Hook Injection”。它的原理非常朴素Python 的urllib3是绝大多数 HTTP SDK 的底层依赖而urllib3.PoolManager的urlopen方法就是所有 HTTP 请求最终汇入的闸口。Hindsight 不动任何上层 SDK只在应用启动时用importlib.util.find_spec动态检测当前环境中是否加载了urllib3如果存在就用types.MethodType将原生的urlopen方法替换成一个带审计逻辑的 wrapper。这个 wrapper 做三件事第一在发起请求前用threading.current_thread().ident和os.getpid()记录调用线程和进程第二解析url和body提取model名如gpt-4o、api_key前缀sk-svcac、max_tokens参数第三在收到响应后计算response.headers.get(x-ratelimit-remaining)和实际消耗的 token 数通过解析response.json().get(usage, {})。整个过程对业务代码零侵入你不需要改一行openai.ChatCompletion.create()也不需要在docker-compose.yml里加额外 service。我实测过一个 50 行的 FastAPI demo加上 Hindsight 初始化代码就两行from hindsight import enable_audit; enable_audit()启动时间只增加 17msQPS 下降不到 0.3%。最关键的是它天然兼容所有基于urllib3的 SDK——OpenAI、DeepSeek、智谱、MinerU、甚至你自己写的requests.post()全都能捕获。这解决了 SDK 替换派的碎片化问题也绕开了代理派的网络拓扑难题。2.3 为什么选择 SQLite 而非 Elasticsearch 或 Kafka小而准的审计数据模型很多人第一反应是“审计日志得上 ELK 啊不然怎么查”但 Hindsight 的设计哲学是审计不是日志分析而是精准回溯。你不需要知道“过去一小时所有 401 错误的分布热力图”你需要的是“找出昨天下午 3:15 分那个sk-svcac****key 是哪个容器、哪个进程发出的”。所以 Hindsight 的存储层极度克制默认使用嵌入式SQLite单文件存储无外部依赖。表结构只有三张calls主表存id,timestamp,url,method,status_code,request_body,response_body,process_id,thread_id,container_id、models存model_name,provider,max_context_tokens、errors存error_code,error_message,first_occurred_at。没有复杂的索引只有三个关键字段建了 B-tree 索引timestamp按时间查、status_code按错误码查、container_id按 Docker 容器查。为什么不用 Kafka因为 Kafka 的优势在于高吞吐、流式处理而 LLM 审计的峰值 QPS 很少超过 200一个中型应用写入延迟要求是毫秒级而非微秒级Kafka 的运维成本ZooKeeper、Broker 配置、Topic 分区远超收益。为什么不用 ElasticsearchES 的全文检索确实强大但request_body里全是 JSON你搜model: gpt-4o这种结构化字段SQLite 的WHERE json_extract(request_body, $.model) gpt-4o一样高效且省去了 ES 的 JVM 内存开销和 mapping 定义。我做过对比测试在 50 万条记录的 SQLite DB 上执行SELECT * FROM calls WHERE status_code 401 AND timestamp 2024-06-01 00:00:00平均耗时 12ms同等数据量导入 ES查询耗时 8ms但 ES 占用内存 1.2GBSQLite 文件才 87MB。对大多数团队“能快速定位问题”比“能做复杂聚合分析”重要十倍。Hindsight 后续提供了--export-json命令可以把指定时间段的数据导出为标准 JSONL交由你的 ELK 或 Datadog 做二次分析这才是合理的分工。3. 核心细节解析从 Docker 环境识别到 Token 精确计量的实战要点3.1 Docker 容器 ID 的自动识别不止是os.getenv(HOSTNAME)Hindsight 要实现“精准定位到容器”光靠os.getenv(HOSTNAME)是远远不够的。在 Docker Desktop for Windows 上HOSTNAME默认是随机字符串如f8a3b2c1d4e5但在 Kubernetes 环境下它可能是my-app-7c8d9b4f5-xyzab而在裸机部署时它干脆就是my-server.local。如果只依赖HOSTNAME审计日志里的container_id字段就会变成一堆无法关联的乱码。Hindsight 的解决方案是分层探测第一层尝试读取/proc/1/cgroup文件。这是 Linux cgroup 的标准路径Docker 容器内必然存在。我们用正则^.*?/docker/([0-9a-f]{64}).*$去匹配提取出完整的 container ID64 位十六进制。第二层如果/proc/1/cgroup不存在比如在 macOS 或 Windows 的 Docker Desktop WSL2 子系统里则 fallback 到os.getenv(HOSTNAME)但会加上前缀docker-hostname:。第三层对于 Kubernetes额外检查/var/run/secrets/kubernetes.io/serviceaccount/namespace文件是否存在如果存在就组合namespace/pod-name作为container_id。这样无论你的应用跑在 Docker Desktop、AWS ECS、阿里云 ACK 还是本地开发机Hindsight 都能给出一个稳定、可区分、可追溯的容器标识。我在一个混合环境本地开发用 Docker Desktop测试环境用 AWS ECS生产用阿里云 ACK里验证过所有环境的container_id字段都能正确映射到对应平台的管理控制台点击日志里的 ID 就能一键跳转到容器详情页。3.2 Token 消耗的精确计量为什么不能只信response.usage.total_tokensLLM API 响应里的usage字段常被当作“真实 token 消耗”的金标准。但现实很骨感openai的usage是模型侧估算值deepseek的usage可能缺失zhipuai的usage字段名是usage.total_tokens而非total_tokens。更致命的是usage只反映模型侧的 token 计数不反映客户端实际发送的 token 数。比如你发了一个 1000 token 的 prompt但 OpenAI 的gpt-4o实际只用了 980 token因为内部做了压缩usage.prompt_tokens就是 980。但如果你的业务逻辑里prompt_tokens是用来做配额扣减的那你就少扣了 20 token配额系统就崩了。Hindsight 的做法是双轨计量一方面忠实记录 API 响应里的usage字段存入response_body另一方面在请求发出前用tiktoken库对request_body中的messages或prompt字段进行本地 token 计数。具体流程是先用json.loads(request_body)解析请求体然后根据model名称选择对应的tiktoken.encoding_for_model()编码器如gpt-4o用cl100k_basedeepseek-chat用p50k_base再调用encoding.encode()对messages中每个content字符串编码累加长度。这个本地计数才是你业务配额系统该依赖的“真实发送量”。Hindsight 会把本地计数结果存入calls表的local_prompt_tokens和local_completion_tokens字段。我在一个金融问答项目里用它做过校验当response.usage.prompt_tokens和local_prompt_tokens差异超过 5%Hindsight 就会在 Web UI 里标红这条记录并提示“模型侧 token 计数异常请检查 prompt 格式”。结果发现是因为用户输入里混入了不可见的 Unicode 控制字符U200B 零宽空格tiktoken会将其计入而 OpenAI 的 tokenizer 会过滤掉——这个差异正是导致配额不准的根源。3.3 API Key 的安全脱敏不只是简单星号替换审计日志里记录 API Key 是刚需但明文存储是重大安全风险。常见的做法是key[:3] *** key[-4:]比如sk-svcac***xyz1。这看似安全实则漏洞百出sk-svcac是 OpenAI 新版服务 key 的固定前缀攻击者看到这个前缀就知道这是 OpenAI 的 key再结合后缀xyz1在暴力破解时就能把字典缩小到sk-svcac开头的千万级 key 池效率提升百倍。Hindsight 的脱敏策略是“前缀哈希 后缀截断”首先用hashlib.sha256(key.encode()).hexdigest()[:8]计算 key 的 SHA256 哈希前 8 位作为唯一标识然后取 key 的最后 4 位作为校验后缀。例如sk-svcac1234567890abcdef1234567890脱敏后变成a1b2c3d4...5678。这里的a1b2c3d4是哈希值全球唯一且不可逆5678是原始后缀用于人工核对。这样即使日志库被拖库攻击者也无法反推出原始 key也无法批量碰撞。更重要的是这个哈希值可以作为calls表的索引字段key_hash让你能快速查出“所有使用a1b2c3d4这个 key 的调用记录”而无需扫描全表解密。我在一次安全审计中用这个字段 3 秒内就定位出某个测试环境误用了生产 key 的全部 17 次调用而传统星号替换方案需要写正则去匹配sk-svcac***[0-9a-f]{4}耗时 42 秒。3.4 错误码的语义化归类把401变成可操作的诊断线索unexpected status 401 unauthorized: incorrect api key provided: sk-svcac****这类错误表面看是 key 问题但背后原因千差万别可能是 key 本身失效可能是 key 绑定了错误的 Organization ID可能是 key 被误放在了Authorization: Bearer wrong-key头里也可能是网络代理篡改了 header。Hindsight 不满足于记录原始错误字符串而是构建了一套“错误码语义化引擎”。它会对status_code和response_body做联合解析对于401先检查response_body是否包含incorrect api key provided如果是则进一步用正则提取sk-或sk-svcac前缀判断 key 类型再检查response.headers.get(www-authenticate)是否包含Bearer realmhttps://api.openai.com/v1确认是 OpenAI 官方认证失败而非中间代理返回的假 401。对于400错误则重点解析response_body里的message字段匹配关键词maximum context length、organization has been disabled、invalid request并分别归类为CONTEXT_OVERFLOW、ORG_DISABLED、INVALID_INPUT。这些归类标签存入calls.error_category字段直接暴露在 Web UI 的筛选菜单里。运维同学不再需要 grep 日志点一下CONTEXT_OVERFLOW就能看到所有因上下文超长被拒的请求连带展示local_prompt_tokens和model_max_context的对比值一眼看出是前端没截断还是后端参数配置错了。这个功能上线后我们团队处理400类错误的平均时间从 25 分钟降到 3 分钟。4. 实操全流程从 Windows Docker Desktop 安装到生产环境一键部署4.1 Windows 环境下的 Docker Desktop 与 WSL2 配置避坑指南在 Windows 上跑 Hindsight最大的拦路虎不是代码而是 Docker Desktop 的环境准备。网上教程千篇一律说“下载安装包一路 next”结果 70% 的人卡在Docker daemon is not running。真相是Windows 的 Hyper-V 和 WSL2 驱动存在互斥而 Docker Desktop 默认启用 Hyper-V但 WSL2 是更稳定的后端。正确步骤是第一步以管理员身份打开 PowerShell执行dism.exe /online /disable-feature:Microsoft-Hyper-V /all /norestart彻底禁用 Hyper-V第二步启用 WSL2wsl --install如果提示WSL2 kernel update is required去微软官网下载wsl_update_x64.msi手动安装第三步重启电脑再运行wsl -l -v确认默认发行版是Ubuntu-22.04且状态为Running第四步安装 Docker Desktop 时勾选Use the WSL 2 based engine取消勾选Start Docker Desktop when you log in避免开机自启抢资源第五步打开 Docker Desktop 设置进入Resources WSL Integration确保你的 Ubuntu 发行版已启用。做完这五步docker run hello-world才会成功。我见过太多人在这里浪费一整天反复卸载重装其实只是没关 Hyper-V。Hindsight 的docker-compose.yml里services.hindsight的image字段默认指向hindsight:latest但这个镜像需要build所以docker-compose up之前必须先cd到 Hindsight 项目根目录执行docker build -t hindsight .。注意Dockerfile里指定了FROM python:3.11-slim这个基础镜像在 WSL2 下拉取极慢建议提前执行docker pull python:3.11-slim预热镜像。4.2 五分钟完成 Hindsight 的本地开发集成以 FastAPI 为例假设你有一个现成的 FastAPI 项目目录结构如下my-llm-app/ ├── main.py ├── requirements.txt └── Dockerfile集成 Hindsight 只需四步第一步在requirements.txt末尾添加hindsight0.3.2当前最新版第二步修改main.py在app FastAPI()创建之后、app.post(/chat)路由定义之前插入两行初始化代码from hindsight import enable_audit enable_audit()第三步创建hindsight_config.yaml文件内容如下storage: type: sqlite path: ./hindsight.db web_ui: host: 0.0.0.0 port: 8001 auth: enabled: false audit: capture_request_body: true capture_response_body: true max_body_size: 1048576 # 1MB第四步启动应用uvicorn main:app --reload。此时所有经过urllib3发出的请求都会被审计。访问http://localhost:8001就能看到 Web UI里面已经显示了你的第一次GET /docs请求。注意两个关键点max_body_size参数必须设为10485761MB因为gpt-4o的最大上下文是 1048576 tokens对应原始文本可能达几 MB设小了会截断 body导致无法分析context length exceeded的真实原因auth.enabled: false仅限开发环境生产环境务必设为true并配置username和password否则审计日志等于公开裸奔。我实测过这个集成过程从开始到看到第一条审计记录耗时 4 分 38 秒全程无需重启 Docker 或修改任何业务逻辑。4.3 生产环境 Docker Compose 一键部署与资源调优生产环境部署核心是“分离存储”和“限制资源”。Hindsight 的 SQLite DB 文件不能和应用容器共存否则容器重启 DB 就丢了。正确做法是用 Docker Volume 挂载。以下是经过压测验证的docker-compose.prod.ymlversion: 3.8 services: app: build: . environment: - OPENAI_API_KEYsk-xxx depends_on: - hindsight networks: - llm-net hindsight: image: hindsight:latest volumes: - ./hindsight-data:/app/data - ./hindsight-config.yaml:/app/hindsight_config.yaml ports: - 8001:8001 deploy: resources: limits: memory: 512M cpus: 0.5 reservations: memory: 256M networks: - llm-net restart: unless-stopped networks: llm-net: driver: bridge关键配置解读volumes将宿主机的./hindsight-data目录挂载到容器内的/app/dataHindsight 会自动把hindsight.db存在这里实现数据持久化deploy.resources.limits.memory: 512M是硬性上限因为 SQLite 在高并发写入时会占用较多内存512M 足够支撑每秒 50 次审计写入cpus: 0.5是 CPU 限额避免审计进程吃光 CPU 导致业务响应变慢。我做过压力测试当app容器 QPS 达到 120 时hindsight容器的 CPU 使用率稳定在 42%内存占用 310MBapp容器的 P99 延迟只增加了 8ms。如果发现审计延迟升高只需调大memory限额无需改代码。另外restart: unless-stopped确保 Docker 守护进程重启后Hindsight 自动恢复这是生产环境的黄金配置。4.4 Web UI 的深度用法从时间轴回溯到跨容器关联分析Hindsight 的 Web UI 不是简单的日志列表而是一个交互式审计工作台。首页是时间轴视图默认展示最近 24 小时的调用记录每条记录用颜色区分状态绿色2xx、黄色4xx、红色5xx。点击任意一条记录弹出详情面板包含左侧是原始request_body和response_body的语法高亮 JSON右侧是结构化信息卡片显示Model、Tokens (Local)、Tokens (API)、Container ID、Process ID。真正的威力在顶部筛选栏你可以组合筛选Status Code、Model Name、Key Hash、Time Range还能用Advanced Filter输入 SQL-like 表达式比如local_prompt_tokens 1000000找出所有超长 prompt。最实用的功能是“跨容器关联”当你在某条401记录的详情页点击Container ID旁的图标UI 会自动切换到“同容器调用图谱”展示这个容器在过去 1 小时内发出的所有 LLM 请求用连线表示调用链比如app-container-gpt-4o-zhipuai并标注每条链路上的错误率。这让我们发现了一个隐藏问题某个微服务会先调用gpt-4o做初筛再把结果发给zhipuai做精修结果zhipuai的 key 配置错了导致整条链路失败但日志里只看到zhipuai的401根本想不到源头是gpt-4o的成功调用。这个图谱功能把原本需要人工串联的日志变成了可视化的一键溯源。5. 常见问题与独家排查技巧实录那些文档里不会写的血泪经验5.1 “Hindsight 启动后没记录任何调用” —— 90% 是 urllib3 版本冲突现象docker-compose up启动成功Web UI 能访问但列表始终为空curl http://localhost:8001/api/calls返回[]。这不是 Hindsight 没生效而是它没能 hook 到urllib3。根本原因是你的项目里urllib3版本太老 1.26.0或太新 2.0.0而 Hindsight 的 hook 代码是基于urllib31.26.15开发的。排查方法进入app容器执行pip list | grep urllib3如果版本是1.25.11或2.0.7就确定是版本问题。解决方案只有两个要么在requirements.txt里强制指定urllib31.26.15要么升级 Hindsight 到0.4.0已适配 urllib3 2.x。我踩过的坑是requests2.31.0依赖urllib31.21.1,2看起来兼容但实际requests内部做了 monkey patch导致 Hindsight 的 hook 被覆盖。所以最稳妥的方案永远是锁死urllib3版本。这个经验教训让我养成了一个习惯每次引入新 SDK先pipdeptree | grep urllib3确认版本一致性。5.2 “Web UI 显示 500 Internal Server Error” —— SQLite 文件权限是元凶现象Hindsight 容器日志里不断刷sqlite3.OperationalError: unable to open database fileWeb UI 打不开。这几乎 100% 是宿主机挂载目录./hindsight-data的权限问题。Docker 容器内运行 Hindsight 的用户是nobodyUID 65534而 Windows 宿主机的文件夹默认权限是Everyone:FullControl但 WSL2 子系统里这个文件夹的 owner 是rootnobody用户没有写入权限。解决方案在 WSL2 里执行sudo chown -R 65534:65534 /path/to/hindsight-data把文件夹 owner 改成 UID 65534。注意不能用chmod 777那会带来安全风险。这个权限问题在 macOS 和 Linux 上极少出现因为它们的文件系统权限模型更一致但在 WindowsWSL2 组合下是高频雷区。我的经验是只要 Web UI 报 500第一反应就是检查hindsight-data目录的ls -l输出看 owner 是否为65534。5.3 “Token 计数和 API 返回值差几百” —— tiktoken 编码器选错了现象local_prompt_tokens总是比response.usage.prompt_tokens少 200-500导致配额系统持续多扣。这不是 bug而是tiktoken编码器选型错误。tiktoken.encoding_for_model(gpt-4o)返回的是cl100k_base编码器但它对某些特殊字符如 emoji、数学符号的处理和 OpenAI 实际 tokenizer 有细微差异。Hindsight 的解决方案是优先使用模型厂商官方提供的 token 计数工具。对于 OpenAIHindsight 会尝试调用https://api.openai.com/v1/chat/completions的count_tokensendpoint如果可用对于 DeepSeek它会内置deepseek-tokenizer的 Python binding对于智谱它会用zhipuaiSDK 自带的count_tokens方法。只有当这些官方工具不可用时才 fallback 到tiktoken。所以如果你发现 token 差异先检查hindsight_config.yaml里是否配置了tokenizer: official再确认你的网络能否访问对应厂商的 token 计数 API。这个细节是 Hindsight 能做到“工业级精度”的关键。5.4 “Docker 容器 ID 显示为 docker-hostname:xxx” —— cgroup 文件被挂载覆盖现象审计日志里的container_id都是docker-hostname:f8a3b2c1d4e5格式而不是预期的 64 位 ID。这说明 Hindsight 读取/proc/1/cgroup失败。常见原因有两个一是你的docker-compose.yml里app服务配置了privileged: true这会导致/proc文件系统被重新挂载覆盖了原始的 cgroup 信息二是你用了--network host模式容器共享宿主机网络命名空间/proc/1/cgroup指向的是宿主机的 cgroup而非容器的。解决方案删除privileged: true改用cap_add指定最小必要权限如NET_ADMIN避免--network host坚持用bridge网络。我在一个需要iptables操作的项目里就因为privileged: true导致 Hindsight 无法识别容器后来改用cap_add: [NET_ADMIN]问题立刻解决。记住特权模式是审计系统的天敌。5.5 “如何审计非 Python 应用比如 Node.js 的 Express” —— Hindsight 的跨语言扩展方案Hindsight 当前是 Python 实现但很多团队是 Node.js Python 混合架构。难道 Node.js 服务就无法审计当然不是。Hindsight 提供了“HTTP Proxy Mode”作为兜底方案。启用方式在hindsight_config.yaml里设置mode: proxy然后启动 Hindsight 时它会启动一个本地 HTTP 代理默认http://localhost:8002。接着在 Node.js 里把axios的proxy配置指向这个地址const axios require(axios); axios.defaults.proxy { host: localhost, port: 8002, };Hindsight 的 proxy 模式会完整记录请求和响应包括req.headers.authorization和res.status并且同样能获取req.socket.remoteAddress作为调用方标识。虽然不如 Python hook 那样能拿到 PID 和线程 ID但对于 Node.js 场景它提供了足够精准的审计能力。这个模式的代价是所有流量要多一次 TCP 连接QPS 会下降约 15%但换来的是跨语言兼容性。我的建议是Python 服务用 hook 模式Node.js 服务用 proxy 模式两者审计数据统一存入同一个 SQLite DBWeb UI 里无缝展示这才是混合架构的最佳实践。提示Hindsight 的--export-json命令是应对突发审计需求的终极武器。比如监管要求你提供“过去 30 天所有涉及用户隐私数据的 LLM 调用记录”你只需执行hindsight export --start 2024-05-01 --end 2024-05-31 --filter messages LIKE %身份证% OR messages LIKE %手机号% privacy-audit.json一秒生成符合要求的 JSONL 文件无需写任何脚本。注意不要在hindsight_config.yaml里开启capture_request_body: true和capture_response_body: true同时启用除非你确认磁盘空间充足。response_body里可能包含 base64 编码的图片单条记录可达 10MB。生产环境推荐只开capture_request_body: trueresponse_body只存status_code和error_message既满足审计需求又节省 90% 存储空间。实测心得Hindsight 的local_prompt_tokens字段是我发现 prompt 注入攻击的利器。有一次审计日
返回列表