AI-курация и обновление базы знаний
Мы часто видим, как база знаний, которую не поддерживают, хуже отсутствия базы знаний. Она создаёт иллюзию порядка, но на деле полна устаревших инструкций, дублирующих статей и мёртвых ссылок. Ручная курация при объёме 500+ статей нереалистична: у редактора просто нет времени систематически проверять каждую.
Наша AI-система курирования не заменяет экспертов, но автоматически выявляет проблемы, расставляет приоритеты для ревью и предлагает конкретные правки — редактор работает с готовым ревью-листом, а не с голым контентом. За 5 лет работы мы обработали базы знаний от 200 до 10 000 статей и гарантируем улучшение метрик свежести и покрытия.
Как AI выявляет устаревший контент?
Система анализирует каждую статью по нескольким параметрам. Во-первых, проверяется дата последнего обновления и сопоставляется с тематикой: статьи о версиях ПО теряют актуальность быстрее, чем концептуальные материалы. Во-вторых, LLM оценивает содержимое на предмет упоминания устаревших версий, названий продуктов или команд. Например, если в статье упоминается v1.2 а текущая версия v3.0 — ставится флаг. В-третьих, проверяются внутренние ссылки: битые ссылки отправляются в список на исправление. Для эмбеддингов мы используем SentenceTransformer, а для оркестрации LLM — LangChain.
Пять типов проблем, которые выявляет AI
- Устаревший контент — версии ПО, названия команд, ссылки на несуществующие процессы.
- Дублирование — семантически похожие статьи по разным URL.
- Пробелы — вопросы, которые пользователи часто задают, но статьи нет.
- Низкое качество — статьи без acceptance criteria, без примеров, с расплывчатыми формулировками.
- Нарушенные связи — внутренние ссылки ведут на несуществующие страницы.
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]:
"""Находит семантически дублирующие статьи"""
texts = [f"{a['title']} {a['body'][:500]}" for a in articles]
embeddings = self.embedder.encode(texts, batch_size=32, show_progress_bar=True)
# Попарное сравнение — только верхний треугольник матрицы
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:
"""Оценивает устаревание статьи через LLM"""
last_updated = datetime.fromisoformat(article["last_updated"])
age_days = (datetime.now() - last_updated).days
prompt = f"""Оцени свежесть технической статьи.
Заголовок: {article['title']}
Содержимое (первые 1000 символов):
{article['body'][:1000]}
Последнее обновление: {age_days} дней назад
Проверь:
1. Упоминаются ли конкретные версии ПО/инструментов? Актуальны ли они?
2. Есть ли устаревшие термины (например, название старой команды или продукта)?
3. Ссылки выглядят актуально?
4. Общая оценка актуальности: актуально/требует_проверки/устарело
Верни 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]:
"""Находит вопросы, на которые нет статей"""
# Индексируем существующие статьи
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: # нет достаточно похожей статьи
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"])
Автоматическое предложение правок
После выявления проблем — генерация конкретных улучшений:
async def suggest_improvements(self, article: dict) -> dict:
prompt = f"""Проверь статью базы знаний и предложи конкретные улучшения.
Статья: {article['title']}
Текст:
{article['body'][:2000]}
Оцени и предложи правки по каждому критерию:
1. Ясность — понятна ли статья новому сотруднику?
2. Полнота — есть ли примеры, конкретные шаги?
3. Структура — нужны ли заголовки, списки?
4. Актуальность — нет ли устаревших деталей?
Для каждой проблемы: цитата из оригинала → предлагаемая правка.
Верни JSON: {{score: 0-10, issues: [{{location, problem, suggestion}}]}}"""
result = await self.llm.ainvoke(prompt)
return {"article_id": article["id"], **eval(result.content)}
Дашборд состояния базы знаний
| Метрика | Как считается | Целевое значение |
|---|---|---|
| Coverage Rate | % вопросов из саппорта с ответом в KB | > 70% |
| Freshness Score | % статей обновлённых < 6 мес назад | > 80% |
| Duplication Rate | % дублирующих пар / всего статей | < 5% |
| Quality Score | Средний AI-балл качества по всем статьям | > 7.5/10 |
| Broken Links Rate | % статей с нерабочими ссылками | < 2% |
Пример дашборда после аудита
Статистика по базе из 800 статей:
- Дубли: 67 пар
- Устаревшие: 124 статьи (>18 мес)
- Пробелы: 89 вопросов без статей
- Средний Quality Score: 6.2/10
Почему автоматическое курирование эффективнее ручного?
Сравним: редактор-человек тратит в среднем 15–20 минут на проверку одной статьи. Для базы из 800 статей это 200–270 часов непрерывной работы — без учёта времени на исправления. AI-система обрабатывает тот же объём за 2–3 часа анализа и выдаёт приоритезированный список проблем. Редактору остаётся только утвердить или отклонить предложенные правки. Таким образом, AI сокращает время курации в 15–20 раз, сохраняя качество.
| Параметр | Ручная курация | AI-курация |
|---|---|---|
| Время на 500 статей | 125–175 часов | 2–3 часа анализа |
| Полнота охвата | Зависит от усталости редактора | 100% статей |
| Объективность | Субъективно | Стандартизированные критерии |
| Обновляемость | Раз в квартал | Еженедельно |
Что входит в работу
- Аудит текущей базы знаний: полный анализ статей, выявление дублей, устаревшего контента, пробелов.
- Настройка AI-пайплайна: интеграция с Confluence, Notion, GitBook или API; выбор модели, настройка порогов сходства.
- Дашборд с метриками: визуализация Freshness Score, Coverage Rate, Duplication Rate, Quality Score.
- Автоматические рекомендации: LLM генерирует конкретные правки для каждой проблемной статьи.
- Обучение команды: семинар по работе с системой, передача документации.
- Гарантия поддержки: 3 месяца сопровождения после внедрения.
По нашим данным, после внедрения AI-курации компании сокращают время на поддержку базы знаний на 60–80%.
Процесс работы
- Аналитика: сбор и структурирование текущих статей, выгрузка логов поиска и запросов в саппорт.
- Проектирование: выбор архитектуры (RAG, fine-tuning или zero-shot), подбор модели и эмбеддера.
- Реализация: разработка пайплайна аудита, интеграция с хранилищем, настройка дашборда.
- Тестирование: прогон на тестовой выборке, сверка с экспертной оценкой, калибровка порогов.
- Деплой: запуск в продуктив, передача команде, обучение.
Сроки и стоимость
Сроки зависят от объёма базы и сложности интеграции. Аудит и выявление проблем занимают от 1 до 2 недель. Система автоматических рекомендаций и дашборд — ещё 3–4 недели. Стоимость рассчитывается индивидуально после оценки вашей базы знаний и текущих процессов. Мы гарантируем прозрачное ценообразование и фиксацию стоимости на этапе договора.
Оценим ваш проект бесплатно. Свяжитесь с нами, чтобы получить предварительный анализ и дашборд метрик вашей базы знаний.







