RAG_AIEXP_01 / README.md
MrSimple07's picture
new version with document uploading + fixed readme + xlsx processer inside documents prep
5099a0a
---
title: RAG AIEXP 0
emoji: 🔥
colorFrom: blue
colorTo: gray
sdk: gradio
sdk_version: 5.42.0
app_file: app.py
pinned: false
---
# AIEXP — RAG pipeline for normative documents (README)
Кратко: репозиторий содержит конвейер загрузки и подготовки нормативных документов (JSON/CSV/таблицы/изображения), нормализации терминов (марки стали, обозначения соединений), чанкинга, построения векторного индекса и Gradio UI для семантического поиска и ответов.
---
## Содержание README
1. Требования
2. Быстрая установка
3. Переменные окружения / конфигурация
4. Структура данных / куда класть новые документы
5. Процесс подготовки данных (что делает pipeline)
6. Параметры чанкинга и частые ошибки
7. Построение индекса и создание query engine
8. Запуск приложения (локально / Windows)
9. Отладка и полезные утилиты
10. Как добавить новые документы
11. Частые ошибки и их исправления
---
## 1) Требования
- Python 3.10+
- pip, git
- Доступ к Hugging Face dataset (repo_id) для загрузки исходных JSON/CSV
- API-ключи (для LLM / embeddings) при использовании удалённых моделей
Пример зависимостей (создайте requirements.txt):
- llama-index (соответствующая версия)
- gradio>=5
- sentence-transformers
- huggingface-hub
- sentencepiece (если нужно)
- pandas
- cross-encoder
- другие: см. ваш проектный requirements
---
## 2) Быстрая установка
Windows PowerShell:
```powershell
python -m venv .venv
.\.venv\Scripts\Activate.ps1
pip install -r requirements.txt
```
Bash / Linux:
```bash
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
```
---
## 3) Переменные окружения / конфигурация
Отредактируйте `config.py` или установите переменные окружения:
PowerShell:
```powershell
$env:GOOGLE_API_KEY="your_google_api_key"
$env:OPENAI_API_KEY="your_openai_api_key"
$env:HF_TOKEN="your_hf_token"
```
Bash:
```bash
export GOOGLE_API_KEY="your_google_api_key"
export OPENAI_API_KEY="your_openai_api_key"
export HF_TOKEN="your_hf_token"
```
Основные настройки в `config.py`:
- CHUNK_SIZE (токены/символы для текстов)
- CHUNK_OVERLAP
- MAX_CHARS_TABLE / MAX_ROWS_TABLE — параметры чанкинга таблиц
- HF_REPO_ID, TABLE_DATA_DIR, JSON_FILES_DIR, IMAGE_DATA_DIR
---
## 4) Структура данных и форматы
AIEXP_RAG/
│── app.py # Main entry point (Gradio)
│── requirements.txt # Dependencies
│── data/ # Documents, tables, images
│── notebooks/ # Preprocessing notebooks
│── src/ # Source code (preprocess + rag)
- Текстовые документы: JSON (с полями document_metadata, sections/subsections)
- Таблицы: JSON (sheets → headers, data, table_number, table_title, section, sheet_name)
- Изображения: CSV (строки с полями: Обозначение документа, № Изображения, Название изображения, Описание)
При загрузке pipeline:
- `load_json_documents` — парсит текстовые разделы
- `load_table_documents` — парсит таблицы и запускает `chunk_table_by_content`
- `load_image_documents` — создает описательные чанки
Если вы добавляете новые данные на HF, положите их в соответствующие папки (см. `config.py`).
---
## 5) Что делает pipeline (пошагово)
1. Загрузка файлов с HF (JSON/ZIP/CSV)
2. Извлечение разделов документа (text)
3. Нормализация:
- `normalize_text` — нормализует типы соединений (C/С)
- `normalize_steel_designations` — нормализует марки стали (латиница ↔ кириллица)
4. Чанкинг:
- Текст: SentenceSplitter (CHUNK_SIZE, CHUNK_OVERLAP)
- Таблицы: собираются строки в чанки по правилам (header + строки) до MAX_CHARS_TABLE или MAX_ROWS_TABLE
5. Метаданные: минимальный набор (type, document_id, table_number, table_title, section, connection_type)
6. Построение VectorStoreIndex из всех чанков
---
## 6) Параметры чанкинга и частые ошибки
- Metadata length > chunk size:
- Ошибка: ValueError: Metadata length (...) is longer than chunk size (1024).
- Решение: увеличить CHUNK_SIZE или уменьшить размер поля metadata (не класть большие тексты в metadata).
- Если строки таблиц очень длинные, уменьшение MAX_CHARS_TABLE не даст эффекта — проверяйте длины отдельных строк.
- Рекомендация: комбинировать ограничения по символам и по числу строк (MAX_CHARS_TABLE и MAX_ROWS_TABLE).
---
## 7) Построение индекса и query engine
- create_vector_index(documents) — строит VectorStoreIndex и логирует статистику по типам соединений и таблицам.
- create_query_engine(vector_index, vector_top_k, bm25_top_k, similarity_cutoff, hybrid_top_k) — конфигурируемый гибридный retriever (Vector + BM25 + QueryFusion).
- Ререйтер `rerank_nodes(query, nodes, reranker, top_k, min_score_threshold)` — использует CrossEncoder для финального ранжирования.
Советы:
- Нормализуйте document_id (удалите лишние пробелы, суффиксы года) для точного фильтрования по документу.
- При поиске по типам соединений (C-25 / С-25) всегда нормализуйте символ 'C'/'С' в данных и в запросе.
---
## 8) Запуск приложения (Gradio)
Локально:
```bash
python app.py
```
Важно:
- Вызов `gr.api(...)` должен быть внутри `with gr.Blocks(...) as demo:` блока.
- Функции, которые вы регистрируете как Gradio API, должны иметь полные type-hints (например `def retrieve_chunks(question: str, top_k: int = 20) -> list:`).
---
## 9) Отладка и полезные утилиты
- Логирование: используйте `log_message(...)` — логирование подробностей в stdout/файл.
- Функции для отладки:
- `debug_search_tables(vector_index, search_term="С-25")` — найдет таблицы по вхождению термина.
- В `create_query_engine` можно добавить дополнительный перечисляющий лог (поиск по 'C-25' / 'С-25').
- Частые проверки:
- Сколько чанков получилось: итог в `load_all_documents`.
- Показать примерные превью чанков при отладке (первые 200 символов).
- Дедупликация: `deduplicate_nodes(nodes)` — как формируются идентификаторы.
---
## 10) Как добавить новые документы
1. Подготовьте JSON/CSV в формате, согласованном с pipeline.
2. Загрузите в HF dataset (REPO_ID указанный в config.py) в соответствующую директорию:
- JSON → `JSON_FILES_DIR`
- Таблицы → `TABLE_DATA_DIR`
- Изображения (CSV) → `IMAGE_DATA_DIR`
3. Обновите config (если новые директории)
4. Перезапустите `app.py` — или только шаги подготовки:
- Запустите `load_all_documents(...)` и формирование индекса заново (см. app.initialize_system).
---
## 11) Частые ошибки и быстрые исправления
- Gradio: "Cannot call api() outside of a gradio.Blocks context." → переместить `gr.api(...)` внутрь блока.
- Gradio: "API endpoints must have type hints." → добавить type-hints в сигнатуру.
- Pydantic / Document immutability: "can't set attribute 'text'" → не изменяйте `doc.text` напрямую, создавайте новый `Document(text=..., metadata=doc.metadata)`.
- Метаданные слишком большие → уменьшить metadata или увеличить CHUNK_SIZE.
- Кириллическая/латинская буква 'C' mismatch → нормализуйте и в запросе, и в данных (функция `normalize_text` / `normalize_connection_type`).
---
## Примеры команд (Windows)
Установка env vars (PowerShell):
```powershell
$env:HF_TOKEN="hf_xxx"
$env:GOOGLE_API_KEY="xxx"
$env:OPENAI_API_KEY="xxx"
python app.py
```
---
## Консистентность метаданных (важно)
- Храните в metadata минимально нужные поля:
- type, document_id, table_number, table_title, section, connection_type, chunk_id/row_start/row_end (при табличных чанках)
- Избегайте кладения больших текстов в metadata.
---
## Testing on Huggingface
https://mrsimple01-rag-aiexp-01.hf.space/