{"id":83866,"date":"2026-10-14T14:28:29","date_gmt":"2026-10-14T08:58:29","guid":{"rendered":"https:\/\/2thenew.today\/blog\/?p=83866"},"modified":"2026-10-27T23:08:11","modified_gmt":"2026-10-27T17:38:11","slug":"incremental-intelligence-bringing-data-engineering-principles-to-ai-systems-2","status":"publish","type":"post","link":"https:\/\/2thenew.today\/blog\/incremental-intelligence-bringing-data-engineering-principles-to-ai-systems-2\/","title":{"rendered":"Incremental Intelligence: Bringing Data Engineering Principles to AI Systems"},"content":{"rendered":"<h1><strong>Introduction<\/strong><\/h1>\n<p style=\"padding-left: 40px;\">Every data engineer who has run <strong><em>dbt run &#8211;full-refresh<\/em><\/strong> on a 400-million-row table at 2 a.m. knows a specific dread: watching warehouse credits burn while reprocessing everything, when only a fraction of the data actually changed.<\/p>\n<p style=\"padding-left: 40px;\">dbt&#8217;s answer \u2014 incremental models, materializations, snapshots, exposures \u2014 is a decade of hard-won wisdom about one question: <strong>when something changes, how much of the world do you actually need to redo?<\/strong><\/p>\n<p style=\"padding-left: 40px;\">Here&#8217;s what nobody&#8217;s really written about yet: AI engineers are relearning this exact lesson right now, one expensive re-embedding job and one forgetful chatbot at a time. RAG pipelines, agent memory, and prompt versioning are all quietly reinventing dbt&#8217;s incremental philosophy \u2014 usually without knowing a mature vocabulary for it already exists.<\/p>\n<p style=\"padding-left: 40px;\">This post is that bridge: dbt&#8217;s core concepts, translated into AI-native equivalents, with working code.<\/p>\n<h1><\/h1>\n<h1><strong>The Problem AI Systems Are Rediscovering<\/strong><\/h1>\n<p style=\"padding-left: 40px;\">A very typical (and expensive) RAG pipeline:<\/p>\n<p style=\"padding-left: 40px;\"><img loading=\"lazy\" decoding=\"async\" class=\" wp-image-83840\" src=\"https:\/\/2thenew.today\/blog\/wp-ttn-blog\/uploads\/2026\/10\/Screenshot-2026-09-03-at-12.06.40-PM-300x73.png\" alt=\"img\" width=\"481\" height=\"117\" srcset=\"https:\/\/2thenew.today\/blog\/wp-ttn-blog\/uploads\/2026\/10\/Screenshot-2026-09-03-at-12.06.40-PM-300x73.png 300w, https:\/\/2thenew.today\/blog\/wp-ttn-blog\/uploads\/2026\/10\/Screenshot-2026-09-03-at-12.06.40-PM-768x187.png 768w, https:\/\/2thenew.today\/blog\/wp-ttn-blog\/uploads\/2026\/10\/Screenshot-2026-09-03-at-12.06.40-PM-624x152.png 624w, https:\/\/2thenew.today\/blog\/wp-ttn-blog\/uploads\/2026\/10\/Screenshot-2026-09-03-at-12.06.40-PM.png 984w\" sizes=\"auto, (max-width: 481px) 100vw, 481px\" \/><\/p>\n<p style=\"padding-left: 40px;\">Fix one typo in one of 5,000 documents, and this still re-embeds all 5,000 \u2014 the RAG equivalent of <em><strong>dbt run &#8211;full-refresh<\/strong><\/em> because one row changed. The same pattern shows up in agent memory (re-summarizing an entire conversation history every turn) and in evals (re-running the full suite for every prompt tweak, instead of only what&#8217;s affected). None of this is a knock on AI engineers \u2014 it&#8217;s a young field re-discovering an old, already-solved problem.<\/p>\n<h1><\/h1>\n<h1><strong>Translating dbt Concepts Into AI Systems<\/strong><\/h1>\n<p style=\"padding-left: 40px;\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-83878 size-full\" src=\"https:\/\/2thenew.today\/blog\/wp-ttn-blog\/uploads\/2026\/10\/dbt_ai_equivalent.png\" alt=\"img\" width=\"1018\" height=\"384\" srcset=\"https:\/\/2thenew.today\/blog\/wp-ttn-blog\/uploads\/2026\/10\/dbt_ai_equivalent.png 1018w, https:\/\/2thenew.today\/blog\/wp-ttn-blog\/uploads\/2026\/10\/dbt_ai_equivalent-300x113.png 300w, https:\/\/2thenew.today\/blog\/wp-ttn-blog\/uploads\/2026\/10\/dbt_ai_equivalent-768x290.png 768w, https:\/\/2thenew.today\/blog\/wp-ttn-blog\/uploads\/2026\/10\/dbt_ai_equivalent-624x235.png 624w\" sizes=\"auto, (max-width: 1018px) 100vw, 1018px\" \/><\/p>\n<p style=\"padding-left: 40px;\"><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-82217 \" src=\"https:\/\/2thenew.today\/blog\/wp-ttn-blog\/uploads\/2026\/09\/Screenshot-2026-09-03-at-12.09.39\u202fPM.png\" alt=\"image-02\" width=\"628\" height=\"262\" srcset=\"https:\/\/2thenew.today\/blog\/wp-ttn-blog\/uploads\/2026\/09\/Screenshot-2026-09-03-at-12.09.39\u202fPM.png 996w, https:\/\/2thenew.today\/blog\/wp-ttn-blog\/uploads\/2026\/09\/Screenshot-2026-09-03-at-12.09.39\u202fPM-300x125.png 300w, https:\/\/2thenew.today\/blog\/wp-ttn-blog\/uploads\/2026\/09\/Screenshot-2026-09-03-at-12.09.39\u202fPM-768x321.png 768w, https:\/\/2thenew.today\/blog\/wp-ttn-blog\/uploads\/2026\/09\/Screenshot-2026-09-03-at-12.09.39\u202fPM-624x261.png 624w\" sizes=\"auto, (max-width: 628px) 100vw, 628px\" \/><\/p>\n<p style=\"padding-left: 40px;\">Same insight as dbt&#8217;s <em><strong>is_incremental()<\/strong><\/em> macro: filter first, process second.<\/p>\n<blockquote style=\"padding-left: 40px;\">\n<p style=\"padding-left: 40px;\"><span style=\"color: #333333;\">One caveat worth knowing before you ship this: updated_at timestamps only catch changes to source content. If your chunking strategy or embedding model changes, the source document can look &#8220;unchanged&#8221; while its vectors are stale. Store the content hash alongside <strong>chunking_version<\/strong> and <strong>embedding_model_version<\/strong>, and treat any of the three changing as a reason to reprocess. The hash catches content changes; the version fields make pipeline and model changes explicit.<\/span><\/p>\n<\/blockquote>\n<h1><strong>Incremental Strategies and Their AI Counterparts<\/strong><\/h1>\n<p style=\"padding-left: 40px;\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-83885 size-full\" src=\"https:\/\/2thenew.today\/blog\/wp-ttn-blog\/uploads\/2026\/10\/dbtstrategyai_equivalent.png\" alt=\"img\" width=\"1002\" height=\"338\" srcset=\"https:\/\/2thenew.today\/blog\/wp-ttn-blog\/uploads\/2026\/10\/dbtstrategyai_equivalent.png 1002w, https:\/\/2thenew.today\/blog\/wp-ttn-blog\/uploads\/2026\/10\/dbtstrategyai_equivalent-300x101.png 300w, https:\/\/2thenew.today\/blog\/wp-ttn-blog\/uploads\/2026\/10\/dbtstrategyai_equivalent-768x259.png 768w, https:\/\/2thenew.today\/blog\/wp-ttn-blog\/uploads\/2026\/10\/dbtstrategyai_equivalent-624x210.png 624w\" sizes=\"auto, (max-width: 1002px) 100vw, 1002px\" \/><\/p>\n<p style=\"padding-left: 40px;\"><img loading=\"lazy\" decoding=\"async\" class=\" wp-image-83842\" src=\"https:\/\/2thenew.today\/blog\/wp-ttn-blog\/uploads\/2026\/10\/Screenshot_merge-300x93.png\" alt=\"img\" width=\"552\" height=\"171\" srcset=\"https:\/\/2thenew.today\/blog\/wp-ttn-blog\/uploads\/2026\/10\/Screenshot_merge-300x93.png 300w, https:\/\/2thenew.today\/blog\/wp-ttn-blog\/uploads\/2026\/10\/Screenshot_merge-768x239.png 768w, https:\/\/2thenew.today\/blog\/wp-ttn-blog\/uploads\/2026\/10\/Screenshot_merge-624x194.png 624w, https:\/\/2thenew.today\/blog\/wp-ttn-blog\/uploads\/2026\/10\/Screenshot_merge.png 996w\" sizes=\"auto, (max-width: 552px) 100vw, 552px\" \/><\/p>\n<p style=\"padding-left: 40px;\">Use &#8220;append&#8221; where you needed &#8220;merge,&#8221; and you get duplicates \u2014 in dbt, duplicate rows; in an agent, a context window with three contradictory versions of the same fact.<\/p>\n<p style=\"padding-left: 40px;\"><span style=\"color: #333333;\">\ud83e\udded<em> <strong>Quick self-check:<\/strong><\/em> Does the same fact ever get updated more than once? No \u2192 <strong>Append<\/strong>. Yes, and you only care about the current value \u2192 <strong>Merge<\/strong>. Yes, and you need to know what it used to be \u2192 you need <strong>SCD-2<\/strong>, not a simple merge (next section).<\/span><\/p>\n<h1><\/h1>\n<h1><strong>Practical Implementation Lessons<\/strong><\/h1>\n<p style=\"padding-left: 40px;\">Two production details matter once incremental embeddings are running:<\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li><strong>Delete handling:<\/strong> If a source document is removed, its chunks and vectors should be deleted or tombstoned too. Otherwise, retrieval can continue surfacing content that no longer exists.<\/li>\n<li><strong>Idempotent re-embedding and upserts:<\/strong> When the embedding model or chunking version changes, reprocess the affected documents and upsert using a deterministic key such as <strong>document_id + chunk_id + chunking_version + embedding_model_version<\/strong>. A retry should update the same vector rather than create duplicates.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h1><\/h1>\n<h1><strong>Bringing Slowly Changing Dimensions to AI Memory<\/strong><\/h1>\n<p style=\"padding-left: 40px;\">The single most underused idea in AI system design: not all memory should behave the same way when it changes.<\/p>\n<p style=\"padding-left: 40px;\"><img loading=\"lazy\" decoding=\"async\" class=\" wp-image-82236\" src=\"https:\/\/2thenew.today\/blog\/wp-ttn-blog\/uploads\/2026\/09\/Screenshot-2026-09-03-at-12.28.26\u202fPM-300x72.png\" alt=\"image - 05\" width=\"408\" height=\"98\" srcset=\"https:\/\/2thenew.today\/blog\/wp-ttn-blog\/uploads\/2026\/09\/Screenshot-2026-09-03-at-12.28.26\u202fPM-300x72.png 300w, https:\/\/2thenew.today\/blog\/wp-ttn-blog\/uploads\/2026\/09\/Screenshot-2026-09-03-at-12.28.26\u202fPM-624x149.png 624w, https:\/\/2thenew.today\/blog\/wp-ttn-blog\/uploads\/2026\/09\/Screenshot-2026-09-03-at-12.28.26\u202fPM.png 720w\" sizes=\"auto, (max-width: 408px) 100vw, 408px\" \/><\/p>\n<p style=\"padding-left: 40px;\"><strong>SCD-1 facts<\/strong> (overwrite, no history needed): a corrected phone number, a fixed CRM typo. There&#8217;s no value \u2014 and real risk \u2014 in an agent &#8220;remembering&#8221; the old, wrong version.<\/p>\n<p style=\"padding-left: 40px;\"><strong>SCD-2 facts<\/strong> (history matters): evolving product preferences, a patient&#8217;s medication history, a client&#8217;s risk tolerance over time. Treat these as SCD-1 and you lose the ability to explain why the AI is behaving the way it is now \u2014 an audit and compliance liability in regulated industries. Treat everything as SCD-2, on the other hand, and you get context-window bloat from facts that never needed history.<\/p>\n<p style=\"padding-left: 40px;\">dbt&#8217;s snapshot pattern (<strong><em>dbt_valid_from \/ dbt_valid_to<\/em><\/strong>) maps directly onto an AI &#8220;memory snapshot&#8221;:<\/p>\n<p style=\"padding-left: 40px;\"><img loading=\"lazy\" decoding=\"async\" class=\" wp-image-83863\" src=\"https:\/\/2thenew.today\/blog\/wp-ttn-blog\/uploads\/2026\/10\/Screenshot-2026-09-03-at-12.30.15-PM-300x114.png\" alt=\"img\" width=\"534\" height=\"203\" srcset=\"https:\/\/2thenew.today\/blog\/wp-ttn-blog\/uploads\/2026\/10\/Screenshot-2026-09-03-at-12.30.15-PM-300x114.png 300w, https:\/\/2thenew.today\/blog\/wp-ttn-blog\/uploads\/2026\/10\/Screenshot-2026-09-03-at-12.30.15-PM-768x292.png 768w, https:\/\/2thenew.today\/blog\/wp-ttn-blog\/uploads\/2026\/10\/Screenshot-2026-09-03-at-12.30.15-PM-624x237.png 624w, https:\/\/2thenew.today\/blog\/wp-ttn-blog\/uploads\/2026\/10\/Screenshot-2026-09-03-at-12.30.15-PM.png 994w\" sizes=\"auto, (max-width: 534px) 100vw, 534px\" \/><\/p>\n<p style=\"padding-left: 40px;\">When an agent is wrong, &#8220;knowing what it believed and when helps identify the root cause&#8221;\u2014easy with snapshot history, difficult with a single mutable blob.<\/p>\n<h1><\/h1>\n<h1><strong>Bringing dbt Governance Patterns Into AI<\/strong><\/h1>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li><strong>Pre\/Post-hooks \u2192 guardrails:<\/strong>\u00a0dbt runs SQL before\/after a model executes. AI pipelines need the same two moments: pre-hooks (PII scrubbing, prompt-injection checks, before the LLM call) and post-hooks (safety classification, schema validation, memory writes, after the call). Treating guardrails as first-class pipeline steps \u2014 not an afterthought bolted on post-incident \u2014 is the whole point.<\/li>\n<li><strong>Source freshness \u2192 context freshness:<\/strong>\u00a0dbt checks if raw data is stale; AI systems rarely check if retrieved context is stale \u2014 yet a RAG system citing three-week-old pricing will do so with exactly the same fluent confidence as correct information. A simple <em><strong>warn_after \/ error_after<\/strong><\/em> contract per source (docs: warn at 3 days; pricing: error at 6 hours) catches this before a user does.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<blockquote>\n<p style=\"padding-left: 80px;\"><em style=\"color: #999999;\"><code># context_sources.yml<\/code><\/em><\/p>\n<p style=\"padding-left: 80px;\"><span style=\"color: #999999;\"><em><code><\/code><\/em><\/span><span style=\"color: #800000;\"><em><code>sources:<\/code><\/em><\/span><br \/>\n<span style=\"color: #999999;\"><em>\u00a0 \u00a0 <span style=\"color: #800000;\"><code>- name: <span style=\"color: #008000;\">pricing_docs<\/span><\/code><\/span><\/em><\/span><br \/>\n<span style=\"color: #800000;\"><em>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0<code>freshness:<\/code><\/em><\/span><br \/>\n<span style=\"color: #800000;\"><em>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <code>warn_after: <span style=\"color: #000000;\">{<\/span>count: <span style=\"color: #008000;\">3<\/span>, period: <span style=\"color: #008000;\">hour<\/span><span style=\"color: #000000;\">}<\/span><\/code><\/em><\/span><br \/>\n<span style=\"color: #800000;\"><em>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <code>error_after: <span style=\"color: #000000;\">{<\/span>count: <span style=\"color: #008000;\">6<\/span>, period: <span style=\"color: #008000;\">hour<\/span><span style=\"color: #000000;\">}<\/span><\/code><\/em><\/span><\/p>\n<p style=\"padding-left: 80px;\"><span style=\"color: #800000;\"><em>\u00a0 <code>- name: <span style=\"color: #008000;\">product_docs<\/span><\/code><\/em><\/span><br \/>\n<span style=\"color: #800000;\"><em>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0<code>freshness:<\/code><\/em><\/span><br \/>\n<span style=\"color: #800000;\"><em>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<code>warn_after: {count: <span style=\"color: #008000;\">3<\/span>, period: <span style=\"color: #008000;\">day<\/span>}<\/code><\/em><\/span><br \/>\n<span style=\"color: #800000;\"><em>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <code>\u00a0error_after: {count: <span style=\"color: #008000;\">7<\/span>, period: <span style=\"color: #008000;\">day<\/span>}<\/code><\/em><\/span><\/p>\n<\/blockquote>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li><strong>Exposures \u2192 dependency declarations: <\/strong>dbt exposures document what downstream thing depends on a model, so a change is traceable before it ships. Most AI stacks have no equivalent \u2014 nobody knows what breaks if you swap an embedding model until something breaks. A simple ai_exposures.yml (which prompts\/models\/indexes feed which features, owned by whom) turns &#8220;who broke the chatbot?&#8221; into &#8220;oh, I broke it&#8221; \u2014 days earlier and much cheaper.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<blockquote>\n<p style=\"padding-left: 80px;\"><em><span style=\"color: #999999;\"><code># ai_exposures.yml<\/code><\/span><\/em><\/p>\n<p style=\"padding-left: 80px;\"><span style=\"color: #999999;\"><em><code><\/code><\/em><\/span><span style=\"color: #800000;\"><em><code>exposures:<\/code><\/em><\/span><br \/>\n<span style=\"color: #999999;\"><em>\u00a0 \u00a0 <span style=\"color: #800000;\"><code>- name: <span style=\"color: #008000;\">support_chatbot_widget<\/span><\/code><\/span><\/em><\/span><br \/>\n<span style=\"color: #800000;\"><em>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0<code>type<code>: <span style=\"color: #008000;\">application<\/span><\/code><\/code><\/em><\/span><br \/>\n<span style=\"color: #800000;\"><em>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0<code>owner: <span style=\"color: #008000;\">support-eng<\/span><\/code><\/em><\/span><br \/>\n<span style=\"color: #800000;\"><em>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0<code><code>depends_on:<\/code><\/code><\/em><\/span><\/p>\n<p style=\"padding-left: 160px;\"><span style=\"color: #800000;\"><code>- prompt: <span style=\"color: #008000;\">refund_policy_V3<\/span><br \/>\n- index: <span style=\"color: #008000;\">kb_articles_embeddings<\/span><br \/>\n- model: <span style=\"color: #008000;\">text-embedding-3-large<\/span><\/code><\/span><\/p><\/blockquote>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li><strong>dbt Jobs \u2192 CI for prompts:<\/strong>\u00a0The highest-leverage idea to steal: run a golden-set eval suite against any prompt or retrieval-config change before it merges, exactly like dbt&#8217;s CI job tests SQL changes before merge.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h1><\/h1>\n<h1><strong>Case Study: Building a More Reliable TicketMind<\/strong><\/h1>\n<p style=\"padding-left: 40px;\">A support-bot team ships v1 with: full ticket history stuffed into every prompt, a nightly full re-embed of 12,000 articles, customer facts as one mutable JSON blob, and no eval gate on prompt changes.The failures arrive on schedule: a 45-minute nightly job re-processing 11,950 unchanged articles for 50 new ones (Week 3); an unanswerable refund dispute because facts were overwritten with no history (Week 6); a &#8220;make it concise&#8221; prompt tweak that silently drops safety disclaimers, caught only after a customer complains (Week 9); and degrading answer quality as 40+ tickets of irrelevant history crowd out the context window (Week 11).<\/p>\n<p style=\"padding-left: 40px;\">The fix is incremental, fittingly: switch to incremental (merge) embedding, split customer facts into SCD-1 (overwrite) vs. SCD-2 (snapshot) tables, scope context to current merged facts instead of full history, add a CI eval gate on the refund-policy prompt, declare an exposure naming compliance as owner, and set a freshness contract on the knowledge base. None of it required new infrastructure \u2014 just applying discipline the data team already had.<\/p>\n<p style=\"padding-left: 40px;\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-83873 size-large\" src=\"https:\/\/2thenew.today\/blog\/wp-ttn-blog\/uploads\/2026\/10\/Screenshot-2026-09-14-at-2.59.47-PM-1024x638.png\" alt=\"img\" width=\"625\" height=\"389\" srcset=\"https:\/\/2thenew.today\/blog\/wp-ttn-blog\/uploads\/2026\/10\/Screenshot-2026-09-14-at-2.59.47-PM-1024x638.png 1024w, https:\/\/2thenew.today\/blog\/wp-ttn-blog\/uploads\/2026\/10\/Screenshot-2026-09-14-at-2.59.47-PM-300x187.png 300w, https:\/\/2thenew.today\/blog\/wp-ttn-blog\/uploads\/2026\/10\/Screenshot-2026-09-14-at-2.59.47-PM-768x479.png 768w, https:\/\/2thenew.today\/blog\/wp-ttn-blog\/uploads\/2026\/10\/Screenshot-2026-09-14-at-2.59.47-PM-624x389.png 624w, https:\/\/2thenew.today\/blog\/wp-ttn-blog\/uploads\/2026\/10\/Screenshot-2026-09-14-at-2.59.47-PM.png 1354w\" sizes=\"auto, (max-width: 625px) 100vw, 625px\" \/><\/p>\n<p>&nbsp;<\/p>\n<h1><strong>A Practical Guide to Getting Started<\/strong><\/h1>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>Audit your \u201cfull refresh\u201d points \u2014 fix the most expensive one first.<\/li>\n<li>Classify your top 10 facts as SCD-1 or SCD-2.<\/li>\n<li>Write down a freshness contract per data source.<\/li>\n<li>Declare exposures for your top 3 production AI features.<\/li>\n<li>Add one CI eval gate on your most-changed prompt.<\/li>\n<li>Formalize pre\/post-hooks instead of scattered if checks.<\/li>\n<li>Document your memory schema like a dbt model.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p style=\"padding-left: 40px;\">None of this needed a new framework or a research paper \u2014 just borrowing ten years of data engineering discipline and pointing it at a problem AI teams are currently re-discovering the expensive way. Next time you&#8217;re designing agent memory or debugging a RAG system that &#8220;doesn&#8217;t feel fresh,&#8221; ask the dbt question instead of the AI question: not which model should I use, but what actually changed?<\/p>\n<p style=\"padding-left: 40px;\">Happy building (incrementally)!<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introduction Every data engineer who has run dbt run &#8211;full-refresh on a 400-million-row table at 2 a.m. knows a specific dread: watching warehouse credits burn while reprocessing everything, when only a fraction of the data actually changed. dbt&#8217;s answer \u2014 incremental models, materializations, snapshots, exposures \u2014 is a decade of hard-won wisdom about one question: [&hellip;]<\/p>\n","protected":false},"author":2354,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"iawp_total_views":8,"footnotes":""},"categories":[6194],"tags":[8917,5519,8916],"class_list":["post-83866","post","type-post","status-publish","format-standard","hentry","category-data-engineering","tag-aimemory","tag-dbt","tag-incrementaldataprocessing"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.0.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"Introduction Every data engineer who has run dbt run --full-refresh on a 400-million-row table at 2 a.m. knows a specific dread: watching warehouse credits burn while reprocessing everything, when only a fraction of the data actually changed. dbt&#039;s answer \u2014 incremental models, materializations, snapshots, exposures \u2014 is a decade of hard-won wisdom about one question:\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Insha Danish\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/2thenew.today\/blog\/incremental-intelligence-bringing-data-engineering-principles-to-ai-systems-2\/\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.0.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"en_US\" \/>\n\t\t<meta property=\"og:site_name\" content=\"TO THE NEW BLOG\" \/>\n\t\t<meta property=\"og:type\" content=\"blog\" \/>\n\t\t<meta property=\"og:title\" content=\"Incremental Intelligence: Bringing Data Engineering Principles to AI Systems | TO THE NEW Blog\" \/>\n\t\t<meta property=\"og:description\" content=\"Introduction Every data engineer who has run dbt run --full-refresh on a 400-million-row table at 2 a.m. knows a specific dread: watching warehouse credits burn while reprocessing everything, when only a fraction of the data actually changed. dbt&#039;s answer \u2014 incremental models, materializations, snapshots, exposures \u2014 is a decade of hard-won wisdom about one question:\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/2thenew.today\/blog\/incremental-intelligence-bringing-data-engineering-principles-to-ai-systems-2\/\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/2thenew.today\/blog\/wp-content\/themes\/ttn\/images\/social-logo.png\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/2thenew.today\/blog\/wp-content\/themes\/ttn\/images\/social-logo.png\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary\" \/>\n\t\t<meta name=\"twitter:site\" content=\"@tothenew\" \/>\n\t\t<meta name=\"twitter:title\" content=\"Incremental Intelligence: Bringing Data Engineering Principles to AI Systems | TO THE NEW Blog\" \/>\n\t\t<meta name=\"twitter:description\" content=\"Introduction Every data engineer who has run dbt run --full-refresh on a 400-million-row table at 2 a.m. knows a specific dread: watching warehouse credits burn while reprocessing everything, when only a fraction of the data actually changed. dbt&#039;s answer \u2014 incremental models, materializations, snapshots, exposures \u2014 is a decade of hard-won wisdom about one question:\" \/>\n\t\t<meta name=\"twitter:image\" content=\"https:\/\/2thenew.today\/blog\/wp-content\/themes\/ttn\/images\/social-logo.png\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/incremental-intelligence-bringing-data-engineering-principles-to-ai-systems-2\\\/#article\",\"name\":\"Incremental Intelligence: Bringing Data Engineering Principles to AI Systems | TO THE NEW Blog\",\"headline\":\"Incremental Intelligence: Bringing Data Engineering Principles to AI Systems\",\"author\":{\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/author\\\/insha-danish\\\/#author\"},\"publisher\":{\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/#organization\"},\"image\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/wp-ttn-blog\\\/uploads\\\/2026\\\/10\\\/Screenshot-2026-09-03-at-12.06.40-PM-300x73.png\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/incremental-intelligence-bringing-data-engineering-principles-to-ai-systems-2\\\/#articleImage\"},\"datePublished\":\"2026-10-14T14:28:29+05:30\",\"dateModified\":\"2026-10-27T23:08:11+05:30\",\"inLanguage\":\"en-US\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/incremental-intelligence-bringing-data-engineering-principles-to-ai-systems-2\\\/#webpage\"},\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/incremental-intelligence-bringing-data-engineering-principles-to-ai-systems-2\\\/#webpage\"},\"articleSection\":\"Data Engineering, AIMemory, dbt, IncrementalDataProcessing\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/incremental-intelligence-bringing-data-engineering-principles-to-ai-systems-2\\\/#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog#listItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.tothenew.com\\\/blog\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/category\\\/data-engineering\\\/#listItem\",\"name\":\"Data Engineering\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/category\\\/data-engineering\\\/#listItem\",\"position\":2,\"name\":\"Data Engineering\",\"item\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/category\\\/data-engineering\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/incremental-intelligence-bringing-data-engineering-principles-to-ai-systems-2\\\/#listItem\",\"name\":\"Incremental Intelligence: Bringing Data Engineering Principles to AI Systems\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog#listItem\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/incremental-intelligence-bringing-data-engineering-principles-to-ai-systems-2\\\/#listItem\",\"position\":3,\"name\":\"Incremental Intelligence: Bringing Data Engineering Principles to AI Systems\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/category\\\/data-engineering\\\/#listItem\",\"name\":\"Data Engineering\"}}]},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/#organization\",\"name\":\"TO THE NEW Blog\",\"url\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/author\\\/insha-danish\\\/#author\",\"url\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/author\\\/insha-danish\\\/\",\"name\":\"Insha Danish\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/incremental-intelligence-bringing-data-engineering-principles-to-ai-systems-2\\\/#authorImage\",\"url\":\"https:\\\/\\\/newersworld-sf-static.tothenew.net\\\/prod\\\/profilePicFolder\\\/fa0f55a4-6ea7-4c16-950e-c6917a383bfd_6720-Insha-Danish-PROFILEPICTURE.jpeg\",\"width\":96,\"height\":96,\"caption\":\"Insha Danish\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/incremental-intelligence-bringing-data-engineering-principles-to-ai-systems-2\\\/#webpage\",\"url\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/incremental-intelligence-bringing-data-engineering-principles-to-ai-systems-2\\\/\",\"name\":\"Incremental Intelligence: Bringing Data Engineering Principles to AI Systems | TO THE NEW Blog\",\"description\":\"Introduction Every data engineer who has run dbt run --full-refresh on a 400-million-row table at 2 a.m. knows a specific dread: watching warehouse credits burn while reprocessing everything, when only a fraction of the data actually changed. dbt's answer \\u2014 incremental models, materializations, snapshots, exposures \\u2014 is a decade of hard-won wisdom about one question:\",\"inLanguage\":\"en-US\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/incremental-intelligence-bringing-data-engineering-principles-to-ai-systems-2\\\/#breadcrumblist\"},\"author\":{\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/author\\\/insha-danish\\\/#author\"},\"creator\":{\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/author\\\/insha-danish\\\/#author\"},\"datePublished\":\"2026-10-14T14:28:29+05:30\",\"dateModified\":\"2026-10-27T23:08:11+05:30\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/\",\"name\":\"TO THE NEW Blog\",\"inLanguage\":\"en-US\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.tothenew.com\\\/blog\\\/#organization\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"Incremental Intelligence: Bringing Data Engineering Principles to AI Systems | TO THE NEW Blog","description":"Introduction Every data engineer who has run dbt run --full-refresh on a 400-million-row table at 2 a.m. knows a specific dread: watching warehouse credits burn while reprocessing everything, when only a fraction of the data actually changed. dbt's answer \u2014 incremental models, materializations, snapshots, exposures \u2014 is a decade of hard-won wisdom about one question:","canonical_url":"https:\/\/2thenew.today\/blog\/incremental-intelligence-bringing-data-engineering-principles-to-ai-systems-2\/","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/2thenew.today\/blog\/incremental-intelligence-bringing-data-engineering-principles-to-ai-systems-2\/#article","name":"Incremental Intelligence: Bringing Data Engineering Principles to AI Systems | TO THE NEW Blog","headline":"Incremental Intelligence: Bringing Data Engineering Principles to AI Systems","author":{"@id":"https:\/\/2thenew.today\/blog\/author\/insha-danish\/#author"},"publisher":{"@id":"https:\/\/2thenew.today\/blog\/#organization"},"image":{"@type":"ImageObject","url":"https:\/\/2thenew.today\/blog\/wp-ttn-blog\/uploads\/2026\/10\/Screenshot-2026-09-03-at-12.06.40-PM-300x73.png","@id":"https:\/\/2thenew.today\/blog\/incremental-intelligence-bringing-data-engineering-principles-to-ai-systems-2\/#articleImage"},"datePublished":"2026-10-14T14:28:29+05:30","dateModified":"2026-10-27T23:08:11+05:30","inLanguage":"en-US","mainEntityOfPage":{"@id":"https:\/\/2thenew.today\/blog\/incremental-intelligence-bringing-data-engineering-principles-to-ai-systems-2\/#webpage"},"isPartOf":{"@id":"https:\/\/2thenew.today\/blog\/incremental-intelligence-bringing-data-engineering-principles-to-ai-systems-2\/#webpage"},"articleSection":"Data Engineering, AIMemory, dbt, IncrementalDataProcessing"},{"@type":"BreadcrumbList","@id":"https:\/\/2thenew.today\/blog\/incremental-intelligence-bringing-data-engineering-principles-to-ai-systems-2\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/2thenew.today\/blog#listItem","position":1,"name":"Home","item":"https:\/\/2thenew.today\/blog","nextItem":{"@type":"ListItem","@id":"https:\/\/2thenew.today\/blog\/category\/data-engineering\/#listItem","name":"Data Engineering"}},{"@type":"ListItem","@id":"https:\/\/2thenew.today\/blog\/category\/data-engineering\/#listItem","position":2,"name":"Data Engineering","item":"https:\/\/2thenew.today\/blog\/category\/data-engineering\/","nextItem":{"@type":"ListItem","@id":"https:\/\/2thenew.today\/blog\/incremental-intelligence-bringing-data-engineering-principles-to-ai-systems-2\/#listItem","name":"Incremental Intelligence: Bringing Data Engineering Principles to AI Systems"},"previousItem":{"@type":"ListItem","@id":"https:\/\/2thenew.today\/blog#listItem","name":"Home"}},{"@type":"ListItem","@id":"https:\/\/2thenew.today\/blog\/incremental-intelligence-bringing-data-engineering-principles-to-ai-systems-2\/#listItem","position":3,"name":"Incremental Intelligence: Bringing Data Engineering Principles to AI Systems","previousItem":{"@type":"ListItem","@id":"https:\/\/2thenew.today\/blog\/category\/data-engineering\/#listItem","name":"Data Engineering"}}]},{"@type":"Organization","@id":"https:\/\/2thenew.today\/blog\/#organization","name":"TO THE NEW Blog","url":"https:\/\/2thenew.today\/blog\/"},{"@type":"Person","@id":"https:\/\/2thenew.today\/blog\/author\/insha-danish\/#author","url":"https:\/\/2thenew.today\/blog\/author\/insha-danish\/","name":"Insha Danish","image":{"@type":"ImageObject","@id":"https:\/\/2thenew.today\/blog\/incremental-intelligence-bringing-data-engineering-principles-to-ai-systems-2\/#authorImage","url":"https:\/\/newersworld-sf-static.tothenew.net\/prod\/profilePicFolder\/fa0f55a4-6ea7-4c16-950e-c6917a383bfd_6720-Insha-Danish-PROFILEPICTURE.jpeg","width":96,"height":96,"caption":"Insha Danish"}},{"@type":"WebPage","@id":"https:\/\/2thenew.today\/blog\/incremental-intelligence-bringing-data-engineering-principles-to-ai-systems-2\/#webpage","url":"https:\/\/2thenew.today\/blog\/incremental-intelligence-bringing-data-engineering-principles-to-ai-systems-2\/","name":"Incremental Intelligence: Bringing Data Engineering Principles to AI Systems | TO THE NEW Blog","description":"Introduction Every data engineer who has run dbt run --full-refresh on a 400-million-row table at 2 a.m. knows a specific dread: watching warehouse credits burn while reprocessing everything, when only a fraction of the data actually changed. dbt's answer \u2014 incremental models, materializations, snapshots, exposures \u2014 is a decade of hard-won wisdom about one question:","inLanguage":"en-US","isPartOf":{"@id":"https:\/\/2thenew.today\/blog\/#website"},"breadcrumb":{"@id":"https:\/\/2thenew.today\/blog\/incremental-intelligence-bringing-data-engineering-principles-to-ai-systems-2\/#breadcrumblist"},"author":{"@id":"https:\/\/2thenew.today\/blog\/author\/insha-danish\/#author"},"creator":{"@id":"https:\/\/2thenew.today\/blog\/author\/insha-danish\/#author"},"datePublished":"2026-10-14T14:28:29+05:30","dateModified":"2026-10-27T23:08:11+05:30"},{"@type":"WebSite","@id":"https:\/\/2thenew.today\/blog\/#website","url":"https:\/\/2thenew.today\/blog\/","name":"TO THE NEW Blog","inLanguage":"en-US","publisher":{"@id":"https:\/\/2thenew.today\/blog\/#organization"}}]},"og:locale":"en_US","og:site_name":"TO THE NEW BLOG","og:type":"blog","og:title":"Incremental Intelligence: Bringing Data Engineering Principles to AI Systems | TO THE NEW Blog","og:description":"Introduction Every data engineer who has run dbt run --full-refresh on a 400-million-row table at 2 a.m. knows a specific dread: watching warehouse credits burn while reprocessing everything, when only a fraction of the data actually changed. dbt's answer \u2014 incremental models, materializations, snapshots, exposures \u2014 is a decade of hard-won wisdom about one question:","og:url":"https:\/\/2thenew.today\/blog\/incremental-intelligence-bringing-data-engineering-principles-to-ai-systems-2\/","og:image":"https:\/\/2thenew.today\/blog\/wp-content\/themes\/ttn\/images\/social-logo.png","og:image:secure_url":"https:\/\/2thenew.today\/blog\/wp-content\/themes\/ttn\/images\/social-logo.png","twitter:card":"summary","twitter:site":"@tothenew","twitter:title":"Incremental Intelligence: Bringing Data Engineering Principles to AI Systems | TO THE NEW Blog","twitter:description":"Introduction Every data engineer who has run dbt run --full-refresh on a 400-million-row table at 2 a.m. knows a specific dread: watching warehouse credits burn while reprocessing everything, when only a fraction of the data actually changed. dbt's answer \u2014 incremental models, materializations, snapshots, exposures \u2014 is a decade of hard-won wisdom about one question:","twitter:image":"https:\/\/2thenew.today\/blog\/wp-content\/themes\/ttn\/images\/social-logo.png"},"aioseo_meta_data":{"post_id":"83866","title":null,"description":null,"keywords":null,"keyphrases":{"focus":{"keyphrase":"","score":0,"analysis":{"keyphraseInTitle":{"score":0,"maxScore":9,"error":1}}},"additional":[]},"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":"","og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"Article","isEnabled":true},"graphs":[]},"schema_type":"default","schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":"-1","robots_max_videopreview":"-1","robots_max_imagepreview":"large","priority":null,"frequency":"default","local_seo":null,"limit_modified_date":false,"created":"2026-10-07 15:23:47","updated":"2026-10-27 17:38:13","focus_keyword":null,"additional_keywords":null,"truseo_locale":null,"ai":{"faqs":[],"keyPoints":[],"schemas":[],"titles":[],"descriptions":[],"socialPosts":{"email":{"subject":"","preview":"","content":""},"linkedin":[],"twitter":[],"facebook":[],"instagram":[]}},"breadcrumb_settings":null,"seo_analyzer_scan_date":null},"aioseo_breadcrumb":"<div class=\"aioseo-breadcrumbs\"><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/2thenew.today\/blog\" title=\"Home\">Home<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/2thenew.today\/blog\/category\/data-engineering\/\" title=\"Data Engineering\">Data Engineering<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\tIncremental Intelligence: Bringing Data Engineering Principles to AI Systems\n\t\t<\/span><\/div>","aioseo_breadcrumb_json":[{"label":"Home","link":"https:\/\/2thenew.today\/blog"},{"label":"Data Engineering","link":"https:\/\/2thenew.today\/blog\/category\/data-engineering\/"},{"label":"Incremental Intelligence: Bringing Data Engineering Principles to AI Systems","link":"https:\/\/2thenew.today\/blog\/incremental-intelligence-bringing-data-engineering-principles-to-ai-systems-2\/"}],"_links":{"self":[{"href":"https:\/\/2thenew.today\/blog\/wp-json\/wp\/v2\/posts\/83866","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/2thenew.today\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/2thenew.today\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/2thenew.today\/blog\/wp-json\/wp\/v2\/users\/2354"}],"replies":[{"embeddable":true,"href":"https:\/\/2thenew.today\/blog\/wp-json\/wp\/v2\/comments?post=83866"}],"version-history":[{"count":14,"href":"https:\/\/2thenew.today\/blog\/wp-json\/wp\/v2\/posts\/83866\/revisions"}],"predecessor-version":[{"id":84085,"href":"https:\/\/2thenew.today\/blog\/wp-json\/wp\/v2\/posts\/83866\/revisions\/84085"}],"wp:attachment":[{"href":"https:\/\/2thenew.today\/blog\/wp-json\/wp\/v2\/media?parent=83866"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/2thenew.today\/blog\/wp-json\/wp\/v2\/categories?post=83866"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/2thenew.today\/blog\/wp-json\/wp\/v2\/tags?post=83866"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}