Deduplication & Conflict Resolution

Agentic AI Systems advanced Building with AI 11 min read

Overview

As AI agents accumulate memories across hundreds or thousands of interactions, two critical problems emerge: duplication (storing the same fact multiple times in slightly different phrasings) and contradiction (storing conflicting facts about the same entity or topic). Left unaddressed, these problems degrade agent performance in measurable ways — duplicate memories waste storage and retrieval bandwidth, while contradictory memories cause the agent to produce inconsistent or hallucinated responses.

Consider an agent that has stored “User works at Acme Corp as a senior engineer” from one conversation and “User is a staff engineer at Acme” from another. These are near-duplicates that also contain a conflict (senior vs. staff). Without deduplication and conflict resolution, both entries occupy space in the memory store, both may be retrieved for relevant queries, and the agent must somehow reconcile the contradiction at inference time — burning tokens and introducing uncertainty.

Deduplication and conflict resolution form a critical subsystem within the memory distillation pipeline. They ensure that the agent’s long-term memory remains a clean, authoritative source of truth rather than an ever-growing pile of redundant and contradictory fragments. For AI engineers, getting this right is the difference between an agent whose memory is an asset and one whose memory is a liability.

How It Works

Detecting Duplicates

Duplicate detection in agent memory is more nuanced than simple string matching. Two memories can be duplicates even with completely different wording if they convey the same semantic content. The detection system must operate at multiple levels:

Exact Deduplication

The simplest and cheapest check. Compute a hash (SHA-256) of the normalized memory content and check it against an idempotency index. This catches identical or near-identical text but misses semantic duplicates. Used as a fast first pass before more expensive checks.

Semantic Deduplication

Embed the candidate memory and compute cosine similarity against existing memories in the vector store. Memories with similarity above a threshold (typically 0.90-0.95) are flagged as potential duplicates. This catches paraphrases and reformulations but requires tuning the threshold — too low produces false positives (merging distinct facts), too high misses real duplicates.

Entity-Aware Deduplication

Extract named entities from both the candidate and existing memories. If two memories reference the same entities and have high semantic similarity, they are almost certainly duplicates. This adds precision by grounding the comparison in concrete entities rather than relying solely on embedding similarity, which can be fooled by superficially similar but factually distinct statements.

# Multi-level deduplication pipeline
class DeduplicationPipeline:
    def __init__(self, memory_store, similarity_threshold=0.92):
        self.store = memory_store
        self.threshold = similarity_threshold
        self.hash_index = {}  # SHA-256 → memory_id

    def check_duplicate(self, candidate):
        # Level 1: Exact hash match
        content_hash = sha256(normalize(candidate.content))
        if content_hash in self.hash_index:
            return DuplicateResult(
                type="exact",
                existing_id=self.hash_index[content_hash],
                confidence=1.0
            )

        # Level 2: Semantic similarity
        embedding = embed(candidate.content)
        similar = self.store.vector_search(
            embedding, top_k=5, threshold=self.threshold
        )

        if similar:
            best_match = similar[0]

            # Level 3: Entity-aware verification
            candidate_entities = extract_entities(candidate.content)
            match_entities = extract_entities(best_match.content)
            entity_overlap = jaccard(candidate_entities, match_entities)

            if entity_overlap > 0.5 and best_match.score > self.threshold:
                return DuplicateResult(
                    type="semantic",
                    existing_id=best_match.id,
                    confidence=best_match.score,
                    entity_overlap=entity_overlap
                )

        return DuplicateResult(type="none", confidence=0.0)

Conflict Detection

Conflicts are harder to detect than duplicates because they require understanding the logical relationship between statements. Two memories about the same entity with different attribute values represent a conflict. The detection process involves:

  1. Entity extraction: Identify the subject entities in both memories
  2. Attribute extraction: Parse the properties or claims being made about those entities
  3. Comparison: Check whether the same attribute has different values across memories
  4. Classification: Determine if the difference is a genuine contradiction, a temporal update, or complementary information
# Conflict detection using LLM analysis
CONFLICT_DETECTION_PROMPT = """
Compare these two memory entries and classify their relationship:

Memory A (stored {date_a}): {memory_a}
Memory B (new, {date_b}): {memory_b}

Classify as one of:
- DUPLICATE: Same information, different wording
- UPDATE: B is newer version of same fact (e.g., role change)
- CONTRADICTION: Genuinely conflicting claims
- COMPLEMENTARY: Different facts about same topic, both valid
- UNRELATED: Not about the same topic

If UPDATE or CONTRADICTION, specify:
- Which attribute differs
- Which version is likely more current
- Confidence (0.0-1.0) in your classification

Output as JSON.
"""

