<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: arjun shukla</title>
    <description>The latest articles on DEV Community by arjun shukla (@arjun_shukla_dev).</description>
    <link>https://dev.to/arjun_shukla_dev</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4111538%2Fb9627033-3e3c-4b83-b72d-09bd50ee6efe.jpg</url>
      <title>DEV Community: arjun shukla</title>
      <link>https://dev.to/arjun_shukla_dev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/arjun_shukla_dev"/>
    <language>en</language>
    <item>
      <title>Why Multi-Agent AI Pipelines Need Incremental Builds</title>
      <dc:creator>arjun shukla</dc:creator>
      <pubDate>Sat, 05 Sep 2026 19:38:39 +0000</pubDate>
      <link>https://dev.to/arjun_shukla_dev/why-multi-agent-ai-pipelines-need-incremental-builds-3l0e</link>
      <guid>https://dev.to/arjun_shukla_dev/why-multi-agent-ai-pipelines-need-incremental-builds-3l0e</guid>
      <description>&lt;p&gt;Multi-agent systems are getting more complex.&lt;/p&gt;

&lt;p&gt;What starts as one agent calling a tool can quickly become a system with multiple agents, shared context, retrieval, prompts, model calls, evaluators, and several downstream steps.&lt;/p&gt;

&lt;p&gt;The problem is that our development workflow hasn't really caught up.&lt;/p&gt;

&lt;p&gt;A small change in one part of the system can cause us to rerun a large part of the pipeline — even when most of the work is still valid.&lt;/p&gt;

&lt;p&gt;That becomes especially painful with RAG and multi-agent systems because some steps are expensive.&lt;/p&gt;

&lt;p&gt;So I started thinking about a simple question:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why can't AI pipelines work more like traditional build systems?&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem with rebuilding AI pipelines
&lt;/h2&gt;

&lt;p&gt;Consider a RAG system:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Documents
    ↓
Chunking
    ↓
Embeddings
    ↓
Vector Index
    ↓
Retriever
    ↓
Agent
    ↓
Evaluation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now imagine changing only the agent's system prompt.&lt;/p&gt;

&lt;p&gt;The documents haven't changed.&lt;br&gt;&lt;br&gt;
The chunks haven't changed.&lt;br&gt;&lt;br&gt;
The embeddings haven't changed.&lt;br&gt;&lt;br&gt;
The vector index hasn't changed.&lt;/p&gt;

&lt;p&gt;Yet depending on how the pipeline is implemented, it is easy to end up rerunning much more work than necessary.&lt;/p&gt;

&lt;p&gt;Multi-agent systems make this even more obvious.&lt;/p&gt;

&lt;p&gt;A system might look more like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                    ┌── Research Agent ──┐
                    │                    │
User → Planner Agent ── Retrieval Agent ──→ Synthesizer
                    │                    │
                    └── Tool Agent ──────┘
                             ↓
                          Evaluator
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now add prompts, models, tools, datasets, retrieval configuration, evaluation criteria, and intermediate artifacts.&lt;/p&gt;

&lt;p&gt;The system becomes a &lt;strong&gt;dependency graph&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;But many workflows still treat it like a script.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI systems are graphs
&lt;/h2&gt;

&lt;p&gt;I think this is an important mental model.&lt;/p&gt;

&lt;p&gt;An AI application isn't necessarily one program that runs from top to bottom.&lt;/p&gt;

&lt;p&gt;It's often a graph of dependent artifacts and computations.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Dataset
   ↓
Preprocessing
   ↓
Embeddings
   ↓
Vector Index
   ↓
Retrieval
   ↓
Agent
   ↓
Evaluation
   ↓
Report
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And some nodes may branch:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                    ┌── Embeddings ──→ Index
Dataset ──→ Clean ──┤
                    └── Metadata ────→ Evaluation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once you think about the system this way, a useful property appears:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If a node hasn't changed, its output should usually be reusable.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That's the same basic idea behind build systems such as &lt;code&gt;make&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What an incremental build actually means
&lt;/h2&gt;

&lt;p&gt;An incremental build system doesn't ask:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Should I run the entire pipeline?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It asks:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What changed, and what depends on that change?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Suppose we have:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Dataset → Chunking → Embeddings → Index → Retrieval → Agent → Eval
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the dataset changes, a lot of the graph may need to be rebuilt.&lt;/p&gt;

&lt;p&gt;But if only the agent prompt changes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Dataset       cached
Chunking      cached
Embeddings    cached
Index         cached
Retrieval     cached
Agent         changed
Eval          rebuild
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There is no reason to recompute the earlier stages.&lt;/p&gt;

