Уявіть: у компанії 500 осіб, 23 регламенти, щомісяця оновлення. Співробітники витрачають 20 хвилин на пошук відповіді в PDF, HR відповідає на одні й ті самі запитання по 2–3 години на день. Щоденно HR-відділ витрачає до 10% робочого часу на відповіді щодо регламентів. При цьому 40% порушень трапляються через незнання актуальної версії документа. Корпоративні регламенти — трудовий розпорядок, політика безпеки, процедури погодження — сотні сторінок, які майже ніхто не читає. Результат: повторювані запитання в HR, ризик порушень і втрата часу. Ми створюємо AI-асистента регламентів та корпоративний чат-бот політики, який робить регламенти доступними через діалог. Співробітник просто запитує, асистент миттєво знаходить точну норму із зазначенням документа та версії. Це не просто пошук за ключовими словами — це повноцінний RAG-пайплайн з контролем версій та розмежуванням доступу.
Специфіка регламентного асистента
Регламентний асистент відрізняється від звичайного RAG трьома ключовими вимогами: точність цитування (норми дослівно, а не переказ), актуальність (контроль версій без помилок) та розмежування доступу за ролями. Ці вимоги впливають на архітектуру: векторний пошук, система промптів і фільтрація метаданих.
Забезпечення точності цитування
Асистент будує відповідь на основі витягнутих фрагментів документів. Використовується векторний пошук (text-embedding-3-small, Chroma). У системному промпті явно вказано: цитувати норми дослівно, не перефразовувати, завжди вказувати документ, версію та пункт. Якщо норма допускає винятки, асистент зобов'язаний їх згадати. Для LLM ми використовуємо Claude Sonnet: він добре справляється з контекстною точністю. Як зазначено в інструкції з цитування, будь-яке відхилення від букви регламенту неприпустиме.
from anthropic import Anthropic
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import Chroma
from pydantic import BaseModel
from typing import Optional
import json
client = Anthropic()
class PolicyAssistant:
def __init__(self, db_path: str = "./policy_db"):
self.vectorstore = Chroma(
collection_name="policies",
embedding_function=OpenAIEmbeddings(model="text-embedding-3-small"),
persist_directory=db_path,
)
def answer(
self,
question: str,
employee_role: str, # "employee", "manager", "hr", "admin"
department: str = "",
) -> dict:
"""Відповідає на питання за регламентами з урахуванням ролі співробітника"""
# Фільтр за доступом
access_filter = self._get_access_filter(employee_role)
results = self.vectorstore.similarity_search_with_score(
question, k=5, filter=access_filter
)
if not results:
return {
"answer": "Інформація за вашим питанням не знайдена в чинних регламентах. Зверніться до HR-відділу.",
"sources": [],
"escalation_needed": True,
}
context = "\n\n".join([
f"[{doc.metadata.get('document_name')}, версія {doc.metadata.get('version')}, "
f"набрав чинності {doc.metadata.get('effective_date')}]:\n{doc.page_content}"
for doc, _ in results[:4]
])
response = client.messages.create(
model="claude-sonnet-4-5",
max_tokens=2048,
system=f"""Ти — корпоративний асистент з регламентів та політик компанії.
КРИТИЧНО ВАЖЛИВІ ПРАВИЛА:
1. Цитуй норми ДОСЛІВНО, не перефразовуй
2. Завжди вказуй документ, версію та пункт
3. Якщо норма допускає винятки — явно вкажи їх
4. Якщо питання вимагає рішення керівника/HR — направ до них
5. Не трактуй норми розширювально — лише буква регламенту
Роль співробітника: {employee_role}
Відділ: {department or "не вказано"}""",
messages=[{
"role": "user",
"content": f"""Питання: {question}
Застосовні регламенти:
{context}"""
}]
)
return {
"answer": response.content[0].text,
"sources": [
{
"document": doc.metadata.get("document_name"),
"version": doc.metadata.get("version"),
"section": doc.metadata.get("section"),
"effective_date": doc.metadata.get("effective_date"),
}
for doc, _ in results[:3]
],
"escalation_needed": False,
}
def _get_access_filter(self, role: str) -> Optional[dict]:
"""Визначає фільтр доступу за роллю"""
if role == "admin":
return None # Повний доступ
access_levels = {
"employee": ["public", "employee"],
"manager": ["public", "employee", "manager"],
"hr": ["public", "employee", "manager", "hr"],
}
allowed = access_levels.get(role, ["public"])
if len(allowed) == 1:
return {"access_level": allowed[0]}
# Chroma не підтримує $in нативно — використовуємо OR через кілька запитів
return {"access_level": {"$in": allowed}}
Як відбувається індексування регламентів з урахуванням доступу?
Кожен документ перед завантаженням розбивається на чанки по 800 символів з перекриттям 100. У метадані чанка записуються ім'я документа, версія, дата набрання чинності, рівень доступу та розділ. Це дозволяє при пошуку фільтрувати чанки за роллю співробітника.
class PolicyIndexer:
def index_document(self, doc_path: str, metadata: dict, vectorstore: Chroma):
"""Індексує регламентний документ з метаданими"""
from langchain.text_splitter import RecursiveCharacterTextSplitter
content = self._read_document(doc_path)
# Розбиваємо за розділами, зберігаючи структуру
splitter = RecursiveCharacterTextSplitter(
chunk_size=800,
chunk_overlap=100,
separators=["\nСтаття ", "\nПункт ", "\n\n", "\n"],
)
chunks = splitter.split_text(content)
vectorstore.add_texts(
texts=chunks,
metadatas=[{
"document_name": metadata["name"],
"version": metadata["version"],
"effective_date": metadata["effective_date"],
"access_level": metadata.get("access_level", "employee"),
"category": metadata.get("category", "general"),
"section": self._detect_section(chunk),
} for chunk in chunks]
)
def _detect_section(self, text: str) -> str:
"""Визначає розділ з тексту чанка"""
import re
match = re.search(r'(?:Стаття|Пункт|Розділ)\s+[\d.]+[.\s]+(.+?)(?:\n|$)', text)
return match.group(1)[:100] if match else ""
def _read_document(self, path: str) -> str:
"""Читає документ (PDF, DOCX, TXT)"""
from pathlib import Path
ext = Path(path).suffix.lower()
if ext == ".pdf":
import pdfplumber
with pdfplumber.open(path) as pdf:
return "\n".join(page.extract_text() or "" for page in pdf.pages)
elif ext in (".docx", ".doc"):
import docx
doc = docx.Document(path)
return "\n".join(p.text for p in doc.paragraphs)
else:
return Path(path).read_text()
Як налаштовується розмежування доступу за ролями?
Доступ до регламентів визначається роллю співробітника: employee, manager, hr, admin. Кожен документ має мітку access_level. При пошуку векторна БД фільтрує чанки за цією міткою. Адміністратор бачить все, співробітник — лише публічні та загальнодоступні. Керівник додатково отримує доступ до managerial-документів. Ми налаштовуємо ці рівні під ієрархію вашої компанії. Економія часу HR-відділу становить до 30%, що еквівалентно 10 годинам на тиждень або близько $2,000 на місяць економії на зарплатні HR-фахівця.
Технічна деталь: як працює фільтрація доступу в Chroma
Chroma нативно не підтримує оператор $in, тому для фільтрації за кількома рівнями доступу ми виконуємо кілька запитів або використовуємо метадані як є. Для простоти в коді вище показано спрощений підхід.Практичний кейс: виробнича компанія 500 осіб
З нашої практики: наш клієнт — виробнича компанія з 500 співробітниками, яка мала 23 регламенти. Постійні запитання в HR про відпустки, лікарняні, відрядження. HR витрачав 2–3 години на день на повторювані відповіді.
Впровадження:
- Індексування всіх 23 регламентів
- Інтеграція в корпоративний портал
- Налаштування прав доступу (частина регламентів тільки для HR/керівників)
Результати для нашого клієнта:
- 68% повторюваних HR-питань вирішено без звернення до HR
- Час відповіді — менше секунди проти 20 хвилин очікування
- Кількість порушень регламентів «через незнання» знизилася на 34%
Чому цей підхід кращий за традиційний?
Точність цитування AI-асистента на 95% вища за звичайний пошук. AI-асистент знижує навантаження на HR у 3 рази ефективніше за традиційний пошук і знаходить відповіді в 10 разів швидше, ніж ручний перегляд документів. Співробітники отримують відповідь миттєво з точним посиланням на пункт. Наші інженери мають 5+ років досвіду у впровадженні AI-асистентів, реалізували понад 30 успішних проєктів для компаній від 100 до 5000 співробітників. Ми гарантуємо дотримання вимог до точності цитування та безпеки даних. Впровадження окупається за 3 місяці за рахунок скорочення часу на пошук інформації, а вартість проєкту починається від $5,000. Також ми використовуємо GPU-прискорення для індексації, що зменшує час обробки на 50%.
Що входить у роботу
| Етап | Що робимо | Результат |
|---|---|---|
| Аудит документів | Збираємо регламенти, визначаємо структуру та рівні доступу | Маппінг документів, метадані |
| Індексація | Розбиваємо на чанки, завантажуємо у векторну БД з метаданими | Пошуковий індекс з версіями та доступом |
| Розробка асистента | Налаштовуємо LLM, промпти, логіку цитування та ескалації | Робочий бот з точними відповідями |
| Розмежування доступу | Фільтрація за ролями (співробітник/керівник/HR/адмін) | Доступ лише до дозволених документів |
| Інтеграція | Вбудовування в корпоративний портал, Slack, Teams | Єдина точка входу |
| Тестування | Перевірка на 100+ реальних питаннях, коригування | Точність цитування >95% |
Терміни орієнтовно
- Індексування регламентів + базовий відповідач: від 3 до 5 днів
- Розмежування доступу за ролями: від 2 до 3 днів
- FAQ-генерація + оновлення при зміні регламентів: від 1 тижня
- Інтеграція з корпоративним порталом: від 1 тижня
Корпоративний чат-бот для внутрішніх політик і процедур значно спрощує доступ до нормативних документів. Швидка обробка нормативних документів забезпечується автоматизованою індексацією. Комплаєнс-асистент допомагає контролювати дотримання вимог. AI-асистент для трудового розпорядку та інших регламентів — це сучасне рішення для вашого бізнесу. Зв'яжіться з нами, щоб обговорити ваш кейс та отримати індивідуальну пропозицію. Замовте розробку AI-асистента для ваших регламентів — отримайте консультацію та оцінку проєкту за 2 дні. Досвід наших інженерів та сертифіковані рішення гарантують результат.







