Spaces:
Sleeping
Sleeping
File size: 5,076 Bytes
86c402d |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 |
---
description:
globs:
alwaysApply: true
---
# Project description
Данный проект представляет собой библиотеку, предоставляющую возможности для чанкинга и сборки
инъекций в промпт LLM для дальнейшего использования в RAG-системах. Основная логика описана в README.md и в architectures, если они не устарели. Ядро системы представляют классы LinkerEntity, Destructurer, EntityRepository, InjectionBuilder, ChunkingStrategy.
- LinkerEntity – основная сущность, от которой затем наследуются Chunk и DocumentAsEntity. Реализует триплетный подход, при котором один и тот же класс задаёт и сущности, и связи, и при этом сущности-ассоциации реализуются одним экземпляром, а не множеством.
- Destructurer – реализует логику разбиения документа на множество LinkerEntity, во многом делегируя работу различным ChunkingStrategy (но не всю).
- EntityRepository – интерфейс. Предполагается, что после извлечения всех сущностей посредством Destructurer пользователь библиотеки сохранит все свои сущности некоторым произвольным образом, например, в csv-файл или PostgreSQL. Библиотека не знает, как работать с пользовательскими хранилищами данных, поэтому пользователь должен сам написать реализацию EntityRepository для своего решения, и предоставить её в InjectionBuilder
- InjectionBuilder – сборщик промпт-инъекции. Принимает на вход отфильтрованный и (в отдельных случаях) оценённый некоторым скором набор сущностей, сортирует их, распределяет по документам и собирает всё в единый текст, пользуясь EntityRepository, чтобы достать связанные полезные сущности
Данная библиотека ориентируется на ParsedDocument из библиотеки ntr_fileparser, структура которого примерно соответствует следующему:
@dataclass
class ParsedDocument(ParsedStructure):
"""
Документ, полученный в результате парсинга.
"""
name: str = ""
type: str = ""
meta: ParsedMeta = field(default_factory=ParsedMeta)
paragraphs: list[ParsedTextBlock] = field(default_factory=list)
tables: list[ParsedTable] = field(default_factory=list)
images: list[ParsedImage] = field(default_factory=list)
formulas: list[ParsedFormula] = field(default_factory=list)
def to_string() -> str:
...
def to_dict() -> dict:
...
@dataclass
class ParsedTextBlock(DocumentElement):
"""
Текстовый блок документа.
"""
text: str = ""
style: TextStyle = field(default_factory=TextStyle)
anchors: list[str] = field(default_factory=list) # Список идентификаторов якорей (закладок)
links: list[str] = field(default_factory=list) # Список идентификаторов ссылок
# Технические метаданные о блоке
metadata: list[dict[str, Any]] = field(default_factory=list) # Для хранения технической информации
# Примечания и сноски к тексту
footnotes: list[dict[str, Any]] = field(default_factory=list) # Для хранения сносок
title_of_table: int | None = None
def to_string() -> str:
...
def to_dict() -> dict:
...
@dataclass
class ParsedTable(DocumentElement):
"""
Таблица из документа.
"""
title: str | None = None
note: str | None = None
classified_tags: list[TableTag] = field(default_factory=list)
index: list[str] = field(default_factory=list)
headers: list[ParsedRow] = field(default_factory=list)
subtables: list[ParsedSubtable] = field(default_factory=list)
table_style: dict[str, Any] = field(default_factory=dict)
title_index_in_paragraphs: int | None = None
def to_string() -> str:
...
def to_dict() -> dict:
...
(Дальнейшую информацию о вложенных классах ты можешь уточнить у пользователя, если это будет нужно) |