Уявіть: у компанії 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 дні. Досвід наших інженерів та сертифіковані рішення гарантують результат.







