English translation is not available yet. Showing Russian content.

Как вы представляете граф знаний из изображения для LLM?

Краткий тезис

Граф знаний]] из изображения — это структурированное представление визуальной информации, где узлы — объекты (например, геометрические фигуры, текст) и понятия, а рёбра — их связи (стрелки, линии, отношения). Для подачи в LLM такой граф сериализуют в текст, JSON или последовательность триплетов, чтобы модель могла «читать» визуальную логику. Основная сложность — точное извлечение узлов и связей из неструктурированного растра с помощью OCR, детекции объектов и анализа макета.


1. Термин: Граф знаний из изображения (Knowledge Graph from Image)

Граф знаний (graph|Knowledge Graph) — это ориентированный мультиграф, вершины которого обозначают сущности (объекты, понятия, события), а рёбра — отношения между ними. В контексте изображения граф знаний строится на основе визуального анализа: например, блок-схема «Загрузка → Проверка → Ошибка/Успех» превращается в узлы «Загрузка», «Проверка», «Ошибка», «Успех» и рёбра «поток», «условие».

Отличие от простого распознавания текста LLM может прочитать текст с изображения (через OCR), но не понимает структуры — какие элементы связаны, какова логика перехода. Граф знаний]] восстанавливает эту структуру.

2. Зачем представлять граф знаний из изображения для LLM?

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

  • Пользователь загружает блок‑схему бизнес‑процесса и спрашивает: «Какие шаги выполняются после проверки?»
  • LLM, получив сериализованный граф, может точно определить следующий шаг, а не просто гадать по плоскому тексту.

Другие сценарии: диаграммы потоков данных, схемы архитектуры ПО, карты процессов, организационные диаграммы.

3. Проблемы при извлечении графа из изображения

  1. Неструктурированность растра — пиксели не дают прямой информации о связях.
  2. Шум — фон, тени, наложения линий, нестандартные шрифты.
  3. Layout‑вариативность — стрелки могут быть кривыми, пересекаться, иметь подписи.
  4. OCR‑ошибки — особенно на кириллице или стилизованных шрифтах.
  5. Разреженность или плотность — в сложных схемах много узлов и рёбер, сериализация может быть слишком длинной для контекстного окна LLM.

4. Методы сериализации графа в текст

Основной подход — преобразовать граф в линейную последовательность токенов, понятную LLM. Четыре популярных формата:

ФорматОписаниеПример
Натуральный языкОписание рёбер и узлов естественными фразами«Узел А (прямоугольник, текст «Загрузка») связан стрелкой (тип «поток») с узлом Б (ромб, текст «Проверка?»)»
Триплеты (RDF)Каждое отношение как (субъект, предикат, объект)(Загрузка, follows, Проверка), (Проверка, condition, Ошибка)
JSON / YAMLМашиночитаемая структура{"nodes": [{"id":"A","label":"Загрузка","shape":"rect"}], "edges":[{"from":"A","to":"B","type":"flow"}]}
Текстовая нотацияСпециально разработанный синтаксис (как DOT для Graphviz)A [label="Загрузка"]; B [label="Проверка"]; A -> B [label="поток"];

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

4.1 Детальный пример сериализации в текст

Изображение блок‑схемы:

[Прямоугольник "Начало"] → [Ромб "Есть ошибка?"] → [Прямоугольник "Исправить"] → [Прямоугольник "Конец"]
                              ↓ (нет)
                              [Прямоугольник "Отправить"]

Результат сериализации:

Узел 1 (прямоугольник, текст «Начало») соединён сплошной стрелкой (тип «поток») с узлом 2 (ромб, текст «Есть ошибка?»).
Из узла 2 выходят две стрелки:

  • одна (подпись «да») ведёт к узлу 3 (прямоугольник, текст «Исправить»),
  • вторая (подпись «нет») ведёт к узлу 4 (прямоугольник, текст «Отправить»).
    Узел 3 связан стрелкой (без подписи) с узлом 5 (прямоугольник, текст «Конец»).
    Узел 4 также соединён с узлом 5.

