☰
AI Agent重构数据栈:从语义层到多模态数据湖的落地复盘
2026/10/18 17:50:33 网站建设 项目流程

做数据平台的时间长了,多少会有点路径依赖:数据进数仓、做好宽表、挂上 BI,就认为链路闭环了。这两年大语言模型和 AI Agent 火起来之后,我第一次把一个对话式分析 Agent 接到内部数据平台上,差点被现实教育到怀疑人生——它连"该查哪张表"这种最基础的事都搞不定。不是模型笨,而是我们整套数据栈从元数据、权限、调度到血缘,全是围绕"人来用"设计的,压根没给机器留"自助理解"的入口。

这个标题其实包含了三个高度耦合的问题:AI Agent 如何重构下一代数据栈、多模态数据湖如何演进、元数据治理怎么做创新。我最近在一个模拟项目X(某零售企业的数据底座改造)里把三条线完整走了一遍:先给 Agent 重构了访问数据的方式,又把原来只装结构化数据的数仓改造成了多模态湖,最后把元数据体系重做了一轮。这篇文章就是做完之后的复盘,从链路设计、数据模型到落地踩坑都有,适合正在做数据平台、数据中台,或者准备把内部数据开放给 AI Agent 使用的朋友。

1. 先戳破一个幻觉:传统数据栈在 Agent 面前有三道断层

在讲重构之前,得先讲清楚传统数据栈到底输在哪。不是性能不够,也不是功能缺失,而是它的设计前提在 Agent 时代崩塌了。我梳理下来,最核心的是三道断层。

1.1 断层一:使用者的行为模式从"人查数"变成了"机器调数"

传统数据栈的所有交互设计全都默认使用者是人:人要打开 BI 看板,人要写 SQL 提数,人要翻数据字典找字段含义。于是我们围绕"人"建了数仓、做了宽表、写了大量给人看的数据字典和指标说明文档。Agent 一来,这些假设全部失效。

Agent 不会打开看板,它只会按照工具调用的方式去访问数据;它看不懂"本月 GMV 口径详见某某文档"这种人类式备注,它需要的是机器可读、语义明确、带样例的结构化信息。在模拟项目X里我第一个版本就是直接给 Agent 开了个"查数工具",让它自己去看数仓表,结果它频繁选错表。数据里有张订单明细表和一张订单汇总表,字段几乎一样,它就总是拿明细表去算汇总指标,数字直接翻倍。问题不在模型,在于元数据里根本没写"这张表是什么粒度、那张表是什么粒度",模型只能靠猜。

1.2 断层二:语义和口径没有"机器可读"的载体

传统数据字典本质是给人看的文档。字段说明写"客户编号",业务同学知道那是指客户主数据里的唯一键,模型不知道。模型需要的是字段的业务含义、取值样例、与业务指标的公式关联、粒度、时效,这些不是一句注释能解决的,得有一套结构化、可被检索的语义元数据。

更头疼的是口径。同一个"销售额",财务口径要含税,运营口径不含税,做报表的时候可能都叫 GMV。人看上下文能分辨出这是两个指标,Agent 只看字段名根本分不出来。我们后来在元数据里显式加了"指标公式 + 口径标签",并且要求 Agent 在规划阶段先读口径说明、再决定用哪张表。做了这一步之后,选表错误率才真正降下来。这件事给我的启发是:对 Agent 而言,最贵的不是缺少算力,而是缺少能被机器消化的"语义上下文"。

1.3 断层三:批式链路满足不了实时问答

传统数仓的节奏是批处理:凌晨跑批、早上出报表,数据时效刚好匹配人的作息。Agent 面对的用户其实还是人,但提问是实时的,要的是"刚刚发生"的数据。试过让 Agent 直接去查数仓,只要当天的批还没跑完,它拿到的就是昨天的数,回答自然不准,用户一句"你这数据不对吧"就把信任度打没了。

