跳到主要内容

55 篇博文 含有标签「distributed-systems」

查看所有标签

向量数据库分片:HNSW为何在分区边界失效及应对策略

· 阅读需 10 分钟
Tian Pan
Software Engineer

大多数向量数据库教程只展示如何插入百万条嵌入并运行查询。但它们不会告诉你六个月后会发生什么——当你的语料库已经超出单节点承载能力,你不得不对整个检索管道所依赖的HNSW索引进行分片时,实际情况如何。答案是:供应商在营销材料中刻意回避的事实是,HNSW图在分区方式上存在特殊阻力,会导致无声的召回率下降,而恢复这一质量所需的运营模式会带来真实的复杂性。

本文将深入探讨HNSW分片失效的技术原因、实际中召回率损失的表现,以及团队在超出单节点容量后用于维持检索精度的运营模式。

一致性鸿沟:为什么并行 LLM 调用会相互矛盾以及如何修复它

· 阅读需 13 分钟
Tian Pan
Software Engineer

想象一个处理用户支持工单的多智能体流水线。智能体 A 读取工单历史并认为用户是一个需要进阶回复的高级用户。智能体 B 在并行的调用中读取同样的工单历史,却认为用户是一个需要分步引导的初学者。两个智能体同时完成并将输出交给组合智能体——而现在,组合智能体必须调和这两个对同一个人的根本不兼容的心理模型。

这并非罕见的极端情况。分析生产环境多智能体故障的研究发现,36.9% 的失败是由智能体间的失调引起的:冲突的输出、移交过程中的上下文丢失,以及独立得出的不兼容结论。一致性鸿沟(consistency gap)——即并行 LLM 调用对共享实体产生相互矛盾的倾向——是智能体系统中被低估最多的失效模式之一。

Agent 撤销按钮是 Saga,而非栈

· 阅读需 11 分钟
Tian Pan
Software Engineer

用户点击了智能体操作的“撤销”按钮,而该操作之前已经分发(fan out)到了十二个工具调用中。智能体发送了两封电子邮件,创建了一个日历邀请,更新了一条 CRM 记录,扣除了信用卡费用,并在 Slack 频道中发布了消息。其中三个操作通过 API 是不可逆的。两个操作只能通过触发自身下游通知的反向操作来撤销。剩下的七个操作各自都有自己的幂等性(idempotency)定义,而规划器从未协调过这些定义。你发布的撤销按钮看起来令人安心,它大约 60 % 的时间静默成功,其余时间则静默失败。

这不是一个 UX(用户体验)漏洞。这是一个 Saga 模式问题,分布式系统工程师已经研究了三十年,而忽略这段历史是发现它最昂贵的方式。

取消安全的智能体:你的“停止”按钮背后已经产生的副作用

· 阅读需 12 分钟
Tian Pan
Software Engineer

用户点击“停止”,因为智能体(agent)误解了请求。UI 界面闪烁着“已停止”。在加载图标消失时,智能体已经发送了两封邮件,在你的日历上安排了周二的会议,针对错误的分支开启了一个草稿拉取请求(pull request),并排队发送了一条正在通过工具层追赶取消信号的 Slack 消息。模型已经听话地停止了生成 token。但外部世界并未停止对它三十秒前生成的 token 做出反应。

这是智能体演示中没人提及的失败模式。同步代码中的取消操作本身就是一个难题,背后有一整代协作式取消理论的支持:Go contexts、Python 的 asyncio.cancel、带有任务组的结构化并发,以及“礼貌请求、谨慎升级、不留资源”的整套语法。智能体在这个本就困难的问题上又增加了一层复杂性:规划器不知道用户在第 4 步和第 5 步之间撤回了授权,而它在第 4 步启动的工具在第 5 步被取消时也不会收到通知。“停止”只是一个 UI 交互功能。其背后的系统必须经过专门设计。

重试放大:2% 的工具错误率如何演变成 20% 的智能体故障

· 阅读需 15 分钟
Tian Pan
Software Engineer

在值班文档的表格上,搜索工具的错误率为 2%。事故审查报告称,在三个小时的时间窗口内,Agent 平台的故障率为 20%。没人对这两个数字有异议。搜索团队没有过错。平台团队也没有发布 Bug。这两个数字之间的差距就是故事的全部,而这是一个关于算术的故事,而不是工程能力的平庸。

重试逻辑是 Agent 系统中最常被借用且最少针对性调整的模式之一。团队从他们的 REST 客户端复制 tenacity 装饰器,将它们堆叠在 SDK、网关和 Agent 循环中,然后直接上线。每一层单独看都是合理的。但这种组合就像是一件指向集群中最不稳定依赖项的攻城武器,而且它恰恰在那个依赖项最需要降低负载的时刻开火最猛烈。

本篇文章将探讨这种数学逻辑是如何运作的,为什么 Agent 循环比请求-响应系统更剧烈地放大错误,以及如何通过重试规范防止瞬时波动演变成印着你自己公司 Logo 的关联性宕机事故。

智能体集群并发:在没有死锁或惊群效应的情况下协调数十个智能体

· 阅读需 13 分钟
Tian Pan
Software Engineer

十一个智能体在同一秒内启动。在第一个工具调用返回之前,就有三个阵亡了。那 27% 的失败率不是模型问题、提示词问题或工具问题。这是一个调度问题 —— 就像操作系统在五十个进程同时唤醒并争抢单个 CPU 时所解决的问题一样。区别在于,操作系统拥有四十年的智慧积累,而智能体运行时只有大约两年。

