The Airbnb Tech Blog | Medium ... 笔记

The Airbnb Tech Blog | Medium 中文

Airbnb 工程博客是一个由 Airbnb 工程团队撰写的文章集合,讨论了各种技术、创新和行业案例。该网站为读者提供了对软件工程、产品开发、可扩展性、性能等领域的深入分析和见解,还涵盖了技术、领导力和团队协作方面的新趋势,为改进科技公司提供了智慧。

笔记线程

Airbnb 强调将评估视为构建可信生成式 AI 产品的关键工程学科。传统软件测试的假设受到大语言模型(LLM)输出非确定性和主观性的挑战,往往需要 AI 来评估 AI。Airbnb 的产品团队构建基于 LLM 的功能,并由基础设施团队提供工具集和最佳实践。一个基础原则是:必须从项目 outset 开始规划评估,以避免虚假信心和未检测到的回归。"一条规则"是手动审查数据,并通过检查原型输出来建立对成功的直觉。这一习惯演变为评估驱动的开发,其中失败模式被识别、编码并持续测试。评估驱动开发的关键原则包括:明确目标、让真实错误指导指标、使用小而精的评估者集合、指定决策者以及持续协作。三种评估方法形成分层结构:程序化检查用于明显失败,LLM-as-a-Judge 用于细微的质量判断,人工评估用于边缘案例和验证。程序化检查基于确定性代码测试,而 LLM-as-a-Judge 则利用更强的 LLM 对照评分标准进行评估,需要校准以确保可信度。人工评估作为真值和高 stakes 决策的黄金标准。对于代理系统,评估跨越多个层级,不仅检查最终输出,还审查推理路径和工具调用。一个实际 walkthrough 展示了探索初始失败、构建包含程序化检查和校准虚拟法官的分层评估,并通过生产监控进行扩展。关键要点强调:查看数据、避免通用指标、从小处着手、校准评估者、采用分层防御,并在生产中镜像评估。最终,成功的 AI 产品开发取决于评估成为一项协作的团队运动,它塑造了产品成功的定义。
CdXz5zHNQW_T3SelU9bHa.jpeg
将生产级语言模型系统上线需要快速迭代改进,但由于模型和评估过程的非确定性,这一挑战尤为突出。Airbnb 通过构建覆盖四个层面的可靠 LLM 基础设施,聚焦工程优化与集成,以应对这些挑战。其核心原则是:组件间的接口处最容易出现问题,因此全面的端到端测试至关重要。第一层专注于评估噪声的诊断性框定,区分数据噪声与判断不确定性,以理解性能波动。LLM 评估中的噪声可能源于评分者对输入的不同打分,或 LLM 生成的参考答案发生变化,从而难以辨别模型真正的改进。准确诊断的关键在于区分认识性不确定性(模型/评分者的局限性)与偶然性不确定性(任务本身的歧义)。第二层通过稳定输入给评分者,建立确定性的评估基础。这通过为每个样本缓存参考答案和评分实现,确保相同输入始终返回缓存结果,从而使评估可复现且高效。这种确定性测量是第一层诊断能力得以实现的前提。第三层通过微适配器实现有界、范围受限的模型突变。这些是仅在特定缺陷上训练的小型 LoRA 补丁,支持快速(约一小时)训练及类似热修复的部署。为防止适配器堆栈性能退化,需遵循三条生命周期规则:融合并发触发的补丁、在累积数据上重新训练、以及卸载未使用的补丁。第四层在系统接口处提供端到端验证。尽管各组件单独表现正常,但其交互仍可能导致意外行为。该层面涉及将代表性输入运行于整个生产路径,以衡量综合质量与延迟,确保在部署前暴露接口处的缺陷。这四个层面构成一个依赖栈,每一层的有效性均依赖于其他层面。
CdXz5zHNQW_y2WUihSDGZ.png
Airbnb 开发了 Sitar Agent,一个轻量级的 Kubernetes Sidecar,用于可靠地向数千个服务实例交付动态配置变更。配置交付始于开发人员通过 Git 或 UI 创建或更新配置值,这些值随后存储于 Sitar Service 中。Sitar Service 会定期将配置的全量状态打包为压缩快照并上传至 AWS S3。当服务 Pod 启动时,Sitar Agent 首先将这些 S3 快照下载到挂载的磁盘上,从而实现快速引导。随后,Agent 与 Sitar Service 同步自快照创建以来所做的任何变更,并向主应用容器发出就绪信号。启动后,Agent 每隔数秒持续轮询 Sitar Service 以获取更新。主应用容器通过 Sitar 客户端库从挂载的磁盘读取配置,该库缓存配置值并检测文件变更。一项关键的设计决策是将 Sitar Agent 作为独立的 Sidecar 容器,而非集成到主容器中,此举优先考虑了可靠性、操作安全性和多语言支持,而非微小的成本节约。该系统采用拉取(pull)模型,Agent 轮询 Sitar Service,并通过服务端缓存和基于令牌的数据库访问进行优化,以降低负载。对于本地磁盘键值存储,Airbnb 选择了 SQLite 而非基于 Sparkey 的旧版实现,原因在于 SQLite 在并发能力、性能及多语言支持方面表现更优。SQLite 内置的预写日志(Write-Ahead Logging)允许在写入期间进行并发读取,其更简单的运维模型也优于 RocksDB 虽性能更高但复杂度更大的方案。这种健壮的 Sidecar 设计确保了关键配置能够快速、可靠地交付至 Airbnb 庞大的服务舰队。
CdXz5zHNQW_7QO75wfm4Y.jpeg
Airbnb 开发了一套内部存储系统,用于处理每秒 5000 万个样本以及 2.5 PB 的时间序列数据。这一转变的必要性源于其不断演进的产品和基础设施中广泛部署的代码监控所产生的海量数据。主要工程挑战在于如何高效地持久化并服务这一庞大的数据集。为应对如此巨大的规模,Airbnb 采用了多租户架构,按服务或进程对租户进行隔离,以实现稳定的分组与归因。他们实施了 Shuffle Sharding 机制,将租户工作负载隔离开来,通过将租户仅写入并查询部分节点,从而提升了系统的容错能力。针对租户接入和配置管理等运营复杂性,系统引入了统一的控制平面,自动化租户接入流程并简化配置更新。该系统的关键需求包括:每秒处理超过 5000 万个样本、支持大量仪表板和告警,并保持低查询执行延迟。初期通过影子集群进行的验证揭示了可靠性问题、压缩延迟以及在大数据量负载下查询性能缓慢等问题。解决这些挑战的第一步是确保单个集群的可靠性,重点通过基准测试、防护机制和查询路径隔离,来稳定写入、读取和压缩操作。系统通过在三可用区部署具备状态感知能力的组件实现了容错。同时,实施了副本级限制和租户级控制,以有效管理集群规模并保护系统。随后,系统演进为多集群架构,以降低故障影响范围并增强灵活性。然而,多集群方案也带来了指标发现、查询以及运营开销等方面的复杂性。这些问题通过租户与集群映射工具以及基于 Kubernetes Operator 的自动化部署策略得到了缓解。引入带有自定义增强的 Promxy 后,实现了跨集群查询与告警功能。此次实践的关键经验包括:跨集群查询成本高昂,以及部署一致性的重要性——这可通过自动化和标准化部署来实现。其理念逐渐演变为将集群视为可替换的资源(类似“牲畜”),而非关键且独特的“宠物”,从而更易于扩展和维护。最终,构建该平台需要架构创新、严谨的运营实践,以及在管理预期方面的文化转变。
CdXz5zHNQW_oUKNz5mUz5.jpeg