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