# image_article_comprehension 数据工程流程分析报告(三库核验版) 生成时间:2026-05-28 分析范围:`/Users/samlee/Documents/works/image_article_comprehension` 源码、PostgreSQL `open_aigc.public` 只读实连统计、MySQL `open_aigc_pattern` 与 `aigc-admin-prod` 连接/元数据核验。 核验方式:PostgreSQL 使用 `default_transaction_read_only=on` 查询元数据和统计;MySQL `open_aigc_pattern` 的 RDS 域名会被本机/VPN Fake-IP 路径接管且 SQL 握手失败,但真实内网地址 `192.168.202.204:3306` 可只读实连;MySQL `aigc-admin-prod` 只查询 `information_schema` 字段元数据,不读取 cookie 行值。 > 安全说明:本报告不复写数据库密码原文;密码原文按用户要求只写入同目录 Excel 的 `数据库清单` sheet。 2026-05-29 追加核验口径:Excel 的“源表 -> 去重 -> embedding -> 距离矩阵 -> DBSCAN -> batch -> 分类 agent -> global 三表”是真实存在的聚类辅助分类/embedding 分类链路;但 `scripts/run_classify.py` 主入口不把 `element_dedup_group`、source embedding cache、距离矩阵、DBSCAN 当硬前置。狭义 Pattern V2 是 `pattern_mining_*` 快照和 pattern 挖掘,不生成 global 三表;如果口头把整个 `pattern_global_v2` 服务都叫 Pattern V2,则其中分类库阶段会写 global 三表。MySQL `open_aigc_pattern` 当前通过真实内网地址 `192.168.202.204:3306` 只读复核成功,但只影响 build 工作台和旧兼容层口径,不改变分类库与 Pattern V2 主链路。完整修订见 `/Users/samlee/Documents/works/数据工程/pattern-global-v2-full-data-algorithm-report.md`。 ## 1. 核验结论 本项目当前只按 3 个有效数据库整理: | 数据库 | 定性 | 本项目角色 | |---|---|---| | PostgreSQL `open_aigc.public` | 分类库 + pattern v2 + 原始解构主库 | 接收 topic/script 解构结果,沉淀去重、分类树、映射、embedding、pattern 快照和 pattern v2 输出 | | MySQL `open_aigc_pattern` | 构建工作台库 | 记录选题构建、脚本构建、prompt/strategy、外部搜索日志、输入缓存/配置,以及旧版兼容 `topic_pattern_*` 表 | | MySQL `aigc-admin-prod` | AIGC 后台辅助库 | 当前代码只用于浏览器工具读取 `agent_channel_cookies` 的 cookie/profile 元数据,不是 pattern 加工输入库或输出库 | 两个已确认废弃库已从本报告和 Excel 的主数据流转中删除,不再纳入本项目数据工程口径。 主数据链路是:上游内容或解构 JSON/API 进入 `open_aigc` 原始表,经过 dedup、embedding/距离矩阵、DBSCAN 聚类辅助、分类 agent 写入全局分类体系,再由 pattern snapshot 和配置化挖掘产出 pattern v2 结果。`patter_from_global_and_build` 消费 `open_aigc` / pattern v2 查询能力,把选题和脚本构建过程写入 `open_aigc_pattern`。 需要特别修正的口径: 1. `run_daily_main.py` 当前默认只启用 `topic_element` FP-Growth;`topic`、`point_pattern`、`cross_layer`、`paragraph`、`script_sequence` 等 loop 是可配置能力或历史输出,不能写成当前默认都会跑。 2. `open_aigc_pattern` 是当前 topic/script build 工作台库,不只是旧兼容库;其中 `topic_pattern_*` 是旧本地 mining/兼容/展示兜底层,当前 library/account pattern 查询更应以 `pattern_global_v2` HTTP debug API 和 `open_aigc` 的 pattern v2 表为准。 3. `aigc-admin-prod` 不提供外部搜索 case 数据;外部搜索来自 HTTP/crawler/aigc-channel/tophub 等接口,结果落 `open_aigc_pattern.external_search_case_log`。 4. `post_decode_topic_point_element` 已有 topic 侧 `感受` 数据,实测 `38,773` 行,但当前 `element_dedup_group` 和当前全局映射尚未承接这部分口径。 ## 2. 数据库和实例核验 | 数据库 | 实例名/实例ID | 实例连接地址 | 当前解析/peer | 连接状态 | 用途 | 配置来源 | |---|---|---|---|---|---|---| | PostgreSQL `open_aigc.public` | `gp-t4n72471pkmt4b9q7o-master` | `gp-t4n72471pkmt4b9q7o-master.gpdbmaster.singapore.rds.aliyuncs.com:5432` | `198.18.0.45:5432` | 只读实连成功 | 原始解构、全局分类、embedding、dedup、pattern v2 快照和输出 | `aiddit/pattern_global_v2/db/pg_db_manager.py:13`、`docker/Dockerfile.pattern_global_v2:21`、`patter_from_global_and_build/library_data/library_db_manager.py:12` | | MySQL `open_aigc_pattern` | `rm-bp1k5853td1r25g3n690` | `rm-bp1k5853td1r25g3n690.mysql.rds.aliyuncs.com:3306` | 域名 Fake-IP 本轮 `198.18.0.59:3306`;真实直连 `192.168.202.204:3306` | 域名 Fake-IP 路径 TCP 可连但无 MySQL greeting;真实内网地址只读实连成功,35 张表、332 个字段 | 选题/脚本 build 工作台、prompt/strategy、外部搜索缓存、配置/输入缓存、旧 `topic_pattern_*` 兼容层 | `aiddit/pattern/patter_from_global_and_build/db_manager.py:11` | | MySQL `aigc-admin-prod` | `rm-t4na9qj85v7790tf84o` | `rm-t4na9qj85v7790tf84o.mysql.singapore.rds.aliyuncs.com:3306` | `198.18.0.86:3306` | 实连成功;只查 `agent_channel_cookies` 字段元数据,不读 cookie 行值 | AIGC 后台浏览器工具 cookie/profile 辅助库 | `aigc_agent_sdk/Agent/agent/tools/builtin/browser/sync_mysql_help.py:27`、`browser/baseClass.py:520` | ## 3. PostgreSQL `open_aigc` 表规模 | 表 | 2026-05-28 实测值 | 业务域 | |---|---:|---| | `post` | 66,974 | 内容主表 | | `post_decode_result` | 66,670 | 选题解构结果 | | `post_decode_topic_point` | 572,780 | 选题点 | | `post_decode_topic_point_element` | 1,308,993 | 选题点元素 | | `post_script_paragraph` | 12,164 | 脚本段落 | | `post_script_element` | 47,951 | 脚本一级元素 | | `post_script_paragraph_element` | 110,999 | 段落元素关联 | | `post_script_paragraph_field_element` | 177,856 | 段落字段元素 | | `element_dedup_group` | 262,326 | 去重组 | | `global_category` | 4,944 | 全局分类树 | | `global_element` | 290,864 | 全局元素 | | `element_classification_mapping` | 1,123,373 | 源元素到全局元素/分类映射 | | `global_element_embedding` | 455,269 | 元素向量 | | `global_category_embedding` | 8,860 | 分类向量 | | `pattern_mining_execution` | 7 | pattern v2 执行 | | `pattern_mining_category` | 25,816 | pattern 分类快照 | | `pattern_mining_element` | 1,950,755 | pattern 元素快照 | | `pattern_mining_config` | 45 | pattern 挖掘配置 | | `pattern_itemset` | 449,216 | FP-Growth 结果 | | `pattern_itemset_item` | 1,808,629 | itemset item | | `pattern_itemset_post` | 3,910,262 | itemset 支撑 post | | `pattern_script_sequence` | 2,753 | PrefixSpan 序列 | | `pattern_script_sequence_item` | 7,873 | 序列 item | | `pattern_script_sequence_post` | 15,907 | 序列支撑 post | | `pattern_group_itemset` | 2,997 | topic point/group pattern | | `pattern_group_itemset_item` | 6,138 | group itemset item | | `pattern_group_itemset_member` | 39,191 | group itemset 成员 | ## 4. 原始解构数据 ### 4.1 选题解构元素:`post_decode_topic_point_element` | 分类维度 | 元素行数 | 覆盖 post | distinct 元素名 | |---|---:|---:|---:| | 实质 | 681,856 | 66,069 | 165,839 | | 形式 | 537,947 | 65,899 | 56,975 | | 意图 | 50,417 | 47,572 | 743 | | 感受 | 38,773 | 12,827 | 361 | topic 侧 `感受` 已经是实测存在的数据,不再沿用旧报告“只有 3 行”的说法。但 dedup、聚类入口和当前全局映射尚未承接 `感受 + post_decode_topic_point_element`。 ### 4.2 脚本一级元素:`post_script_element` | 分类维度 | 元素行数 | 覆盖 post | distinct 元素名 | |---|---:|---:|---:| | 实质 | 31,872 | 1,936 | 12,572 | | 形式 | 16,079 | 1,952 | 9,055 | ### 4.3 脚本段落字段元素:`post_script_paragraph_field_element` 后续 dedup、paragraph pattern 和 script sequence pattern 的业务维度以 `field_type` 为核心:`function -> 作用`、`feeling -> 感受`,`theme/form` 再结合 `element_type` 归入“实质/形式”。 | 流转维度 | field_type | 元素行数 | 覆盖 post | distinct 元素名 | |---|---|---:|---:|---:| | 作用 | function | 28,895 | 1,931 | 8,422 | | 实质 | form | 40,207 | 1,926 | 13,084 | | 实质 | theme | 41,699 | 1,932 | 20,760 | | 形式 | form | 31,481 | 1,930 | 6,758 | | 形式 | theme | 7,038 | 1,303 | 2,979 | | 感受 | feeling | 28,536 | 1,932 | 2,194 | ## 5. 主加工 loop 状态 | loop | 当前状态 | 输入 | 输出 | 说明 | |---|---|---|---|---| | topic/script 导入 | 保留主加工 | 上游 JSON/API/ODPS | `post_decode_*`、`post_script_*` | `pattern_global_v2/data_io` 写入 `open_aigc` | | dedup 同步 | 保留主加工 | 3 张原始元素表 | `element_dedup_group` | 1 张表内按 `source_type + source_table` 分 9 个处理组合,不是 9 张 dedup 表 | | source embedding | 保留辅助加工 | dedup 代表元素、已有全局元素向量、embedding API | 本地 `cache/embeddings_{source_table}.ids.npy/.vecs.npy`;可复用/补写 `global_element_embedding` | 原始 source 元素没有独立 DB embedding 表;本地 cache 是矩阵输入 | | 距离矩阵 | 保留主加工 | 9 组 dedup 代表元素 embedding | 本地 `cache/dist_rows_{source_type}__{source_table}.bin/.idx.npz` | 距离矩阵不是数据库表;每个 source_type/source_table 一组矩阵文件 | | DBSCAN 聚类 | 保留辅助加工 | 距离矩阵 | 当前 `cluster_on_demand.py` 返回内存聚类结果;旧/归档路径可写本地 `cache/global_clusters_{source_type}_{source_table}_{timestamp}.json` | 聚类不直接写分类树,只辅助分类 agent/人工批处理;JSON 不是当前必经落地产物 | | 分类 agent | 保留主加工 | cluster batch 或未分类元素 | `global_category`、`global_element`、`element_classification_mapping`;辅助写 `classify_*`、`global_*_embedding`、`post_classification_status` | pattern v2 快照的事实基础 | | pattern snapshot | 保留主加工 | 当前全局分类树和映射 | `pattern_mining_execution/category/element` | 每次 execution 固化当时分类视图 | | topic_element FP-Growth | `run_daily_main.py` 默认启用 | `pattern_mining_element` topic 元素 | `pattern_itemset*` scope=`topic_element` | 当前默认唯一启用的挖掘 loop | | topic FP-Growth | 可配置启用/历史输出 | topic 分类 item | `pattern_itemset*` scope=`topic` | `ENABLE_TOPIC=False` | | point pattern | 可配置启用/历史输出 | topic point/group transaction | `pattern_group_itemset*` | `ENABLE_POINT_PATTERN=False` | | cross_layer | 可配置启用/历史输出 | fully_classified post | `pattern_itemset*` scope=`cross_layer` | `ENABLE_CROSS_LAYER=False` | | paragraph | 可配置启用/历史输出 | paragraph transaction | `pattern_itemset*` scope=`paragraph` | `ENABLE_PARAGRAPH=False` | | script sequence | 可配置启用/历史输出 | 段落顺序 | `pattern_script_sequence*` | `ENABLE_SCRIPT=False` | | MySQL `topic_pattern_*` 本地 mining | 兼容/展示兜底层 | v2 export API 快照 | `open_aigc_pattern.topic_pattern_*` | 非当前 pattern v2 主事实;当前 library/account pattern 查询默认看 v2 HTTP debug API | | AIGC 后台 cookie/profile | 外部辅助 | `agent_channel_cookies` 元数据 | 浏览器工具登录态 | 不参与 pattern 加工,不读 cookie 行值 | ## 6. 去重、embedding 和聚类链路 聚类完整链路只使用 PostgreSQL `open_aigc.public` 作为数据库;`open_aigc_pattern` 不参与原始元素去重、embedding、距离矩阵、DBSCAN 或分类树写入。需要特别区分:`element_dedup_group` 是 1 张数据库表中的 9 个处理组合,不是 9 张表;embedding 和距离矩阵大量落在本地 `cache/` 文件,DBSCAN 当前可跑入口返回内存结果,旧/归档路径才会写 `global_clusters_*.json`。 ### 6.1 阶段产物总览 | 阶段 | 输入 | 加工方式 | 生成数据 | 写入/落地位置 | |---|---|---|---|---| | 原始元素输入 | `post_decode_topic_point_element`、`post_script_element`、`post_script_paragraph_field_element` | topic/script 解构导入后形成原始元素行 | 原始元素 ID、post_id、元素名、元素类型、描述、段落字段类型 | 3 张原始元素表 | | 去重 dedup | 3 张原始元素表 | 按 `source_type + source_table + normalized_name` 分组;段落字段表中 `function -> 作用`、`feeling -> 感受`,`theme/form` 再结合 `element_type` 归入实质/形式 | `representative_id`、`member_ids`、`occurrence_count`、`dedup_key` | `element_dedup_group` | | source embedding | dedup 代表元素 ID | 优先读本地 source embedding cache;缺失时尝试通过 `element_classification_mapping -> global_element_embedding` 复用已分类全局元素向量;仍缺失则调用 embedding API 并回写本地 cache | source 元素向量 | 本地 `cache/embeddings_{source_table}.ids.npy`、`cache/embeddings_{source_table}.vecs.npy`;分类后新全局元素向量写 `global_element_embedding` | | 距离矩阵 | 9 组 dedup 代表元素向量 | 计算 cosine distance,行存储 float16,增量追加 | 每组 source_type/source_table 的代表元素距离行和索引 | 本地 `cache/dist_rows_{source_type}__{source_table}.bin`、`cache/dist_rows_{source_type}__{source_table}.idx.npz`;旧格式兼容 `cache/distance_matrix_{key}.npz` | | DBSCAN | 距离矩阵 | `DBSCAN(metric='precomputed')` 找相似元素簇 | `metadata`、`clusters[{cluster_id,size,member_ids}]`、`noise_elements`;当前 `cluster_on_demand.py` 返回内存 dict | 旧/归档路径可写本地 `cache/global_clusters_{source_type}_{source_table}_{timestamp}.json`,但不是当前必经落地产物 | | cluster batch | DBSCAN 内存结果或旧归档 JSON、`element_dedup_group`、`element_classification_mapping`、原始元素表 | 展开 dedup member_ids,过滤已在 mapping 中分类过的 source_element_id,再回原始表取元素名/描述 | 待分类 batch:`representative_id`、`element_name`、`element_description`、`all_ids`、`cluster_id`、`source_table` | 传给 classify agent;不直接写 DB | | 分类 agent | cluster batch 或普通未分类 batch | agent tool 可查树、建分类、创建/复用全局元素、创建映射、刷新 post 分类状态 | 全局分类树、全局归一元素、原始元素到全局元素/分类的映射、执行日志、向量 | `global_category`、`global_element`、`element_classification_mapping`;辅助表 `classify_execution`、`classify_batch`、`classify_execution_log`、`global_element_embedding`、`global_category_embedding`、`post_classification_status` | 当前代码里还存在一个实现漂移,需要把“设计链路”和“当前可跑入口”分开看:`ClusterBatchPreparer.cluster_all_elements()` 同步矩阵时使用 `source_type + source_table`,但随后 `load_or_create(source_type)` 没带 `source_table`,与实际矩阵 key `source_type__source_table` 不一致;同文件 `get_unclassified_from_cluster()` 调用的 `expand_dedup_groups` 在 `DedupManager` 中实际方法名是 `expand_members`。因此当前更可信的聚类入口是 `scripts/dedup_matrix/build_all_matrices.py` 预构建 9 组矩阵,再由 `scripts/dedup_matrix/cluster_on_demand.py` 按 `source_type__source_table` 提取子矩阵做按需聚类;`global_clusters_*.json` 只能写作旧/归档式路径,不应写成当前必经产物。 ### 6.2 原始元素表和 9 个 dedup/聚类组合 聚类入口的原始元素表一共 3 张: | 原始元素表 | 实测行数 | 聚类使用字段 | 进入哪些处理组合 | |---|---:|---|---| | `post_decode_topic_point_element` | 1,308,993 | `id`、`post_id`、`element_type`、`element_name`、`element_description` | `实质`、`形式`、`意图`;topic 侧 `感受` 原始存在但当前 dedup/聚类组合未承接 | | `post_script_element` | 47,951 | `id`、`post_id`、`element_type`、`name`、`element_description` | `实质`、`形式` | | `post_script_paragraph_field_element` | 177,856 | `id`、`paragraph_id`、`post_id`、`field_type`、`element_type`、`element_name`、`element_description` | `实质`、`形式`、`作用`、`感受` | `element_dedup_group` 仍为聚类前的关键缩减表。去重按 `source_type + source_table + normalized_name` 建组,代表元素用于 embedding 和距离矩阵。 | source_type | source_table | 去重组数 | 去重口径内出现行 | 最大组大小 | 平均组大小 | |---|---|---:|---:|---:|---:| | 作用 | `post_script_paragraph_field_element` | 8,422 | 28,895 | 1,326 | 3.43 | | 实质 | `post_decode_topic_point_element` | 140,069 | 537,822 | 4,448 | 3.84 | | 实质 | `post_script_element` | 12,562 | 31,872 | 292 | 2.54 | | 实质 | `post_script_paragraph_field_element` | 30,830 | 81,906 | 1,155 | 2.66 | | 形式 | `post_decode_topic_point_element` | 49,402 | 423,987 | 6,093 | 8.58 | | 形式 | `post_script_element` | 9,053 | 16,079 | 211 | 1.78 | | 形式 | `post_script_paragraph_field_element` | 9,151 | 38,519 | 1,437 | 4.21 | | 意图 | `post_decode_topic_point_element` | 643 | 40,732 | 19,478 | 63.35 | | 感受 | `post_script_paragraph_field_element` | 2,194 | 28,536 | 1,590 | 13.01 | 当前 topic 原始表已经增长,但 dedup 仍停在旧同步口径。例如 topic 原始 `实质` 是 `681,856` 行,而 dedup 中 `实质 + post_decode_topic_point_element` occurrence 仍是 `537,822`;topic 原始 `感受` 有 `38,773` 行,但 dedup 没有 `感受 + post_decode_topic_point_element`。 ### 6.3 分类写表格式 分类 agent 处理的是 cluster batch 或普通未分类元素 batch。DBSCAN 只提供“哪些元素相似”的候选簇,真正的全局归一和分类树写入发生在分类工具层: | 写入表 | 写入内容 | 关键字段 | |---|---|---| | `global_category` | 全局分类树节点,按 `stable_id` 维持逻辑稳定 ID,修改时用新行版本追踪 | `stable_id`、`name`、`description`、`parent_stable_id`、`source_type`、`classified_as`、`level`、`path`、`created_at_execution_id`、`retired_at_execution_id` | | `global_element` | 全局归一后的标准元素;同名同分类可复用,复用时增加 `occurrence_count` | `id`、`name`、`description`、`belong_category_stable_id`、`source_type`、`element_sub_type`、`occurrence_count`、`created_at_execution_id`、`retired_at_execution_id` | | `element_classification_mapping` | 原始 source 元素到全局元素和分类节点的映射 | `source_table`、`source_element_id`、`post_id`、`element_name`、`element_type`、`global_element_id`、`global_category_stable_id`、`classification_path`、`classify_execution_id` | | `global_element_embedding` | 新建或迁移后的全局元素向量,用于相似搜索和后续复用 | `element_id`、`belong_category_stable_id`、`source_type`、`embedding_field`、`embedding_model`、`embedding`、`is_active` | | `global_category_embedding` | 分类节点向量,用于分类树搜索、相似分类检索;分类名/描述变化时旧向量失活 | `stable_id`、`source_type`、`embedding_field`、`embedding_model`、`embedding`、`is_active` | | `post_classification_status` | 按 post/source_type/source_table 刷新分类完成度 | `post_id`、`source_type`、`source_table`、`total_elements`、`classified_elements`、`is_completed` | “全局归一”的实际关系是:原始元素表中的一行或一个 dedup group member,最终通过 `element_classification_mapping.source_table + source_element_id` 指向一个 `global_element.id`;这个全局元素再通过 `belong_category_stable_id` 挂到 `global_category.stable_id` 对应的分类树节点。原始元素不被覆盖,映射表保存“原始元素 -> 全局标准元素 -> 分类路径”的关系。 ## 7. 全局分类树、映射和 pattern v2 统计口径:`global_category.retired_at_execution_id IS NULL` 和 `global_element.retired_at_execution_id IS NULL`。 | 分类树 | 活跃节点 | 根节点 | 叶子节点 | 最大层级 | 活跃 global_element | 映射行数 | 覆盖 post | 活跃 category embedding | |---|---:|---:|---:|---:|---:|---:|---:|---:| | 作用 | 185 | 2 | 140 | 8 | 4,753 | 25,298 | 1,907 | 362 | | 实质 | 972 | 2 | 740 | 7 | 148,740 | 615,710 | 52,836 | 1,916 | | 形式 | 624 | 2 | 458 | 6 | 60,384 | 470,315 | 52,710 | 1,248 | | 意图 | 28 | 3 | 18 | 3 | 293 | 12,050 | 11,954 | 56 | | 感受 | 46 | 2 | 36 | 3 | 0 | 0 | 0 | 92 | `感受` 当前有分类节点和 embedding,但没有活跃 `global_element` / `element_classification_mapping`。这与脚本原始数据、dedup 和历史 pattern 快照中存在“感受”形成口径差异。 `pattern_mining_execution` 仍有 current 异常:`#401` 是 `is_current=true` 但 `status=failed`,`#281` 也是 current;`#581` 是最新成功执行但 `is_current=false`。API 如果只按 `is_current` 选 execution,可能会拿到失败快照。 | execution_id | snapshot_date | status | is_current | post_count | category_count | element_count | topic_itemset_count | topic_element_itemset_count | cross_itemset_count | paragraph_itemset_count | script_sequence_count | |---:|---|---|---|---:|---:|---:|---:|---:|---:|---:|---:| | 581 | 2026-05-09 | success | false | 13,265 | 1,932 | 290,467 | 35,406 | 18,491 | - | - | - | | 541 | 2026-04-27 | running | false | 12,448 | 3,992 | 315,389 | - | 38,418 | - | - | - | | 501 | 2026-04-27 | success | false | 12,448 | 3,992 | 315,389 | - | 26,070 | - | - | - | | 421 | 2026-04-24 | success | false | 12,448 | 3,995 | 315,389 | 26,849 | 8,932 | - | - | - | | 401 | 2026-04-23 | failed | true | 12,448 | 3,995 | 315,389 | - | - | 2,649 | 3,219 | 1,197 | | 301 | 2026-04-21 | success | false | 11,760 | 3,955 | 199,366 | 928 | 388 | - | - | - | | 281 | 2026-04-16 | success | true | 11,760 | 3,955 | 199,366 | 76,835 | 17,153 | 92,142 | 3,219 | 1,030 | ## 8. 构建库 `open_aigc_pattern` `open_aigc_pattern` 是当前 topic/script build 工作台库,而不是当前 pattern v2 真相库。当前连接核验结论: - RDS 域名 `rm-bp1k5853td1r25g3n690.mysql.rds.aliyuncs.com:3306` 会被本机/VPN Fake-IP 路径接管;本轮解析为 `198.18.0.59`,此前核验曾出现 `198.18.0.47`。该路径 TCP 可连,但收不到 MySQL greeting,PyMySQL 会报 `OperationalError: (2013, 'Lost connection to MySQL server during query')`。 - 真实内网地址 `192.168.202.204:3306` 只读实连成功,返回 MySQL `5.7.30-log`;当前库实测 35 张表、332 个字段。 - Excel `表字段字典` 已从 live `information_schema` 补齐此前缺失的 5 张表:`account_constant`、`base_config`、`topic_build_strategy`、`topic_build_strategy_version`、`xhs_benchmark_account`。 2026-05-29 复核关键表规模: | 表 | 2026-05-29 实测行数 | 角色 | |---|---:|---| | `topic_build_record` | 1,093 | 选题构建执行记录 | | `topic_build_topic` | 1,264 | 选题候选/结果 | | `topic_build_composition_item` | 22,579 | 选题组成元素 | | `topic_build_item_source` | 23,504 | 元素证据来源 | | `topic_build_item_exploration_trace` | 15,466 | item 探索轨迹 | | `script_build_record` | 269 | 脚本构建执行记录 | | `script_build_paragraph` | 945 | 脚本段落 | | `script_build_element` | 2,459 | 脚本元素 | | `script_build_paragraph_element` | 4,447 | 段落和元素关联 | | `external_search_case_log` | 12,043 | 外部搜索 case 缓存 | | `prompt` / `prompt_version` | 9 / 125 | prompt 当前版本和历史版本 | | `build_strategy` / `build_strategy_version` | 56 / 242 | 构建策略当前版本和历史版本 | | `topic_pattern_itemset` | 655,513 | 旧 topic pattern 本地 itemset | | `topic_pattern_itemset_item` | 3,007,048 | 旧 topic pattern item | 从 live schema、ORM 和业务工具看,保留这些 build 表组: | 表组 | 主要表 | 用途 | |---|---|---| | 配置/输入缓存 | `base_config`、`account_constant`、`topic_piaoquan_demand`、`xhs_benchmark_account`、`post` | 默认 execution、批量配置、账号人设常量、票圈需求池、对标账号缓存和本地 post 元数据 | | 选题构建 | `topic_build_record`、`topic_build_topic`、`topic_build_composition_item`、`topic_build_item_source`、`topic_build_item_exploration_trace`、`topic_build_point*`、`topic_build_log` | 记录需求、选题方向、构成 item、证据来源、探索轨迹、组合点和执行日志 | | 脚本构建 | `script_build_record`、`script_build_paragraph`、`script_build_element`、`script_build_paragraph_element`、`script_build_decision_trace`、`script_build_log` | 记录脚本段落树、元素、支撑关系、决策 trace 和执行日志;`script_build_provenance` 为旧数据保留 | | prompt/strategy | `prompt`、`prompt_version`、`build_strategy`、`build_strategy_version` | 复现构建策略和 prompt 版本 | | 外部搜索缓存 | `external_search_case_log` | 保存 HTTP 外部搜索结果,用 `channel_content_id` 回查素材证据 | | 兼容旧 pattern | `topic_pattern_*`、`topic_pattern_account_itemset_cache` | 旧本地 mining/兼容/展示兜底,不作为当前 pattern v2 主真相 | 当前 topic build 的 pattern/library 查询运行时默认转成 `pattern_global_v2` HTTP debug API;script build 的创作 pattern 查询走 `/api/pattern/creation-tools/debug`。另有 `library_data` 通过 PostgreSQL `open_aigc` 直查 `post / post_script_paragraph / post_script_element`,用于参考脚本搜索。需要注意,`topic_build_record.execution_id` 不能简单理解为只指向 MySQL `topic_pattern_execution.id`:实测 build 记录中也出现 `401`、`281`、`79` 等远端/open_aigc pattern v2 execution 口径。 ## 9. 后台库 `aigc-admin-prod` `aigc-admin-prod` 当前在本项目中的代码用途很窄: | 表 | 字段 | 用途 | |---|---|---| | `agent_channel_cookies` | `cookies` | 浏览器工具注入登录态,核验时未读取行值 | | `agent_channel_cookies` | `type` | 渠道类型,例如 xhs/gzh/shp/github | | `agent_channel_cookies` | `profileId` | 云浏览器 profile ID | 这张表服务的是内嵌 Agent SDK 的 browser helper,不是内容解构、分类、pattern 或 build 的主数据来源。外部搜索 case 不从该库读取;`external_search_case` 走 HTTP/crawler/aigc-channel/tophub/newrank 等外部接口,结果写入 `open_aigc_pattern.external_search_case_log`。 ## 10. 数据加工流转地图 | 阶段 | 输入 | 关键处理 | 输出 | 下游 | |---|---|---|---|---| | 内容采集/外部输入 | crawler、ODPS、外部任务 API、本地 JSON | 采集或接收内容和解构结果 | 本地 JSON、`post` | topic/script 导入 | | 选题导入 | topic decode JSON | 写帖子、解构结果、topic point 和 element | `post_decode_result`、`post_decode_topic_point`、`post_decode_topic_point_element` | dedup、分类、topic pattern | | 脚本导入 | script split/decode JSON | 写段落、一级元素、字段元素 | `post_script_paragraph*`、`post_script_element` | dedup、paragraph/sequence pattern | | 去重 | 3 张原始元素表 | `source_type + source_table + normalized_name` 分组 | `element_dedup_group` 1 张表内的 9 个组合 | source embedding、距离矩阵、分类 batch | | source embedding | dedup 代表元素、已有 `global_element_embedding`、embedding API | 复用或生成 source 元素向量 | 本地 `cache/embeddings_{source_table}.*`;分类后补写 `global_element_embedding` | 距离矩阵、相似搜索 | | 距离矩阵 | 9 组 source embedding | 计算 cosine distance,行存储增量追加 | 本地 `cache/dist_rows_{source_type}__{source_table}.bin/.idx.npz` | DBSCAN | | 聚类 | 距离矩阵 | DBSCAN 聚相似元素,输出簇和噪音点 | 当前按需入口返回内存结果;旧/归档路径可写本地 `cache/global_clusters_{source_type}_{source_table}_{timestamp}.json` | 分类 agent/人工筛选 | | 分类 | cluster batch 或未分类元素 batch | agent tool 创建/调整分类、元素、映射并刷新状态 | `global_category`、`global_element`、`element_classification_mapping`、`classify_*`、`global_*_embedding`、`post_classification_status` | pattern snapshot/API | | pattern 快照 | 当前分类树和映射 | 固化 execution 视角 | `pattern_mining_execution/category/element/semantic_map` | 挖掘算法 | | 默认 pattern loop | `pattern_mining_element` topic 元素 | `topic_element` FP-Growth | `pattern_itemset*` | visualization/build | | 可选 pattern loop | topic/cross/paragraph/script 输入 | 按开关运行 FP-Growth/PrefixSpan | `pattern_itemset*`、`pattern_script_sequence*`、`pattern_group_itemset*` | visualization/build | | build 配置/输入 | `open_aigc_pattern.base_config/prompt*/build_strategy*/account_constant/topic_piaoquan_demand/xhs_benchmark_account` | 读取默认 execution、prompt、策略、账号常量、批量需求和对标账号缓存 | build 运行上下文 | topic/script build agent | | 应用 build | pattern v2 HTTP API、open_aigc 帖子/脚本库、用户需求、策略/prompt、外部搜索 | 选题构建、脚本构建、证据追踪 | MySQL `open_aigc_pattern` 的 `topic_build_*`、`script_build_*`、`external_search_case_log` | 业务应用层 | | 旧 pattern 兼容 | v2 export API 快照、本地 mining | 本地 topic pattern mining、详情页/脚本辅助兼容查询 | MySQL `open_aigc_pattern.topic_pattern_*` | 兼容展示和兜底,不替代 pattern v2 主事实 | | 后台辅助 | `aigc-admin-prod.agent_channel_cookies` 字段元数据 | 提供 browser helper 登录态配置 | 浏览器工具运行态 | 外部网页/平台操作 | ## 11. 主要问题和建议 1. 修复 `pattern_mining_execution` current 口径:只保留一条 current,且 API 查询 current 时增加 `status='success'` 保护。 2. 重跑或增量同步 topic dedup:当前 topic raw 表已增长,dedup 和后续聚类/分类 batch 已经不是最新口径。 3. 明确 topic 侧 `感受` 的处理策略:当前 topic raw 有 `感受`,但 dedup/mapping/pattern active 口径没有承接。 4. 修复聚类入口实现漂移:`ClusterBatchPreparer` 的矩阵 key 和 dedup 展开方法名与当前 manager 不一致,应统一到 `source_type__source_table` 和 `expand_members`,或明确只保留 `build_all_matrices.py + cluster_on_demand.py` 路径。 5. 对聚类输出新增 DB 审计或固定归档:否则 `cache/global_clusters_*` 丢失后无法复盘哪次聚类辅助了哪批分类。 6. 修复或绕过 `open_aigc_pattern` 域名 Fake-IP 路径:当前真实内网 IP 可读,但标准 RDS 域名仍会被 Fake-IP 接管并导致 MySQL 握手失败,建议在 VPN/代理规则中对该 RDS 域名走真实内网解析或直连路由。 ## 12. 一句话数据地图 `crawler/ODPS/上游解构 JSON/API` -> `open_aigc.post + post_decode_* + post_script_*` 原始解构仓 -> `element_dedup_group + embedding cache + distance matrix` 做元素归并和聚类辅助 -> `global_category + global_element + element_classification_mapping` 形成分类树和源元素映射 -> `pattern_mining_execution + pattern_mining_category + pattern_mining_element` 固化 pattern v2 快照 -> 默认 `topic_element` 及可配置 pattern loop 产出 `pattern_itemset* / pattern_script_sequence* / pattern_group_itemset*` -> `patter_from_global_and_build` 消费 pattern v2、帖子库和外部搜索,生成选题/脚本并写 `open_aigc_pattern`。