Такой текст передаётся LLM как дополнительный контекст при ответе на вопросы по схеме.

5. Альтернативные подходы: графовые эмбеддинги и визуальные токены

Вместо текстовой сериализации можно использовать:

  • Графовые нейросети (GNN) — создать эмбеддинг всего графа и подать его в LLM через cross‑attention (исследовательские работы, например, Graph‑LLM). Однако это требует модификации архитектуры.
  • Визуальные токены — передать изображение напрямую (например, через CLIP‑эмбеддинг) и попросить LLM «увидеть» граф. Современные мультимодальные модели (GPT‑4V, Gemini) могут это делать, но часто ошибаются в логике перехода.
  • Смешанный подход — извлечённый граф подаётся и как текст, и как изображение (если модель поддерживает оба модальности).

6. Роль OCR и Layout Analysis

Чтобы построить граф, нужно сначала выделить все текстовые блоки и геометрические фигуры. Для этого применяются:

  • OCR (Optical Character Recognition) — извлечение текста из областей. Современные системы: Tesseract (open‑source), PaddleOCR (высокая точность на кириллице), Azure Computer Vision.
  • Layout Analysis — распознавание структуры страницы: разделение на блоки, определение их формы (прямоугольник, ромб, круг), порядка чтения. Инструменты: LayoutLM (модель от Microsoft), TableTransformer, YOLO (детекция объектов).
  • Детекция стрелок — отдельная задача: поиск линий, стрелочных головок, подписей рёбер. Можно использовать Hough Transform, нейросетевой детектор (SSD/RetinaNet) или постобработку с OpenCV.

Типичный пайплайн: изображение → детекция объектов (YOLO) → классификация фигур → OCR по каждому боксу → построение графа связей (анализ пересечения линий с блоками, распознавание подписей стрелок) → сериализация.

7. Инструменты и технологии

ЭтапИнструменты / моделиПримечания
Детекция узлов и рёберYOLOv8, Detectron2, OpenCV (контурный анализ)YOLO даёт bounding box, OpenCV строит линии
OCRTesseract, PaddleOCR, Microsoft TrOCRPaddleOCR лучше для русского, Tesseract – универсальный
Анализ макетаLayoutLMv3, TableTransformer, PubTabNetПредобучены на документах и схемах
Классификация фигурCNN / ResNet, lightweight SVM на HOGОпределение прямоугольник/ромб/эллипс
Построение графаNetworkX, Neo4j, python‑igraphХранение и экспорт в JSON / DOT
СериализацияПростой шаблонизатор (Handlebars, Jinja)Генерация текстового описания

8. LLM, способные работать с таким представлением

Практически все современные LLM (GPT‑4, GPT‑4o, Claude 3.5, Gemini, Llama 3) хорошо понимают текстовую сериализацию графа, если она дана в естественном языке. Для JSON формата желательно дать в промпте пример разметки.

Модели с function calling (GPT‑4‑turbo, Claude Tools) позволяют вернуть структурированный ответ (JSON), что удобно для автоматического обновления базы знаний RAG.

9. Пример полного пайплайна (с кодом)

import cv2
import pytesseract
import networkx as nx
from PIL import Image

