Реализация AI-ассистента для юридических консультаций в мобильном приложении
Юридический AI-ассистент в мобильном приложении — это не ChatGPT с юридической шапкой. Это система, где неправильно сформулированный ответ может стоить пользователю проигранного иска, нарушенного срока исковой давности или штрафа. Архитектура начинается с понимания этих ограничений, а не с выбора LLM.
Что отличает юридического ассистента от обычного чат-бота
Три фундаментальных отличия, которые нельзя игнорировать при проектировании.
Юрисдикция имеет значение. Статья Гражданского кодекса России и аналогичная норма Казахстана могут давать прямо противоположные ответы на один вопрос. Перед любым ответом система должна знать юрисдикцию пользователя — либо из профиля, либо через явный выбор. Ошибка здесь — не «неточный ответ», а потенциально вредный совет.
RAG, а не fine-tuning. LLM, дообученная на законодательстве образца 2022 года, будет уверенно цитировать нормы, которые уже отменены. Правильный подход — Retrieval-Augmented Generation с актуальной базой нормативных актов. Документ разбивается на чанки, индексируется через vector store (pgvector, Pinecone или Weaviate), при запросе извлекаются релевантные фрагменты и передаются в контекст LLM. Источник всегда указывается в ответе: «Согласно ст. 196 ГК РФ (редакция от 01.07.2024)».
Disclaimer — часть UX, не сноска. Перед первым запросом — явное подтверждение, что пользователь понимает: это не юридическая консультация и не заменяет адвоката. Без этого подтверждения — интерфейс не открывается.
Как реализован RAG-поиск по законодательной базе
Ядро системы — поисковый пайплайн на мобильном клиенте и backend-сервисе.
// iOS: запрос к юридическому ассистенту
struct LegalQueryRequest: Codable {
let query: String
let jurisdiction: String // "RU", "BY", "KZ"
let practiceArea: LegalArea // contract, labor, tax, family, criminal
let sessionId: String
}
enum LegalArea: String, Codable {
case contract = "contract_law"
case labor = "labor_law"
case tax = "tax_law"
case family = "family_law"
case property = "property_law"
case administrative = "administrative"
}
На backend RAG-пайплайн выглядит так: запрос пользователя эмбеддится через text-embedding-3-small, выполняется поиск по векторной базе (cosine similarity, top-k = 5), найденные нормы передаются в контекст GPT-4o или Claude 3.5 с жёстким системным промптом.
LEGAL_SYSTEM_PROMPT = """
You are a legal information assistant for {jurisdiction}.
You MUST:
1. Only answer based on the provided legal documents
2. Always cite the specific article/law you reference
3. Clearly state when a question requires professional legal advice
4. Never provide a definitive legal opinion — provide information only
5. If the retrieved documents don't cover the question, say so explicitly
Retrieved legal documents:
{retrieved_chunks}
Important: This is information only, not legal advice.
"""
Если retrieval вернул нерелевантные чанки (similarity score ниже порога), LLM получает инструкцию явно сообщить пользователю, что ответ находится за пределами доступной базы — вместо того чтобы «додумывать» на основе обучающих данных.
Структура мобильного приложения
На iOS — MVVM с Combine, на Android — ViewModel + StateFlow. Чат реализован через список сообщений с поддержкой rich-контента: цитаты нормативных актов, ссылки на источники, кнопки с призывом «Проконсультироваться с юристом».
struct LegalChatMessage: Identifiable {
let id: UUID
let role: MessageRole
let content: String
let citations: [LegalCitation]? // ссылки на НПА
let disclaimer: String? // disclaimer для сложных вопросов
let suggestsProfessional: Bool // флаг: рекомендовать живого юриста
let timestamp: Date
}
struct LegalCitation: Codable {
let documentTitle: String
let article: String
let excerpt: String
let url: String?
let asOfDate: String // дата редакции
}
Когда suggestsProfessional == true — в UI появляется карточка с кнопкой связи с юристом. Это монетизация через партнёрство с юридическими сервисами и одновременно снижение юридических рисков для владельца приложения.
Детекция высокорисковых запросов
Уголовные вопросы, вопросы о конкретных уголовных делах, медицинско-юридические пересечения — отдельный класс. Classifier (дообученный BERT или keyword-based для MVP) определяет категорию до LLM-вызова:
enum LegalRiskLevel {
case informational // что такое срок исковой давности
case moderate // как составить претензию
case high // как избежать уголовной ответственности
case criticalRedirect // активное уголовное дело, арест
}
При criticalRedirect — только экстренный редирект к живому юристу, без AI-ответа.
Безопасность и хранение данных
Юридические консультации — чувствительные данные. Они не должны храниться в cleartext.
На iOS история чата шифруется через CryptoKit (AES-GCM) перед записью в Core Data. Ключ — в Keychain, привязан к biometric authentication. На Android — аналогично через EncryptedSharedPreferences или Room с SQLCipher.
Серверная сторона: все запросы к LLM логируются без идентификаторов пользователя (только session hash), данные в vector store — публичные нормативные акты, персональных данных нет.
Ориентиры по срокам
MVP с RAG на одной юрисдикции, базовым чатом и disclaimer-флоу — 3–4 недели. Полная система с мультиюрисдикционной базой (RU/BY/KZ), автоматическим обновлением законодательной базы, классификатором рисков, интеграцией с партнёрским юридическим сервисом, шифрованием истории и поддержкой iOS + Android — 2–3 месяца. Сроки зависят от объёма индексируемой нормативной базы.







