Как создать граф знаний из документов: Kanon 2 Enricher и Open Australian Legal Corpus | AiManual
AiManual Logo Ai / Manual.
21 Фев 2026 Гайд

Семантический граф знаний из юридических документов: от австралийского права до ваших данных

Пошаговый гайд по созданию семантического графа знаний из юридических документов с Kanon 2 Enricher и австралийским правом. Извлечение цитат, нормализация, эмбе

Почему графы знаний — это не просто модное слово

Вы когда-нибудь пытались найти все судебные решения, которые цитируют конкретный закон? Или понять, как одна правовая норма связана с десятками других через прецеденты? Если да, то вы знаете — это ад. Текстовый поиск тут не работает. Он находит упоминания, но не понимает контекст. Он видит цитату, но не знает, что это именно цитата.

Вот тут и появляются графы знаний. Но не те абстрактные графы из академических статей, а реальные, рабочие инструменты, которые можно собрать за пару дней. Сегодня я покажу конкретный кейс с австралийским правом и инструментом Kanon 2 Enricher, который вышел в начале 2026 года с поддержкой новых моделей эмбеддингов.

Важно: я не буду рассказывать про онтологии, OWL и прочую академическую ерунду. Мы будем строить практический граф, который действительно работает с реальными документами.

Что такое Open Australian Legal Corpus и зачем он нам

Open Australian Legal Corpus (OALC) — это открытая коллекция австралийских правовых документов: судебные решения, законодательные акты, комментарии. На февраль 2026 года в ней около 2.5 миллионов документов. Почему именно она?

  • Все документы структурированы — есть метаданные, разделы, параграфы
  • Юридические цитаты стандартизированы (например, "[2025] HCA 12" или "Criminal Code Act 1995 (Cth) s 11.1")
  • Документы связаны через цитирования — один судебный прецедент ссылается на десятки других
  • Идеальный тестовый полигон для экспериментов

Но даже с такой структурой автоматически извлечь все связи невозможно. Цитаты пишут по-разному, сокращают, делают ошибки. Вот тут-то и нужен Kanon 2 Enricher.

Kanon 2 Enricher: не просто парсер, а семантический движок

Если Kanon 1 был просто парсером юридических цитат, то версия 2.0 — это полноценный пайплайн для обогащения документов. Что он умеет на февраль 2026:

Модуль Что делает Почему важно
Цитатный парсер Находит юридические цитаты в тексте Без этого вообще никак — цитаты это связи между документами
Нормализатор Приводит цитаты к канонической форме "Cth" становится "Commonwealth", сокращения раскрываются
Семантический энкодер Генерирует эмбеддинги для документов и их частей Позволяет искать похожие документы по смыслу, а не по ключевым словам
Графовый конструктор Строит граф знаний из извлеченных связей Визуализирует связи между документами

Самое интересное — семантический энкодер. В Kanon 2 Enricher по умолчанию используется LawBERT-v3 — модель, специально дообученная на юридических текстах. Она понимает разницу между "consider" в обычном смысле и "consider" в юридическом контексте (рассматривать дело).

💡
Если LawBERT-v3 слишком тяжела для ваших нужд, можно использовать smaller модели типа Legal-Sentence-BERT. Но для качественных эмбеддингов лучше брать полноразмерные модели.

Практика: строим граф знаний за 5 шагов

Теперь перейдем к конкретике. Вот пошаговый план, который я использовал для OALC. Он работает и для других коллекций документов — просто замените парсер цитат на свой.

1 Подготовка данных и установка Kanon 2 Enricher

Сначала качаем OALC с официального сайта. Данные в формате JSONL — каждая строка это отдельный документ с полями: text, metadata, citations. Устанавливаем Kanon 2 Enricher:

# Клонируем репозиторий
git clone https://github.com/kanon-legal/kanon-enricher-v2
cd kanon-enricher-v2

# Создаем виртуальное окружение
python -m venv venv
source venv/bin/activate  # или venv\Scripts\activate на Windows

# Устанавливаем зависимости
pip install -r requirements.txt

# Дополнительно ставим модели для эмбеддингов
pip install sentence-transformers legal-bert

Важный момент: Kanon 2 Enricher требует Python 3.10+. Проверьте версию перед установкой.

2 Извлечение и нормализация цитат

Запускаем пайплайн обработки. Создаем конфигурационный файл config.yaml:

input:
  path: "/path/to/oalc/data.jsonl"
  format: "jsonl"

processing:
  citation_extraction: true
  citation_normalization: true
  semantic_embeddings: true
  graph_construction: true

models:
  citation_extractor: "legal_citation_v2"
  embedding_model: "lawbert-v3"
  normalize_to: "canonical"

