mirror of
https://github.com/trustgraph-ai/trustgraph.git
synced 2026-04-25 08:26:21 +02:00
356 lines
17 KiB
Markdown
356 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
|