AI-платформа вики (AI-powered Wiki)
Вики работает, пока её поддерживают. Перестают поддерживать почти всегда — через 6–12 месяцев после запуска. AI-powered Wiki меняет механику: система сама поддерживает актуальность, предлагает контент при создании новых страниц, автоматически связывает статьи и отвечает на вопросы напрямую, не требуя навигации по структуре.
Основные AI-функции платформы
Автогенерация черновиков — при создании новой страницы AI создаёт структурированный черновик на основе заголовка и контекста соседних статей.
Умный поиск — semantic search вместо keyword, с ответом на естественный вопрос.
Автосвязывание — при сохранении статьи система находит семантически связанные страницы и предлагает добавить ссылки.
Детектор устаревания — мониторит изменения в репозиториях и системах, оповещает владельцев статей о потенциальном устаревании.
AI-ассистент — чат-интерфейс для вопросов по базе знаний прямо в боковой панели.
Архитектура: стек для self-hosted вики
# Бэкенд: FastAPI + LlamaIndex + Qdrant + PostgreSQL
# Фронтенд: React + Tiptap (rich text editor)
from llama_index.core import VectorStoreIndex, Document
from llama_index.core.query_engine import RetrieverQueryEngine
from llama_index.embeddings.huggingface import HuggingFaceEmbedding
from llama_index.llms.openai import OpenAI
from sqlalchemy import create_engine
from sqlalchemy.orm import Session
class WikiPlatform:
def __init__(self, db_engine, qdrant_client, openai_key: str):
self.db = db_engine
self.embed_model = HuggingFaceEmbedding(
model_name="intfloat/multilingual-e5-large"
)
self.llm = OpenAI(model="gpt-4o-mini", api_key=openai_key)
self.index = self._build_index(qdrant_client)
def draft_new_page(self, title: str, space_context: list[str]) -> str:
"""Генерирует черновик новой страницы"""
context_summary = "\n".join([f"- {c}" for c in space_context[:5]])
prompt = f"""Создай структурированный черновик вики-статьи.
Заголовок: {title}
Контекст (соседние статьи в разделе):
{context_summary}
Создай черновик в Markdown:
- Краткое введение (2–3 предложения)
- Разделы с заголовками H2/H3
- Placeholder'ы [TODO: заполни X] для разделов, которые требуют экспертных знаний
- Список связанных тем для See Also
Создай структуру, не заполняй технические детали — это задача автора."""
return self.llm.complete(prompt).text
def find_related_pages(self, page_content: str, all_pages: list[dict]) -> list[dict]:
"""Находит семантически связанные статьи"""
page_emb = self.embed_model.get_text_embedding(page_content[:1000])
scored = []
for p in all_pages:
p_emb = self.embed_model.get_text_embedding(p["title"] + " " + p["summary"])
from numpy import dot
from numpy.linalg import norm
score = dot(page_emb, p_emb) / (norm(page_emb) * norm(p_emb))
if score > 0.72:
scored.append({"page": p, "score": float(score)})
return sorted(scored, key=lambda x: x["score"], reverse=True)[:5]
def answer_question(self, question: str) -> dict:
"""Отвечает на вопрос с цитатами источников"""
query_engine = RetrieverQueryEngine.from_args(
retriever=self.index.as_retriever(similarity_top_k=6),
llm=self.llm
)
response = query_engine.query(question)
return {
"answer": str(response),
"sources": [
{
"title": n.metadata.get("title", "Без названия"),
"url": n.metadata.get("url", ""),
"score": round(n.score or 0, 3)
}
for n in response.source_nodes
]
}
Интеграция с редактором (Tiptap + AI)
// AI-ассистент в редакторе вики
import { Extension } from "@tiptap/core";
const AIAssistExtension = Extension.create({
name: "aiAssist",
addKeyboardShortcuts() {
return {
"Ctrl-Space": () => {
const { selection, doc } = this.editor.state;
const currentText = doc.textBetween(
Math.max(0, selection.from - 200),
selection.from
);
this.triggerCompletion(currentText);
return true;
},
};
},
async triggerCompletion(context: string) {
const response = await fetch("/api/wiki/autocomplete", {
method: "POST",
body: JSON.stringify({ context, page_title: this.options.pageTitle }),
});
const { suggestion } = await response.json();
this.editor.commands.insertContent(suggestion);
},
});
Автоматический мониторинг актуальности
import asyncio
from github import Github
class StalenessMonitor:
"""Следит за изменениями в системах и оповещает владельцев статей"""
async def check_code_changes(self, article: dict, github_token: str):
"""Проверяет, изменился ли код, на который ссылается статья"""
g = Github(github_token)
code_refs = self._extract_code_references(article["content"])
for ref in code_refs:
# ref = {"repo": "company/api", "path": "src/auth/oauth.py"}
try:
repo = g.get_repo(ref["repo"])
commits = repo.get_commits(path=ref["path"], since=article["last_updated_at"])
if commits.totalCount > 0:
await self._notify_owner(article, ref, commits[0])
except Exception:
pass
async def _notify_owner(self, article: dict, changed_ref: dict, commit):
notification = {
"article_id": article["id"],
"owner": article["owner_email"],
"message": f"Файл {changed_ref['path']} изменился после последнего обновления статьи",
"commit_url": commit.html_url,
"action": "review_required"
}
await self.notification_service.send(notification)
Кейс: технологическая компания, 150 разработчиков. Confluence с 600 страницами, половина которых не обновлялась > года. После развёртывания AI-вики: количество вопросов в Slack-каналах #dev-help снизилось на 31% за первые 2 месяца, а время онбординга нового разработчика (по оценке менеджеров) сократилось с 3 недель до 1.5 недель.
Сроки
- Базовая AI-вики (поиск + автосвязывание): 4–6 недель
- С генерацией черновиков и встроенным ассистентом: 8–10 недель
- Self-hosted деплой с интеграцией GitHub/GitLab: +2–3 недели







