随着人工智能技术在业务中的渗透,我们逐渐意识到:AI 不仅是提升效率的工具,更是重构数据处理与消费方式的核心驱动力。在这一背景下,我们思考: 能否构建一款「AI + Data」一站式融合的数据引擎? 它不仅能够统一处理文本、音视频等非结构化数据与传统结构化数据,还能为算法工程师提供流畅的数据开发体验,实现数据处理与 AI 模型无缝衔接,并能确保数据处理负载与在线服务负载完全隔离。这是 2024 年末启动 DataMind 项目的初衷。
本文整理自字节跳动 DataMind 负责人郭泽晖在 Doris Summit 2025 中的演讲内容,并以演讲者第一视角进行叙述。
在项目启动前,我们评估了多种市面上的开源方案,但未能找到完全符合 AI + Data 引擎需求的产品。因此,我们决定选择一款优秀的 OLAP 数据库,并在此基础上融合和增强 AI 功能。Apache Doris 凭借完善的功能、卓越的 OLAP 性能、丰富的生态体系、活跃的社区氛围及良好的产品口碑吸引了我们的注意。
与此同时, 我们了解到社区也在积极探索 Doris 与 AI 能力的结合,因此决定在 Apache Doris 基础上二次开发,打造一站式引擎 ------DataMind。这些能力包括:
目前,我们已将部分 AI 融合的实践成果贡献给开源社区,大家可从 Doris 4.0 版本 中关注。
这些能力不仅是 Datamind 的重要组成,也是构建企业级 AI 问数平台奠定了坚实的技术基础。后文将逐一展开其设计思路、实现路径与优化实践。
AI 场景下典型的混合搜索的架构可以概括为三种搜索方式:基于 文本相似性、语义相似性、业务规则的匹配。这三路的搜索结果会在后端统一排序,排序方法依赖自训练的模型,分为粗排和精排两个阶段。粗排模型可提高处理性能,精排模型实现更优的重排序效果,平衡整体开销。

我们希望将这三类搜索能力集成至基于 Doris 的 DataMind 引擎之中,让用户只需导入一份数据,并在完成必要的处理及索引构建后,即可直接上线服务,无需介入其他三方工具。为实现这一目标,团队基于 Doris 补充了向量索引和 BM25 打分函数这两项核心能力。
我们基于 Faiss (Facebook 开源的 AI 相似性搜索工具)实现了 HNSW 与 IVF_PQ 两种 ANN 算法的向量索引。HNSW 在大规模数据集上性能表现更优,但资源开销较大; IVF_PQ 在大规模数据集上,成本与性能表现更加均衡。
向量索引支持与其他索引条件组合使用。比如,可将倒排索引的结果通过 Faiss 提供 IDSelector 接口传递到底层 ANN 算法实现上以控制搜索过程。基本原理是:倒排索引首先检索匹配行号的 Bitmap,这一 Bitmap 被传递给 Faiss 库。当进行向量搜索时,Faiss 会将搜索范围限制,最终输出 TopN 行号结果,代表融合后的结果集。当倒排索引在第一阶段筛选出的数据量较少时,会跳过向量索引进行暴力计算,这样耗时更短、时间更精准。

BM25 是一种用于信息检索的排名函数,用于衡量查询与文档的相关性。它基于词频(t)和文档长度进行加权计算,同时考虑逆文档频率(IDF)以惩罚常见词。在整个公式中,需重点关注总文档数 N 和文档频率 DF 等全局统计信息,这些信息直接影响实现的难度。( 更多信息可自行搜索查阅)
在 Doris 的设计中,一个 segment 对应一个倒排索引的解决方案,因此在 segment 级别实施 BM25 较为简单,系统可以基于每个 segment 的统计信息(如总文档数 N 和文档频率 DF)计算每一行的得分。然而,合并小 segment 可能导致统计信息变化,从而影响 BM25 得分,造成用户评分波动,这在生产环境中不可接受。
为了避免此问题,团队将 BM25 公式提升至 tablet 级(tablet-level)。所有全局统计信息(包括 N 和 DF)需基于整个 tablet 聚合,以保持得分结果的一致性。
以 Merge on Write / Merge on Write 为例:

