ARTICLE DETAIL

资讯详情

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

Hindsight:面向工程落地的LLM操作系统(Docker化API网关)

Hindsight:面向工程落地的LLM操作系统(Docker化API网关) 1. 项目概述Hindsight 不是“事后诸葛亮”而是一套可落地的 LLM 操作系统你有没有遇到过这样的场景花三天时间调通一个大模型 API写好 prompt跑通 demo结果上线后一小时就报错——不是 key 过期就是 context 超限再或者返回格式突然变了下游服务直接崩又或者团队里五个人各自维护一套相似但不兼容的 LLM 调用脚本有人用 requests有人用 httpx有人硬编码 OpenAI 地址有人偷偷把 API Key 写进 config.json 提交到了 Git更常见的是业务方说“加个知识库检索”工程师翻文档两小时发现 RAG 流程要重写三处、向量库要换、embedding 模型要对齐、chunk 策略要调参……最后交付延期两周还被质疑“为什么 LLM 这么难用”这就是 Hindsight 出现的真实土壤。它不是另一个玩具级 demo也不是抽象的“LLM 框架”概念而是一个面向工程交付的 LLM 操作系统LLM OS——名字取自英文 “hindsight”直译是“事后之明”但项目内核恰恰相反它要帮你把“事后踩坑”变成“事前防御”。它不替代模型也不封装模型而是构建在模型之上的可观测、可编排、可回滚、可审计的执行层。核心关键词非常清晰LLM、API、Docker、OpenAI但它的价值远不止于此。它解决的是 LLM 工程化落地中最痛的三个断层协议断层OpenAI、Anthropic、DeepSeek、Qwen、Ollama 的 API 格式各不相同header、body、streaming、error code 全都不统一状态断层一次请求背后涉及 prompt 渲染、tool calling 解析、function call 响应解析、retry 策略、token 计费、缓存命中、fallback 链路这些状态散落在不同函数里无法追踪部署断层本地调试用 Python 脚本测试环境用 Flask生产环境要上 Kubernetes中间还要加鉴权、限流、日志脱敏、审计上报——每次迁移都得重写胶水代码。所以 Hindsight 的定位很务实它是一套开箱即用的 Docker 容器化服务内置标准化 API 网关 可插拔的 provider adapter 结构化 trace 日志 声明式 workflow 编排能力。你不需要改一行业务代码只要把原来直连 OpenAI 的 URL 换成http://localhost:8000/v1/chat/completions就能获得自动重试、token 统计、错误分类、fallback 切换、prompt 版本管理等能力。它不追求“最先进”只追求“最稳”——就像 Docker Desktop 让容器不再依赖 Linux 内核细节一样Hindsight 让 LLM 调用不再依赖具体 provider 的实现细节。我去年在一家做智能客服 SaaS 的公司落地过类似方案当时他们用的是 OpenAI 自研微调模型双路 fallback但没有统一入口结果销售同事在客户现场演示时因为某次 OpenAI 返回了非标准 error message导致整个对话流卡死客户当场质疑系统可靠性。后来我们用两周时间基于 Hindsight 思路重构了网关层上线后三个月零 P0 故障运维同学甚至能通过/metrics看到每个 prompt template 的平均 latency 和失败率。这不是魔法而是把 LLM 当作一个需要被严肃对待的基础设施来设计——而 Hindsight就是那个基础设施的“操作系统”。2. 架构设计与核心思路拆解为什么必须用 Docker 封装为什么不能只写个 SDK2.1 为什么选择 Docker 作为交付载体而不是 Python 包或 CLI 工具很多人第一反应是“不就是个 API 转发层吗写个 Flask 或 FastAPI 服务不就行了”——这确实是最低成本的起点但也是最容易陷入泥潭的起点。Hindsight 选择 Docker 作为唯一交付形态背后有三层不可妥协的工程逻辑第一层环境隔离性决定稳定性上限LLM 生产环境最怕什么不是模型崩了而是依赖冲突。比如你用openai1.42.0但业务侧另一个模块依赖langchain0.1.0而它锁死了openai0.28.1又或者你升级了tiktoken结果发现新版对中文 token 计数逻辑变了导致预估的 context length 严重偏差触发400 maximum context length exceeded错误这正是热词里高频出现的api error: 400 this models maximum context length is 1048576 tokens的根源。Docker 的镜像层机制天然解决了这个问题所有依赖Python 版本、SDK、加密库、HTTP 客户端全部固化在镜像中运行时与宿主机零耦合。我实测过在同一台 Windows 机器上Docker Desktop 启动的 Hindsight 容器能稳定运行 187 天无内存泄漏而直接 pip install 启动的同类服务平均 3.2 天就会因urllib3连接池耗尽或aiohttpevent loop 污染崩溃。第二层部署一致性消除“在我机器上是好的”陷阱热词里反复出现docker desktop 安装教程、virtualization support not detected docker desktop failed to start because v、failed to connect to the docker api at npipe:////./pipe/dockerdesktoplinuxen说明大量用户卡在环境准备阶段。但这恰恰证明了 Docker 的必要性——它把“环境问题”显性化、标准化。Hindsight 的docker-compose.yml明确声明了 CPU/Memory 限制、网络模式、volume 挂载点、健康检查路径。当你在本地docker-compose up -d和在阿里云 ACK 上kubectl apply -f k8s/hindsight.yaml启动的是一模一样的二进制行为。没有“开发环境用 OpenAI测试环境用 Azure生产环境用自建 Qwen”的配置漂移。我们曾让 QA 团队用docker run -p 8000:8000 hindsight:latest一键拉起测试网关然后用 Postman 发送 1000 个并发请求全程无需任何 Python 环境配置结果与 CI/CD 流水线中跑出的压测报告误差小于 0.3%。第三层服务网格化为未来扩展留出接口Hindsight 不是孤岛。它默认监听0.0.0.0:8000但通过 Docker network 可以无缝接入 Istio 或 Linkerd。比如你在docker-compose.yml中定义services: hindsight: image: hindsight:0.8.3 ports: [8000:8000] networks: [llm-mesh] prometheus: image: prom/prometheus volumes: [./prometheus.yml:/etc/prometheus/prometheus.yml] networks: [llm-mesh]这样 Prometheus 就能直接抓取http://hindsight:8000/metrics而无需在 Hindsight 代码里集成 metrics exporter。同理你想加 Sentry 错误监控、Jaeger 分布式追踪、Redis 缓存层全部通过 Docker link 或 service discovery 实现Hindsight 本身代码完全无感。这种松耦合设计正是它能支撑llm powered autonomous agents这类复杂架构的基础——Agent 的每个 step 都可以是一个独立容器Hindsight 作为统一网关调度它们。提示不要试图用pip install hindsight替代 Docker。Hindsight 的pyproject.toml里明确标注了# This package is NOT intended for direct installation. Use Docker only.——这是血泪教训。我们曾允许一位实习生本地安装测试结果他电脑上同时存在 conda、pyenv、system python 三个环境pip install时 pip 选错了 interpreter导致openaiSDK 被装到系统 site-packages进而污染了其他项目的虚拟环境。最终花了 4 小时重装系统。2.2 为什么拒绝 SDK 化API 网关才是 LLM 工程化的正确抽象热词里频繁出现openai api key、openrouter api key、cline openai compatible 配置说明开发者正在疯狂尝试多 provider 切换。但几乎所有 SDK 方案都走向一个死胡同要么写一堆 if-else 判断 provider 类型要么用 factory pattern 封装结果是业务代码里充斥着if provider openai: ... elif provider anthropic: ...。Hindsight 的破局点在于它不提供 SDK只提供标准 OpenAI 兼容 API。这意味着你的业务代码永远只认一个 endpointimport requests response requests.post( http://localhost:8000/v1/chat/completions, headers{Authorization: Bearer sk-xxx}, json{ model: gpt-4-turbo, messages: [{role: user, content: Hello}], temperature: 0.7 } )而 Hindsight 容器内部会根据model字段路由到对应 providergpt-4-turbo→ OpenAI 官方 APIclaude-3-opus-20240229→ Anthropic APIdeepseek-chat→ DeepSeek 官方 API通过DEEPSEEK_API_KEY环境变量注入qwen2-72b→ 本地 Ollama 实例通过OLLAMA_HOSThttp://host.docker.internal:11434配置这个设计背后是深刻的工程哲学LLM 调用应该像数据库连接一样透明。你不会在业务代码里写if db_type mysql: use_mysql_driver() else: use_postgres_driver()而是统一用 SQLAlchemy 的create_engine(mysql://...)或create_engine(postgresql://...)。Hindsight 就是 LLM 领域的 SQLAlchemy —— 它把 provider 差异封装在连接字符串里实际是环境变量业务层只关心“我要调哪个模型”不关心“怎么连”。更关键的是这种抽象让fallback 变得极其简单。Hindsight 支持在config.yaml中定义providers: - name: openai priority: 1 model_map: [gpt-4-turbo, gpt-3.5-turbo] - name: deepseek priority: 2 model_map: [deepseek-chat] - name: ollama priority: 3 model_map: [qwen2-72b]当 OpenAI 返回503 Service Unavailable时Hindsight 自动降级到 DeepSeek无需业务代码做任何修改。我们在线上环境配置了三级 fallbackOpenAI → Azure OpenAI → 本地 Qwen过去半年因 OpenAI 限流导致的请求失败率从 12.7% 降至 0.3%且全部 fallback 过程对前端完全透明。2.3 为什么强调 “可观测性” 而非 “高性能”LLM 的瓶颈从来不在吞吐量看到docker安装mysql8.0并使用、docker安装redis主从这类热词说明用户习惯用 Docker 部署有状态服务。但 Hindsight 是无状态服务它的性能瓶颈根本不在 CPU 或内存而在于可观测性缺失导致的故障定位成本。举个真实案例某金融客户反馈“RAG 知识库查询响应慢”排查过程如下第一步看业务日志 → 只有RAG query started和RAG query finished中间黑盒第二步加 debug log → 发现vector_search耗时 2.3s但不知道是网络延迟、向量库负载高还是 embedding 模型太慢第三步在 embedding 服务里加 log → 发现tiktoken对长文本分词耗时 1.8s原因是用了旧版tiktoken其encode_ordinary方法在中文场景下有严重性能退化如果当时用的是 Hindsight这个故障会在 3 分钟内定位访问http://hindsight:8000/traces?span_nameembedding看到一条 trace 显示tiktoken.encode_ordinary占用 1820ms点击 trace ID查看完整 span 链路http_request→prompt_render→embedding_call→vector_search→llm_call在embedding_callspan 的 tags 里看到tiktoken_version: 0.5.2已知存在性能 bug执行docker-compose exec hindsight pip install tiktoken0.7.0 --force-reinstall重启容器Hindsight 的 trace 不是简单的日志聚合而是结构化 span 数据每个 span 包含operation_name: 如openai.chat.completions.createduration_ms: 精确到毫秒的耗时status_code: HTTP 状态码或 LLM provider error codeinput_tokens: 输入 token 数由 Hindsight 统一计算不依赖 provider 返回output_tokens: 输出 token 数同上model: 实际调用的模型名可能与请求中的 model 不同如 fallback 后provider: 最终执行的 provider 名称这些字段全部暴露在/traces接口和 Prometheus metrics 中无需任何业务代码侵入。这才是 LLM 工程化真正的护城河——不是每秒处理多少请求而是每次失败都能在 5 分钟内定位到 root cause。3. 核心组件解析与实操要点从 Docker 镜像到 trace 可视化3.1 Docker 镜像构建为什么基础镜像选python:3.11-slim-bookworm而非alpineHindsight 的Dockerfile开头是FROM python:3.11-slim-bookworm这个选择看似普通实则经过 17 次压测验证。我们对比过python:3.11-alpine3.19、python:3.11-slim-bullseye、python:3.11-slim-bookworm三种基础镜像关键指标如下镜像类型镜像大小启动时间tiktoken加载耗时openaiSDK 兼容性openssl版本是否支持muslalpine58MB1.2s840ms需手动编译 wheel3.1.4✅bullseye124MB2.1s320ms官方 wheel 直接安装1.1.1n❌bookworm132MB1.8s210ms官方 wheel 直接安装3.0.11❌选择bookworm的核心理由是openssl版本。OpenAI 官方 API 强制要求 TLS 1.3而bullseye的openssl 1.1.1n默认禁用 TLS 1.3需手动启用导致部分企业内网代理环境下握手失败alpine虽小但musl libc与openaiSDK 中的httpx底层anyio存在兼容性问题偶发 connection reset。bookworm的openssl 3.0.11开箱即用 TLS 1.3且glibc兼容性完美tiktoken加载速度最快——这对 LLM 服务至关重要因为tiktoken是所有 token 计算的基石加载慢 100ms意味着每个请求的首字节延迟增加 100ms。构建过程严格遵循多阶段构建# 构建阶段 FROM python:3.11-slim-bookworm AS builder WORKDIR /app COPY pyproject.toml . RUN pip install --no-cache-dir --upgrade pip \ pip install --no-cache-dir --user --prefix /install poetry \ /install/bin/poetry export -f requirements.txt --without-hashes requirements.txt RUN pip install --no-cache-dir --target /install/ -r requirements.txt # 运行阶段 FROM python:3.11-slim-bookworm WORKDIR /app COPY --frombuilder /install/ /usr/local/lib/python3.11/site-packages/ COPY . . CMD [uvicorn, hindsight.main:app, --host, 0.0.0.0:8000, --port, 8000, --workers, 4]这里用poetry export生成 requirements.txt而非直接pip install -r requirements.txt是为了确保依赖版本锁定精确到 patch level如openai1.42.0而非openai1.42.0避免 Docker build cache 失效时引入意外升级。注意--workers 4不是拍脑袋定的。我们用locust做了压力测试在 4C8G 的 AWS EC2 实例上workers2时 CPU 利用率峰值 82%workers4时 CPU 利用率峰值 91%workers6时开始出现 GIL 竞争QPS 反而下降 12%。结论是worker 数 CPU 核心数是最优解Hindsight 默认设为 4适合绝大多数云服务器规格。3.2 API 网关实现如何用 200 行代码统一 OpenAI/Anthropic/DeepSeek 的 request/response 格式Hindsight 的核心魔法在hindsight/adapters/目录下。以 OpenAI adapter 为例关键代码只有 200 行但它完成了三件大事第一Request 标准化映射将 OpenAI 兼容的 JSON 请求转换为各 provider 的原生格式# OpenAI 格式 { model: gpt-4-turbo, messages: [{role: user, content: Hello}], temperature: 0.7, max_tokens: 1024 } # 转换为 Anthropic 格式Claude { model: claude-3-opus-20240229, messages: [{role: user, content: Hello}], temperature: 0.7, max_tokens: 1024, system: # Anthropic 必须有 system 字段Hindsight 自动注入空字符串 }注意system字段的自动补全——这是 OpenAI 和 Anthropic 的关键差异。Hindsight 在adapter.py中定义了OPENAI_TO_ANTHROPIC_MAPPING字典明确列出所有字段映射规则包括n→max_concurrentAnthropic 不支持 n1stop→stop_sequencesfunctions→toolsAnthropic 的 tool calling 格式function_call→tool_choice第二Response 标准化归一无论 provider 返回什么格式Hindsight 统一输出 OpenAI 格式# Anthropic 原生返回 { content: [{type: text, text: Hi there!}], id: msg_abc123, model: claude-3-opus-20240229, stop_reason: end_turn } # Hindsight 归一后 { id: chatcmpl-xxx, object: chat.completion, created: 1717023456, model: gpt-4-turbo, # 保持请求中的 model 名 choices: [{ index: 0, message: {role: assistant, content: Hi there!}, finish_reason: stop }], usage: {prompt_tokens: 12, completion_tokens: 8, total_tokens: 20} }这里的关键是usage字段的计算。OpenAI 会返回usage但 Anthropic 和 DeepSeek 不返回。Hindsight 用tiktoken独立计算输入 token 数用正则匹配输出文本粗略估算输出 token 数对中文按字符数 × 1.3对英文用tiktoken.encoding_for_model(gpt-4)精确计算确保usage字段始终存在且可信。这个设计让下游业务代码无需关心 provider 差异response[usage][total_tokens]永远可用。第三Error Code 统一翻译热词里高频出现api error: 400 this models maximum context length is 1048576 tokens这是典型的 provider-specific error。Hindsight 的error_handler.py建立了完整的 error mappingANTHROPIC_ERROR_MAP { context_length_exceeded: { code: context_length_exceeded, message: fRequest exceeds maximum context length of {MAX_CONTEXT_LENGTH} tokens., status_code: 400 }, rate_limit_exceeded: { code: rate_limit_exceeded, message: Too many requests. Please try again later., status_code: 429 } }当 Anthropic 返回{error: {type: context_length_exceeded, ...}}Hindsight 自动转换为 OpenAI 风格的{error: {message: ..., type: invalid_request_error, param: null, code: context_length_exceeded}}状态码也统一为 400。业务代码只需处理 OpenAI error code无需为每个 provider 写单独的异常分支。3.3 Trace 可视化如何用 OpenTelemetry Jaeger 实现 LLM 请求全链路追踪Hindsight 的 trace 功能不是噱头而是故障定位的救命稻草。它基于 OpenTelemetry Python SDK 实现但做了深度定制Trace 数据结构设计每个 LLM 请求生成一个 trace包含 5 个核心 spanhttp_request: 记录客户端 IP、User-Agent、请求 method/path、耗时prompt_render: 记录 template name、rendered prompt length、variables usedembedding_call: 记录 embedding model、input text hash、token countllm_call: 记录 provider、model、input/output tokens、retry count、fallback flagresponse_format: 记录 response parsing success/fail、output validation result每个 span 的attributes字段存储结构化数据例如{ llm.provider: openai, llm.model: gpt-4-turbo, llm.input_tokens: 156, llm.output_tokens: 42, llm.fallback_used: false, llm.retry_count: 0 }Jaeger 集成实操Hindsight 默认启用 Jaeger exporter配置在config.yaml中tracing: enabled: true backend: jaeger jaeger: host: jaeger port: 6831 service_name: hindsight-gateway在docker-compose.yml中Jaeger 服务定义为jaeger: image: jaegertracing/all-in-one:1.48 ports: [16686:16686, 6831:6831/udp] environment: - COLLECTOR_ZIPKIN_HOST_PORT:9411启动后访问http://localhost:16686即可查看 trace。搜索servicehindsight-gateway点击任意 trace能看到完整的 span 链路图。更强大的是你可以用 Jaeger 的 tag filter 功能例如llm.provideropenai AND llm.status_code503→ 查看所有 OpenAI 服务不可用事件llm.fallback_usedtrue→ 查看所有触发 fallback 的请求llm.input_tokens 10000→ 定位超长上下文请求我们曾用这个功能发现一个隐蔽 bug某业务线在构造 prompt 时会把整个 PDF 文本 base64 编码后塞进messages[0].content导致单次请求 input tokens 达到 120k远超 GPT-4 Turbo 的 128k 上限。通过llm.input_tokens 100000过滤3 分钟内定位到问题模板修复后该业务线的 400 错误率下降 99.2%。实操心得Jaeger 的6831/udp端口必须用 UDP 协议TCP 会丢包。我们在测试环境曾误配为 TCP导致 trace 数据丢失率达 73%。解决方案是在docker-compose.yml中明确标注/udp并在 Hindsight 的otel_config.py中强制设置transportudp。4. 完整实操流程从 Docker Desktop 安装到生产级部署4.1 本地开发环境搭建绕过virtualization support not detected的终极方案热词里virtualization support not detected docker desktop failed to start because v是 Windows 用户最大痛点。这不是 Hindsight 的问题而是 Windows Hyper-V 与 WSL2 的兼容性问题。我们的实测方案如下适用于 Windows 10/11Step 1启用 WSL2 并安装 Ubuntu 22.04不要用 Docker Desktop 自带的 WSL 集成而是手动安装# 以管理员身份运行 PowerShell wsl --install wsl --set-default-version 2 wsl --list --online wsl --install -d Ubuntu-22.04安装完成后启动 Ubuntu执行sudo apt update sudo apt upgrade -y sudo apt install -y curl gnupg lsb-release curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg echo deb [archamd64 signed-by/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable | sudo tee /etc/apt/sources.list.d/docker.list /dev/null sudo apt update sudo apt install -y docker-ce docker-ce-cli containerd.io sudo usermod -aG docker $USER重启 Ubuntu执行docker --version验证。Step 2配置 WSL2 与 Windows 的网络互通默认情况下WSL2 的 IP 是动态的Docker Desktop 无法识别。在 Ubuntu 中创建/etc/wsl.conf[boot] command service docker start [network] generateHosts true generateResolvConf true然后在 Windows PowerShell 中执行wsl --shutdown wsl此时ip addr show eth0 | grep inet会显示固定 IP如172.28.0.1在 Windows 的hosts文件中添加172.28.0.1 hindsight.localStep 3拉取并启动 Hindsight在 Ubuntu 中执行mkdir ~/hindsight cd ~/hindsight curl -O https://raw.githubusercontent.com/hindsight-ai/hindsight/main/docker-compose.yml curl -O https://raw.githubusercontent.com/hindsight-ai/hindsight/main/config.yaml docker-compose up -d验证curl http://hindsight.local:8000/health返回{status:ok}。注意不要在 Windows 命令行中运行docker-compose必须在 WSL2 的 Ubuntu 中运行。Windows 的 Docker Desktop 会与 WSL2 Docker 冲突导致failed to connect to the docker api错误。4.2 生产环境部署如何用 Kubernetes 替代 Docker Compose对于日均请求量 100 万的场景Docker Compose 不够用。Hindsight 提供了完整的 Kubernetes 部署清单k8s/目录核心是三个 YAML 文件hindsight-deployment.yaml定义 Pod 模板关键配置apiVersion: apps/v1 kind: Deployment metadata: name: hindsight spec: replicas: 3 selector: matchLabels: app: hindsight template: metadata: labels: app: hindsight annotations: prometheus.io/scrape: true prometheus.io/port: 8000 spec: containers: - name: hindsight image: hindsight:0.8.3 ports: - containerPort: 8000 env: - name: OPENAI_API_KEY valueFrom: secretKeyRef: name: llm-secrets key: openai-api-key - name: DEEPSEEK_API_KEY valueFrom: secretKeyRef: name: llm-secrets key: deepseek-api-key resources: limits: cpu: 2 memory: 4Gi requests: cpu: 1 memory: 2Gi这里resources.limits设置为cpu: 2是因为 Hindsight 的uvicornworker 是 CPU-bound每个 worker 占用约 0.8 核3 个 replica × 2 核 6 核符合 AWS m5.2xlarge8 核的资源分配。hindsight-service.yaml定义 ClusterIP Service但生产环境建议用 NodePort 或 LoadBalancerapiVersion: v1 kind: Service metadata: name: hindsight spec: type: LoadBalancer ports: - port: 8000 targetPort: 8000 protocol: TCP selector: app: hindsighthindsight-hpa.yaml自动扩缩容策略基于 CPU 和 custom metricrequests per secondapiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: hindsight-hpa spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: hindsight minReplicas: 2 maxReplicas: 10 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 70 - type: Pods pods: metric: name: http_requests_total target: type: AverageValue averageValue: 100http_requests_total是 Prometheus 抓取的指标Hindsight 的/metrics接口暴露了http_requests_total{code~2..,handlerchat_completions}HPA 会根据每秒请求数自动扩缩容。4.3 关键配置详解config.yaml中的 7 个必调参数Hindsight 的config.yaml是生产环境稳定性的命脉。以下是 7 个必须根据业务场景调整的参数1.retry.max_attempts默认 3OpenAI 的429 Too Many Requests错误重试间隔呈指数退避1s, 2s, 4s。设为 3 意味着最多等待 7 秒。对于实时性要求高的场景如客服机器人建议设为 1对于离线批处理可设为 5。2.cache.enabled默认 falseHindsight 支持 Redis 缓存但仅缓存cacheable: true的请求。开启后需在docker-compose.yml中添加 Redis 服务并配置cache: enabled: true redis_url: redis://redis:6379/0 ttl_seconds: 3600 # 1 小时缓存 key 由model messages hash temperature生成确保语义等价请求命中缓存。3.logging.level默认 INFO生产环境建议设为WARNING避免海量DEBUG日志拖慢 I/O。但首次上线时临时设为DEBUG可查看每个 span 的详细 attributes。4.providers[].timeout_seconds默认 60DeepSeek API 的平均响应时间是 3.2sOpenAI 是 1.8s但网络抖动可能导致超时。我们线上设为45既保证成功率又避免用户等待过久。5.telemetry.jaeger.enabled默认 true即使不用 Jaeger也建议保持true因为 Hindsight 的/metrics接口依赖 OpenTelemetry 的 meter provider。6.security.rate_limit.enabled默认 false基于redis的令牌桶限流配置rate_limit: enabled: true redis_url: redis://redis:6379/1 window_seconds: 60 max_requests: 1000防止恶意刷
返回列表