--- 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: ... (Дальнейшую информацию о вложенных классах ты можешь уточнить у пользователя, если это будет нужно)