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 недели. Стоимость рассчитывается индивидуально после оценки вашей базы знаний и текущих процессов. Мы гарантируем прозрачное ценообразование и фиксацию стоимости на этапе договора.
Оценим ваш проект бесплатно. Свяжитесь с нами, чтобы получить предварительный анализ и дашборд метрик вашей базы знаний.