&lt;p&gt;This sounds obvious.&lt;/p&gt;

&lt;p&gt;The difficult part is making the system know &lt;strong&gt;what actually changed&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why timestamps aren't enough
&lt;/h2&gt;

&lt;p&gt;Traditional build systems often use file timestamps to determine whether something needs to be rebuilt.&lt;/p&gt;

&lt;p&gt;AI pipelines are more complicated.&lt;/p&gt;

&lt;p&gt;An artifact can depend on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a dataset&lt;/li&gt;
&lt;li&gt;a configuration file&lt;/li&gt;
&lt;li&gt;a prompt&lt;/li&gt;
&lt;li&gt;model parameters&lt;/li&gt;
&lt;li&gt;preprocessing code&lt;/li&gt;
&lt;li&gt;another artifact&lt;/li&gt;
&lt;li&gt;an evaluation configuration&lt;/li&gt;
&lt;li&gt;an external model&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The file itself might not have changed, but its contents or dependencies might have.&lt;/p&gt;

&lt;p&gt;This is where content-based fingerprints become useful.&lt;/p&gt;

&lt;p&gt;Instead of asking:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Did this file's timestamp change?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;we can ask:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Did the content or dependency state that produced this artifact change?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A simple approach is to calculate a content hash.&lt;/p&gt;

&lt;p&gt;Conceptually:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;artifact_hash =
    hash(
        input_content
        + configuration
        + dependency_hashes
    )
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the resulting fingerprint is identical, the previous output may be reusable.&lt;/p&gt;

&lt;p&gt;If it changes, downstream artifacts can be marked stale.&lt;/p&gt;

&lt;h2&gt;
  
  
  This becomes especially interesting for agents
&lt;/h2&gt;

&lt;p&gt;Multi-agent systems introduce another layer of complexity.&lt;/p&gt;

&lt;p&gt;An agent may depend on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Model&lt;/li&gt;
&lt;li&gt;Prompt&lt;/li&gt;
&lt;li&gt;Tools&lt;/li&gt;
&lt;li&gt;Tool schemas&lt;/li&gt;
&lt;li&gt;Retrieved context&lt;/li&gt;
&lt;li&gt;Memory&lt;/li&gt;
&lt;li&gt;Agent configuration&lt;/li&gt;
&lt;li&gt;Evaluation criteria&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And an agent can produce outputs that become inputs to another agent.&lt;/p&gt;

&lt;p&gt;So you can end up with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Planner
   ↓
Researcher
   ↓
Retriever
   ↓
Analyst
   ↓
Writer
   ↓
Evaluator
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Changing the writer's prompt shouldn't necessarily cause the researcher or retriever to run again.&lt;/p&gt;

&lt;p&gt;Likewise, changing the retriever shouldn't necessarily require rebuilding an unrelated branch of the system.&lt;/p&gt;

&lt;p&gt;This is where dependency-aware execution becomes useful.&lt;/p&gt;

&lt;h2&gt;
  
  
  There is another problem: evaluation
&lt;/h2&gt;

&lt;p&gt;Evaluation is particularly interesting in agentic systems.&lt;/p&gt;

&lt;p&gt;A traditional ML pipeline might evaluate a model against a dataset.&lt;/p&gt;

&lt;p&gt;Agent evaluation can involve much more:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;final output&lt;/li&gt;
&lt;li&gt;tool calls&lt;/li&gt;
&lt;li&gt;retrieval results&lt;/li&gt;
&lt;li&gt;intermediate steps&lt;/li&gt;
&lt;li&gt;context&lt;/li&gt;
&lt;li&gt;latency&lt;/li&gt;
&lt;li&gt;token usage&lt;/li&gt;
&lt;li&gt;agent trajectories&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Modern agent evaluation is increasingly concerned with the whole execution path rather than just the final answer.&lt;/p&gt;

&lt;p&gt;That means evaluation itself becomes part of the dependency graph.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Agent
  ↓
Trace
  ↓
Evaluator
  ↓
Experiment
  ↓
Report
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Change the evaluation criteria? You may only need to rerun the evaluator and downstream report.&lt;/p&gt;

&lt;p&gt;Change the underlying agent? Now the evaluation needs new inputs.&lt;/p&gt;

&lt;p&gt;This dependency relationship is something a build system can reason about.&lt;/p&gt;

&lt;h2&gt;
  
  
  Putting the idea into practice
&lt;/h2&gt;

