Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

8 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

VeriDNA: DNA-Inspired LLM Veracity & Fidelity Framework

Reduce hallucinations. Increase determinism. Emulate nature's most reliable copying machine.

License: MIT Python 3.10+ OpenAI

VeriDNA applies the exact three-stage error-correction architecture of DNA replication to Large Language Models:

Stage DNA Name DNA Function VeriDNA Analog Effect
1 Polymerase Base selection & polymerization Generator LLM Initial response
2 Proofreading (3'→5' Exonuclease) Backtrack & remove mismatched bases Proofreader LLM Local error correction
3 Mismatch Repair (MutS-MutL-MutH) Global detection, excision, resynthesis Detector + Repairer LLM Global hallucination repair

The result: dramatically lower effective error rates, more deterministic outputs, and built-in confidence scoring — all modeled after the molecular machinery that replicates your genome with ~1 in a billion fidelity.


The Science Lesson: How DNA Achieves ~1 in a Billion Fidelity

DNA replication is one of the most accurate processes in biology. Here's exactly how it works — with real enzyme names, mechanisms, and the direct analog to LLM behavior.

Stage 1: Polymerase — Base Selection & Polymerization

DNA polymerases add nucleotides according to Watson-Crick base pairing (A–T, G–C). In E. coli, the primary replicative enzyme is DNA Polymerase III holoenzyme (α, ε, θ subunits). In eukaryotes, Pol δ (lagging strand) and Pol ε (leading strand) do the work.

Template:   3' — A T G C T A — 5'
Synthesis:  5' — T A C G A T — 3'
                         ↑
                    Pol III adds T ✓ (matches A on template)
  • Error rate without correction: ~1 in 10⁴ to 10⁵ bases (10⁻⁴ to 10⁻⁵).
  • The polymerase selects the correct nucleotide ~99.9% of the time through geometric selection and induced fit.
  • But even at 99.9% accuracy, a 3-billion-base human genome would accumulate ~3 million errors per replication — catastrophic.

Stage 2: Proofreading — 3'→5' Exonuclease Activity

Most replicative DNA polymerases have built-in proofreading capability via a separate 3'→5' exonuclease domain.

Organism Polymerase Exonuclease Subunit Mechanism
E. coli DNA Pol III ε subunit (dnaQ) Detects mismatched base pair; backtracks; removes incorrect nucleotide; resumes synthesis
E. coli DNA Pol I Klenow fragment Same mechanism, also involved in Okazaki fragment maturation
Eukaryotes Pol δ / Pol ε Intrinsic 3'→5' exo domain Identical logic — detects distorted helix geometry
  Misincorporation:
  5' — T A C G A T — 3'
  3' — A T G C T A — 5'    ← T·T mismatch (wrong!)

  Proofreading (ε subunit detects distortion):
  5' — T A C G A T — 3'
  3' — A T G   T A — 5'    ← Exo removes T
            ↑
         3'→5' exo

  Resynthesis:
  5' — T A C G A T — 3'
  3' — A T G C T A — 5'    ← Correct A·T pair restored
  • Fidelity improvement: ~10–200× reduction in error rate.
  • Resulting error rate: ~1 in 10⁶ to 10⁷ (10⁻⁶ to 10⁻⁷).
  • In the human genome, this reduces the per-replication error count from ~3,000,000 to ~30,000 — better, but still too many.

Stage 3: Mismatch Repair (MMR) — The Ultimate Spellchecker

Errors that escape proofreading are caught by the post-replication Mismatch Repair system — a coordinated molecular machine that can detect, discriminate, excise, and resynthesize errors across long distances.

Prokaryotic MMR (E. coli — the best-understood system)

