AI-Powered Knowledge Base Curation and Updates
We often see that a neglected knowledge base is worse than no knowledge base at all. It creates an illusion of order but is actually full of outdated instructions, duplicate articles, and dead links. Manual curation of 500+ articles is unrealistic — the editor simply lacks time to check each one systematically.
Our AI curation system doesn't replace experts, but it automatically detects issues, prioritizes reviews, and suggests specific edits — the editor works with a ready-made review list, not raw content. Over 5 years of work, we've processed knowledge bases ranging from 200 to 10,000 articles and guarantee improved freshness and coverage metrics.
How AI Detects Outdated Content
The system analyzes each article across several parameters. First, it checks the last update date and compares it with the topic: software version articles become outdated faster than conceptual materials. Second, LLM evaluates the content for references to obsolete versions, product names, or team names. For example, if an article mentions v1.2 and the current version is v3.0, a flag is raised. Third, it checks internal links: broken links are sent to a list for correction. For embeddings, we use SentenceTransformer, and for LLM orchestration, LangChain.
Five Types of Problems AI Detects
- Outdated content — software versions, team names, links to non-existent processes.
- Duplication — semantically similar articles under different URLs.
- Gaps — questions users frequently ask but no article exists.
- Low quality — articles without acceptance criteria, examples, or with vague wording.
- Broken relationships — internal links lead to non-existent pages.
from langchain_openai import ChatOpenAI
from sentence_transformers import SentenceTransformer
from sklearn.metrics.pairwise import cosine_similarity
import numpy as np
from datetime import datetime, timedelta
class KnowledgeBaseAuditor:
def __init__(self, confluence_client, llm: ChatOpenAI, embedder: SentenceTransformer):
self.confluence = confluence_client
self.llm = llm
self.embedder = embedder
def find_duplicates(self, articles: list[dict], threshold: float = 0.88) -> list[tuple]:
"""Finds semantically duplicate articles"""
texts = [f"{a['title']} {a['body'][:500]}" for a in articles]
embeddings = self.embedder.encode(texts, batch_size=32, show_progress_bar=True)
# Pairwise comparison — only upper triangle of the matrix
sim_matrix = cosine_similarity(embeddings)
np.fill_diagonal(sim_matrix, 0)
duplicates = []
for i in range(len(articles)):
for j in range(i + 1, len(articles)):
if sim_matrix[i][j] >= threshold:
duplicates.append((
articles[i]["id"], articles[i]["title"],
articles[j]["id"], articles[j]["title"],
round(float(sim_matrix[i][j]), 3)
))
return sorted(duplicates, key=lambda x: x[4], reverse=True)
async def check_staleness(self, article: dict) -> dict:
"""Evaluates article staleness via LLM"""
last_updated = datetime.fromisoformat(article["last_updated"])
age_days = (datetime.now() - last_updated).days
prompt = f"""Evaluate the freshness of a technical article.
Title: {article['title']}
Content (first 1000 characters):
{article['body'][:1000]}
Last updated: {age_days} days ago
Check:
1. Are specific software/tool versions mentioned? Are they current?
2. Are there obsolete terms (e.g., old team or product names)?
3. Do links seem current?
4. Overall assessment: current/needs_review/outdated
Return JSON: {staleness_level, reasons: [], suggested_action}"""
result = await self.llm.ainvoke(prompt)
return {"article_id": article["id"], **eval(result.content)}
def find_content_gaps(
self,
support_queries: list[str],
articles: list[dict]
) -> list[dict]:
"""Finds questions without corresponding articles"""
# Index existing articles
article_embs = self.embedder.encode(
[a["title"] + " " + a["body"][:200] for a in articles]
)
gaps = []
for query in support_queries:
query_emb = self.embedder.encode([query])
similarities = cosine_similarity(query_emb, article_embs)[0]
max_sim = np.max(similarities)
if max_sim < 0.65: # no sufficiently similar article
gaps.append({
"query": query,
"best_match_score": round(float(max_sim), 3),
"best_match_article": articles[np.argmax(similarities)]["title"]
})
return sorted(gaps, key=lambda x: x["best_match_score"])
Automatic Improvement Suggestions
After problem detection, we generate specific enhancements:
async def suggest_improvements(self, article: dict) -> dict:
prompt = f"""Review the knowledge base article and suggest concrete improvements.
Article: {article['title']}
Text:
{article['body'][:2000]}
Evaluate and suggest edits for each criterion:
1. Clarity — is the article understandable for a new employee?
2. Completeness — are there examples, specific steps?
3. Structure — are headings, lists needed?
4. Currency — no outdated details?
For each issue: original quote → suggested fix.
Return JSON: {score: 0-10, issues: [{location, problem, suggestion}]}"""
result = await self.llm.ainvoke(prompt)
return {"article_id": article["id"], **eval(result.content)}
Knowledge Base Health Dashboard
| Metric | How It's Calculated | Target Value |
|---|---|---|
| Coverage Rate | % of support questions with an answer in KB | > 70% |
| Freshness Score | % of articles updated < 6 months ago | > 80% |
| Duplication Rate | % of duplicate pairs / total articles | < 5% |
| Quality Score | Average AI quality score across all articles | > 7.5/10 |
| Broken Links Rate | % of articles with non-working links | < 2% |
Example dashboard after audit
Statistics for an 800-article base:
- Duplicates: 67 pairs
- Outdated: 124 articles (>18 months)
- Gaps: 89 questions without articles
- Average Quality Score: 6.2/10
Why Automated Curation Is More Effective Than Manual
Comparison: a human editor spends on average 15–20 minutes checking one article. For an 800-article base, that's 200–270 hours of continuous work — not counting time for fixes. An AI system processes the same volume in 2–3 hours of analysis and outputs a prioritized list of issues. The editor only needs to approve or reject the suggested edits. Thus, AI reduces curation time by 15–20 times while maintaining quality.
| Parameter | Manual Curation | AI Curation |
|---|---|---|
| Time for 500 articles | 125–175 hours | 2–3 hours analysis |
| Coverage completeness | Depends on editor fatigue | 100% of articles |
| Objectivity | Subjective | Standardized criteria |
| Update frequency | Quarterly | Weekly |
What's Included
- Audit of the current knowledge base: full analysis of articles, detection of duplicates, outdated content, gaps.
- Setting up the AI pipeline: integration with Confluence, Notion, GitBook, or API; model selection, similarity threshold tuning.
- Dashboard with metrics: visualization of Freshness Score, Coverage Rate, Duplication Rate, Quality Score.
- Automatic recommendations: LLM generates specific edits for each problematic article.
- Team training: workshop on using the system, handover of documentation.
- Support guarantee: 3 months of post-implementation support.
Based on our data, after AI curation implementation, companies reduce knowledge base maintenance time by 60–80%.
Process
- Analytics: collect and structure existing articles, export search logs and support queries.
- Design: choose architecture (RAG, fine-tuning, or zero-shot), select model and embedder.
- Implementation: develop audit pipeline, integrate with storage, set up dashboard.
- Testing: run on test sample, cross-check with expert evaluation, calibrate thresholds.
- Deployment: launch in production, hand over to team, training.
Timeline and Cost
Timelines depend on the base volume and integration complexity. Audit and problem detection take 1 to 2 weeks. The automatic recommendation system and dashboard take another 3–4 weeks. Cost is calculated individually after assessing your knowledge base and current processes. We guarantee transparent pricing and cost lock-in at the contract stage.
Get a free project assessment. Contact us for a preliminary analysis and metrics dashboard of your knowledge base.







