Представьте: в компании 500 человек, 23 регламента, каждый месяц обновления. Сотрудники тратят 20 минут на поиск ответа в PDF, HR отвечает на одни и те же вопросы по 2–3 часа в день. Ежедневно HR-отдел тратит до 10% рабочего времени на ответы по регламентам. При этом 40% нарушений происходят из-за незнания актуальной версии документа. Корпоративные регламенты — трудовой распорядок, политика безопасности, процедуры согласования — сотни страниц, которые почти никто не читает. Результат: повторяющиеся вопросы в HR, риск нарушений и потеря времени. Мы создаём AI-ассистента, который делает регламенты доступными через диалог. Сотрудник просто спрашивает, ассистент мгновенно находит точную норму с указанием документа и версии. Это не просто поиск по ключевым словам — это полноценный RAG-пайплайн с контролем версий и разграничением доступа.
Специфика регламентного ассистента
Регламентный ассистент отличается от обычного RAG тремя ключевыми требованиями: точность цитирования (нормы дословно, а не пересказ), актуальность (контроль версий без ошибок) и разграничение доступа по ролям. Эти требования влияют на архитектуру: векторный поиск, система промптов и фильтрация метаданных.
Как AI-ассистент обеспечивает точность цитирования?
Ассистент строит ответ на основе извлечённых фрагментов документов. Используется векторный поиск (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 часам в неделю.
Практический кейс: производственная компания 500 человек
Из нашей практики: компания с 23 регламентами, постоянные вопросы в HR про отпуска, больничные, командировки. HR тратил 2–3 часа в день на повторяющиеся ответы.
Внедрение:
- Индексирование всех 23 регламентов
- Интеграция в корпоративный портал
- Настройка прав доступа (часть регламентов только для HR/руководителей)
Результаты:
- 68% повторяющихся HR-вопросов решены без обращения к HR
- Время ответа — менее секунды против 20 минут ожидания
- Количество нарушений регламентов «по незнанию» снизилось на 34%
Почему стоит выбрать этот подход?
AI-ассистент снижает нагрузку на HR в 3 раза эффективнее традиционного поиска. Сотрудники получают ответ мгновенно с точной ссылкой на пункт. Наши инженеры имеют опыт внедрения для компаний от 100 до 5000 сотрудников. Мы гарантируем соблюдение требований к точности цитирования и безопасности данных. Внедрение окупается за 3 месяца за счёт сокращения времени на поиск информации.
Что входит в работу
| Этап | Что делаем | Результат |
|---|---|---|
| Аудита документов | Собираем регламенты, определяем структуру и уровни доступа | Маппинг документов, метаданные |
| Индексация | Разбиваем на чанки, загружаем в векторную БД с метаданными | Поисковый индекс с версиями и доступом |
| Разработка ассистента | Настраиваем LLM, промпты, логику цитирования и эскалации | Рабочий бот с точными ответами |
| Разграничение доступа | Фильтрация по ролям (сотрудник/руководитель/HR/админ) | Доступ только к разрешённым документам |
| Интеграция | Встраивание в корпоративный портал, Slack, Teams | Единая точка входа |
| Тестирование | Проверка на 100+ реальных вопросов, корректировка | Точность цитирования >95% |
Сроки ориентировочно
- Индексирование регламентов + базовый ответчик: от 3 до 5 дней
- Разграничение доступа по ролям: от 2 до 3 дней
- FAQ-генерация + обновление при изменении регламентов: от 1 недели
- Интеграция с корпоративным порталом: от 1 недели
Свяжитесь с нами, чтобы обсудить ваш кейс и получить индивидуальное предложение. Закажите разработку AI-ассистента для ваших регламентов — получите консультацию и оценку проекта за 2 дня. Опыт наших инженеров и сертифицированные решения гарантируют результат.