output:
  format: "graphml"
  path: "/path/to/output/graph.graphml"
  include_embeddings: true

Запускаем обработку:

python kanon_pipeline.py --config config.yaml

Что происходит на этом этапе:

  • Модель legal_citation_v2 находит все юридические цитаты в тексте
  • Нормализатор приводит их к единому формату ("[2025] FCA 123" → "Federal Court of Australia, 2025, case 123")
  • Для каждой цитаты извлекается контекст — несколько предложений до и после

Ошибка новичков: не настраивают контекстное окно. По умолчанию Kanon берет 2 предложения до и после цитаты. Для юридических текстов этого мало — ставьте 3-4 предложения.

3 Генерация семантических эмбеддингов

Теперь самый ресурсоемкий этап. Kanon 2 Enricher генерирует эмбеддинги:

  • Документ-уровень: эмбеддинг всего документа (1024 измерения)
  • Абзац-уровень: эмбеддинги каждого значимого абзаца
  • Цитата-уровень: эмбеддинги контекста вокруг каждой цитаты

Зачем три уровня? Чтобы искать документы по разным критериям:

# Пример использования эмбеддингов после обработки
import numpy as np
from sklearn.metrics.pairwise import cosine_similarity

# Загружаем сохраненные эмбеддинги
doc_embeddings = np.load("doc_embeddings.npy")  # [n_docs, 1024]
paragraph_embeddings = np.load("paragraph_embeddings.npy")  # [n_paragraphs, 1024]
citation_context_embeddings = np.load("citation_embeddings.npy")  # [n_citations, 1024]

# Ищем похожие документы по смыслу
def find_similar_documents(query_embedding, top_k=5):
    similarities = cosine_similarity([query_embedding], doc_embeddings)[0]
    top_indices = np.argsort(similarities)[-top_k:][::-1]
    return top_indices, similarities[top_indices]

На этом этапе многие сталкиваются с проблемой памяти. LawBERT-v3 требует около 4GB VRAM на инференс. Если GPU нет, используйте CPU, но готовьтесь ждать. Для больших коллекций типа OALC лучше арендовать инстанс с A100.

4 Построение графа знаний

Теперь у нас есть:

  1. Документы с метаданными
  2. Нормализованные цитаты
  3. Семантические эмбеддинги

Строим граф. Каждый документ — узел. Каждая цитата — ребро между документом-источником и документом-целью. Но не просто ребро, а с атрибутами:

  • Тип связи (цитирует, упоминает, отменяет)
  • Контекст цитаты
  • Семантическое сходство между документами
  • Дата документов

Kanon 2 Enricher сохраняет граф в формате GraphML, который можно открыть в Gephi, Cytoscape или загрузить в Neo4j.

# Пример анализа графа с NetworkX
import networkx as nx
import matplotlib.pyplot as plt

# Загружаем граф из GraphML
G = nx.read_graphml("legal_graph.graphml")

# Анализируем основные метрики
print(f"Всего узлов: {G.number_of_nodes()}")
print(f"Всего ребер: {G.number_of_edges()}")
print(f"Плотность графа: {nx.density(G):.4f}")

# Находим самые влиятельные документы (по PageRank)
pagerank = nx.pagerank(G)
top_docs = sorted(pagerank.items(), key=lambda x: x[1], reverse=True)[:10]
print("\nТоп-10 документов по влиянию:")
for doc, score in top_docs:
    print(f"  {doc}: {score:.4f}")

5 Визуализация и анализ

Сырой граф из миллионов узлов бесполезен. Нужна визуализация. Я использую комбинацию:

  1. Gephi для статической визуализации кластеров
  2. Neo4j для интерактивного исследования
  3. Собственный веб-интерфейс на Streamlit для демонстрации

Вот минимальный Streamlit-дашборд для просмотра графа:

import streamlit as st
import networkx as nx
import plotly.graph_objects as go

st.title("Юридический граф знаний")

# Загружаем граф
G = nx.read_graphml("legal_graph.graphml")

# Визуализация с Plotly
pos = nx.spring_layout(G, seed=42)

edge_x = []
edge_y = []
for edge in G.edges():
    x0, y0 = pos[edge[0]]
    x1, y1 = pos[edge[1]]
    edge_x.extend([x0, x1, None])
    edge_y.extend([y0, y1, None])

node_x = [pos[node][0] for node in G.nodes()]
node_y = [pos[node][1] for node in G.nodes()]
node_text = list(G.nodes())

