AI Agent生产级Harness:7大子系统构建可观测可运维智能体操作系统
1. 什么是让 AI Agent 真正下地干活的 Harness不是框架不是 SDK而是可调度、可观测、可运维的“智能体操作系统”你有没有试过用 LangChain 写一个能查天气、能订会议室、还能读邮件的 AI Agent代码跑通了本地 demo 也炫酷——但一上生产环境就卡在三件事上任务跑着跑着就断了没人知道它到底在想什么并发一上来LLM 调用全乱序结果错得离谱新插件加进去整个流程就报harness failed to load plugins日志里连哪行出的问题都找不到。这时候你才意识到你写的不是“Agent”只是个会说话的玩具真正能让 AI 持续、稳定、可追踪、可扩缩地干活的是那个藏在 Demo 背后、从不露脸却决定成败的Harness。这个词最近被 DeepSeek、Spring AI、LangGraph 社区反复提起但它既不是某个具体开源库的名字别再搜 “harness download” 了也不是某家公司的私有产品代号。Harness 是一套工程化抽象层本质是把 AI Agent 的运行时行为从“函数调用链”升级为“可观测服务进程”。它解决的不是“怎么让大模型回答问题”而是“当 200 个用户同时发来指令系统如何确保每个指令都被完整执行、状态可追溯、失败可重试、资源不耗尽”。就像 Linux 内核之于应用程序——你写 Python 不需要懂进程调度但没有内核所有程序都是裸奔。我带团队落地过 4 个工业级 AI Agent 项目从金融风控辅助到制造业设备巡检踩过所有坑。最深的体会是90% 的失败不是模型不行而是 Harness 缺位。比如某次上线后发现Agent 在处理“生成周报同步到飞书触发审批流”这个三步动作时第二步失败后第三步居然还在执行——因为没统一的状态机管理又比如高峰期 QPS 刚过 30LLM 接口就开始超时熔断但监控面板上只显示“API Error”根本看不出是 token 超限、还是上下文爆炸、还是插件死锁。这些都不是 prompt 工程能解决的是 Harness 层该兜底的事。所以标题里说的“7 个子系统”不是学术分类而是从真实生产环境反推出来的、缺一不可的工程模块。它们共同构成一个闭环输入进来 → 拆解成原子任务 → 分配资源执行 → 监控每一步 → 处理异常 → 记录全过程 → 对外暴露能力。接下来我会用实际部署过的架构图、配置片段、压测数据带你一层层拆开这 7 个子系统——不讲概念只讲你在写代码、配参数、看日志、扛并发时到底要动哪些地方、为什么这么动。2. Harness 的 7 个核心子系统从“能跑”到“稳跑”的工程分水岭2.1 任务编排引擎Orchestration EngineAgent Loop 的“交通指挥中心”很多人以为 Agent Loop 就是while not done: think → act → observe这个简单循环。但在生产环境这个循环必须被接管、被拆解、被注入控制逻辑。任务编排引擎就是把单次 Loop 拆成可调度、可中断、可重入的原子任务单元并定义它们之间的依赖关系与执行策略。我们用一个真实案例说明某客户要求 Agent 完成“分析销售数据 → 生成 PPT → 邮件发送给总监”。在 Demo 里这可能是一段串行代码但在 Harness 中它会被自动拆解为Task A调用 SQL Agent 查询 Q3 各区域销售额依赖数据库连接池Task B调用 Charting Tool 生成柱状图依赖 GPU 资源Task C调用 LLM 撰写 PPT 文案依赖 LLM API 配额Task D调用 PowerPoint SDK 渲染 PPT依赖 Windows Server 实例Task E调用 SMTP Service 发送邮件依赖企业邮箱白名单提示编排引擎的核心能力不是“多线程”而是“状态持久化”。每次 Task 执行前必须将当前上下文包括历史消息、工具调用参数、临时文件路径序列化存入 Redis 或 PostgreSQL失败时能从断点恢复而不是从头开始。我们实测过未启用持久化时网络抖动导致 Task B 失败整个流程需重跑 8 分钟启用后5 秒内从 Task B 继续。关键配置项以 LangGraph FastAPI 实现为例# task_definition.py from typing import Dict, Any from langgraph.graph import StateGraph class SalesReportWorkflow: def __init__(self): self.graph StateGraph(State) # 每个节点都标注资源需求和超时阈值 self.graph.add_node(query_db, self._run_query, resource{cpu: 0.5, memory_mb: 512, timeout_sec: 30}) self.graph.add_node(gen_chart, self._run_chart, resource{gpu: 0.25, timeout_sec: 60}) self.graph.add_node(gen_ppt_text, self._run_llm, resource{llm_model: qwen2-72b, max_tokens: 2048}) # 显式定义依赖gen_ppt_text 必须等 query_db 和 gen_chart 都成功 self.graph.add_edge(query_db, gen_ppt_text) self.graph.add_edge(gen_chart, gen_ppt_text)为什么不用纯 LangChain Chain因为 Chain 是单向流水线无法表达“Task C 依赖 Task A 和 Task B 的输出”更无法做资源隔离。而编排引擎强制要求每个 Task 声明资源需求这是后续弹性扩缩的基础。2.2 工具注册与路由中心Tool Registry Router让 Agent “认识”所有可用能力“Tools Actions” 热词背后藏着一个致命陷阱很多项目把工具当函数硬编码进 Agent 逻辑里比如if user_ask 查天气: call_weather_api()。这导致两个问题一是新增工具要改核心代码二是无法做权限控制和调用审计。工具注册与路由中心本质是一个动态插件市场 智能路由网关。它要求所有工具无论本地 Python 函数、HTTP 微服务、还是 RPA 流程都遵循统一契约注册由 Harness 统一管理生命周期、调用频次、错误重试策略。我们部署的典型结构┌─────────────────┐ ┌───────────────────────┐ ┌──────────────────┐ │ Tool Plugin │────▶│ Tool Registry (Redis) │────▶│ Tool Router (FastAPI) │ │ • weather.py │ │ • name: weather │ │ • /v1/tools/{name} │ │ • db_query.py │ │ • endpoint: http://... │ │ • auth: JWT RBAC │ │ • rpa_login.exe │ │ • schema: OpenAPI 3.0 │ │ • rate_limit: 10/s │ └─────────────────┘ └───────────────────────┘ └──────────────────┘注册一个新工具只需三步以 Python 插件为例编写符合ToolInterface的类必须实现invoke()和schema()方法放入plugins/目录Harness 启动时自动扫描加载在 Redis 的tool_registryHash 中写入元数据我们用脚本自动化# 自动注册脚本片段 redis-cli hset tool_registry:weather \ name weather \ description Get current weather by city name \ endpoint http://weather-svc:8000/v1/current \ schema {parameters:{city:{type:string}}} \ permissions [user,admin]注意Router 层必须做 Schema 校验。我们曾遇到因前端传错参数类型如 city 传了数字 123导致下游服务直接崩溃。现在 Router 在转发前校验 OpenAPI Schema非法请求直接 400 返回不触达工具本身。实操心得工具注册不是“一次配置永久有效”。我们要求所有工具接口必须提供/health和/version端点Harness 每 30 秒轮询一次自动下线不可用工具。某次数据库维护db_query工具自动降级Agent 改走缓存 fallback用户无感知——这就是路由中心的价值。2.3 上下文管理器Context Manager解决 LLM “健忘症” 的工程方案LLM 的上下文窗口有限Qwen2-72B 最大 128K但实际业务中常卡在 32K而真实任务往往需要跨多轮、跨多工具积累信息。比如“帮我订下周二去上海的机票”后续追问“改成周三”Agent 必须记住“目的地是上海”、“航班类型是经济舱”等隐含约束。靠 prompt 拼接Token 早爆了。上下文管理器不是简单地存 chat history而是构建一个分层、可裁剪、带 TTL 的知识图谱。它把对话拆解为三类实体Session State本次会话的临时变量如current_cityShanghaiTTL24hUser Profile用户长期偏好如preferred_airlineChina EasternTTL永久但可被显式更新World Knowledge领域常识如shanghai_iata_codeSHATTL7d自动刷新我们用 Neo4j 图数据库实现节点类型包括:Session,:User,:Entity,:Relation。每次 Agent 调用工具后自动提取关键实体并建立关联// 示例查询上海天气后自动建立关联 CREATE (s:Session {id:sess_abc123})-[:KNOWS]-(c:City {name:Shanghai, iata:SHA}) CREATE (s)-[:USES]-(w:WeatherService {provider:AccuWeather})当用户问“上海天气怎么样”Context Manager 先查Session节点发现已有关联City直接复用若问“北京呢”则新建City节点并关联。这样无论对话多长LLM 只需注入当前 Session IDHarness 自动拼接相关子图作为 contextToken 消耗降低 65%。常见误区有人用 Redis Hash 存 key-value 对但这无法表达“上海属于中国中国首都北京”这类层级关系。我们压测发现当用户连续问 12 个不同城市天气时纯 KV 方案 context size 达 28K tokens图谱方案仅 4.2K且支持语义检索如“找所有沿海城市”。2.4 执行沙箱Execution Sandbox给每个工具调用划出“安全责任田”让 Agent 调用外部工具最大的风险不是结果不准而是失控。比如一个 RPA 插件误操作删除了生产数据库或一个本地 Python 工具os.system(rm -rf /)。Harness 必须确保工具只能访问授权资源失败不能影响其他任务。执行沙箱不是 Docker 容器太重而是基于 Linux cgroups seccomp namespace 的轻量级隔离层。我们用bubblewrapbwrap实现每个工具调用启动一个独立进程限制如下资源类型限制值作用CPU Quota500ms/sec防止 CPU 密集型工具拖垮整机Memory1GB max避免内存泄漏OOMFilesystem只读/usr 读写/tmp/tool_{id}禁止修改系统文件Network仅允许访问tools.internal域名防止外连恶意网站Syscall黑名单openat,unlink,execve等 47 个危险调用彻底杜绝rm -rf配置示例bwrap 命令bwrap \ --cap-drop ALL \ --unshare-pid --unshare-net --unshare-ipc \ --ro-bind /usr /usr \ --bind /tmp/tool_abc123 /tmp \ --blockfd 3 --dev-bind /dev/null /dev/null \ --seccomp-data ./seccomp_rules.json \ --rlimit-as1073741824 \ --cpu-quota500000 \ python3 /plugins/weather.py $INPUT注意沙箱不是万能的。我们曾发现某 RPA 工具通过dbus通信绕过网络限制最终在 seccomp 规则中加入dbus_sendsyscall 拦截。沙箱规则必须随工具迭代持续更新建议建立“工具安全白名单”机制新插件上线前强制通过沙箱测试。实操心得沙箱性能损耗约 8%但换来的是 100% 的故障隔离。某次db_query工具因 SQL 注入漏洞被攻击沙箱内进程被 kill其他 23 个并发任务完全不受影响——这比任何灾备方案都管用。2.5 状态机与决策中枢State Machine Decision Hub让 Agent “知道自己在做什么”Agent Loop 的think步骤常被简化为“调 LLM 生成下一步 action”。但生产环境需要确定性LLM 输出可能不稳定同一输入两次结果不同而业务流程必须可预测。状态机与决策中枢是用确定性规则兜底 LLM 的不确定性。我们采用混合决策模式LLM 主决策生成 high-level plan如 “先查库存再比价最后下单”规则引擎辅决策对每个 step 做合法性校验如 “下单前必须库存 0”否则跳转 error state人工干预点关键步骤如支付自动进入 approval state等待运营确认状态机定义用 Pydantic Graphviz 可视化from enum import Enum class OrderState(str, Enum): INIT init # 接收用户指令 CHECK_STOCK check_stock # 调用库存工具 COMPARE_PRICE compare_price # 调用比价工具 WAIT_APPROVAL wait_approval # 人工审核 PLACE_ORDER place_order # 下单 ERROR error # 状态转移规则确定性 TRANSITIONS { OrderState.INIT: [OrderState.CHECK_STOCK], OrderState.CHECK_STOCK: [OrderState.COMPARE_PRICE, OrderState.ERROR], OrderState.COMPARE_PRICE: [OrderState.WAIT_APPROVAL, OrderState.ERROR], OrderState.WAIT_APPROVAL: [OrderState.PLACE_ORDER, OrderState.ERROR], }决策中枢的输入是 LLM 的 JSON 输出如{next_action: check_stock, params: {sku: ABC123}}但输出必须经过规则引擎校验def validate_next_action(state: OrderState, llm_output: dict) - bool: if state OrderState.CHECK_STOCK and llm_output[next_action] ! check_stock: return False # 强制必须先查库存 if sku not in llm_output.get(params, {}): return False # SKU 参数必填 return True压测数据纯 LLM 决策时1000 次订单流程中 37 次因 LLM “幻觉”跳过库存检查加入状态机后错误率归零且平均决策延迟仅增加 12ms规则校验在内存完成。2.6 可观测性管道Observability Pipeline让 AI 的“思考过程”变成可查日志调试 Agent 最痛苦的不是报错而是“没报错但结果不对”。比如用户说“把报表发给张经理”Agent 却发给了李经理——你翻遍日志只看到LLM returned: {to: licompany.com}但不知道 LLM 为什么这么选。可观测性管道是把 Agent 的每一次推理、工具调用、状态变更都打标、采样、结构化注入统一日志/指标/链路系统。我们用 OpenTelemetry 实现关键设计Trace Level每个用户会话一个 TraceID贯穿所有微服务Span Level每个 Loop Step 一个 Span如span_namellm_think记录输入 prompt、输出 token 数、耗时、模型版本Log Level每个工具调用生成结构化 LogJSON包含tool_name,input_hash,output_hash,error_codeMetric Level实时聚合agent_loop_duration_seconds,tool_call_success_rate,llm_token_usage_total关键配置OTel Collector# otel-collector-config.yaml receivers: otlp: protocols: grpc: exporters: logging: prometheus: endpoint: 0.0.0.0:9090 loki: endpoint: http://loki:3100/loki/api/v1/push service: pipelines: traces: receivers: [otlp] exporters: [logging, prometheus] logs: receivers: [otlp] exporters: [loki]实战价值某次用户投诉“Agent 总是选错邮箱”我们在 Grafana 查tool_call_success_rate发现email_lookup工具成功率仅 62%进一步查 Loki 日志发现 93% 失败都因error_codeNAME_AMBIGUOUS最终定位到 HR 系统姓名字段存在重名未去重。没有这套管道这个问题会永远归咎于“LLM 不够聪明”。2.7 生命周期管理器Lifecycle ManagerAgent 不是“一次部署永久运行”AI Agent 不同于传统 Web 服务它的生命周期更复杂会话有 idle timeout工具插件需 hot reloadLLM 模型要灰度发布甚至整个 Harness 集群要滚动升级。生命周期管理器是让 Agent 服务像 Kubernetes Pod 一样具备自愈、扩缩、升级能力。核心能力矩阵能力实现方式生产价值会话管理Redis Sorted Set 存储session_id: last_active_ts定时 Job 清理 idle 30min 会话内存占用降低 40%避免僵尸会话堆积插件热更新Watchplugins/目录inotify 触发reload_plugin(weather)旧实例 graceful shutdown新增天气源无需重启服务SLA 99.99%模型灰度在 Router 层按user_id % 100分流95% 流量走 v1.25% 走 v1.3对比task_success_rate避免新模型全量上线导致业务受损集群扩缩Prometheus 抓取agent_loop_queue_lengthHPA 触发 K8s Pod 扩容Black Friday 流量峰值自动从 4 Pod 扩到 12 Pod最体现工程深度的是会话迁移当某台机器负载过高Lifecycle Manager 会主动将部分活跃会话迁移到新节点。迁移不是简单复制内存而是暂停该会话所有新请求返回 503将 Context Manager 中的 Session Graph 序列化导出在目标节点重建 Session State 和关联 Entity恢复请求处理我们实测单次迁移耗时 800ms用户无感知。没有这个能力水平扩展会变成灾难——新节点永远拿不到老会话上下文。3. 如何从零搭建一个生产级 Harness避开 90% 项目踩过的坑3.1 技术栈选型为什么我们放弃 LangChain选择 LangGraph FastAPI Redis Neo4j很多团队起步就选 LangChain因为它封装好、教程多。但我们四个项目全部重构为 LangGraph原因很现实LangChain 的 Runnable 是单向流水线无法表达Task C依赖Task A和Task B的并行结果。而 LangGraph 的 StateGraph 天然支持分支合并ConditionalEdge写法直观def route_to_tool(state: State) - str: if weather in state[query]: return weather_tool elif stock in state[query]: return stock_tool else: return llm_fallback graph.add_conditional_edges(router, route_to_tool)LangChain 的 Callback 系统太重日志埋点侵入业务代码LangGraph 的add_node直接支持on_start,on_end钩子可观测性接入成本降低 70%。FastAPI 替代 Flask是因为自动 OpenAPI 文档Tool Router 的接口契约直接生成 Swagger UI前端调试效率翻倍内置依赖注入轻松注入RedisClient,Neo4jDriver,LLMClient测试时 mock 更方便Redis 选型强调两点必须用 Redis Stack非社区版因为需要 RedisJSON存 Session State、RedisSearch查 User Profile、RedisTimeSeries存 Metrics集群模式禁用 Proxy直接用 Redis Cluster Client避免网络跳转增加延迟Neo4j 选择 Community Edition 而非 Aura Cloud因为图查询性能敏感如MATCH (s:Session)-[r]-(c:City) WHERE s.id$sid RETURN c.name本地 SSD 盘比云数据库快 3.2 倍我们用 Cypher APOC 库实现自动 TTL 清理比 MongoDB 的 TTL Index 更精准注意不要迷信“最新技术”。我们曾试过用 DuckDB 替代 Neo4j 存图谱虽然轻量但并发查询时 CPU 占用飙升最终回退。选型标准只有一条在 1000 QPS、P99 200ms 的 SLA 下哪个组合最稳。3.2 关键参数调优那些文档里不会写的数字参数不是随便填的每个数字背后都是压测数据参数推荐值依据踩坑记录LLM 调用 timeout45sQwen2-72B 在 32K context 下P99 响应 38s设 30s 导致 12% 请求被误判超时重试放大负载Redis Session TTL24h用户最长会话间隔实测 18h留 6h buffer设 1h 导致用户切 Tab 后重新登录NPS 降 22 分Neo4j 查询超时5s复杂图遍历 P99 4.1s设 5s 避免雪崩设 1s 导致 30% 查询失败fallback 到 KV 降级沙箱 CPU Quota500ms/sec工具平均 CPU 使用率 420ms/sec留 15% 余量设 300ms 导致 8% 工具被 throttled任务排队Prometheus 抓取间隔15sMetrics 变化频率 P95 8s15s 平衡精度与存储设 5s 使 TSDB 存储增长 3 倍成本不可控特别提醒harness failed to load plugins错误90% 是插件初始化超时。我们规定所有插件__init__必须 2s超时自动 skip 加载。排查时先看plugin_init_duration_seconds指标而非日志。3.3 部署架构为什么我们坚持“单集群多租户”而非“一客户一集群”很多 SaaS 厂商为每个客户单独部署 Harness看似隔离实则灾难运维成本指数级增长100 客户 100 套监控告警模型更新要重复 100 次灰度发布失效资源碎片化整体利用率不足 30%我们采用Shared Cluster with Tenant Isolation物理层K8s 集群统一纳管Node Pool 按 CPU/GPU 类型划分网络层Calico NetworkPolicy 限制tenant-aPod 只能访问tenant-aRedis/Neo4j数据层Redis Key 前缀tenant_a:session:xxxNeo4j 多数据库tenant_a_graph应用层FastAPI Middleware 解析X-Tenant-ID自动注入 tenant context好处立竿见影新客户上线时间从 2 小时缩短至 8 分钟只需创建 tenant DB 和 namespace模型升级一次生效全部客户灰度比例精确到 0.1%资源利用率从 28% 提升至 67%月省云成本 $12,000提示租户隔离的底线是数据隔离。我们禁止任何跨 tenant 的 JOIN 查询所有数据访问必须带 tenant_id 参数ORM 层强制拦截。3.4 压测与验收用真实业务流量验证 Harness 成色别信 Demo 数据。我们验收 Harness 的唯一标准在模拟真实业务流量下P99 延迟 ≤ 200ms错误率 ≤ 0.1%资源利用率 ≤ 70%。压测方案流量生成用 Locust 模拟 500 并发用户脚本复刻真实场景如 60% 查数据、20% 下单、15% 问客服、5% 复杂多步任务瓶颈定位kubectl top pods查 CPU/Memoryistio proxy-status查 Sidecar 延迟redis-cli --latency查 Redis 延迟熔断验证手动kubectl scale deploy/harness --replicas1观察是否自动触发降级如 LLM fallback 到规则引擎一次典型压测结果指标目标值实测值结论P99 Loop Duration≤ 200ms187ms✅Tool Call Success Rate≥ 99.9%99.92%✅Redis CPU Usage≤ 70%62%✅Neo4j Query Timeout≤ 5%0.3%✅Harness Pod Crash Rate00✅最关键的验收项是“降级能力”我们故意 kill 掉 LLM 服务验证是否自动切换到本地小模型Phi-3且任务成功率保持 ≥ 85%。如果做不到Harness 就不合格。4. 常见问题与实战排查指南那些深夜救火时的真实记录4.1 “harness failed to load plugins” —— 插件加载失败的 5 种根因与速查表这个错误高频出现但日志常只显示Plugin loading failed不告诉你原因。根据我们 127 次故障复盘根因分布根因占比表象排查命令解决方案插件依赖缺失42%ImportError: No module named pandaskubectl exec harness-pod -- pip list | grep pandas在 Dockerfile 中RUN pip install pandas1.5.3禁用pip install -r requirements.txt版本漂移初始化超时28%日志无报错但plugin_init_duration_seconds{pluginrpa} 5.2skubectl logs harness-pod | grep rpa.*init重写插件__init__异步加载重资源如 Chrome Driver主进程只做轻量注册权限不足15%PermissionError: /plugins/rpa_login.exekubectl exec harness-pod -- ls -l /plugins/rpa_login.exeDockerfile 中RUN chmod x /plugins/rpa_login.exe chown harness:harness /plugins/rpa_login.exe网络不通10%ConnectionRefusedError: [Errno 111] Connection refusedkubectl exec harness-pod -- nc -zv rpa-svc 8080检查 NetworkPolicy 是否放行rpa-svc或插件配置中endpoint写错域名Schema 冲突5%ValidationError: city is a required propertyredis-cli hget tool_registry:rpa schema更新插件 OpenAPI Schema同步hset tool_registry:rpa schema {...}实操心得我们开发了harness-plugin-checkCLI 工具一键检测# 本地运行模拟 Harness 加载 harness-plugin-check --plugin ./plugins/weather.py --config ./config.yaml # 输出✅ Dependencies OK, ✅ Init 2s, ✅ Schema Valid, ✅ Network OK4.2 Agent Loop 卡死如何定位是 LLM、工具、还是 Harness 问题现象用户发消息后界面一直转圈无响应。此时不要急着重启。三步定位法查 TraceID从用户请求 Header 中取X-Request-ID在 Jaeger 中搜索该 Trace如果 Trace 只有receive_requestSpan无后续说明请求没进 Harness —— 检查 API Gateway 配置如果 Trace 有llm_thinkSpan 但无tool_call说明 LLM 卡住 —— 查llm_request_duration_seconds指标P99 是否突增如果 Trace 有tool_callSpan 但无tool_result说明工具卡住 —— 查对应工具的tool_call_duration_seconds并kubectl top pod -l apprpa-svc查队列深度redis-cli llen agent_loop_queue 1000 说明任务积压若agent_loop_queue深度高但kubectl top pods显示 Harness CPU 30%说明是 LLM 限流 —— 查llm_rate_limit_remaining指标若agent_loop_queue深度高且 Harness CPU 90%说明是 Harness 本身瓶颈 —— 查process_cpu_seconds_total定位热点函数强制 dump 状态kubectl exec harness-pod -- python -c import sys; print(sys._current_frames())看是否有线程阻塞在redis.blpop()我们曾遇到一次卡死Trace 显示llm_think耗时 120s但llm_request_duration_secondsP99 只有 45s。最终发现是 LLM 服务商 DNS 解析超时requests库默认无 DNS timeout —— 在LLMClient初始化时加timeout(3, 30)解决。4.3 并发下结果错乱为什么 100 个用户同时问“今天天气”返回的却是上海、北京、广州混搭这是典型的状态污染。根源在于多个请求共用了同一个 LLM Client 实例而该实例内部缓存了上一个请求的 context。解决方案分三层应用层每个请求创建独立LLMClient实例代价高不推荐连接池层用httpx.AsyncClient的limits参数控制并发但治标不治本Harness 层强制 LLM 调用带唯一 request_id并在 prompt 中注入# REQUEST_ID: abc123后端日志按 request_id 过滤我们采用第三种配合以下措施所有 LLM 调用必须传headers{X-Request-ID: request_id}LLM 服务端如 vLLM开启--enable-prefix-caching但禁用跨 request 的 cache sharing在 Harness 的llm_thinkSpan 中attributes字段必须包含request_id和session_id效果压测 1000 并发时结果错乱率从 18% 降至 0%且日志可精准追溯每个请求的完整链路。4.4 工具调用失败却不重试Harness 的重试策略该怎么设默认重试是毒药。我们见过太多因盲目重试导致的雪崩数据库工具重试 3 次每次生成新事务 ID造成 3 笔重复扣款邮件工具重试导致用户收到 3 封相同邮件我们的重试铁律幂等性检查只有GET类工具如查
上一篇/下一篇内容由系统自动关联
返回资讯列表 →