Индексация набора документов
Преобразуйте каждый фрагмент в эмбеддинг и сохраните векторы в индексе — это этап офлайн-подготовки любой системы RAG.
«Индексация набора документов» — бесплатный урок AI Agents на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения AI Agents, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс AI Agents содержит 4 уроков всего.
Конвейер загрузки данных
Офлайн-конвейер RAG состоит из четырёх шагов:
- Загрузить документы (PDF, HTML, MD)
- Разделить на фрагменты каждый документ
- Получить эмбеддинги каждого фрагмента
- Сохранить векторы и метаданные в индексе
Шаг 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.'))
Инкрементальные обновления
Когда документ изменяется:
- Вычислите новые фрагменты
- Сравните их с существующими идентификаторами
- Удалите исчезнувшие, добавьте новые, сохраните неизменившиеся
Наивный подход (удалить всё и вставить заново) подходит для небольших корпусов, но приводит к лишним вызовам 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 — локальная установка не требуется.
Все уроки этого курса
- Что решает RAG (ограниченность знаний, галлюцинации)
- Стратегии разбиения (фиксированные, по предложениям, семантические)
- Индексация набора документов
- Создание простого RAG с FAISS или Chroma