The 4-Step AI Attribution Workflow Top Teams Actually Use
The 4-Step AI Attribution Workflow Top Teams Actually Use
By Dr. Eleanor Voss, PhD in Artificial Intelligence
Let's be honest: most AI attribution in the wild is a mess. You've seen it. A product manager asks, "Did AI write this?" and a junior dev replies, "The model generated 40% of the draft, I think." You've seen dashboards that show a single blended "AI contribution" percentage that tells you nothing. You've seen legal teams scrambling to figure out which paragraphs were human, which were model-generated, and which were edited by which person.
None of this works. Not because the technology is missing, but because most teams skip the boring parts that actually make attribution trustworthy.
I've spent the last decade building systems where knowing who or what produced a token is a hard requirement — in research pipelines, in code generation tools, in content platforms. And I've watched teams go from "we'll just log model names" to genuinely defensible, auditable attribution in a few weeks. The difference is a four-step workflow. Not a framework. Not a methodology. A workflow — something you run on every artifact, every day, until it's boring.
Here's the version that works.
Step 1: Define the Unit of Attribution Before You Generate Anything
This is the step almost everyone skips, and it's the one that makes or breaks the whole system.
Most teams start by asking "how much did AI contribute?" which is a vague, subjective question that invites disagreement. The fix is to decide, before generation begins, what the smallest unit of attribution will be.
Options, roughly in order of precision:
Document-level: "This report was 60% AI-generated." Coarse. Good for marketing, bad for audit.
Section-level: "Section 3 was fully model-generated; Sections 1 and 2 were human-written." Better. Works for reports, articles, PRDs.
Paragraph-level: "Paragraphs 4–7 are LLM output; paragraphs 8–10 were human-drafted." This is the sweet spot for most content teams.
Sentence-level: "Sentences 12 and 15 are model output." Precise. Good for legal, compliance, academic work.
Token-level: "Tokens 4,012–4,180 came from GPT-4o; tokens 4,181–4,302 came from Claude 3.5 Sonnet." Maximum precision. Expensive to store. Good for RAG pipelines, code, research.
The right granularity depends on your use case. If you need to defend provenance to a regulator, you want sentence or token level. If you're tracking content quality, paragraph level is usually enough. If you're doing brand voice analysis, section level.
The key insight: the unit of attribution is a design decision, not an implementation detail. It determines your data schema, your storage cost, your UI, your legal defensibility. Decide it once, write it down, and don't change it casually.
Here's a concrete example. Say you're building a marketing content pipeline. You decide:
Unit of attribution: paragraph.
Metadata per paragraph: author_type (human | ai | hybrid), model_id (if ai), prompt_version, generation_timestamp, edit_history.
Now you have a contract. Every paragraph in every artifact carries this metadata. You can query it, filter by it, audit it.
Teams that skip this step end up with a database full of opaque blobs and a dashboard full of vibes.
Step 2: Instrument the Generation Pipeline
Once you know your unit of attribution, you need a pipeline that produces it automatically. This is where most teams give up, because it means touching the code that calls the model.
You don't need a fancy framework. You need three things:
1. A stable identity for each generation. Every time a model produces a chunk of content, assign it a generation_id — a UUID, a timestamped slug, whatever. This is your anchor. When someone later edits a paragraph, you can still point back to which generation produced it.
2. A prompt versioning scheme. If you iterate on prompts (and you will), you need to record which prompt version produced each chunk. Otherwise your attribution says "GPT-4o wrote this" but you can't reproduce the conditions under which it wrote it. I use a simple prompt_id + prompt_hash pair. The hash lets you verify you're looking at the exact prompt text, not just a label someone might have renamed.
3. A human baseline to compare against. This is the part that surprises people. You need to know what the human would have written, or at least where the human intervened. The simplest version: log the human's original draft (if one exists) alongside the AI output, and store both. The richer version: use a lightweight diff to identify which sentences or paragraphs were added, removed, or rewritten by the human.
Here's what the metadata record looks like in practice:
{
"unit": "paragraph_7",
"generation_id": "gen_20260315_8842",
"author_type": "hybrid",
"model_id": "claude-3-5-sonnet",
"prompt_id": "pr_014",
"prompt_hash": "sha256:a8f2c1...",
"generated_at": "2026-03-15T09:42:11Z",
"edited_by": "j.chen",
"edited_at": "2026-03-15T14:03:55Z",
"edit_ratio": 0.31
}edit_ratio is the fraction of the paragraph that was modified by a human after generation. This single number tells you whether the AI did the heavy lifting, whether the human did the heavy lifting, or whether it was a true collaboration.
You don't need to build all of this on day one. Start with generation_id, model_id, and author_type. Add prompt_version and edit_ratio in week two. The workflow compounds.
Step 3: Build the Edit-Tracking Layer
This is the step that separates "we logged which model generated the text" from "we can actually answer questions about provenance."
Here's the problem: the model writes a draft. A human reads it, edits it, rewrites a sentence, deletes a paragraph, adds a new one. Now the final document is a mashup of model output and human text, and your original generation metadata is attached to text that no longer exists in its original form.
You need a lightweight edit tracker. It doesn't need to be a full version control system. It needs to answer three questions:
What changed? (Which units were added, removed, or rewritten?)
By whom? (Human or model, and which human if human.)
When? (Timestamp, so you can reconstruct the sequence.)
The simplest implementation: store a before/after snapshot of each unit at the moment of edit, and compute a diff. You don't need a sophisticated algorithm. For paragraph-level attribution, a simple string comparison with a token-level diff (like difflib in Python or diff in shell) gives you a reasonable edit_ratio. For sentence-level, do the same per sentence.
For code, you already have a version control system — Git. Your attribution layer just needs to link each commit to the generation_id that produced the original version, and track subsequent human commits.
For documents, you can use a simple JSON structure per unit:
"paragraph_3": {
"original": "The model's output...",
"final": "The model's output, refined by the editor...",
"original_author": "ai",
"final_author": "hybrid",
"edit_log": [
{"by": "j.chen", "at": "2026-03-15T14:03:55Z", "change": "rewrote_sent_2"}
]
}This is not glamorous. It's a JSON file or a database table. But it's the difference between "the AI wrote 60% of this" (unverifiable) and "Paragraphs 3, 5, and 8 are hybrid; the human edited 31%, 44%, and 12% respectively" (verifiable, auditable, defensible).
Teams that skip this step can tell you which model generated the text. Teams that build it can tell you what happened after generation — which is where the real provenance questions live.
Step 4: Close the Loop with a Provenance Report
The final step is the one that makes the workflow useful to people who aren't the ones building it.
A provenance report is a structured, queryable summary of the attribution data you've been collecting. It answers the questions that actually get asked:
"Which parts of this document were AI-generated, and which were human-written?"
"Which model produced each section?"
"How much did the human edit the AI output?"
"Can I reproduce the generation? (i.e., do I have the prompt, the model, and the conditions?)"
"Who has touched this artifact, and when?"
The report doesn't need to be a fancy dashboard. A well-structured table or a simple queryable API is enough. The key property is reproducibility: given the provenance report, someone who wasn't involved in the original generation should be able to reconstruct, or at least verify, how the artifact came to be.
Here's a template:
Unit | Author Type | Model | Prompt | Generated At | Edited By | Edit Ratio |
|---|---|---|---|---|---|---|
¶1 | human | — | — | — | — | 0% |
¶2 | ai | claude-3-5-sonnet | pr_014 | 03/15 09:42 | j.chen | 31% |
¶3 | ai | gpt-4o | pr_015 | 03/15 09:43 | m.lee | 44% |
¶4 | human | — | — | — | — | 0% |
¶5 | hybrid | claude-3-5-sonnet | pr_014 | 03/15 09:42 | j.chen | 12% |
Five rows. A few minutes to generate. And now you can hand this to a client, a regulator, a colleague, or a future-you who has forgotten the details, and the provenance is self-evident.
Why This Workflow Actually Works
Let me step back and say why these four steps, in this order, matter.
Step 1 (unit of attribution) forces you to think about what you're trying to measure before you start measuring. It prevents the classic mistake of collecting data you'll never use.
Step 2 (instrument the pipeline) makes attribution automatic rather than retrospective. You're not trying to reconstruct "what did the AI actually do?" after the fact. You're logging it in real time, with the right metadata, at the moment of generation.
Step 3 (edit tracking) captures the collaboration, not just the generation. Most real-world AI-assisted work is a dialogue between human and model, and the provenance question is about the final artifact, not the first draft.
Step 4 (provenance report) makes the data useful to people who weren't in the room. Attribution that only the original author can interpret isn't attribution — it's a diary.
Together, these four steps give you a system where provenance is a property of the artifact, not a property of someone's memory. That's the difference between "I think the AI wrote most of this" and "here's the data, verify it yourself."
A Note on What This Is Not
This workflow is not a replacement for understanding your models, evaluating their outputs, or doing the actual work of using AI well. It's the provenance layer. It doesn't tell you whether the AI output was good, whether the prompt was well-designed, or whether the human edits were the right ones. Those are quality questions. This is a where did this come from question.
And that distinction matters. In legal, academic, and enterprise contexts, provenance is often what's actually required. You don't need to prove the AI did a good job. You need to prove that this specific paragraph came from this specific model, under these specific conditions, and was subsequently edited by this specific person at this specific time.
Start Small
You don't need all four steps on day one. Start with Step 1: decide your unit of attribution. Write it down. Pick one artifact — a report, a blog post, a code file — and run it through the pipeline. Log the generation_id, the model_id, the author_type. That's a working attribution system.
Add the prompt versioning in week two. Add the edit tracking in week three. Build the provenance report when someone asks for it — and you'll be surprised how often someone asks for it.
The teams that actually use this workflow are not the ones with the fanciest stack. They're the ones that made attribution boring. They stopped treating it as a special project. They made it part of the daily pipeline, the same way they made testing or code review part of the daily pipeline.
And that's the whole point. Attribution isn't a feature you add. It's a discipline you practice. And once it's boring, it's working.