在补充了向量索引和 BM25 能力后,我们面临一个新问题:在混合搜索框架中,涉及的函数并非传统意义上在计算层基于输入直接进行求值,而是必须在索引检索的过程中计算出结果,因此需要设计一套特殊的投影下推流程,具体实现如下:

在执行计划层,我们将相关函数替换为虚拟列,并将这些虚拟列下推至 OlapScanNode。OlapScanNode 携带虚拟列的信息,将其传递到接近索引计算与查询块存储逻辑的执行路径中。
在索引计算过程中,系统基于这些虚拟列计算向量距离分数和 BM25 相似性分数,并将结果填充回对应的 block。最终,带有虚拟列计算结果的 block 由 Scan 算子输出,并传递至下游算子,以自然衔接的执行计划完成整个检索流程。
在 AI Function 上,主要基于 Doris 补齐了 AI_QUERY 和 TEXT_EMBEDDING 两种函数。
该函数用于调用大模型并能较好地处理非结构化文本这类数据, 将其转化为结构化数据,再进行传统分析。例如,对于一张客户评价表,可以让大模型为每条评价打分并分类,如好评输出 1、差评输出 0,通过统计即可得出好评与差评的大致数量。
WITH reviews AS ( SELECT
AI_QUERY('volcengine/Doubao-pro-128k-240628', concat('判断这条产品评价是好评还是差评,好评输出1,差评输出0:', review_txt)) AS review_typeFROM customer_reviews
) SELECT review_type, count(*) AS cntFROM reviewsGROUP BY review_type
该函数主要有两个阶段:
SELECT
content,
APPROX_COSINE_SIMILARITY(
TEXT_EMBEDDING('volcengine/Doubao-embedding-240715', 'Doris Summit'),
content_vec_col) AS scoreFROM my_table
ORDER BY scoreLIMIT 7;
除上述标准函数外, 我们基于 Doris 支持了 Python UDF,以满足自部署模型的需求,包括 Rerank 模型、Embedding 模型、甚至大模型的访问需求,以及依赖 Python 库进行非结构化数据处理的需求场景。
Python UDF 的核心设计主要包含几个关键点:

如下方代码示例, 示例中展示了混合搜索(向量 + 全文检索)的应用,两个检索通过用户自研的 Python UDF 模型进行重排序,最终使用 Hybrid Search 进行数据摄取。在 AI Function 和 Python UDF 的加持下,用户只需通过一条简单的 SQL 语句即可串联整个业务搜索流程及数据处理流程,使用十分便捷。
CREATE FUNCTION predict_class(ARRAY<FLOAT>) RETURNS INT PROPERTIES (
"file"="https://cloud-storage/obj/datamind/pyudf.zip",
"symbol"="predict_class",
"type"="PYTHON_UDF" );WITH channel_1 AS ( SELECT
content
FROM my_table
ORDER BY
APPROX_COSINE_SIMILARITY(py_udf_embed('Doris Summit'), content_vec_col) DESC
LIMIT 7),
channel_2 AS ( SELECT
content
FROM my_table WHERE MATCH_ANY(content, 'Doris Summit') ORDER BY
BM25() DESC
LIMIT 7)SELECT
contentFROM ( SELECT content FROM channel_1 UNION ALL
SELECT content FROM channel_2
) tORDER BY py_udf_score('Doris Summit', content) DESCLIMIT 7;
GraphRAG 是一种结合图数据库与 RAG(Retrieval-Augmented Generation)技术。推动 DataMind 集成 GraphRAG 功能的原因是,我们在推广 AI 功能时发现多个业务团队对此有需求。与标准 RAG 相比,GraphRAG 的实现过程更为复杂,需要在基础 AI 能力上进一步构建。
构建阶段:该阶段的输入为文档或分割成的片段(chunk)。利用大模型(AI Function)进行实体抽取 ------ 从文档中提取出关键信息,实体之间的关系可以看作是图中的边,每条边具有一定的权重,这些权重由大模型自动识别,提取的实体及其描述经过向量化后存储,以构建索引。
此外,图结构和边的描述也会存储在一张表中。基于该图,系统利用 Search 发现算法(如 Lighting)进行聚类,将相似的实体归类为一个 Search,并生成 Search 报告。

