mirror of
https://github.com/trustgraph-ai/trustgraph.git
synced 2026-04-25 16:36:21 +02:00
355 lines
17 KiB
Markdown
355 lines
17 KiB
Markdown
---
|
||
layout: default
|
||
title: "Потоки извлечения данных"
|
||
parent: "Russian (Beta)"
|
||
---
|
||
|
||
# Потоки извлечения данных
|
||
|
||
> **Beta Translation:** This document was translated via Machine Learning and as such may not be 100% accurate. All non-English languages are currently classified as Beta.
|
||
|
||
Этот документ описывает, как данные передаются через конвейер извлечения данных TrustGraph, начиная с отправки документов и заканчивая хранением в хранилищах знаний.
|
||
|
||
## Обзор
|
||
|
||
```
|
||
┌──────────┐ ┌─────────────┐ ┌─────────┐ ┌────────────────────┐
|
||
│ Librarian│────▶│ PDF Decoder │────▶│ Chunker │────▶│ Knowledge │
|
||
│ │ │ (PDF only) │ │ │ │ Extraction │
|
||
│ │────────────────────────▶│ │ │ │
|
||
└──────────┘ └─────────────┘ └─────────┘ └────────────────────┘
|
||
│ │
|
||
│ ├──▶ Triples
|
||
│ ├──▶ Entity Contexts
|
||
│ └──▶ Rows
|
||
│
|
||
└──▶ Document Embeddings
|
||
```
|
||
|
||
## Хранение контента
|
||
|
||
### Blob-хранилище (S3/Minio)
|
||
|
||
Содержимое документов хранится в блочном хранилище, совместимом с S3:
|
||
Формат пути: `doc/{object_id}`, где object_id - это UUID
|
||
Все типы документов хранятся здесь: исходные документы, страницы, фрагменты
|
||
|
||
### Хранилище метаданных (Cassandra)
|
||
|
||
Метаданные документов, хранящиеся в Cassandra, включают:
|
||
Идентификатор документа, заголовок, тип (MIME-тип)
|
||
Ссылку `object_id` на блочное хранилище
|
||
Ссылку `parent_id` для дочерних документов (страниц, фрагментов)
|
||
Тип `document_type`: "source", "page", "chunk", "answer"
|
||
|
||
### Порог для встроенных данных и потоковой передачи
|
||
|
||
Передача контента использует стратегию, основанную на размере:
|
||
**< 2 МБ**: Контент включается непосредственно в сообщение (в кодировке base64)
|
||
**≥ 2 МБ**: Отправляется только `document_id`; процессор извлекает данные через API librarian
|
||
|
||
## Этап 1: Отправка документа (Librarian)
|
||
|
||
### Точка входа
|
||
|
||
Документы поступают в систему через операцию `add-document` librarian:
|
||
1. Контент загружается в блочное хранилище
|
||
2. Создается запись метаданных в Cassandra
|
||
3. Возвращается идентификатор документа
|
||
|
||
### Запуск извлечения
|
||
|
||
Операция `add-processing` запускает извлечение:
|
||
Указывает `document_id`, `flow` (идентификатор конвейера), `collection` (целевое хранилище)
|
||
Операция `load_document()` librarian извлекает контент и публикует его в очередь ввода конвейера
|
||
|
||
### Схема: Document
|
||
|
||
```
|
||
Document
|
||
├── metadata: Metadata
|
||
│ ├── id: str # Document identifier
|
||
│ ├── user: str # Tenant/user ID
|
||
│ ├── collection: str # Target collection
|
||
│ └── metadata: list[Triple] # (largely unused, historical)
|
||
├── data: bytes # PDF content (base64, if inline)
|
||
└── document_id: str # Librarian reference (if streaming)
|
||
```
|
||
|
||
**Маршрутизация**: Основана на поле `kind`:
|
||
`application/pdf` → очередь `document-load` → Декодер PDF
|
||
`text/plain` → очередь `text-load` → Разделитель (Chunker)
|
||
|
||
## Этап 2: Декодер PDF
|
||
|
||
Преобразует документы PDF в текстовые страницы.
|
||
|
||
### Процесс
|
||
|
||
1. Получение содержимого (встроенное `data` или через `document_id` от библиотекаря)
|
||
2. Извлечение страниц с использованием PyPDF
|
||
3. Для каждой страницы:
|
||
Сохранение как дочерний документ в библиотеке (`{doc_id}/p{page_num}`)
|
||
Отправка информации о происхождении (страница получена из документа)
|
||
Передача разделителю (chunker)
|
||
|
||
### Схема: TextDocument
|
||
|
||
```
|
||
TextDocument
|
||
├── metadata: Metadata
|
||
│ ├── id: str # Page URI (e.g., https://trustgraph.ai/doc/xxx/p1)
|
||
│ ├── user: str
|
||
│ ├── collection: str
|
||
│ └── metadata: list[Triple]
|
||
├── text: bytes # Page text content (if inline)
|
||
└── document_id: str # Librarian reference (e.g., "doc123/p1")
|
||
```
|
||
|
||
## Этап 3: Разделение на фрагменты
|
||
|
||
Разделяет текст на фрагменты заданного размера.
|
||
|
||
### Параметры (настраиваются в процессе выполнения)
|
||
|
||
`chunk_size`: Целевой размер фрагмента в символах (по умолчанию: 2000)
|
||
`chunk_overlap`: Перекрытие между фрагментами (по умолчанию: 100)
|
||
|
||
### Процесс
|
||
|
||
1. Получение содержимого текста (встроенного или через библиотеку)
|
||
2. Разделение с использованием рекурсивного разделителя символов
|
||
3. Для каждого фрагмента:
|
||
Сохранение как дочерний документ в библиотеке (`{parent_id}/c{index}`)
|
||
Вывод информации о происхождении (фрагмент получен из страницы/документа)
|
||
Передача на этапы обработки извлечения
|
||
|
||
### Схема: Фрагмент
|
||
|
||
```
|
||
Chunk
|
||
├── metadata: Metadata
|
||
│ ├── id: str # Chunk URI
|
||
│ ├── user: str
|
||
│ ├── collection: str
|
||
│ └── metadata: list[Triple]
|
||
├── chunk: bytes # Chunk text content
|
||
└── document_id: str # Librarian chunk ID (e.g., "doc123/p1/c3")
|
||
```
|
||
|
||
### Иерархия идентификаторов документов
|
||
|
||
Дочерние документы кодируют свою родословную в идентификаторе:
|
||
Источник: `doc123`
|
||
Страница: `doc123/p5`
|
||
Часть страницы: `doc123/p5/c2`
|
||
Часть текста: `doc123/c2`
|
||
|
||
## Этап 4: Извлечение знаний
|
||
|
||
Доступно несколько шаблонов извлечения, выбираемых конфигурацией потока.
|
||
|
||
### Шаблон A: Базовый GraphRAG
|
||
|
||
Два параллельных процессора:
|
||
|
||
**kg-extract-definitions**
|
||
Вход: Часть текста
|
||
Выход: Тройки (определения сущностей), Контексты сущностей
|
||
Извлекает: метки сущностей, определения
|
||
|
||
**kg-extract-relationships**
|
||
Вход: Часть текста
|
||
Выход: Тройки (отношения), Контексты сущностей
|
||
Извлекает: отношения субъект-предикат-объект
|
||
|
||
### Шаблон B: Основанный на онтологии (kg-extract-ontology)
|
||
|
||
Вход: Часть текста
|
||
Выход: Тройки, Контексты сущностей
|
||
Использует настроенную онтологию для управления извлечением
|
||
|
||
### Шаблон C: Основанный на агентах (kg-extract-agent)
|
||
|
||
Вход: Часть текста
|
||
Выход: Тройки, Контексты сущностей
|
||
Использует агентную платформу для извлечения
|
||
|
||
### Шаблон D: Извлечение строк (kg-extract-rows)
|
||
|
||
Вход: Часть текста
|
||
Выход: Строки (структурированные данные, а не тройки)
|
||
Использует определение схемы для извлечения структурированных записей
|
||
|
||
### Схема: Тройки
|
||
|
||
```
|
||
Triples
|
||
├── metadata: Metadata
|
||
│ ├── id: str
|
||
│ ├── user: str
|
||
│ ├── collection: str
|
||
│ └── metadata: list[Triple] # (set to [] by extractors)
|
||
└── triples: list[Triple]
|
||
└── Triple
|
||
├── s: Term # Subject
|
||
├── p: Term # Predicate
|
||
├── o: Term # Object
|
||
└── g: str | None # Named graph
|
||
```
|
||
|
||
### Схема: EntityContexts
|
||
|
||
```
|
||
EntityContexts
|
||
├── metadata: Metadata
|
||
└── entities: list[EntityContext]
|
||
└── EntityContext
|
||
├── entity: Term # Entity identifier (IRI)
|
||
├── context: str # Textual description for embedding
|
||
└── chunk_id: str # Source chunk ID (provenance)
|
||
```
|
||
|
||
### Схема: Строки
|
||
|
||
```
|
||
Rows
|
||
├── metadata: Metadata
|
||
├── row_schema: RowSchema
|
||
│ ├── name: str
|
||
│ ├── description: str
|
||
│ └── fields: list[Field]
|
||
└── rows: list[dict[str, str]] # Extracted records
|
||
```
|
||
|
||
## Этап 5: Генерация векторных представлений (эмбеддингов)
|
||
|
||
### Векторные представления графа
|
||
|
||
Преобразует контексты сущностей в векторные представления.
|
||
|
||
**Процесс:**
|
||
1. Получение контекстов сущностей (EntityContexts)
|
||
2. Вызов сервиса генерации векторных представлений с текстом контекста
|
||
3. Вывод векторных представлений графа (отображение сущности во вектор)
|
||
|
||
**Схема: Векторные представления графа (GraphEmbeddings)**
|
||
|
||
```
|
||
GraphEmbeddings
|
||
├── metadata: Metadata
|
||
└── entities: list[EntityEmbeddings]
|
||
└── EntityEmbeddings
|
||
├── entity: Term # Entity identifier
|
||
├── vector: list[float] # Embedding vector
|
||
└── chunk_id: str # Source chunk (provenance)
|
||
```
|
||
|
||
### Векторные представления документов
|
||
|
||
Преобразует текстовые фрагменты непосредственно в векторные представления.
|
||
|
||
**Процесс:**
|
||
1. Получение фрагмента текста
|
||
2. Вызов сервиса векторизации с текстом фрагмента
|
||
3. Вывод векторного представления документа
|
||
|
||
**Схема: Векторное представление документа**
|
||
|
||
```
|
||
DocumentEmbeddings
|
||
├── metadata: Metadata
|
||
└── chunks: list[ChunkEmbeddings]
|
||
└── ChunkEmbeddings
|
||
├── chunk_id: str # Chunk identifier
|
||
└── vector: list[float] # Embedding vector
|
||
```
|
||
|
||
### Встраивания строк
|
||
|
||
Преобразует поля индекса строк в векторные представления.
|
||
|
||
**Процесс:**
|
||
1. Получение строк
|
||
2. Встраивание настроенных полей индекса
|
||
3. Вывод в хранилище векторов строк
|
||
|
||
## Этап 6: Хранение
|
||
|
||
### Тройной магазин
|
||
|
||
Получает: Тройки
|
||
Хранение: Cassandra (таблицы, ориентированные на сущности)
|
||
Именованные графы разделяют основные знания от информации об источнике:
|
||
`""` (по умолчанию): Факты основных знаний
|
||
`urn:graph:source`: Информация об источнике извлечения
|
||
`urn:graph:retrieval`: Объяснимость во время запроса
|
||
|
||
### Хранилище векторов (Встраивания графов)
|
||
|
||
Получает: Встраивания графов
|
||
Хранение: Qdrant, Milvus или Pinecone
|
||
Индексируется по: IRI сущности
|
||
Метаданные: chunk_id для информации об источнике
|
||
|
||
### Хранилище векторов (Встраивания документов)
|
||
|
||
Получает: Встраивания документов
|
||
Хранение: Qdrant, Milvus или Pinecone
|
||
Индексируется по: chunk_id
|
||
|
||
### Хранилище строк
|
||
|
||
Получает: Строки
|
||
Хранение: Cassandra
|
||
Структура таблицы, определяемая схемой
|
||
|
||
### Хранилище векторов строк
|
||
|
||
Получает: Встраивания строк
|
||
Хранение: Векторная база данных
|
||
Индексируется по: полям индекса строк
|
||
|
||
## Анализ полей метаданных
|
||
|
||
### Активно используемые поля
|
||
|
||
| Поле | Использование |
|
||
|-------|-------|
|
||
| `metadata.id` | Идентификатор документа/фрагмента, ведение журнала, информация об источнике |
|
||
| `metadata.user` | Многопользовательский режим, маршрутизация хранения |
|
||
| `metadata.collection` | Выбор целевой коллекции |
|
||
| `document_id` | Ссылка на библиотекаря, связывание с информацией об источнике |
|
||
| `chunk_id` | Отслеживание информации об источнике через конвейер |
|
||
|
||
<<<<<<< HEAD
|
||
### Потенциально избыточные поля
|
||
|
||
| Поле | Статус |
|
||
|-------|--------|
|
||
| `metadata.metadata` | Устанавливается в `[]` всеми извлекателями; метаданные на уровне документа теперь обрабатываются библиотекарем при отправке |
|
||
=======
|
||
### Удаленные поля
|
||
|
||
| Поле | Статус |
|
||
|-------|--------|
|
||
| `metadata.metadata` | Удалено из класса `Metadata`. Тройки метаданных на уровне документа теперь напрямую выдаются библиотекарем в тройной магазин при отправке, а не передаются через конвейер извлечения. |
|
||
>>>>>>> e3bcbf73 (The metadata field (list of triples) in the pipeline Metadata class)
|
||
|
||
### Шаблон полей байтов
|
||
|
||
Все поля содержимого (`data`, `text`, `chunk`) являются `bytes`, но немедленно декодируются в строки UTF-8 всеми процессорами. Ни один процессор не использует необработанные байты.
|
||
|
||
## Конфигурация потока
|
||
|
||
Потоки определяются внешне и предоставляются библиотекарию через сервис конфигурации. Каждый поток определяет:
|
||
|
||
Входные очереди (`text-load`, `document-load`)
|
||
Цепочка процессоров
|
||
Параметры (размер фрагмента, метод извлечения и т. д.)
|
||
|
||
Пример шаблонов потоков:
|
||
`pdf-graphrag`: PDF → Decoder → Chunker → Definitions + Relationships → Embeddings
|
||
`text-graphrag`: Text → Chunker → Definitions + Relationships → Embeddings
|
||
`pdf-ontology`: PDF → Decoder → Chunker → Ontology Extraction → Embeddings
|
||
`text-rows`: Text → Chunker → Row Extraction → Row Store
|