BXUP Track progress & test yourself — free
IT Support / Service Desk / Sysadmin · Playbook · Core · ~4 min read
IT SUPPORT / SERVICE DESK / SYSADMIN · PLAYBOOK · CORE

Audit KB Health: Find Stale, Duplicate and Contradictory Articles

A knowledge base rots in three ways: articles go stale as the estate changes, near-duplicates split search traffic, and two articles quietly give opposite instructions. AI makes all three findable at scale — and reopen-rate data tells you which broken articles are actively hurting users right now.

Tier: Core · Workflow area: Knowledge management · ~35 minutes

This playbook runs a periodic health audit over a full KB export: embeddings to surface duplicates, an LLM pass to spot contradictions and staleness signals, and a join against ticket reopen data to rank which fixes-that-don't-fix deserve attention first.

When to use

  • Quarterly KB hygieneany KB past a few hundred articles that has never had a systematic duplicate/contradiction sweep.
  • Before deploying a RAG chatbota bot retrieving from a contradictory KB will alternate between the right answer and the wrong one; audit first, deploy second (this is the pb-38 prerequisite).
  • After a platform migration or major estate changeWindows 11 rollout, new VPN, tenant migration: a wave of articles just went stale simultaneously.

When NOT to use

  • As a substitute for owners. An audit that produces a spreadsheet nobody is assigned to fix is a mood, not a process. Run it only with named owners for the follow-up.
  • On a KB younger than the factoryif you just started pb-15, there is not enough corpus to audit; give it a quarter.
  • To bulk auto-fix. The audit finds candidates; humans retire, merge and correct. Auto-deleting "duplicates" the model paired wrongly destroys good articles.

The recipe

  1. Export the KB. Full text plus metadata: article ID, title, body, created/updated dates, view count, and linked-ticket IDs if your platform tracks them. CSV or JSON, one row per article.

  2. Find duplicate clusters with embeddings. Locally, so nothing leaves your machine:

    from sentence_transformers import SentenceTransformer, util
    import csv
    
    model = SentenceTransformer("all-MiniLM-L6-v2")
    rows = list(csv.DictReader(open("kb-export.csv")))
    texts = [r["title"] + "\n" + r["body"][:2000] for r in rows]
    emb = model.encode(texts, convert_to_tensor=True)
    pairs = util.paraphrase_mining_embeddings(emb, top_k=5)
    for score, i, j in pairs:
        if score > 0.80:
            print(f"{score:.2f} | {rows[i]['id']} {rows[i]['title']}"
                  f"  <->  {rows[j]['id']} {rows[j]['title']}")
    

    Pairs above ~0.80 are merge candidates; above ~0.92 they are usually true duplicates. Tune against a handful you inspect by hand.

  3. Run the contradiction pass on each cluster. For every candidate pair or cluster, one prompt:

    These KB articles cover the same or overlapping topics. Compare them.
    Report:
    1. Same issue or genuinely different? (one line)
    2. Contradictions: any step, setting, path or value where they
       disagree — quote both versions exactly.
    3. Which is more current/complete, judging only from the text and
       updated dates given.
    4. Recommendation: merge / retire one (which) / keep both (why).
    
    Article A ([id], updated [date]): [body]
    Article B ([id], updated [date]): [body]
    

    Sample output worth acting on:

    2. CONTRADICTION: A says "set MaxTokenSize to 48000"; B says
       "65535". A step 4 disables the health service; B step 2 says the
       health service must stay running.
    4. Retire A (updated 2023-02, pre-migration values); fold its
       screenshots section into B.
    
  4. Sweep for staleness signals. Batch articles (10–20 per prompt) and ask the model to flag: references to retired products or versions you name ("Windows 10, Skype for Business, the old VPN"), dead-looking URLs, dates or version strings older than your threshold, and steps referencing menus that no longer exist in current builds you describe. Staleness flags are leads, not verdicts.

  5. Join reopen data — the harm ranking. From ITSM reporting, pull tickets that linked each article and their reopen/reclassification rate. An article whose linked tickets reopen at twice the baseline is a documented fix that does not work — the most damaging article class you have. Rank the fix queue: contradictions on high-traffic articles first, high-reopen articles second, stale low-traffic last.

  6. Assign and time-box the cleanup. Each flagged article gets an owner and one of four verdicts: retire, merge-into, correct, confirm-good. Record the verdict on the article; "confirm-good" resets its review date, so the next audit skips it.

  7. Rerun quarterly and trend it. Duplicate-cluster count, contradiction count, and mean article age should all fall. Publish the three numbers; a KB with falling rot metrics is the credibility foundation for every AI feature you build on it.

Make it yours

  • ServiceNow shopuse KB article quality/usage dashboards for the traffic and feedback joins, and export via the table API; flag verdicts with a custom field so the next audit filters on it.
  • Small KB, no Pythonskip embeddings: sort the export by title, paste 30 titles at a time into the LLM and ask for probable-duplicate groupings, then run step 3 on the groups. Coarser, still effective under ~300 articles.
  • RAG-bound shopadd one output to step 3: "which single article should the chatbot retrieve for this issue?" — the merged canonical article becomes the retrieval target, and the retired ones get excluded from the index (pb-38).

Quality check

  • Every retire/merge verdict is human-confirmed. The model pairs by similarity, and similar is not identical — a Windows and a macOS article for the same symptom must both live.
  • Contradiction quotes are verified in-article. Open both articles and find the quoted lines before acting; retrieval-and-quote errors happen.
  • Reopen correlation is a lead, not proof. High reopen on a linked article can mean a bad article — or a hard issue. Read the reopened tickets before condemning the article.
  • The audit leaves an artifact. Dated findings sheet, verdicts, owners — so next quarter measures progress instead of rediscovering the same rot.
Warning

A full KB export can contain embedded credentials, internal hostnames and customer references accumulated over years — run the embeddings step locally, and sanitize article bodies before sending any batch to an external assistant.

Key Takeaway:

Embeddings find the duplicates, the LLM finds the contradictions, but reopen-rate data is what turns a hygiene chore into a ranked list of articles that are actively wasting your users' time.

This is the free reading view. Open BXUP to track your progress, run the hands-on labs, and prove it with original, exam-pattern assessments.
© Anvi Innovate · BXUP — Be Exponentially Upskilled · BXUP is an independent learning platform, not affiliated with or endorsed by AWS, Microsoft, Google, NVIDIA, IBM, Salesforce, Databricks, Oracle or Anthropic. All trademarks belong to their respective owners. · bxup.in