Использование Azure AI Search для перезаписи запросов при поиске нормативных актов о жилищной поддержке

Бесплатная консультация юриста

+7 (800) 301-07-30

Реклама jurik.ru

Поиск релевантной информации в массивах нормативной документации — задача со звездочкой. Жилищное законодательство РФ характеризуется обширной терминологией, частыми изменениями, иерархией актов (ФЗ, Постановления Правительства, региональные законы, местные нормативные акты) и специфическим юридическим языком. Традиционный полнотекстовый поиск часто выдает шум или пропускает критически важные документы из-за несовпадения лексики запроса и текста документа.

Современные возможности Azure AI Search (ранее известного как Azure Cognitive Search), в частности перезапись запросов (Query Rewriting) в сочетании с семантическим ранжированием и интегрированной векторизацией, позволяют построить интеллектуальную поисковую систему, «понимающую» юридический контекст.


Проблематика поиска в жилищном законодательстве

Прежде чем рассматривать техническое решение, определим ключевые вызовы, с которыми сталкиваются юристы, сотрудники соцзащиты и разработчики правовых систем:

  • Синонимия и терминологическая вариативность: Пользователь ищет «пособие на оплату ЖКУ», а в законе написано «государственная помощь в оплате жилищно-коммунальных услуг» или «субсидия на оплату жилого помещения и коммунальных услуг».
  • Сложная структура документов: Нормативные акты состоят из статей, частей, пунктов, приложений. Релевантный ответ часто спрятан глубоко в иерархии.
  • Динамика законодательства: Акты меняются, вступают в силу, теряют силу. Поиск должен учитывать версионность и дату актуальности.
  • Межрегиональные различия: Региональные законы (например, о социальной поддержке отдельных категорий граждан в конкретном субъекте РФ) дополняют федеральный уровень.
  • Естественный язык запросов: Пользователи формулируют запросы бытовым языком: «Мне отключили газ за долги, что делать?», а не юридическими конструкциями.

Архитектура решения на базе Azure AI Search

Современный подход к решению этих задач — реализация паттерна RAG (Retrieval-Augmented Generation) с использованием агентного извлечения (Agentic Retrieval) и конвейера перезаписи запросов.

Ключевые компоненты Azure AI Search для данной задачи:
  1. Интегрированная векторизация (Integrated Vectorization): Автоматическое создание эмбеддингов (векторов) для чанков нормативных актов при индексации (через навыки Cognitive Skills или Azure OpenAI Embeddings: text-embedding-3-large или text-embedding-ada-002).
  2. Гибридный поиск (Hybrid Search): Одновременный полнотекстовый поиск (BM25) и векторный поиск для покрытия как точных совпадений терминов («статья 15 ЖК РФ»), так и семантического сходства («помощь молодая семья квартира»).
  3. Семантическое повторное ранжирование (Semantic Reranker): Использование модели @search.reranker для пересортировки топ-N результатов по семантической релевантности намерению пользователя.
  4. Перезапись запросов (Query Rewriting) / Планирование запросов: Ключевой компонент для нашей задачи, реализуемый через LLM (Azure OpenAI GPT-4o / GPT-4 Turbo) на этапе предобработки запроса.

Механика перезаписи запросов (Query Rewriting) в контексте нормативных актов

Перезапись запроса — это процесс трансформации исходного пользовательского запроса в набор оптимизированных подзапросов или структурированного запроса для поискового движка. В Azure AI Search это реализуется на уровне приложения (orchestration layer) с вызовом LLM до отправки запроса в индекс.

Стратегии перезаписи для жилищного права:

Расширение терминов (Term Expansion & Legal Synonyms)

LLM анализирует запрос и генерирует синонимы, акронимы и официальные термины.

Пример:
User Query: «пособие на аренду для одиночки»
Rewritten Queries:
«социальный наем жилья одиноко проживающие»
«специализированный жилищный фонд очередь предоставление»
«субсидия оплата аренды наниматели специализированного фонда»
«статья 51 ЖК РФ предоставление жилого помещения»

Декомпозиция сложных запросов (Query Decomposition)

Разбиение составного вопроса на атомарные подзапросы для параллельного поиска.

Пример:
User Query: «Какие документы нужны для встать на учет на улучшение жилищных условий многодетной семье в Москве 2024?»
Sub-queries:
«порядок встать на учет нуждающихся улучшение жилищных условий многодетная семья»
«список документов регистрация очередь жилье многодетные семьи»
«Закон Москвы социальная поддержка многодетные семьи жилищные права 2024»
«пособие молодой семьи на жилье Москва условия предоставления»

Внедрение контекста и фильтров (Context Injection & Filter Generation)