Conflict Resolution Strategies

Once a conflict is detected, the system must decide how to resolve it. There is no universally correct strategy — the right approach depends on the application domain, the nature of the conflict, and the available metadata. Here are the primary strategies used in production systems:

1. Recency-Based Resolution

The simplest and most common strategy: the newer information wins. This works well for facts that change over time (job titles, addresses, preferences) but can be dangerous if the newer source is less reliable. Every memory entry needs a reliable timestamp for this to work.

# Recency-based resolution
def resolve_by_recency(existing, candidate):
    if candidate.timestamp > existing.timestamp:
        existing.content = candidate.content
        existing.timestamp = candidate.timestamp
        existing.metadata["previous_value"] = existing.content
        existing.metadata["update_reason"] = "recency"
        return existing
    else:
        return existing  # Keep older if candidate isn't newer

2. Confidence-Weighted Resolution

Each memory carries a confidence score based on how explicitly it was stated, how reliable the source was, and how many times it has been confirmed. When conflicts arise, the higher-confidence memory wins. This is more sophisticated than pure recency but requires a well-calibrated confidence model.

Confidence Scoring Factors

Confidence is typically computed from multiple signals: explicitness (the user directly stated it vs. it was inferred), frequency (mentioned once vs. confirmed across multiple conversations), source authority (from the user themselves vs. from a third-party document), and recency (recent statements may be more accurate for mutable facts). A weighted combination of these factors produces the final confidence score.

3. Source-Authority Resolution

In multi-agent systems, different agents may write conflicting memories. A simple last-writer-wins policy is dangerous if a less capable agent overwrites a better assessment. Source-authority resolution assigns trust levels to different memory sources:

4. LLM-Arbitrated Resolution

For complex conflicts that simple heuristics cannot resolve, an LLM can serve as an arbitrator. The conflicting memories, their metadata (timestamps, sources, confidence), and surrounding context are presented to the model, which makes a judgment call about which version to keep or how to merge them:

RESOLUTION_PROMPT = """
Two memories about the same topic conflict:

Memory A: "{memory_a}"
  - Stored: {date_a}
  - Source: {source_a}
  - Confidence: {conf_a}
  - Confirmed {times_a} time(s)

Memory B: "{memory_b}"
  - Stored: {date_b}
  - Source: {source_b}
  - Confidence: {conf_b}
  - Confirmed {times_b} time(s)

Produce a single resolved memory that:
1. Preserves the most accurate/current information
2. Notes the uncertainty if the conflict can't be fully resolved
3. Retains specific details from both where they complement

Output the resolved memory text and your reasoning.
"""

5. Voting and Quorum (Multi-Agent)

In multi-agent systems, conflicts can be resolved through voting. If three out of five agents agree on a fact, the majority position becomes authoritative. More sophisticated variants use weighted voting where each agent’s vote is scaled by its expertise in the relevant domain. An orchestrator agent may also serve as a tiebreaker with elevated authority.

Handling Edge Cases

Real-world systems encounter several tricky edge cases that naive implementations miss:

Practical Applications

Customer Relationship Management

AI agents managing customer relationships must maintain accurate profiles despite receiving information from multiple channels — conversations, emails, CRM updates, and support tickets. Deduplication prevents the profile from bloating with redundant entries (“customer prefers email contact” stored 15 times), while conflict resolution ensures that when a customer’s role changes from “VP of Engineering” to “CTO,” the profile is updated cleanly rather than storing contradictory titles.

In high-stakes domains, contradictory memories can have serious consequences. A medical AI that stores both “patient is allergic to penicillin” and “penicillin prescribed for infection” has a dangerous conflict that must be resolved immediately, not left for the model to sort out at inference time. These systems implement aggressive conflict detection with human-in-the-loop resolution for high-severity contradictions.

Knowledge Base Maintenance

Organizations using AI agents to maintain internal knowledge bases face constant deduplication challenges. Multiple employees describe the same process differently, policies get updated but old versions persist, and acronyms get defined inconsistently. Automated deduplication and conflict resolution keep the knowledge base clean and authoritative, reducing the manual curation burden that typically falls on knowledge management teams.

Collaborative Multi-Agent Research

When multiple research agents independently investigate a topic, their findings inevitably overlap and occasionally conflict. A deduplication layer merges redundant findings (three agents all discover the same key paper), while conflict resolution handles cases where agents reach different conclusions from the same evidence. The result is a consolidated research brief that represents the strongest synthesis of all agents’ work.

Key Takeaways

Further Reading