后来的做法是在执行层增加时效判断:高频更新的业务数据走实时链路,低频稳定的分析数据走批式链路,Agent 先根据问题的时效需求路由到对应通道。这个"先判断时效再选路径"的动作,其实就是数据栈为 Agent 重构的第一步。顺着这个思路,我把整个数据栈拆成了四个层级,下面详细说。

2. AI Agent 重构数据栈:我拆出来的四个关键层级

数据栈落到 AI Agent 场景,不再是简单的"计算引擎 + 存储 + BI",而是一套能让 Agent 自主完成"理解—规划—执行—修正"的支撑体系。我实际落地时把它拆成四层:语义层、编排层、执行层、反馈层。每层解决一个问题,缺一层都会在某个环节出幺蛾子。

2.1 语义层:先让 Agent 看得懂,再谈上手用

语义层的职责是回答"数据是什么"。传统元数据在这里要升级为"语义目录",里面至少包含四类信息:字段的业务定义、字段的取值样例、指标的计算公式与口径、以及数据的粒度和时效。

举个例子,我在模拟项目X里给每张核心表建立了一份语义画像,结构大致是这样:

{ "table": "order_detail", "display_name": "订单明细", "grain": "订单行粒度", "update_frequency": "实时", "fields": { "order_id": { "description": "订单唯一标识", "sample": "OD202410010001", "is_primary_key": true }, "gmv": { "description": "订单成交金额,含优惠后实付口径", "formula": "sum(amount - discount)", "caliber": "含税" } } }

这份语义画像是"给 Agent 看的文档"。Agent 在规划查询前,会先检索相关表的语义画像,再决定用哪张表、是否可以加 JOIN、指标用哪种口径。实测下来,加上这层之后选表准确率提升非常明显。我后来把语义画像同步做成向量索引,让 Agent 可以直接用自然语言语义检索"哪张表包含销售额和区域",而不是必须知道表名。这一步是后面所有能力的基础,千万别省。

2.2 编排层:把问题拆成步骤,而不是让模型直接写 SQL

很多人做数据 Agent 的第一反应是"让大模型直接生成 SQL"。我劝你冷静。直接生成 SQL 的问题在于:模型不掌握你对表的约束、权限、口径、连接方式,生成的 SQL 往往语法对但逻辑错,而且无法做权限下沉和审计。我的做法是把数据访问能力封装成一个个"原子工具",编排层负责把用户问题拆解成工具调用序列。

比如用户问"本周华东区各品类销售额环比怎么样",编排层的规划结果是:先用指标检索工具找到"销售额"对应的口径和表,再用维度工具解析"华东区、品类、周",接着调用"封装好的多维查询工具"去取数,最后调用解读工具生成结论。每一步都是有限选项,而不是自由文本。这样做好处很多:出错可以定位到具体步骤,权限可以在单步上控制,审计日志也是干净的。

四层体系我整理成一张表,方便你对照检查自己的方案缺了哪块:

层级核心职责关键产物最容易犯的错
语义层让 Agent 理解数据含义语义画像、样例数据、口径公式只给表名不给样例和口径
编排层把问题拆解为可执行的步骤任务规划、工具调用序列让模型直接自由生成 SQL
执行层安全可控地访问数据工具接口、权限策略、审计日志权限绕过或链路不可追踪
反馈层持续提升回答质量评分、纠错样本、回归集上线后不评价不迭代

2.3 执行层:工具化封装才是安全底线

执行层是 Agent 与数据之间的"门卫"。我的原则是:Agent 永远不能直连数据库,它只能调用预先封装好的工具。这些工具每个都有明确的入参、出参、权限范围和调用频控。比如一个"query_metric"工具内部会做四件事:解析参数、校验权限、拼装受控 SQL、记录审计日志。

权限校验这里有个容易被忽略的点:不要把 Agent 当做一个单独的系统账号。如果所有请求都走同一个账号,那就没法回答"为什么这个 Agent 能看到某张表"这种问题。正确做法是让 Agent 的每次调用都携带发起用户上下文,执行层基于用户的权限做行级和列级过滤。也就是说,Agent 可以比人更快地找数,但不能比人看到更多。

我还在执行层做了"护栏型工具",比如"explain_metric"返回指标口径说明,让 Agent 在拿不准的时候先调用它再取数。这比在提示词里塞一大段规则可靠得多。工具本身的约束,才是 Agent 真正会遵守的约束。

2.4 反馈层:没有评价闭环,Agent 只会越用越飘

很多团队做完前三层就上线了,我强烈建议把反馈层也做上。没有反馈的 Agent,就像没有质检的产线,出错了也无人在意,直到用户忍无可忍。

我在模拟项目X里搭了一套轻量反馈机制:每次 Agent 回答完,让用户点"满意 / 不满意";不满意时自动留痕——问题、规划步骤、工具调用、最终答案、用户补充说明全部进样本库。然后用这些样本每两周做一次回归评测,针对同一批固定问题跑一遍,看准确率有没有退化。这套机制看起来不起眼,但它是整个系统持续可靠的保证。有一次模型版本升级后,某类日期解析全错,就是靠回归集先暴露出来的,没让问题扩散到线上。

3. 多模态数据湖的演进:从"存表格"到"存一切"

如果说前两部分是"Agent 怎么用数据",那多模态数据湖回答的就是"Agent 要用的新数据从哪来、怎么存"。真实的业务数据远不止结构化表格:合同 PDF、客服录音、工单文本、产品图片、监控视频,这些数据以前要么躺在文件服务器里没人管,要么被直接丢弃。Agent 恰恰是最需要这些多模态数据的——也只有 Agent 真正有能力把它们利用起来。

3.1 老数据湖的隐藏假设:一切皆表

传统数据湖的技术底座实际上是"以表为中心"的:分区、文件格式、数仓表都围绕结构化数据设计。把一张图片、一段音频放进去,它就是一个"黑盒文件",没有 schema、没有可解析的语义、也没有办法被 SQL 查询到。我最初接需求时,对方的想法是"把非结构化数据也收进湖里,方便以后用",但真的收进来之后发现,除了占存储、建了目录,它们基本是死的——因为没有统一的元数据描述,也没有消费入口。

3.2 多模态带来的三类"新住户"

多模态数据湖要把并非表格的东西变成可以被 Agent 理解和检索的资源。我实际归档下来,积累的数据形态大致有三类:

第一类是文本类资产,包括合同、工单、客服对话记录、产品描述。这些数据需要抽取关键字段(合同金额、签约日期、工单类别),生成摘要和主题标签,再连同原文一起入库。第二类是向量资产,文本、图片经模型切分和向量化之后产生的向量集合,它们要配合专用检索引擎使用,向量与元数据必须能互相回溯。第三类是音视频的大文件或小文件,它们的特点是体积大、需要转码和抽帧处理,处理产物(字幕文本、关键帧画面甚至帧级别的语义标签)才是 Agent 真正需要的。

这个演进本质上是从"一个存储"变成"存储 + 处理 + 索引"的一体化设计。好在现在主流的对象存储加上开源处理框架都能支撑,关键是别把"入库"当成终点,入库之后要有配套的处理流水线,把非结构化数据"翻译"成 Agent 可理解的语义资源。

3.3 统一目录与统一访问层:湖的"操作系统"

多模态湖最怕的是搞出两套体系:结构化数据一套目录,非结构化文件一套目录,向量又一套。Agent 来访问的时候,根本不知道该去哪套里找。我在项目里把湖的所有资产收进了一个统一目录服务,每类资产都登记为一种资产类型,有统一的标识、负责人、访问策略、更新时间字段,再在资产类型下面扩展专有属性(表结构、向量维度、文件标签等)。

这样设计有个直接收益:Agent 侧的检索逻辑只需要对着一套目录做语义检索,命中哪个资产就按对应的资产类型调用相应的读取工具。权限治理也统一了,不用为每类数据单独写一套鉴权。我觉得"统一目录 + 多类型扩展"是多模态湖管得住的关键,如果一开始就各管各的,后期想合并会非常痛苦。

4. 元数据治理的创新实践:从"文档字典"升级成"机器契约"

前面几章其实已经反复提到元数据,因为它就是 AI Agent 时代的"数据底座里的底座"。但元数据治理本身也在变,不再是简单地做数据字典和数据地图。我把它总结成三个关键词:自动化、实时化、契约化。

4.1 自动化采集:让元数据从人工登记变成主动发现

传统数据治理最劝退的就是人工登记:建表的人不写注释,后面就要靠专人补录,补录还经常漏。Agent 时代这条路彻底走不通,因为数据的消费方是机器,元数据的完整度直接影响 Agent 的正确率。我们的做法是把元数据采集做成了持续运行的流水线:表结构和字段信息自动解析,字段取值自动抽样去重,表间外键关系自动探索,再加上定期扫描数据质量规则生成质量评分。人工只需要做"审阅和订正",而不是从零录入。

这一步的性价比极高。因为采集是自动的,覆盖面可以做到 100%,不会出现"常用表有人维护、冷门表无人问津"的情况。而这个"覆盖面"恰恰是 Agent 场景下最要命的指标——如果 Agent 检索不到某张冷门表,它就会理所当然地告诉你"没有这些数据"。

4.2 血缘的实时化:从"事后回溯"变成"事前推演"

血缘在传统治理里主要是用来排错的:报表数据出问题了,顺着血缘往回找是哪一层跑挂了。对 Agent 来说,血缘的作用升级了——它需要知道"我手上这张表的数据是从哪来的、加工逻辑是什么、数据可信度如何",才能判断能不能用来回答用户的问题。

我们在项目里把血缘解析从批处理改成了任务运行时实时记录:每次调度任务执行,就把本次实际读写的表和字段关系记录下来,实时更新到目录服务里。这样 Agent 在取数前可以先看血缘链,如果目标表依赖的上游任务最近有失败,它就可以主动告诉用户"这个数可能不全,建议稍后再查"。这一步让血缘从"出事后的排查工具"变成了"回答前的上下文依据"。

4.3 数据契约:给 Agent 一个稳定可靠的接口

我自己体会最深的一个理念是:对 Agent 来说,数据表更像 API,而数据契约就是 API 的接口文档。契约里除了结构信息,还要写清楚承诺:更新延迟、分区策略、空值处理方式、质量规则、粒度说明。例如:

{ "dataset": "order_detail_daily", "schema_version": "v3", "owner": "data-team", "sla": {"max_delay": "2h", "partition": "day"}, "quality_rules": [ {"field": "order_id", "rule": "unique", "severity": "error"}, {"field": "amount", "rule": "not_null", "severity": "error"} ] }

数据契约的最大意义是"稳定"。Agent 的提示词不需要频繁改,它能从契约里自动获取最新的字段清单和口径;数据方改结构时也要先看契约,提前评估影响范围。我们专门做了契约变更的版本管理,任何不兼容变更都会自动通知到依赖这个数据集的 Agent 任务,避免静默出错。

4.4 安全与合规:Agent 场景下的权限传播与脱敏

元数据治理里最容易出风险的是权限和敏感数据。Agent 放大了这个风险,因为原来一个普通员工只能看到自己有权限的数据,现在有了 Agent,等于多了一个"不知疲倦的找数助手",如果权限设计不好,它就可能帮助用户看到不该看的东西。