Protein Function VeriDNA Analog
MutS Mismatch recognition (dimer). Scans DNA, detects distortions. ATP-dependent sliding clamp. Detector LLM — scans text for hallucinated claims
MutL Molecular coordinator. Recruited by MutS. Activates MutH, loads helicase. Coordinator logic — decides scope and invokes repair
MutH Endonuclease. Strand discrimination: nicks the unmethylated (new) strand at hemi-methylated GATC sites. Strand discrimination — template is ground truth, generated text is the "new strand"
UvrD Helicase II. Unwinds DNA from the nick toward the mismatch. Excision — identification of text span to remove
ExoI / ExoVII / RecJ 3'→5' or 5'→3' exonucleases. Degrade the error-containing segment. Text removal — strip hallucinated content
SSB Single-strand binding protein. Stabilizes the gap. (placeholder — gap stability)
DNA Pol III Resynthesizes the gap using the parental strand as template. Repairer LLM — regenerates accurate content
DNA Ligase Seals the nick. Final assembly — coherent output
Step 1 — Recognition (MutS):
  5' — T A C G A T — 3'
  3' — A T G G T A — 5'    ← G·T mismatch (wobble pair)
            ↑
          MutS binds

Step 2 — Strand Discrimination (MutH):
  5' — T A C G A T — 3'    ← methylated (template)
  3' — A T G G T A — 5'    ← unmethylated (new) → MutH nicks
              ↑
             MutH

Step 3 — Excision (UvrD + ExoI):
  5' — T A C G A T — 3'
  3' — A T          5'    ← segment removed from nick to mismatch

Step 4 — Resynthesis (Pol III) + Ligation (Ligase):
  5' — T A C G A T — 3'
  3' — A T G C T A — 5'    ← Correct C·G pair restored; nick sealed
  • Fidelity improvement from MMR alone: ~20–400×.
  • Net error rate: ~1 in 10⁹ to 10⁻¹⁰ (10⁻⁹ to 10⁻¹⁰) — less than 1 error per human genome per replication.

Eukaryotic MMR (Human — more complex)

Protein Complex Alternate Name Function
MutSα MSH2–MSH6 Recognizes single-base mismatches and small insertion-deletion loops
MutSβ MSH2–MSH3 Recognizes larger insertion-deletion loops
MutLα MLH1–PMS2 Endonuclease activity; introduces nicks on the daughter strand; coordinates downstream repair
MutLβ MLH1–MLH3 Backup role
EXO1 5'→3' exonuclease that degrades the error-containing strand
PCNA Proliferating Cell Nuclear Antigen Sliding clamp; processivity factor
RFC Replication Factor C Clamp loader
RPA Replication Protein A Single-strand binding protein; protects the gap
DNA Pol δ Gap resynthesis
DNA Ligase I Nick sealing