查询阶段:在检索过程中,首先将 Query 转换为向量,该向量用于 Search 实体,以找到与之相关的 Top-K 实体。得到 TopK 实体后,系统将召回它们相关的边,这些边包含与实体相关的描述和信息,以及这些实体关联的报告和原始文档的片段。在有限的上下文内,系统会按优先级拼接相关内容,形成最终上下文,随后将其输入 AI 以生成回答。

基于 Apache Doris 的 DataMind 产品上如何构建 GraphRAG 呢?整体设计分为多层,如下图所示:

底层是表结构的设计,包括实体表、Search 表以及用户自定义的源数据表等。在此基础上,通过一系列函数,包含用于文档切分的函数、Leiden 聚合函数等等,最后结合 ETL SQL、Query SQL 等,共同实现 GraphRAG 的构建与查询流程。
由于底层 SQL 相对复杂,团队在这些 SQL 上封装了 Go、Python 与 Java 的 SDK,以方便用户使用。用户只需调用如 build 或 import 等接口即可完成数据导入与构建,再通过 query 接口实现查询能力。这样一来,应用层研发能够更快速地接入新的 AI 能力。只需使用 Apache Doris 数据库并结合团队提供的 SDK,即可直接将业务流程跑通并验证效果。
企业级 AI 问数是当前行业内较为经典且热门的探索方向。行业内普遍采用 NL2SQL 直接查询 Apache Doris 等数据库的模式。那么,字节是如何落地的呢?
首先,我们基于 Doris 构建了湖仓一体的数据架构,以数据湖为中心,外部业务系统或企业内部信息系统(如 RDS、API 取数),数据经过 DTS 等工具摄入,最终沉淀在云存储中,呈现为传统 Hive 的原生 Parquet 格式。随后,数据通过 Spark 或 Flink 进行 ETL 清洗,遵循标准的 Lambda 架构,最终生成可供消费的数据,并存储至 OLAP 引擎 Apache Doris 以实现查询加速。

若要利用 AI 进行数据消费,以实现类似企业智能体的功能,它需要访问所有企业信息系统的数据。因此,我们期望的理想架构处理流程应如下图:

具体流程:AI 问数应用通过 Data Agent 调用 NL2SQL 这类外部工具,Data Agent 采用 Plan Execute 或 React 模型规划执行路径,需要元数据以及依据业务自定义的语义模型 ------ 简单理解为表字段的描述,基于这些信息,Data Agent 生成取数 SQL,并发给 Apache Doris(即 DataMind) 加速执行,最终将数据返回到 AI 问数应用层。在这其中,Apache Doris 主要作用是将湖上的数据同步到其内部进行查询加速。
而这种理想处理方式面临数据安全性及查询延迟等问题,比如:
为解决上述问题,我们进行了如下优化,具体改进为:

Doris + AI 一站式融合数据引擎 DataMind 的实现,已在字节内部应用一段时间,并在持续推广之中,典型应用场景包括智能简历搜索、ByteRAG 平台、CapCut 内容治理等。且在 GraphRAG 上线后,团队与多方客户合作实现了场景落地,例如广告场景、代码搜索的场景,以及近期业界关注的 PRD2Code 等研发提效场景 。

未来,我们还会在 DATA + AI 上继续探索,搭建更加完善的企业 AI 问数架构。此外,我们将保持与 Doris 开源社区的紧密联系保持联系,积极参与共建并为社区提供反馈。
欢迎更多的同仁加入 AI 能力共创中来,可通过下方二维码添加 Doris 小助手,回复【AI】即可加入 AI 专项交流群。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70017904/viewspace-3103734/ ,如需转载,请注明出处,否则将追究法律责任。