我的经验是三件事必须做:第一,权限上下文传播,Agent 的所有数据访问都绑定发起用户的身份,按用户权限过滤;第二,敏感字段自动识别,在元数据层给字段打敏感性标签,比如身份证号、手机号、薪资,查询时按安全策略自动脱敏;第三,全量审计,Agent 的每次工具调用都记录下来,包含谁发起的、访问了哪些数据、返回了什么内容。这三件事看起来老生常谈,但放到 Agent 链路里执行起来,细节会比人访问场景多很多,值得单独排人力去打磨。

5. 落地三个月的真实复盘:这些坑值得你提前绕开

理论讲完了,最后说说实操里最扎心的几个坑。我不是没走过弯路,以下每一条都是用线上事故换来的经验。

5.1 幻觉问题的根因,往往不在模型而在上下文

很多人以为 Agent 胡说八道是模型的问题,换更大更强的模型就能解决。我的经验是:在数据场景里,大部分"幻觉"其实是上下文缺失导致的。模型不知道有什么表、不知道字段含义、不知道口径差异,就只能编一个看起来合理的答案。

解决方案就是前面说的语义层要做好:让 Agent 在生成答案前先完成"检索语义画像—选择数据资产—确认指标口径—再取数"的完整链路。我们上线语义画像之后,同类问题的错误率大概降了一半还多。所以下次再遇到 Agent 胡说,先别急着骂模型,先问问自己:它该知道的东西,你都喂给它了吗?

5.2 Token 成本和接口延迟,比想象的贵得多

Agent 链路看着简单,实际跑起来,一次问答背后可能是六七次甚至十几次大模型调用:语义检索要调用向量化接口,规划要调用推理模型,每个工具调用还要附带生成参数,最后又要汇总生成回答。这在开发环境里无感,到了生产线上,并发一上来,账单和延迟都很难看。

我的调整策略有四个:第一,优先用小模型做路由和工具参数抽取,只有最后组织答案时才用大模型;第二,给工具调用结果做缓存,同一个问题短时间内重复问就直接返回缓存;第三,把常见口径和常用指标提前做预计算和缓存;第四,限制 Agent 的单次任务步数上限,避免它陷入无意义的循环调用。这四点加起来,成本大概能压到原来的三分之一,响应速度也明显改善。

5.3 向量计算和小文件膨胀:多模态湖最烧钱的两个暗角

多模态湖的存储成本其实不是大头,大头在于处理链路。给几百万份文档做切分、向量化、建索引,计算费用和耗时都很可观。而且向量化模型的版本经常更新,每次更新都要重算一遍,这个成本很多人没提前算进去。

另一个容易踩的是小文件问题。图片、视频抽帧、文本切块都会产生海量小文件,直接落到对象存储会让读写性能大幅下降、元数据服务也跟着吃力。我们后来加了小文件合并层,定时把碎片文件合并成大文件,再配合分区和生命周期策略,性能才稳住。记住,多模态湖的扩容规划里,要把"处理算力 + 索引存储 + 小文件治理"都算进去,不能只盯着原始文件大小。

5.4 动手之前,先想清楚这三件事

如果让我给准备走这条路的人三条建议,我会说:第一,选一个边界清晰的场景先跑通,比如先做"销售数据问答",别一上来就想要一个无所不能的数据助手,范围收得越窄,越容易把质量和成本打平。第二,默认加人机协同,Agent 给出结果和依据,关键决策由人确认,既降低风险也帮你积累高质量标注样本。第三,把数据治理放在 Agent 能力之前,宁可 Agent 能力弱一点,也别在脏数据和模糊口径上硬上——数据不准,Agent 越聪明,错误越有说服力,也更危险。

项目做到最后,我最大的变化反而不在技术上:以前我觉得数据栈的目标是"把数据管好",现在我觉得目标是"让数据可以被正确消费"——而 AI Agent 恰恰是消费方式变化最大的那个变量。这也是我想通过这篇复盘传达的东西:别再把 Agent 当做一个挂在数据栈上的新玩具,它值得我们重新审视从存储、治理到服务的每一个既有设计。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询