LLM извлекает из запроса параметры для фильтров OData ($filter), что критически важно для точного отсечения неактуальных регионов или устаревших редакций.

  • Регион: `region eq ‘Москва’ or region eq ‘Федеральный уровень’`
  • Категория граждан: `target_audience/any(t: t eq ‘многодетные семьи’ or t eq ‘сироты’)`
  • Тип акта: `document_type eq ‘Федеральный закон’ or document_type eq ‘Постановление Правительства РФ’`
  • Актуальность: `effective_date le 2024-06-01 and (repeal_date gt 2024-06-01 or repeal_date null)`

Гипотетический документ (HyDE ౼ Hypothetical Document Embeddings)

LLM генерирует «идеальный ответ» (гипотетический фрагмент закона), который затем векторизуется и используется для поиска ближайших по смыслу реальных чанков в индексе. Это мощно работает, когда пользователь описывает жизненную ситуацию, а не цитирует закон.


Реализация конвейера (Pipeline Implementation)

Ниже приведена схема архитектуры приложения на .NET / Python с использованием Azure AI Search и Azure OpenAI.

Этап 1: Индексация (Offline)
  1. Парсинг и Чанкинг (Chunking): Семантическое разбиение по статьям/пунктам с сохранением иерархии (метаданные: `parent_article`, `hierarchy_path`). Использование Layout API (Azure Document Intelligence) для сложных PDF с таблицами/колонками.
  2. Обогащение (Enrichment): Извлечение сущностей (Named Entity Recognition): даты вступления в силу, номера статей, категории льготников, регионы действия.
  3. Векторизация: Генерация эмбеддингов для каждого чанка (поле `content_vector`).
  4. Загрузка в индекс: Определение схемы индекса с полями: `id`, `content`, `content_vector` (Collection(Edm.Single)), `metadata_json`, `region`, `doc_type`, `effective_date`, `status` (действует/не действует).

Этап 2: Поиск (Online / Runtime)
async function searchHousingLaw(userQuery, userContext) {
 // 1. QUERY REWRITING (LLM Call)
 const rewritePrompt = `
 Ты эксперт по жилищному праву РФ. Перепиши запрос пользователя для поисковой системы.
 Исходный запрос: "${userQuery}"
 Контекст пользователя: ${JSON.stringify(userContext)} (регион, категория, дата);
 Задачи:
 1. Сгенерируй 3-5 вариаций запроса с юридическими терминами/синонимами.
 2. Сформируй OData $filter для Azure AI Search (region, date, category).
 3. Определи intent: "find_article", "check_eligibility", "list_documents", "procedure".
 Верни JSON.
 `;
 const rewriteResult = await azureOpenAI.chatCompletion(rewritePrompt);
 const { searchQueries, odataFilter, intent } = JSON.parse(rewriteResult);

 // 2. HYBRID SEARCH EXECUTION (Parallel)
 const searchTasks = searchQueries.map(q => azureSearchClient.search(q, {
 vectorQueries: [{ kind: 'vector', vector: await getEmbedding(q), k: 50, fields: 'content_vector' }],
 filter: odataFilter,
 select: 'id, content, metadata_json, document_title, article_number',
 queryType: 'semantic', // Включаем семантический ранжировщик
 semanticConfiguration: 'housing-law-semantic-config',
 top: 10
 }));
 const allResults = await Promise.all(searchTasks);

 // 3. FUSION & DEDUPLICATION (RRF ౼ Reciprocal Rank Fusion)
 const fusedResults = reciprocalRankFusion(allResults);

 // 4. AGENTIC RETRIEVAL / RERANK (Optional second pass LLM)
 // Подаем топ-5 в LLM для финальной проверки релевантности и извлечения ответа.
 const finalAnswer = await generateRAGAnswer(userQuery, fusedResults.slice(0, 5));

 return { answer: finalAnswer, sources: fusedResults.slice(0, 5) };
}

Настройка семантической конфигурации (Semantic Configuration)

Для работы семантического ранжировщика (доступного в уровнях Standard и выше) необходимо определить конфигурацию в определении индекса. Это заставляет модель «понимать» структуру закона.

Пример JSON конфигурации для Azure AI Search:
{
 "name": "housing-law-semantic-config",
 "prioritizedFields": {
 "titleField": { "fieldName": "document_title" },
 "prioritizedContentFields": [
 { "fieldName": "content" },
 { "fieldName": "article_text" }
 ],
 "prioritizedKeywordsFields": [
 { "fieldName": "keywords" }, // Извлеченные LLM ключевые слова
 { "fieldName": "legal_concepts" }, // Напр. "социальный наем", "субсидия", "разрушение"
 { "fieldName": "target_categories" } // "многодетные", "инвалиды", "военачальники"
 ]
 }
}

