Exa AI 发布 exa-d:专为海量网页数据设计的声明式处理框架
构建现代搜索引擎的核心挑战在于:如何在全网内容瞬息万变的情况下,实时且高效地索引并检索海量数据。面对 HTML、PDF、JS 渲染应用等多模态异构内容,以及从每小时更新的新闻到数年不变的学术论文等不同更新频率,传统的数据仓库与 SQL 转换层往往难以兼顾灵活性与性能。
为此,Exa AI 推出了其自研的 exa-d(Data Framework),旨在解决从原始网页到可查询索引之间的复杂数据处理链路。
核心设计挑战
在构建 exa-d 之前,Exa 团队评估了多种传统数据管理栈,最终决定定制开发以应对以下三大约束:
1. 声明式依赖与类型安全
传统模式下,工程师需编写大量脚本手动计算和更新不同列,导致代码冗余且难以预测下游影响。exa-d 引入了声明式依赖机制,类似于电子表格中的公式引用。工程师只需定义数据列及其关系,框架自动处理状态、重试和调度。这种设计不仅提升了迭代速度,还通过严格的类型系统(如 torch.Tensor)在编码阶段即捕获无效转换。
2. 外科式更新与全量重建
网页数据具有高度动态性。部分数据需每小时精确替换,而模型更新或信号测试则需覆盖数十亿行数据。exa-d 突破了传统框架“修改任意列即重写全表”的低效模式,能够智能识别受影响的特定行与列,实现外科式更新(Surgical Updates),同时支持针对整个索引的大规模全量重建。
3. 高效并行执行
处理 PB 级数据要求工作流必须高度并行化。exa-d 将任务拆解并分布式部署于 CPU、GPU 及异构集群节点,仅计算缓存外或需重新计算的部分,最大限度减少资源浪费。
技术架构揭秘
exa-d 以 S3 为存储后端,通过逻辑层构建依赖图来管理数据流转。其核心流程包括文本分词(Tokenization)与向量嵌入(Embedding)的自动化推导:
# 分词阶段:将文本转换为 Token 张量
documents = Column(name="documents", type=str)
tokenized = Column(name="documents_tokenized", type=torch.Tensor)
# 声明依赖关系
tokenized.derive().from(documents).impl(Tokenizer)
# 嵌入阶段:将 Token 转换为向量
columns = Column(name="embeddings")
embeddings.derive().from(tokenized, type=torch.Tensor).impl(EmbeddingModel)
# 执行阶段:确保所有依赖数据就绪
dataset = Dataset(location="s3://exa-data/documents/")
execute_columns(dataset, [tokenized, embeddings])
在此架构中,数据并非线性序列,而是由类型化的列(Typed Columns)组成的独立演化系统。每个字段拥有独立的更新计划和依赖表面,系统依据依赖图自动确定执行顺序,无需硬编码脚本。
实际价值
exa-d 的发布标志着 Exa AI 在搜索引擎基础设施上的重大升级。对于开发者而言,这意味着更低的维护成本和更快的实验周期;对于用户而言,这将直接转化为更精准的搜索结果和更低的延迟。随着 AI 模型与搜索信号的快速迭代,exa-d 将成为支撑下一代实时、智能搜索引擎的关键基石。
"我们的目标是确保索引在查询到达之前始终保持最新,exa-d 正是为了应对这一动态复杂性而生的。" —— Exa AI 官方团队