def extract_graph_from_image(image_path):
    img = cv2.imread(image_path)
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

    # 1. Находим контуры фигур (узлы)
    contours, _ = cv2.findContours(gray, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    nodes = []
    for cnt in contours:
        x, y, w, h = cv2.boundingRect(cnt)
        roi = gray[y:y+h, x:x+w]
        text = pytesseract.image_to_string(roi, lang='rus').strip()
        shape = classify_shape(cnt)  # условная функция
        nodes.append({"id": len(nodes), "text": text, "shape": shape, "bbox": (x, y, w, h)})

    # 2. Анализируем линии между узлами (стрелки)
    edges = detect_arrows(img, nodes)  # самодельная функция

    # 3. Строим граф
    G = nx.DiGraph()
    for n in nodes:
        G.add_node(n["id"], label=n["text"], shape=n["shape"])
    for src, tgt, lbl in edges:
        G.add_edge(src, tgt, label=lbl)

    # 4. Сериализация
    serialized = serialize_to_text(G)
    return serialized

def serialize_to_text(G):
    lines = []
    for node_id, data in G.nodes(data=True):
        lines.append(f'Узел {node_id} ({data["shape"]}, текст «{data["label"]}»)')
    for src, tgt, data in G.edges(data=True):
        label = data.get("label", "без подписи")
        lines.append(f'Из узла {src} идёт стрелка (тип «{label}») к узлу {tgt}')
    return "\n".join(lines)

(Для реального использования потребуется более точная детекция стрелок и классификация форм – например, на основе обученного YOLO.)

10. Метрики качества представления графа

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

  • Точность извлечения узлов (Precision/Recall) – сколько истинных надписей/форм найдено.
  • Точность рёбер – доля правильно определённых связей.
  • Семантическая близость – можно попросить LLM ответить по извлечённому графу и сравнить с ответами, полученными по вручную размеченному золотому графу (метрика faithfulness).
  • Время сериализации – важно для production.

11. Сравнение с другими способами представления изображения для LLM

СпособПлюсыМинусы
Base64 всего изображенияПолнота, не требует извлеченияБольшой контекст, модель не видит структуру
Текстовое описание (caption)КомпактноТеряется точность связей
Таблицы (для табличных диаграмм)Хорошо для таблицНе подходит для графов/схем
Граф знаний (text)Сохраняет логику, малый размерЗависит от качества извлечения
Визуальные токены + LLM (GPT‑4V)Поддерживает сложные изображенияОшибки в логике перехода, дорого

Для RAG‑систем со схемами процессов графовый подход даёт наилучшую точность при приемлемых затратах.

12. Применение в мультимодальном RAG

Извлечённый сериализованный граф можно:

  1. Индексировать как документ в векторной БД (например, в виде эмбеддинга текста графа).
  2. Использовать как контекст при retrieval: когда пользователь задаёт вопрос по схеме, мы находим подходящий граф (или его фрагмент) и подставляем в промпт.
  3. Дополнять ответ LLM рассуждениями над графом.

Архитектура мультимодального RAG с графом:

Изображение → Извлечение графа → Сериализация → Эмбеддинг → Векторная БД

Запрос пользователя → Эмбеддинг запроса → Поиск графа → LLM с контекстом (граф + инструкция) → Ответ

Такой подход существенно повышает качество ответов на вопросы о схемах, блок‑диаграммах и картах процессов.


Пет-проект для закрепления

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

Инструменты Python, OpenCV, PaddleOCR, YOLOv8 (детекция фигур), NetworkX, LangChain (RAG), GPT‑4o / Llama 3.

Шаги:

  1. Соберите 20–50 фотографий рукописных и печатных блок‑схем (можно сгенерировать в draw.io).
  2. Разметьте bounding box‑ы фигур и стрелок (LabelImg или RoboFlow).
  3. Обучите YOLO на детекцию прямоугольников, ромбов, окружностей и стрелок.
  4. Напишите скрипт: YOLO → обрезка ROI → OCR → построение графа → сериализация.
  5. Создайте простой RAG: загрузите сериализованные графы в векторную БД (Chroma), реализуйте поиск по запросу.
  6. Подключите LLM: при запросе пользователя (например, «какой шаг после проверки?») retrieval находит релевантный граф, LLM читает описание и даёт ответ.

Ожидаемый результат Telegram‑бот или веб‑интерфейс, куда можно загрузить фото схемы и получить ответ на естественном языке о её структуре.


Связь с другими вопросами

ВопросТема
112Как извлечь текст из изображения в RAG? (OCR и layout)
114Как построить мультимодальные эмбеддинги для изображений и текста?
108Как вы интегрируете Knowledge Graph в RAG?
110Что такое графовые нейросети и как они применяются в RAG?
115Как вы оцениваете качество ответа мультимодального RAG?
107Какие техники fine‑tuning LLM для работы с графами существуют?

Навигация