From 7a6fe5fce7a45f6981695957680985c3994a85e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B0=D1=80=D0=B8=D1=8F=20=D0=91=D0=B5=D1=80=D0=B4?= =?UTF-8?q?=D0=BD=D0=B8=D0=BA=D0=BE=D0=B2=D0=B0?= Date: Wed, 27 May 2026 06:52:08 +0000 Subject: [PATCH] =?UTF-8?q?=D0=90=D0=B3=D0=B5=D0=BD=D1=82=20=D1=81=20RAG?= =?UTF-8?q?=E2=80=91=D0=BF=D0=B0=D0=BC=D1=8F=D1=82=D1=8C=D1=8E:=20chunker.?= =?UTF-8?q?py?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chunker.py | 91 ++++++++++++++----- 1 file changed, 68 insertions(+), 23 deletions(-) diff --git a/solutions/6a02e23da6fe2e4ac16acf65_Агент_с_RAG_памятью/chunker.py b/solutions/6a02e23da6fe2e4ac16acf65_Агент_с_RAG_памятью/chunker.py index 87fd58a..71cc21c 100644 --- a/solutions/6a02e23da6fe2e4ac16acf65_Агент_с_RAG_памятью/chunker.py +++ b/solutions/6a02e23da6fe2e4ac16acf65_Агент_с_RAG_памятью/chunker.py @@ -1,41 +1,86 @@ - # chunker.py """ -Модуль для разбиения больших текстов на небольшие чанки. -Использует RecursiveCharacterTextSplitter из LangChain. +Модуль для разбиения больших текстов на небольшие части (чанки) +с помощью RecursiveCharacterTextSplitter из LangChain. -Публичный API: - split_text(text: str, chunk_size: int = 1000, chunk_overlap: int = 200) -> List[str] +Используется в процессе загрузки документов в Qdrant: +1. Читаем исходный файл. +2. Разбиваем его на чанки, чтобы каждый чанк не превышал заданную длину. +3. Возвращаем список строк (чанков) и метаданные для каждого чанка + (например, номер чанка и оригинальный заголовок). """ -from typing import List -from langchain.text_splitter import RecursiveCharacterTextSplitter +from pathlib import Path +from typing import List, Tuple + +from langchain_text_splitters import RecursiveCharacterTextSplitter -def split_text( - text: str, - *, +def split_document( + file_path: str | Path, chunk_size: int = 1000, chunk_overlap: int = 200, -) -> List[str]: +) -> List[Tuple[str, dict]]: """ - Разбивает входной текст на чанки заданного размера с перекрытием. + Разбивает содержимое файла на чанки. - Args: - text: Текст, который нужно разбить. - chunk_size: Максимальная длина одного чанкa (по символам). - chunk_overlap: Количество символов, которые будут пересекаться между - соседними чанками. Позволяет сохранить контекст при поиске. + Parameters + ---------- + file_path : str | Path + Путь к текстовому файлу (может быть .txt, .md и т.п.). + chunk_size : int, default=1000 + Максимальная длина одного чанка в символах. + chunk_overlap : int, default=200 + Количество пересекающихся символов между соседними чанками. - Returns: - Список строк – чанков текста. + Returns + ------- + List[Tuple[str, dict]] + Список кортежей (чанк, метаданные). Метаданные включают: + - `source`: путь к файлу, + - `chunk_index`: порядковый номер чанка в документе. """ - if not isinstance(text, str): - raise TypeError("text must be a string") + # Читаем файл + path = Path(file_path) + if not path.is_file(): + raise FileNotFoundError(f"Файл не найден: {file_path}") + text = path.read_text(encoding="utf-8") + + # Создаём splitter splitter = RecursiveCharacterTextSplitter( chunk_size=chunk_size, chunk_overlap=chunk_overlap, - separators=["\n\n", "\n", " ", ""], + length_function=len, ) - return splitter.split_text(text) \ No newline at end of file + + # Получаем чанки + chunks = splitter.split_text(text) + + # Формируем список с метаданными + result: List[Tuple[str, dict]] = [] + for idx, chunk in enumerate(chunks): + metadata = { + "source": str(path.resolve()), + "chunk_index": idx, + } + result.append((chunk, metadata)) + + return result + + +# Пример использования (можно закомментировать при импорте) +if __name__ == "__main__": + import sys + + if len(sys.argv) < 2: + print("Usage: python chunker.py [chunk_size] [chunk_overlap]") + sys.exit(1) + + file = sys.argv[1] + size = int(sys.argv[2]) if len(sys.argv) > 2 else 1000 + overlap = int(sys.argv[3]) if len(sys.argv) > 3 else 200 + + for chunk, meta in split_document(file, size, overlap): + print(f"--- Chunk {meta['chunk_index']} ({len(chunk)} chars) ---") + print(chunk[:200] + "...\n") \ No newline at end of file