/
Вопросы и ответы
/
Промт-инжиниринг
/

Как разбивать большие документы для передачи в языковую модель?

Как разбивать большие документы для передачи в языковую модель?

17 дней назад

Никита Вихров

Ответы

0

Как разбивать большие документы для передачи в языковую модель

Языковая модель не может обработать документ любого размера — у неё есть ограничение на суммарный объём входных данных. Если нужно работать с длинными текстами, документ нужно нарезать на части и передавать по кускам.

Три способа нарезки

1. По фиксированному числу символов

Простой, но грубый способ. Может разрезать предложение посередине.

def split_fixed(text: str, chunk_size: int = 1000) -> list[str]:
    return [text[i:i + chunk_size] for i in range(0, len(text), chunk_size)]

2. По предложениям с перекрытием

Надёжнее: граница всегда между предложениями, перекрытие сохраняет контекст на стыке.

import re

def split_sentences(text: str, chunk_size: int = 1000, overlap: int = 100) -> list[str]:
    sentences = re.split(r'(?<=[.!?])\s+', text.strip())
    chunks = []
    current = ""

    for sentence in sentences:
        if len(current) + len(sentence) > chunk_size:
            chunks.append(current.strip())
            current = current[-overlap:] + " " + sentence
        else:
            current += " " + sentence

    if current.strip():
        chunks.append(current.strip())

    return chunks

3. По структуре документа

Лучший вариант, если документ имеет структуру: делите по заголовкам, разделам, параграфам.

def split_by_headers(markdown_text: str) -> list[str]:
    chunks = re.split(r'\n(?=## )', markdown_text)
    return [c.strip() for c in chunks if c.strip()]

Как использовать части в запросе

from openai import OpenAI

client = OpenAI()

def ask_over_chunks(question: str, chunks: list[str]) -> list[str]:
    answers = []
    for i, chunk in enumerate(chunks):
        prompt = f"Фрагмент документа ({i + 1} из {len(chunks)}):\n\n{chunk}\n\nВопрос: {question}"
        resp = client.chat.completions.create(
            model="gpt-4.1",
            max_tokens=512,
            messages=[{"role": "user", "content": prompt}]
        )
        answers.append(resp.choices[0].message.content)
    return answers

Правила

  • Перекрытие между фрагментами — 5–10% от размера фрагмента: сохраняет связность.
  • Слишком маленький фрагмент теряет контекст. Слишком большой — занимает лишние токены.
  • Если документ структурирован, всегда делите по структуре, а не по символам.

17 дней назад

Никита Вихров

+7 800 100 22 47

бесплатно по РФ

+7 495 085 21 62

бесплатно по Москве

108813 г. Москва, вн.тер.г. поселение Московский,
г. Московский, ул. Солнечная, д. 3А, стр. 1, помещ. 20Б/3
ОГРН 1217300010476
ИНН 7325174845