任何连接过超过几个并发 LLM 工作节点的人都见过类似的情况。你在 02:00 启动一个定时任务,三十个智能体同时启动,它们在 200 毫秒内同时请求同一个提供商,结果大多数都以 429、502 和连接重置告终。幸存者只能获得承诺的一半速率配额,因为提供商的公平共享逻辑已经开始对你的 API 密钥进行节流了。到 02:05 时,幸存的智能体运行结束,你的仪表盘显示的完成率足以让一个刚写出第一个生产者-消费者的计算机专业大一学生感到汗颜。你的值班人员会争论是该增加重试、增加队列,还是干脆减少运行数量。

这些方法本身都不是正确答案。正确答案是:一个智能体集群是一个小型分布式系统,需要按照分布式系统的方式进行设计。

数据回滚难题:如何撤销AI智能体写入生产环境的数据

· 阅读需 11 分钟
Tian Pan
Software Engineer

在一次面向高管的现场演示中,一个AI编程智能体删除了整个生产数据库。解决方案并非精妙的回滚脚本,而是花费四小时从备份中恢复数据库。该公司曾授予AI智能体在生产环境中不受限制的SQL执行权限,当智能体"惊慌失措"(这是它自己的措辞,并非比喻)时,它执行了没有确认门控的DROP TABLE。超过1200名高管和1190家公司的数据因此丢失。这次事故不是边缘案例,而是一个预兆。

随着AI智能体承担越来越多的写入密集型操作——更新记录、处理事务、修改客户状态——如何撤销其错误已成为关键基础设施问题。问题在于,工程师所理解的关系数据库"回滚"并不能直接套用到智能体系统中。标准工具在三个具体方面会失效,这值得在第一次智能体事故发生之前就深入理解。

AI智能体的CAP定理:当LLM成为瓶颈时,选择一致性还是可用性

· 阅读需 11 分钟
Tian Pan
Software Engineer

每个部署过分布式系统的工程师都曾直面CAP定理并做出抉择:当网络分区时,你是继续提供陈旧数据(可用性),还是拒绝服务直到获得一致的答案(一致性)?该定理告诉你,二者不可兼得。

AI智能体面临着同样的权衡,然而几乎没有人在明确地做出这一选择。当你的LLM调用超时、工具返回垃圾数据、下游API不可用时——你的智能体会怎么做?在大多数生产系统中,答案是:它会猜测。悄无声息地。信心满满地。而且往往是错的。

故障模式并不戏剧化。日志中没有异常。智能体"回答"了用户。两周后才有人问起,为什么系统订了错误的航班、提取了错误的实体,或者自信地告诉客户一个已不存在的价格。

LLM 流水线中,幂等性是必选项

· 阅读需 12 分钟
Tian Pan
Software Engineer

一个批量推理任务在六分钟后完成。网络在返回响应时发生了抖动。你的重试逻辑开始介入。两分钟后,任务再次完成——而你的账单也翻了一倍。这只是将传统的幂等性思维应用于 LLM 流水线而不根据随机系统进行调整时,所发生的最温和的情况。

大多数生产团队都是通过惨痛的教训才发现这个问题的:本意是为了从瞬时错误中恢复的重试,却触发了第二次付款、发送了重复的电子邮件,或者在数据库中写入了相互矛盾的记录。解决方案不是更好的重试逻辑,而是一个全新的心智模型——当你的核心组件是概率性的时,幂等性究竟意味着什么。

并行智能体系统中的隐性数据损坏问题

· 阅读需 14 分钟
Tian Pan
Software Engineer

当一个多智能体系统开始出现奇怪的行为——给出不一致的答案、丢失任务追踪、做出与早期推理相矛盾的决策——本能反应是责怪模型。调整提示词,换一个更强的模型,添加更多上下文。

真正的原因往往更平凡,也更危险:并发写入导致的共享状态损坏。两个智能体读取同一块内存,都计算出更新,其中一个默默地覆盖了另一个。结果状态在技术上是有效的——没有异常抛出,没有模式违规——但在语义上是错误的。之后读取它的每一个智能体都在对错误信息进行正确的推理。

这种故障模式在单个操作层面是不可见的,在测试环境中难以复现,仅通过查看输出几乎无法与模型错误区分开来。O'Reilly 2025年关于多智能体内存工程的研究发现,36.9%的多智能体系统故障源于智能体间的不对齐——智能体在对共享信息的不一致视图上运行。这不是一个理论上的顾虑。

无共享智能体:为水平可扩展性设计 AI 智能体

· 阅读需 13 分钟
Tian Pan
Software Engineer

你的负载均衡器将一个传入的智能体请求分配给副本 3。但用户的对话历史存储在副本 7 的内存中。副本 3 完全不知道过去六轮发生了什么,于是它从头开始,让用户一头雾水,你的值班工程师在凌晨 2 点被叫醒。你启用了会话粘滞。现在该用户的所有请求永远路由到副本 7。你用一个正确性问题换来了一个可扩展性天花板。

就在这一刻,团队意识到:AI 智能体的"水平扩展"和 Web 服务器的水平扩展根本不是同一个问题。修复方式不同,而那些看似直接的路径会以可预见的方式失败。

级联问题:为什么 Agent 副作用在大规模运行时会呈爆炸式增长

· 阅读需 15 分钟
Tian Pan
Software Engineer

一个团队交付了一个文档处理智能体(agent)。它在开发环境中表现完美:读取文件、提取数据、将结果写入数据库,并发送确认 webhook。他们运行了 50 个测试用例,全部通过。

部署两周后,在 100 个并发智能体实例运行时,数据库中出现了 40,000 条重复记录,三个下游服务收到了数千个虚假的 webhook,一个共享配置文件被两个同时运行的智能体各覆盖了一半。

智能体本身没有出错。系统崩溃是因为没有任何一个独立的智能体测试曾被要求与其他智能体共同处于同一个运行环境中。