Особенности работы с русским языком и анализаторами

Согласно документации Microsoft Learn, поддержка языка выражается через анализаторы (analyzers). Для русского языка в Azure AI Search доступны:

  • Стандартный Lucene (`standard.lucene`), базовый, разбивает по пробелам/пунктуации.
  • Русский язык Microsoft (`ru.microsoft`), рекомендуется. Применяет лемматизацию (приведение к начальной форме), учитывает морфологию (падежи, склонения), стоп-слова. Критично для поиска: «предоставления» найдет «предоставление», «очередь» найдет «очереди».
  • Русский язык Lucene (`ru.lucene`) — альтернативная реализация стемминга.

Важно: Поле `content` в индексе должно иметь `analyzer: «ru.microsoft»` (или `indexAnalyzer` / `searchAnalyzer` при необходимости разделить логику). Для векторного поиска анализатор не применяется (работают эмбеддинги), но для полнотекстовой части (BM25) и автозаполнения (Suggesters) — это обязательно.


Автозаполнение и подсказки (Typeahead / Suggestions)

Для улучшения UX юристов и граждан можно настроить Suggester в индексе. Это позволяет реализовать «подсказки по мере ввода» (typeahead) для:

  • Названий законов («Федеральный закон от № 517-ФЗ…»)
  • Статей ЖК РФ («Статья 51 ЖК РФ», «Статья 105 ЖК РФ»)
  • Категорий льготников («многодетные семьи», «дети-сироты», «лица, пострадавшие от радиации»)

Это опирается на функционал Autocomplete / Suggestions API, который работает очень быстро за счет специальных структур данных (FST), строящихся на основе полей, отмеченных в `suggesters`.


Оценка качества и метрики (Evaluation)

Внедрение перезаписи запросов требует постоянного мониторинга качества. Ключевые метрики:

Метрика Описание Цель для жилищного права
Recall@K (Полнота) Доля релевантных документов в топ-K > 0.9 (пропуск закона недопустим)
NDCG / MRR Качество ранжирования (правильный закон на 1-м месте) MRR > 0.8
Hallucination Rate % ответов LLM, не подтвержденных источниками 0% (критично для права)
Latency (p95) Время ответа (Rewriting + Search + RAG) < 3-5 секунд

Для оценки используйте Azure AI Evaluation SDK или датасеты «золотых» пар запрос-ответ, подготовленные юристами.


Безопасность, говернанс и актуальность
  • RBAC (Role-Based Access Control): Разделение доступа к индексу: админы (загрузка), бэкенд-сервисы (поиск/чтение), аналитики (чтение логов).
  • Managed Identities: Без ключей в коде. Использование `DefaultAzureCredential` для аутентификации в `SearchClient` и `OpenAIClient`.
  • Обновление данных (Index Refresh): Нормативные акты меняются. Настройте Indexer с расписанием или Event-driven архитектуру (Event Grid -> Function -> Indexer Run) при появлении новых версий на `pravo.gov.ru` или региональных порталах. Используйте стратегию In-Place Update или перестроение секций для поддержания актуальности `effective_date` и `status`.
  • Цитируемость (Grounding): В RAG-ответе обязательно выдавайте ссылки на конкретные статьи/пункты (`article_number`, `document_id`, `source_url`), а не просто текст.

Использование Azure AI Search для поиска нормативных актов о жилищной поддержке выходит далеко за рамки простого полнотекстового поиска. Ключевым фактором успеха становится интеллектуальная перезапись запросов (Query Rewriting) на базе LLM (Azure OpenAI), которая:

  1. Переводит бытовой язык пользователя на язык законодательства.
  2. Декомпозирует сложные жизненные ситуации на атомарные правовые вопросы.
  3. Генерирует точные OData-фильтры для отсечения неактуальных регионов и устаревших редакций.

В сочетании с гибридным поиском (BM25 + Vectors), семантическим ранжированием и правильно настроенными русскоязычными анализаторами (`ru.microsoft`), это позволяет построить систему, способную выдавать юридически точные, актуальные и контекстуально релевантные ответы, что критически важно для сферы социальной защиты и жилищных прав граждан.


Полезные ссылки (Microsoft Learn):
  • Обзор обработки запросов в Azure AI Search
  • Семантический поиск и ранжирование
  • Векторный поиск и интегрированная векторизация
  • Анализаторы для лингвистической обработки (в т.ч. ru.microsoft)
  • Настройка автозаполнения (Suggesters/Typeahead)
  • RAG и агентное извлечение в Azure AI Search