这一页只回答一个问题:仓库里跑的每一字节,它从哪里进来(5 类来源)、它怎么被处理(7 步管线)、它落在哪里(4 张表)、谁会再读它(7 个分析模块)、最后变成什么(5 种出口)。先看顶部总图建立心智模型,再逐层钻入细节,末尾用一条 demo 事件走完整链路。
横向 3 列对应数据生命周期的三个阶段。左列是来源:5 类 input 都最终走同一个 ingest_raw() 入口。中列是处理 + 存储:7 步管线 +1 张 SQLite。右列是读取 + 输出:7 个分析模块读 DB 后,通过 CLI / REST / 多格式文件 / Prometheus 出去。流向都是从左到右,只有一个例外 —— thesis_state 会被 thesis.update_thesis_scores 写回 DB,所以右列也有反向虚线箭头隐含。
samples/events.jsonl · 8 条 demo 事件 · satagent ingest-filesatagent fetch --source textsatagent fetch --source rssPOST /events/ingest · 可选 Bearer tokensatagent init 触发 ensure_seedontology.py · 4 主线 / 6 场景 / 6 维度 / 365 词 · 不入 DB, 直接被 classify() 读所有外部 input 都被规约为同一个 RawEvent 数据契约(title / text / source / url / occurred_at / numeric_overrides / next_indicators / companies),由 Source.fetch() → Iterable[RawEvent] 产出。下面 5 张卡按入口形态拆开。
所有 RawEvent 进入 ingest_pipeline.ingest_raw() 后,严格按下面 7 步串行处理。顺序非常关键:第 4 步 LLM 放在「公司反哺」之后, 是为了让 LLM 能纠正反哺引入的 over-fire 主线;第 6 步 numeric_overrides 放在 extract 之后, 保证抓取层 / 人工指定有最终决定权。
所有持久化数据落在 agent/data/agent.db(可由 SATAGENT_DB 环境变量重指向)。schema 在 db.py 维护,带幂等 migrate_schema —— 已有 DB 在加新列时不丢数据。列里凡是会塞 list / dict 的, 一律以 JSON 字符串存。
| id | INTEGER PK | autoincrement |
| title | TEXT | RawEvent.title |
| content | TEXT | RawEvent.text |
| source / url | TEXT | RawEvent.source/url |
| occurred_at | TEXT | RawEvent.occurred_at |
| created_at | TEXT | DB 默认 CURRENT_TIMESTAMP |
| threads (JSON) | TEXT | classify + enrich + LLM |
| scenarios (JSON) | TEXT | classify + LLM |
| dimensions (JSON) | TEXT | classify + LLM |
| thesis_impact | TEXT | classify (极性词) |
| confidence | REAL | classify (命中数) |
| next_indicators | TEXT | RawEvent |
| companies (JSON) | TEXT | match_companies |
| order_amount_cny_yi | REAL | extract / override · NEW |
| capex / opex_cny_yi | REAL | extract / override · NEW |
| time_window | TEXT | extract · NEW |
| customer_subject | TEXT | extract · NEW |
| numeric_evidence | TEXT | extract (原文片段) · NEW |
| id | INTEGER PK | autoincrement |
| name UNIQUE | TEXT | seed |
| thread | TEXT | seed · 供反哺 |
| products / customers / aliases | TEXT(JSON) | seed |
| revenue_mapping | TEXT | seed |
| moat / risk | TEXT | seed |
| score | REAL | seed · 评分 |
| orders | TEXT(JSON) | seed / 用户更新 · NEW |
| peer_rank / delta | INTEGER | decision 更新 · NEW |
| last_quarter_revenue_cny_yi | REAL | 用户填入 · valuation 用 · NEW |
| id | INTEGER PK | autoincrement |
| thread | TEXT | seed |
| year | INTEGER | seed (2025-2031) |
| scenario | TEXT | seed (悲观/中性/乐观) |
| value_cny_yi | REAL | seed · 占位数 |
| note | TEXT | seed |
| UNIQUE(thread, year, scenario) · market_model.dynamic_market_model 不写本表, 只读 + 拼窗口 events | ||
| id | INTEGER PK | autoincrement |
| thread | TEXT | thesis.update_thesis_scores · NEW |
| statement | TEXT | thesis · 命题文本 · NEW |
| score | REAL | thesis · 窗口聚合 · NEW |
| updated_at | TEXT | DB CURRENT_TIMESTAMP · NEW |
| 唯一一张被分析层反向写的表 · GET /thesis/state?refresh=true 时触发 | ||
分析层全部以 events + companies + market_model 为输入, 派生出决策视角的衍生数据。除 thesis.update_thesis_scores 会反向写 thesis_state 外, 其他都是纯读, 输出直接走 CLI / REST。
同一份决策数据可以经过不同 sink 走出去 —— CLI 给运维 / 工程, REST 给前端 / 集成, 多格式文件给业务方分发, Prometheus 给监控, 两张 brief 给 CEO 和投资人。所有出口都基于同一个 decision report dict, 出口选择只决定包装。
用一条典型的中文新闻短文, 逐步演示它从 RawEvent 到 CEO brief 的全过程。每一步显示数据的具体形态变化, 与上面的 7 步管线一一对应。