跳到正文
阿里雲開發者社區 AI·· 3 小時前AI 評分50

AI 回答監測數據如何接入數據倉庫:三層架構與欄位設計

把监测数据接进数仓:分层与字段

AI 導讀

這套方法以 ODS、DWD、ADS 三層將 AI 回答監測數據接入數據倉庫,分存原始回答、加工明細與指標聚合。增量數據寫入 ODS 新分區,DWD 按分區覆蓋回灌;口徑變更時重放 DWD,以新版本重算 ADS 並保留舊版。每個指標可沿口徑版本、DWD 明細及 answer_id 回查 ODS 原始回答;文中 12,000 條回答及 360 條帶被引連結均為假設示例。

正文

2026-10-31 12

版权

版权声明:

本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《 阿里云开发者社区用户服务协议》和 《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写 侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

简介: 本文提出AI回答数据入仓的三层分层架构:ODS存原始回答(只追加)、DWD做归一化与实体标注(按分区覆盖)、ADS产出带版本号的指标聚合。每层职责清晰、可独立重放,支持口径变更回溯与全链路核查,兼顾可复算性与工程可控性。(239字)

结论先说:把 AI 回答监测数据接进数仓,三层就够:ODS 存原始回答不动,DWD 做归一化、去重与实体标注,ADS 出指标聚合。三层各有一组关键字段和分区键;增量按采集批次落 ODS,回灌按分区覆盖 DWD,口径变更用版本号沿链路回滚到 ADS。分层不为层数,为每层都能单独重放。

这里说的「数仓分层」,指的是把采集下来的原始回答、归一后的明细、聚合后的指标,按改造成本拆成三层存放:越往下越接近原始、越少加工,越往上越接近口径、越能重算。每层只做一类事,上一层不回头改下一层。

本文只讲分层与字段:三层各放什么、关键字段怎么定、分区键怎么选、增量和回灌怎么走、口径变更怎么回溯。文中条数和比例都是假设值,只用来演示字段口径。

一、为什么不能一张大表装完

我最初把采集结果塞进一张表:一行里既有回答原文,又有清洗后的链接和按天算好的指标。两周后遇到三个问题。

一是清洗逻辑一改就全表重扫;二是同一行既是事实又是结论,指标算错说不清哪一步错;三是口径一变历史行被覆盖,想比两版口径已找不到旧数据。

三层分离解决的就是这三件事:ODS 保留事实,DWD 承担改造,ADS 承载口径。改造错了重跑 DWD,口径变了重算 ADS,原始回答等在 ODS 里。

二、三层各放什么

层:放什么 | 粒度 | 分区键 | 更新方式
ODS:原始回答、来源列表、抓取上下文 | 一条回答一行 | 采集日 + 批次 | 只追加,不改写
DWD:归一化回答、去重明细、链接归一、实体标注 | 一条有效回答一行 | 采集日 + 平台 | 按分区覆盖回灌
ADS:指标聚合(条数、带链接数、域名数) | 指标 × 维度组合 | 口径版本 + 统计日 | 由 DWD 重算

ODS 只做一件事:把这一轮采集原样落下来。问法原文、平台键、抓取时刻、回答正文、来源列表、采集状态都放这里,字段不改。

DWD 承担全部改造。它只收有效回答,落四类标记:是否有效、是否重复、链接归一、实体标注(主体、其他主体、无法判断)。这层重算最勤。

ADS 只放指标。每行是「指标名 + 维度 + 分子 + 分母 + 口径版本」,不存明细,也不接受手改。

三、每层的关键字段

ODS 必填字段我压到七个:run_id、抓取时刻(带时区)、问法原文、问法集版本、平台键、回答正文、来源列表,再加采集状态,把成功、空回答、失败分开。

DWD 的关键是三个 id:answer_id 用内容 hash 加批次生成,重复抓到的同一条能合并;url_norm 存归一链接,域名单独抽字段;entity_tag 存实体标注,标注规则带版本号。ADS 则要求分子分母同时落,只存比例换个人无法复算。

-- ODS:只追加
CREATE TABLE ods_answer (run_id TEXT, fetched_at TIMESTAMPTZ, question TEXT,
question_ver TEXT, platform TEXT, answer TEXT, sources JSONB, fetch_status TEXT,
dt DATE) PARTITION BY RANGE (dt);
-- DWD:按分区覆盖回灌
CREATE TABLE dwd_answer (answer_id TEXT, platform TEXT, is_valid BOOLEAN, is_dup BOOLEAN,
url_norm TEXT, domain TEXT, entity_tag TEXT, tag_ver TEXT, dt DATE) PARTITION BY LIST (dt);
-- ADS:分子分母 + 口径版本
CREATE TABLE ads_metric (metric TEXT, dim_key TEXT, numerator BIGINT, denominator BIGINT,
caliber_ver TEXT, stat_date DATE) PARTITION BY LIST (stat_date);

四、分区键与增量回灌

分区键按最常用的过滤条件选:ODS 用采集日加批次,回查总按轮次;DWD 用采集日加平台,回灌常按平台切;ADS 用口径版本加统计日,两版口径要能并排看。

增量我只写新分区:新数据落新 dt,不动历史分区,这决定重算成本的上界。

回灌我按分区覆盖,不按行更新。假设一轮采集落 12,000 条回答,其中 360 条带被引链接;链接归一规则变了,我只重算 DWD 受影响分区,ODS 不动。覆盖前我会备份,失败能整区退回。

五、口径变更怎么回溯

口径变更我按四步走:先给新口径升版本号;再从 ODS 重放 DWD 分区;再用新版本重算 ADS;最后两版并列出数,旧版冻结保留。

回溯方向相反:任取一个 ADS 指标,我先找到口径版本和分子分母,再按维度回查 DWD 明细,最后用 answer_id 回查 ODS 原始回答。这条链路通,指标才敢对外讲。

硬规矩一条:ADS 数字不许手改。算错就修 DWD 或改口径版本重算,手改一次,下次重算就对不上。

六、五个能立刻做的检查

第一步,冻结 ODS 字段与分区键,只追加。

第二步,在 DWD 落四类标记:是否有效、是否重复、链接归一、实体标注。

第三步,ADS 每个指标存分子、分母与口径版本。

第四步,回灌前备份分区,回灌后校验。

第五步,我会抽一个 ADS 数字,按版本、明细、原始回答查回去。

七、三个绕不开的反问

问:为什么不直接从 ODS 算指标?
答:能算,但不能复用。 ODS 混着空回答和失败记录,每次算指标都要重写清洗逻辑;口径一变,同一段逻辑改两次。

问:DWD 要不要再存一份原始正文?
答:存引用,不存副本。 原始正文留在 ODS,DWD 存 answer_id 与归一结果,回查时 join 回去。

问:口径变更时旧数据怎么办?
答:旧版冻结、新版重放。 两版并列出数,不做原地覆盖;能并排才谈得上比较。

八、边界

这套分层我承诺三件事:每层单独重放、每个字段可核对、每个指标能回查到原始回答。字段名可改,每层留一个可回溯 id。

数据源:本文为方法说明,不引用真实结果;条数与比例为假设值。
查询日:无真实查询日;示例数字不绑日期。
样本:假设一轮 12,000 条回答,360 条带被引链接。
口径:回答按条计,带链接按来源列表里可点地址计。
局限:示例只演示字段与分层;流式与实时链路不在本文范围。

只写可复算的结构,不承诺任何采集结果与效果数值。

本文含 AI 辅助生成内容,经人工核实。

來源:阿里雲開發者社區 AI · developer.aliyun.com