fig = go.Figure()
fig.add_trace(go.Scatter(x=edge_x, y=edge_y, mode='lines', line=dict(width=0.5, color='#888')))
fig.add_trace(go.Scatter(x=node_x, y=node_y, mode='markers+text', text=node_text,
                         marker=dict(size=10, color='blue'), textposition="top center"))

fig.update_layout(showlegend=False, hovermode='closest',
                  margin=dict(b=20,l=5,r=5,t=40))

st.plotly_chart(fig, use_container_width=True)

Что делать с этим графом? Практические кейсы

Вы построили граф. И что теперь? Вот несколько реальных применений:

Кейс 1: Поиск прецедентов по смыслу, а не по ключевым словам

Традиционный поиск ищет лексические совпадения. Граф позволяет искать семантически похожие дела, даже если в них разные формулировки. Например, найти все дела про "неосторожное вождение", даже если в тексте используется "безрассудное управление автомобилем".

Кейс 2: Анализ влияния законодательных изменений

Добавили новый закон? Граф покажет, какие существующие судебные решения могут быть затронуты, основываясь на семантической близости и цитатных связях.

Кейс 3: Обнаружение противоречий в праве

Два документа семантически близки (говорят об одном), но ссылаются на противоположные прецеденты? Граф это покажет. Это особенно полезно для выявления устаревших или противоречивых толкований.

Кейс 4: Улучшение RAG-систем для юристов

Обычный RAG для юристов ищет релевантные фрагменты текста. Граф знаний добавляет контекстные связи: не только "вот похожий документ", но и "вот какие документы на него ссылаются, вот какие он цитирует, вот какие решения противоречат ему".

Типичные ошибки и как их избежать

Ошибка 1: Пытаться обработать все документы сразу. Начните с небольшой тестовой выборки (100-1000 документов), отладите пайплайн, потом масштабируйтесь.

Ошибка 2: Игнорировать нормализацию цитат. Без нормализации "Cth", "Commonwealth", "Com." будут разными сущностями. Граф получится фрагментированным.

Ошибка 3: Использовать общие модели эмбеддингов. Юридический текст — это особый язык. Общие модели (типа обычного BERT) плохо работают с юридической терминологией.

Ошибка 4: Строить слишком детальный граф. Не нужно создавать узел для каждого абзаца или предложения. Начните с уровня документов, при необходимости детализируйте.

Альтернативы и когда их использовать

Kanon 2 Enricher — не единственный инструмент. Вот сравнение с другими подходами:

Инструмент Плюсы Минусы Когда использовать
Kanon 2 Enricher Специализирован под юридические тексты, есть нормализация цитат Требует Python, не самый простой в настройке Для юридических документов со структурированными цитатами
Wikontic Проще в использовании, хорошая визуализация Менее специализирован для юридических текстов Для вики-подобных документов без строгих цитатных форматов
Neo4j с NLP плагинами Мощная графовая БД, хорошая экосистема Требует больше ручной работы по извлечению сущностей Когда нужна промышленная графовая БД с транзакциями
Самописный пайплайн на spaCy + NetworkX Полный контроль, можно кастомизировать под любые нужды Много кода, нужно разбираться в NLP Когда требования специфичны и нет подходящих готовых инструментов

Что дальше? От графа к интеллектуальной системе

Граф знаний — это не конечная цель, а основа для более сложных систем. Вот что можно построить поверх:

  • Предсказание исходов дел: На основе графа связей между прецедентами и их исходами можно предсказывать вероятности выигрыша/проигрыша по новым делам
  • Автоматическое обновление законодательных сводов: При изменении закона система автоматически находит все зависимые документы
  • Семантический поиск с объяснениями: Не просто "вот документ", а "вот документ, потому что он цитирует X и Y, и семантически близок к Z"
  • Обнаружение правовых пробелов: Анализ графа может показать области, где нет прецедентов или законодательного регулирования

Самое интересное — комбинация графов знаний с LLM. Граф предоставляет структурированные знания и связи, LLM — естественно-языковый интерфейс. Вместе они создают системы, которые не просто ищут документы, а понимают правовые концепции и их взаимосвязи.

💡
Если вы работаете с корпоративными документами (не юридическими), принцип тот же. Замените парсер юридических цитат на извлечение ваших сущностей. Используйте доменно-специфичные модели эмбеддингов. Остальная часть пайплайна останется без изменений.

Начните с малого. Возьмите 100 документов. Постройте граф. Посмотрите, какие инсайты он дает. Потом масштабируйтесь. Через месяц у вас будет система, которая понимает ваши документы лучше, чем любой сотрудник.

И последнее: не зацикливайтесь на идеальном графе. Первая версия будет несовершенной. Главное — начать и итеративно улучшать. Как говорится, лучше плохой граф сегодня, чем идеальный никогда.