Почему графы знаний — это не просто модное слово
Вы когда-нибудь пытались найти все судебные решения, которые цитируют конкретный закон? Или понять, как одна правовая норма связана с десятками других через прецеденты? Если да, то вы знаете — это ад. Текстовый поиск тут не работает. Он находит упоминания, но не понимает контекст. Он видит цитату, но не знает, что это именно цитата.
Вот тут и появляются графы знаний. Но не те абстрактные графы из академических статей, а реальные, рабочие инструменты, которые можно собрать за пару дней. Сегодня я покажу конкретный кейс с австралийским правом и инструментом 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" в юридическом контексте (рассматривать дело).
Практика: строим граф знаний за 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 Построение графа знаний
Теперь у нас есть:
- Документы с метаданными
- Нормализованные цитаты
- Семантические эмбеддинги
Строим граф. Каждый документ — узел. Каждая цитата — ребро между документом-источником и документом-целью. Но не просто ребро, а с атрибутами:
- Тип связи (цитирует, упоминает, отменяет)
- Контекст цитаты
- Семантическое сходство между документами
- Дата документов
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 Визуализация и анализ
Сырой граф из миллионов узлов бесполезен. Нужна визуализация. Я использую комбинацию:
- Gephi для статической визуализации кластеров
- Neo4j для интерактивного исследования
- Собственный веб-интерфейс на 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 документов. Постройте граф. Посмотрите, какие инсайты он дает. Потом масштабируйтесь. Через месяц у вас будет система, которая понимает ваши документы лучше, чем любой сотрудник.
И последнее: не зацикливайтесь на идеальном графе. Первая версия будет несовершенной. Главное — начать и итеративно улучшать. Как говорится, лучше плохой граф сегодня, чем идеальный никогда.