&lt;p&gt;This problem is what led me to build &lt;a href="https://github.com/arjun988/aimake" rel="noopener noreferrer"&gt;aimake&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The basic idea is to bring incremental build concepts to AI/ML and agent pipelines.&lt;/p&gt;

&lt;p&gt;Instead of treating the pipeline as one large execution, aimake represents it as a dependency graph and uses content-based fingerprints to determine what needs to be rebuilt.&lt;/p&gt;

&lt;p&gt;The goal isn't to create another agent framework.&lt;/p&gt;

&lt;p&gt;It's the layer underneath the workflow — something closer to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                 AI / Agent Application
                          ↓
                 Dependency Graph
                          ↓
              Incremental Build System
                          ↓
             Cache / Reuse / Execution
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I'm experimenting with how far this model can go for RAG, multi-agent workflows, evaluation pipelines, and other AI systems.&lt;/p&gt;

&lt;p&gt;Docs: &lt;a href="https://aimake-doc.vercel.app/" rel="noopener noreferrer"&gt;aimake-doc.vercel.app&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I think is interesting about this
&lt;/h2&gt;

&lt;p&gt;As AI applications get larger, the expensive part isn't always the model call itself.&lt;/p&gt;

&lt;p&gt;It can be all the surrounding computation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;processing data&lt;/li&gt;
&lt;li&gt;generating embeddings&lt;/li&gt;
&lt;li&gt;building indexes&lt;/li&gt;
&lt;li&gt;running retrieval&lt;/li&gt;
&lt;li&gt;executing agent trajectories&lt;/li&gt;
&lt;li&gt;running evaluations&lt;/li&gt;
&lt;li&gt;generating reports&lt;/li&gt;
&lt;li&gt;running experiments&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If every small change invalidates everything, development becomes unnecessarily slow and expensive.&lt;/p&gt;

&lt;p&gt;Incremental computation gives us another option:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Only recompute the part of the system whose inputs actually changed.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That's a very old idea in software engineering.&lt;/p&gt;

&lt;p&gt;I don't think AI needs to reinvent it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Open questions
&lt;/h2&gt;

&lt;p&gt;There are still a lot of interesting problems here.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How should nondeterministic LLM calls be cached?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
If the same prompt and model can produce different outputs, content hashing alone isn't enough.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What should happen when an external model changes?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
If you're calling an API model, your local inputs may be identical while the provider's model has changed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How should agent memory affect dependencies?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A memory update could invalidate part of an agent workflow without invalidating everything.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How do you handle stochastic evaluation?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Some evaluations themselves are nondeterministic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How should distributed agent workflows be scheduled?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Once the dependency graph becomes large, you can start thinking about parallel execution and resource-aware scheduling.&lt;/p&gt;

&lt;p&gt;These are the areas I'm interested in exploring.&lt;/p&gt;

&lt;h2&gt;
  
  
  The bigger idea
&lt;/h2&gt;

&lt;p&gt;I don't think the future of AI development is going to be a collection of isolated LLM calls.&lt;/p&gt;

&lt;p&gt;We're increasingly building systems composed of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Models&lt;/li&gt;
&lt;li&gt;Agents&lt;/li&gt;
&lt;li&gt;Tools&lt;/li&gt;
&lt;li&gt;Retrieval&lt;/li&gt;
&lt;li&gt;Memory&lt;/li&gt;
&lt;li&gt;Data&lt;/li&gt;
&lt;li&gt;Prompts&lt;/li&gt;
&lt;li&gt;Evaluations&lt;/li&gt;
&lt;li&gt;Experiments&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That looks less like a single application and more like a computational graph.&lt;/p&gt;

&lt;p&gt;And computational graphs need infrastructure.&lt;/p&gt;

&lt;p&gt;We've already spent decades building systems for incremental compilation, caching, dependency tracking, reproducibility, and distributed execution.&lt;/p&gt;

&lt;p&gt;There is an opportunity to bring some of those ideas into AI engineering.&lt;/p&gt;

&lt;p&gt;That's the problem I'm exploring with &lt;a href="https://github.com/arjun988/aimake" rel="noopener noreferrer"&gt;aimake&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you're building RAG systems, multi-agent workflows, or large AI pipelines, I'm particularly interested in how you're currently handling incremental execution and caching.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What do you rebuild today that you wish you didn't have to?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fk1c7b5unnx01kycpgi2z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fk1c7b5unnx01kycpgi2z.png" alt="aimake dashboard for multi agent build pipeline" width="800" height="391"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>python</category>
      <category>devops</category>
    </item>
  </channel>
</rss>
