0Pricing
AI Agents · Урок

Индексация набора документов

Преобразуйте каждый фрагмент в эмбеддинг и сохраните векторы в индексе — это этап офлайн-подготовки любой системы RAG.

«Индексация набора документов» — бесплатный урок AI Agents на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения AI Agents, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс AI Agents содержит 4 уроков всего.

Конвейер загрузки данных

Офлайн-конвейер RAG состоит из четырёх шагов:

  1. Загрузить документы (PDF, HTML, MD)
  2. Разделить на фрагменты каждый документ
  3. Получить эмбеддинги каждого фрагмента
  4. Сохранить векторы и метаданные в индексе

Шаг 1: загрузка документов

Используйте специализированные загрузчики для разных форматов:

# PDFs
from pypdf import PdfReader
text = ''
for page in PdfReader('doc.pdf').pages:
    text += page.extract_text()

# HTML
from bs4 import BeautifulSoup
text = BeautifulSoup(html, 'html.parser').get_text()

# Markdown — just read the file
text = open('doc.md').read()

Шаг 2: разбиение на фрагменты

Используйте инструмент разбиения из предыдущего урока:

from langchain.text_splitter import RecursiveCharacterTextSplitter
splitter = RecursiveCharacterTextSplitter(chunk_size=800, chunk_overlap=100)
chunks = splitter.split_text(text)

Шаг 3: получение эмбеддингов пакетами

Получайте эмбеддинги нескольких фрагментов за один вызов API:

from openai import OpenAI
client = OpenAI()

def embed_batch(texts, batch_size=100):
    vectors = []
    for i in range(0, len(texts), batch_size):
        batch = texts[i:i + batch_size]
        resp = client.embeddings.create(model='text-embedding-3-small', input=batch)
        vectors.extend(d.embedding for d in resp.data)
    return vectors

Шаг 4: сохранение

Для 10k–50k фрагментов достаточно FAISS или Chroma:

import chromadb
client = chromadb.Client()
collection = client.create_collection('docs')

collection.add(
    ids=[f'doc-{i}' for i in range(len(chunks))],
    embeddings=vectors,
    documents=chunks,
    metadatas=[{'source': 'doc.pdf', 'page': i} for i in range(len(chunks))]
)

Идемпотентная загрузка

Сделайте загрузку безопасной для повторного запуска. Используйте детерминированные идентификаторы (хеш содержимого), чтобы повторный запуск не создавал дубликаты:

import hashlib

def chunk_id(source, text):
    h = hashlib.sha256(text.encode()).hexdigest()[:16]
    return f'{source}:{h}'

print(chunk_id('handbook.pdf', 'Employees get 20 vacation days per year.'))
print(chunk_id('handbook.pdf', 'Employees get 20 vacation days per year.'))

Инкрементальные обновления

Когда документ изменяется:

  1. Вычислите новые фрагменты
  2. Сравните их с существующими идентификаторами
  3. Удалите исчезнувшие, добавьте новые, сохраните неизменившиеся

Наивный подход (удалить всё и вставить заново) подходит для небольших корпусов, но приводит к лишним вызовам API для получения эмбеддингов.

Метаданные для фильтрации

Включайте любое поле, по которому может понадобиться фильтрация в дальнейшем:

metadata = {
    'source': '/docs/handbook.pdf',
    'page': 42,
    'department': 'engineering',
    'updated_at': '2024-08-12',
    'access_level': 'internal'
}
for k, v in metadata.items():
    print(f"{k}: {v}")

Ход выполнения и контрольные точки

При больших объёмах загрузки записывайте ход выполнения и сохраняйте контрольные точки:

for i, batch in enumerate(batches):
    embed_and_store(batch)
    if i % 10 == 0:
        save_checkpoint(i)
        print(f'Processed {i * 100} chunks')

Ограничения частоты запросов

У эмбеддингов OpenAI высокое, но реальное ограничение частоты запросов. Используйте семафоры или повторные попытки `tenacity`:

from asyncio import Semaphore
sem = Semaphore(10)  # 10 concurrent embed calls max

async def safe_embed(batch):
    async with sem:
        return await client.embeddings.create(...)

Проверка индекса

После загрузки выполните несколько тестовых запросов и вручную проверьте результаты. Если ничего релевантного не найдено, значит, разбиение на фрагменты или получение эмбеддингов работает неправильно — выясните причину раньше пользователей.

Версионирование индекса

Версионируйте индекс, чтобы можно было перейти на новую модель разбиения или эмбеддингов без простоя:

collection = client.create_collection(f'docs-v2-{date.today()}')
# old collection stays live until new one is validated

Идемпотентные идентификаторы

Зачем использовать хеши содержимого в качестве идентификаторов фрагментов?

Итоги

Загрузить → разделить на фрагменты → получить эмбеддинги → сохранить, используя идемпотентные идентификаторы и метаданные. Индекс — основа каждого последующего этапа извлечения.

Часто задаваемые вопросы

Урок «Индексация набора документов» бесплатный?

Да — полный текст урока «Индексация набора документов» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс AI Agents, подпишись на CoddyKit PRO. Курс AI Agents содержит 4 уроков всего.

Чему я научусь в уроке «Индексация набора документов»?

Преобразуйте каждый фрагмент в эмбеддинг и сохраните векторы в индексе — это этап офлайн-подготовки любой системы RAG. Ты практикуешь AI Agents с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать AI Agents?

Предыдущий опыт не требуется. AI Agents на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «Индексация набора документов»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке AI Agents?

Да. Каждый урок AI Agents включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Что решает RAG (ограниченность знаний, галлюцинации)
  2. Стратегии разбиения (фиксированные, по предложениям, семантические)
  3. Индексация набора документов
  4. Создание простого RAG с FAISS или Chroma
← Назад к AI Agents