The key difference: in eukaryotes, MutLα (PMS2) has the endonuclease activity that nicks the daughter strand (replacing MutH, since eukaryotes don't use Dam methylation for strand discrimination). Instead, strand discrimination in eukaryotes relies on PCNA orientation and pre-existing nicks in the newly synthesized strand.

The Takeaway

Three layers, each catching what the previous one missed.

Selection (polymerase) → Proofreading (exonuclease) → Mismatch Repair (MutSLH)

10⁻⁴ → 10⁻⁶ → 10⁻⁹

This is exactly what VeriDNA implements for LLMs.


Architecture

                    ┌─────────────────────────────────────┐
                    │         User Query + RAG            │
                    └────────────┬────────────────────────┘
                                 │
                    ┌────────────▼────────────┐
                    │  POLYMERASE (Generator) │  ← Stage 1
                    │  "DNA Pol III"          │
                    └────────────┬────────────┘
                                 │
                            Initial Draft
                                 │
                    ┌────────────▼────────────┐
                    │  EXONUCLEASE (Proofr.)  │  ← Stage 2
                    │  "ε subunit 3'→5' exo"  │
                    └────────────┬────────────┘
                                 │
                     ┌───────────▼───────────┐
                     │   Iterate until       │
                     │   stable or max iters  │
                     └───────────┬───────────┘
                                 │
                           Corrected Text
                                 │
                    ┌────────────▼────────────┐
                    │  MutS (Detector)        │  ← Stage 3a
                    │  Scans for mismatches   │
                    └────────────┬────────────┘
                                 │
                      ┌──────────▼──────────┐
                      │  Passes check?       │
                      │  (issues + severity) │
                      └────┬────────────┬────┘
                           │ YES        │ NO
                           ▼            ▼
                     ┌─────────┐  ┌─────────▼──────────┐
                     │ Return  │  │  MMR Repair        │  ← Stage 3b
                     │ Output  │  │  Excision +        │
                     │         │  │  Resynthesis +     │
                     │         │  │  Ligation          │
                     └─────────┘  └─────────┬──────────┘
                                           │
                                     ┌─────▼──────┐
                                     │ Loop again  │
                                     │ (max rounds)│
                                     └─────┬──────┘
                                           │
                                           ▼
                                  ┌─────────────────┐
                                  │  FINAL OUTPUT   │
                                  │  + Confidence   │
                                  │  + Traceability │
                                  └─────────────────┘

Installation

git clone https://github.com/NullLabTests/VeriDNA
cd VeriDNA
pip install -r requirements.txt

Or install directly:

pip install openai pydantic python-dotenv

Quick Start

Minimal (One Call)

from veridna import VeriDNA

vd = VeriDNA(api_key="sk-...")

result = vd.full_process("What is quantum entanglement?")
print(result["final_output"])
print("Confidence:", result["confidence"])

Full Control

from veridna import VeriDNA, VeriDNAConfig

config = VeriDNAConfig(
    api_key="sk-...",
    model_generator="gpt-4o-mini",
    model_proofreader="gpt-4o-mini",
    model_detector="gpt-4o",
    model_repair="gpt-4o",
    max_proofread_iters=3,
    confidence_threshold=0.85,
    verbose=True,
)

vd = VeriDNA(config=config)

result = vd.full_process(
    "Explain CRISPR-Cas9 and list 3 real applications.",
    rag_context="""CRISPR-Cas9 is a gene-editing tool derived from bacterial immune systems.
It uses a guide RNA to target specific DNA sequences and the Cas9 nuclease to cut.
Applications: sickle cell disease treatment, agricultural crop improvement, malaria-resistant mosquitoes.""",
)

Structured Output

import json
print(json.dumps(result, indent=2))
# {
#   "query": "...",
#   "final_output": "...",
#   "initial_draft": "...",
#   "after_proofread": "...",
#   "proofread_rounds": [...],
#   "issues_found": [...],
#   "repairs_made": 0,
#   "confidence": 0.95,
#   "stages_completed": ["polymerase", "exonuclease"],
#   "elapsed_ms": 4230.12
# }

API Key from Environment

import os
from veridna import VeriDNA

vd = VeriDNA(api_key=os.getenv("OPENAI_API_KEY"))

Per-Stage Model Configuration

Different stages benefit from different model sizes:

Stage Recommended Model Why
Generator gpt-4o-mini Fast, cheap, creative enough for first pass
Proofreader gpt-4o-mini Local corrections; smaller model is sufficient
Detector gpt-4o Needs strongest reasoning to catch subtle hallucinations
Repairer gpt-4o Needs strong factual precision for resynthesis

Set them independently:

config = VeriDNAConfig(
    model_generator="gpt-4o-mini",
    model_proofreader="gpt-4o-mini",
    model_detector="gpt-4o",
    model_repair="gpt-4o",
)

Or use a single model everywhere:

vd = VeriDNA(api_key="sk-...", model="gpt-4o")

RAG Integration

Pass context to ground the generator and repairer:

result = vd.full_process(
    "What is the treatment for atrial fibrillation?",
    rag_context="""Extracted from UpToDate 2026:
- Rate control: beta blockers, calcium channel blockers
- Rhythm control: antiarrhythmics, cardioversion
- Anticoagulation: DOACs (apixaban, rivaroxaban) for CHA2DS2-VASc ≥ 2
- Catheter ablation for symptomatic paroxysmal AFib refractory to meds""",
)

The strand discrimination system (analogous to MutH / Dam methylation) uses this context as the "template strand" — any generated claim that diverges from it is flagged for repair.


OpenCode Skill Registration

VeriDNA is registered as an opencode agent skill. Install it globally:

# Install globally (SKILL.md has proper YAML frontmatter for opencode)
mkdir -p ~/.config/opencode/skills/veridna
cp skill/SKILL.md ~/.config/opencode/skills/veridna/SKILL.md

Then load it in any opencode session:

> /skill veridna

The skill instructs the agent to process queries through the full 3-stage DNA-inspired pipeline (Polymerase → Exonuclease → MutS + MMR) and report confidence scores. See the opencode skills documentation for more details.


The VeriDNA Skill — Reusable Prompts for Any Harness

Use these prompts directly in LangGraph, CrewAI, AutoGen, Custom Agents, or any LLM harness.

Polymerase (Generator) Skill Prompt

You are a high-fidelity polymerase-like generator — analogous to DNA Polymerase III.
- Be precise and factual.
- If uncertain about a fact, state your uncertainty clearly.
- Do not fabricate citations, statistics, or claims.
- When provided with RAG context, use it as your primary source of truth.

Exonuclease (Proofreader) Skill Prompt

You are a 3'→5' exonuclease proofreader — analogous to the ε subunit of DNA Pol III.
- Review the text for local errors: logical inconsistencies, factual mistakes, contradictions.
- Backtrack and correct each error.
- Output ONLY the corrected version (full text).
- If no errors found, output the original unchanged.

MutS Detector Skill Prompt

You are a MutS mismatch detection protein.
- Scan the text for: hallucinations, factual inaccuracies, internal contradictions,
  unsupported claims, fabricated data.
- Output JSON: {"issues": [{"issue": "...", "location": "...", "severity": "high|medium|low"}], "passes": bool}.
- passes = true only if zero high-severity and <2 medium-severity issues.

MMR Repair Skill Prompt

You are the MMR repair pathway (MutS→MutL→MutH→UvrD→ExoI→Pol III→Ligase).
- Remove problematic sections.
- Resynthesize them using accurate information from the provided context.
- Preserve all correct content.
- Maintain original tone and structure.
- Output ONLY the repaired text.

Extending VeriDNA

Add Tool-Verification (MutS with Function Calling)

import json

def verify_claim(claim: str) -> dict:
    # Search web, database, or execute code
    return {"verified": True, "source": "..."}

class VeriDNAWithTools(VeriDNA):
    def detect_mismatches(self, text: str):
        issues, conf = super().detect_mismatches(text)
        for claim in extract_claims(text):
            if not verify_claim(claim)["verified"]:
                issues.append(MismatchIssue(...))
        return issues, conf

Use a Different Provider

config = VeriDNAConfig(
    base_url="https://api.openai.com/v1",  # or any OpenAI-compatible endpoint
    api_key="sk-...",
)

Human-in-the-Loop

result = vd.full_process(query)
if result["confidence"] < 0.7:
    print("LOW CONFIDENCE — Human review needed")
    print(result["final_output"])
    # Escalate to human


SLiM / Evolutionary Refinement (Optional)

VeriDNA can optionally integrate SLiM (a forward-time population-genetic simulator) to treat candidate LLM responses as individuals in a tiny evolving population — adding a fourth "evolutionary" layer inspired by population genetics.

The Biological Analogy

Population Genetics Concept VeriDNA Analog
Haplosome (individual genome) A single candidate LLM response
Population (deme) Pool of candidate responses
Fitness VeriDNA MutS confidence score
Selection Higher-confidence responses preferentially survive
Mutation (neutral + deleterious) LLM-generated variant phrasings (perturbations)
Fixation A high-confidence variant dominates the population
Nucleotide diversity (π) Pairwise text divergence among survivors
Tree sequence Ancestry trace of surviving responses

How It Works

             ┌─────────────────────┐
             │  After Exonuclease  │
             │  (proofread text)   │
             └─────────┬───────────┘
                       │
             ┌─────────▼───────────┐
             │ Generate haplosome  │
             │ pool via LLM        │  ← LLM perturbs text into N variants
             │ perturbation        │
             └─────────┬───────────┘
                       │
             ┌─────────▼───────────┐
             │ Score each variant  │
             │ with MutS detector  │  ← fitness = confidence score (0–1)
             └─────────┬───────────┘
                       │
             ┌─────────▼───────────┐
             │ SLiM Wright–Fisher  │
             │ evolution           │  ← selection + drift over N generations
             │ (N=20, gen=5)       │
             └─────────┬───────────┘
                       │
             ┌─────────▼───────────┐
             │ Survivors → MMR     │
             │ stage               │  ← fittest haplosome(s) pass through
             └─────────────────────┘

Step-by-step:

  1. After proofreading (exonuclease stage), the pipeline generates a small haplosome pool — N variant texts via LLM perturbation using the HAPLOSOME_VARIANT_GENERATOR prompt.
  2. Each variant is scored by the MutS detector for confidence. This confidence score (0–1) becomes the haplosome's fitness.
  3. Scores are embedded into a dynamically generated Eidos script and passed to SLiM.
  4. SLiM runs a Wright-Fisher simulation: each generation, individuals reproduce proportionally to their fitness (selection) with possible mutation (neutral drift).
  5. Survivors from the final generation are mapped back to their original text and the fittest one passes into the MMR repair stage.
  6. Confidence scoring in the MMR stage is boosted by SLiM-derived metrics — high fixation probability = small confidence bonus; high diversity among survivors = small penalty (indicating uncertainty).

Installation

# SLiM is an external binary (not a Python package)
# Download from: https://messerlab.org/slim/
# Ensure `slim` is on your $PATH

# Verify:
slim --version
# SLiM version 5.0 or later recommended

Configuration Fields

Set these on VeriDNAConfig:

Field Default Description
use_slim_evolution False Enable evolutionary refinement
slim_population_size 20 Number of haplosomes per generation (capped at 10 in pool generation)
slim_generations 5 Wright-Fisher generations to simulate
slim_mutation_rate 0.01 Per-base mutation rate in the Eidos model (analogous to per-claim edit rate)
slim_selection_strength 1.0 Selection coefficient scaling (reserved for future use)
slim_path "slim" Path to the SLiM binary

Usage — Full Pipeline Integration

from veridna import VeriDNA, VeriDNAConfig

config = VeriDNAConfig(
    api_key="sk-...",
    use_slim_evolution=True,
    slim_population_size=10,
    slim_generations=5,
    slim_mutation_rate=0.01,
)
vd = VeriDNA(config=config)
result = vd.full_process("Explain DNA mismatch repair in E. coli.")

# Extra diagnostics when SLiM is enabled:
print(result.get("slim_stats"))
print(result.get("haplosome_pool"))

Usage — Direct SLiM Bridge API

You can also use the bridge module directly without the full pipeline:

from veridna.slim_bridge import SlimConfig, run_evolution, select_survivors

# List of candidate texts and their fitness (confidence) scores
texts = [
    "DNA Pol III has 3'->5' exonuclease activity.",
    "DNA polymerase can proofread in the 5'->3' direction.",
    "The epsilon subunit of Pol III provides proofreading.",
]
fitness = [0.92, 0.45, 0.88]

# Run evolution and get survivors
result = select_survivors(texts, fitness, slim_cfg=SlimConfig(pop_size=3, generations=5))
print(result["survivor_texts"])   # texts that survived selection
print(result["slim_stats"])       # full evolution result dict

# Or call run_evolution directly for raw stats
stats = run_evolution(fitness, config=SlimConfig(pop_size=3, generations=5))
print(stats["mean_fitness"])      # mean fitness after selection
print(stats["fixation_prob"])     # fraction of initial candidates that survived
print(stats["diversity"])         # diversity analog among survivors

SlimStats Result Format

When SLiM evolution runs, the result dict returned by run_evolution() contains:

Key Type Description
success bool Whether SLiM completed successfully
survivor_tags list[int] Integer tags of surviving haplosomes
mean_fitness float Mean fitness scaling in the final generation
diversity float Pairwise tag-distance analog of nucleotide diversity (π)
fixation_prob float Fraction of initial tags still present at final generation
stats_raw str Raw SLiM stdout
tree_seq_path str or None Path to recorded .trees file (if record_tree_seq=True)
message str Human-readable status

The same data is available in the pipeline result as result["slim_stats"] (a SlimStats object dict).

The Eidos Template

The Eidos template used by the bridge is available at veridna/templates/slim_selection.slim. It parameterises:

  • Population size ($pop_size) — number of haplosomes
  • Mutation rate ($mutation_rate) — per-base mutation rate
  • Genome size ($genome_size) — length of the symbolic genome
  • Tags and fitness ($tags, $fitness) — Eidos arrays mapping individuals to VeriDNA candidates
  • Generations ($late_gen) — number of WF generations
  • Output file ($output_file) — CSV path for survivor data

The template uses SLiM's fitnessScaling property on individuals to apply VeriDNA-derived fitness values each generation. Each individual's .tag property stores the VeriDNA candidate index for mapping survivors back to text.

Mutation and Selection Details

  • Mutation rate (slim_mutation_rate): In the Eidos model, this controls how often neutral mutations (m1, selection coefficient 0.0) arise. These do not affect fitness directly but introduce genetic drift into the population, simulating the effect of random variation in response generation.
  • Selection strength (slim_selection_strength): Currently reserved for scaling VeriDNA fitness values before passing them to SLiM. The default (1.0) passes raw MutS confidence scores as fitness scaling.
  • The fitness model: Each individual's fitnessScaling is set to its VeriDNA confidence score in an early() callback every generation. Individuals with higher confidence reproduce more, while low-confidence haplosomes are gradually purged.

Tree Sequence Recording

When SlimConfig(record_tree_seq=True) is set, the bridge adds a -d define to SLiM instructing it to write a .trees file. The path is returned as tree_seq_path in the result. This file can be analysed with msprime or tskit to reconstruct the ancestry of surviving haplosomes:

# (requires tskit: pip install tskit)
import tskit
ts = tskit.load(result["tree_seq_path"])
print(ts.num_trees, "ancestral trees")

Fallback Behavior

When SLiM is not installed, use_slim_evolution=True logs a warning and falls back to top-K selection by confidence score — no crash, no hard dependency. The bridge's select_survivors() and run_evolution() both degrade gracefully, returning the input candidates (or top-K) with success=False.

Check if SLiM is Available

from veridna.slim_bridge import slim_available
print(slim_available())  # True if 'slim' binary on $PATH

Run the Example

export OPENAI_API_KEY="sk-..."
python examples/slim_evolution.py

This runs the same query through both classic VeriDNA and VeriDNA + SLiM, printing a side-by-side comparison of confidence, issues found, repairs made, and final output.


LangChain + LangGraph Integration

Each VeriDNA stage is available as a LangChain Runnable, and the full pipeline is compiled as a LangGraph StateGraph with conditional looping.

Install

pip install veridna[langchain]
# or manually: pip install langchain-core langgraph

LangChain Runnables (Individual Stages)

from veridna import VeriDNA
from veridna.langchain_integration import (
    VeriDNAGenerator, VeriDNAProofreader,
    VeriDNADetector, VeriDNARepairer,
)

vd = VeriDNA(api_key="sk-...")

generator = VeriDNAGenerator(vd)
proofreader = VeriDNAProofreader(vd)
detector = VeriDNADetector(vd)
repairer = VeriDNARepairer(vd)

draft = generator.invoke({"query": "Explain quantum computing"})
corrected = proofreader.invoke({"text": draft})
detection = detector.invoke({"text": corrected})
final = repairer.invoke({"text": corrected, "issues": detection["issues"], "query": "..."})

LangGraph StateGraph (Full Pipeline)

The graph implements the 3-stage pipeline with conditional looping — after MutS detection, the graph routes to MMR repair if issues are found, then loops back to MutS for re-verification (up to max_repair_rounds iterations).

from veridna.langchain_integration import VeriDNAGraph

graph = VeriDNAGraph(vd)
result = graph.run("Explain CRISPR-Cas9", max_repair_rounds=2)

print(result["final_output"])
print(f"Confidence: {result['confidence']:.2f}")
print(f"Repairs: {result['repair_count']}")

Graph Structure

  START
    │
    ▼
┌─────────────┐
│ Polymerase  │  (generate draft)
└──────┬──────┘
       │
       ▼
┌─────────────┐
│ Exonuclease │  (iterative proofread)
└──────┬──────┘
       │
       ▼
┌─────────────┐
│ MutS        │  (detect mismatches)
└──────┬──────┘
       │
   ┌───┴───┐
   │       │
  issues  clean
   │       │
   ▼       ▼
┌────────┐  END
│ MMR    │
│ Repair │
└───┬────┘
    │
    └──→ back to MutS (loop max_repair_rounds times)

See examples/langgraph_usage.py for a complete runnable example.


Project Structure

VeriDNA/
├── README.md
├── LICENSE
├── requirements.txt
├── setup.py
├── .gitignore
├── images/
│   ├── chart_scores.png           # Benchmark: quality scores
│   ├── chart_hallucinations.png   # Benchmark: hallucination counts
│   └── chart_radar.png            # Benchmark: radar comparison
├── veridna/
│   ├── __init__.py
│   ├── pipeline.py            # Core VeriDNA pipeline
│   ├── prompts.py             # All system prompts
│   ├── models.py              # Pydantic models
│   ├── config.py              # Configuration dataclass
│   ├── utils.py               # Utilities (confidence, parsing, timer)
│   └── langchain_integration.py  # LangChain Runnables + LangGraph graph
├── examples/
│   ├── basic_usage.py
│   ├── advanced_with_rag.py
│   ├── benchmark_experiment.py   # Experiment data model
│   ├── generate_chart.py         # Chart generation
│   └── langgraph_usage.py        # LangChain/LangGraph example
├── skill/
│   └── veridna-harness-skill.md   # Reusable prompts for any harness
└── tests/
    └── test_pipeline.py

Error Rate Reduction (Conceptual)

Stage DNA Approx. Error Rate VeriDNA Analog Expected LLM Effect
Initial generation 1 in 10⁴ (10⁻⁴) Baseline LLM Raw hallucination rate (varies by model)
+ Proofreading 1 in 10⁶ (10⁻⁶) Exonuclease proofreader ~10–100× reduction in local errors
+ Full MMR 1 in 10⁹ (10⁻⁹) MutS detector + MMR repair ~20–400× further reduction
Total 1 in 10⁹ VeriDNA full pipeline Near-deterministic with grounding

Note: These are conceptual approximations. Real LLM error rates depend on model capability, task difficulty, RAG quality, and prompt design. The layered approach consistently outperforms single-stage generation.


Empirical Benchmark: VeriDNA vs Baseline

We tested the VeriDNA framework against a baseline (direct answer, no pipeline) across 6 hallucination-prone queries designed to trigger common LLM failure modes: numerical imprecision, fabricated citations, misleading textbook values, invented specifics, scheme/library confusion, and wrong hybridization chemistry.

Methodology

Each query was processed through:

  1. Baseline — Direct answer (analogous to Polymerase-only)
  2. VeriDNA — Full 3-stage pipeline (Polymerase → Exonuclease → MutS Detector ± MMR Repair)

Both outputs were scored on four 10-point dimensions plus raw hallucination count.

Results

Query Category Baseline Factual VeriDNA Factual Baseline Hal. VeriDNA Hal.
Intel 4004 transistor count Numerical precision 7.0 (≈2,300) 10.0 (2,250 exact) 1 0
Shannon's 1948 papers Fabricated citations 5.0 (vague + implied) 10.0 (exact + honest) 3 0
ATP hydrolysis ΔG Misleading standard value 6.0 (−30.5 only) 10.0 (both values) 1 0
Byzantine tax rates Invented specifics 3.0 (fabricated %) 9.0 (honest + detailed) 2 0
Homomorphic encryption Scheme/library confusion 6.0 (library→scheme) 10.0 (schemes correct) 1 0
XeF₄ bond angle/hybridization Wrong chemistry 3.0 (sp³/109.5°) 10.0 (sp³d²/90°) 1 0
Average 5.00 9.83 1.50 0.00

Charts

VeriDNA vs Baseline: Average Quality Scores

Horizontal bar chart showing average scores across 4 dimensions. VeriDNA outperforms baseline in every dimension, with the largest gains in proper hedging (+5.83) and citation quality (+5.50).

VeriDNA vs Baseline: Hallucination Count per Query

Hallucination/fabrication count per query. Baseline produced 1–3 fabricated claims per query (avg 1.5). VeriDNA's exonuclease proofreading and MutS detection caught every one, resulting in zero hallucinated claims across all 6 queries.

Multi-Dimension Radar Comparison

Radar chart of average scores across factual accuracy, proper hedging, citation quality, and completeness. VeriDNA (blue) shows a substantially larger area, reflecting consistent improvement across all quality dimensions.

Key Findings

  • 97% average factual accuracy with VeriDNA vs 50% baseline
  • 100% hallucination elimination on these test queries (baseline: 1.5/query)
  • Largest gains in proper hedging and citation quality — the exonuclease proofreader catches vague claims and the MutS detector flags unsupported specifics
  • The exonuclease stage alone corrected 3 of 6 queries; full MMR was needed for the remaining 3 (fabricated citations, invented tax rates, library/scheme confusion)

Reproduce

python examples/generate_chart.py   # Generate charts from experiment data
python examples/benchmark_experiment.py  # Run the experiment framework

License

MIT — use, modify, share. See LICENSE.


References

  1. Kunkel, T. A. (2004). DNA replication fidelity. Journal of Biological Chemistry, 279(17), 16895–16898.
  2. Modrich, P. (2006). Mechanisms in eukaryotic mismatch repair. Journal of Biological Chemistry, 281(41), 30305–30309.
  3. Iyer, R. R., et al. (2006). DNA mismatch repair: functions and mechanisms. Chemical Reviews, 106(2), 302–323.
  4. Kornberg, A., & Baker, T. A. (1992). DNA Replication (2nd ed.). W.H. Freeman.
  5. Alberts, B., et al. (2014). Molecular Biology of the Cell (6th ed.). Garland Science.

Built for the dev masses. Educational science lesson + immediately usable code + extensible skill set.

Star it. Fork it. Improve the repair logic. Add your own verifiers.

Let's push LLM veracity forward — one enzymatic layer at a time.

About

DNA-Inspired LLM Veracity & Fidelity Framework — three-stage error correction (Polymerase, Exonuclease, MMR) modeled after DNA replication

Topics

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages