Головна / Статті

Кінцево-кінцевий RAG з Chroma, FastAPI та Llama 3.2

Повністю інтегрований асистент RAG від початку до кінця: розділення PDF на частини, переранжування за допомогою крос-енкодера, Chroma, Llama 3.2 на Ollama, FastAPI, Docker, pytest та GitHub Actions у процесі CI.

Видавець: REACTAPP.TOP8 хв читання1747 слів

Джерела: I Built a Production-Style RAG Knowledge Assistant with Python, ChromaDB, FastAPI, and Llama 3.2

RAG у форматі виробництва: імпорт до CI

Практичний асистент знань із посиланнями на джерела — імпорт PDF, семантичний пошук, переранжування, локальне генерація за допомогою Llama, FastAPI, Docker та GitHub Actions — який є системою навчання, а не простим інструментом для експериментів.

Після першого експерименту з MCP наступною проблемою була генерація з підсиленням за допомогою пошуку із оцінкою та пакетуванням, а не ще один варіант «завантаження PDF у Colab».

Цілі

Індексувати документи у постійному векторному сховищі; отримувати інформацію, переранжувати результати та надавати відповіді з посиланнями на джерела; надавати дані через HTTP; оцінювати якість за допомогою простих тестів та pytest; контейнеризувати систему та під’єднати до CI, щоб будь-які зміни одразу помічалися.

Архітектура

Скетч індексації:

Documents
   ↓
Chunking
   ↓
Embeddings
   ↓
Vector Database
   ↓
Semantic Retrieval
   ↓
Reranking
   ↓
LLM
   ↓
Grounded Answer + Sources

Шлях завантаження документів:

PDF Documents
      ↓
Document Loading
      ↓
Text Chunking
      ↓
Embeddings
      ↓
ChromaDB

Шлях обробки запитів та надання відповідей:

User Question
      ↓
Semantic Retrieval
      ↓
Cross-Encoder Reranking
      ↓
Prompt Construction
      ↓
Llama 3.2
      ↓
Grounded Answer
      ↓
Source Citations

1. Імпорт даних

Завантажуйте PDF-файли у документи у стилі LangChain, зберігаючи метадані сторінок для подальших посилань. Погані засоби завантаження можуть спричинити проблеми з посиланнями пізніше.

2. Розділення на частини

Chunk size: 1000 characters
Chunk overlap: 200 characters

Перекриття дозволяє реченням, які знаходяться на межах частин, не зникати під час отримання даних. Використовуйте розміри як параметри конфігурації, а не як магічні числа, приховані в клітинці нотатника.

3. Ембеддинги

sentence-transformers/all-MiniLM-L6-v2

Простий інструмент типу sentence-transformer дозволяє запускати демонстрацію на ноутбуці та водночас забезпечує достатню якість для англійських технічних документів.

4. Стабільність Chroma

Document
   ↓
Chunks
   ↓
Embedding Vectors
   ↓
ChromaDB

Частини зберігаються у вигляді векторів на диску, тому після перезапуску не потрібно повторно створювати ембеддинги. Оновлюйте назву колекції, коли змінюється стратегія розділення на частини.

5. Семантичне пошук

documents = vector_store.similarity_search(
    query=query,
    k=top_k
)

Використовуйте топ-k сусідніх елементів як перший результат перед тим, як витрачати ресурси крос-енкодера.

6. Переурочування рейтингів крос-енкодером

cross-encoder/ms-marco-MiniLM-L-6-v2
User Question
      ↓
Vector Search
      ↓
Candidate Documents
      ↓
CrossEncoder
      ↓
Reranked Documents

Bi-encoder recall у поєднанні з точністю cross-encoder є стандартною двоступеневою схемою для систем RAG, чутливих до якості.

7. Фіксація параметрів LLM

Під час створення запиту внесені ранжовані уривки використовуються як номеровані джерела:

[Source 1]
Retrieved document content...
[Source 2]
Retrieved document content...[Source 3]
Retrieved document content...

Накажіть моделі відповідати лише на основі цих блоків та посилатися на них. Відхиляйте запити, якщо контекст порожній.

8. Локальний Llama через Ollama

Генерація тексту відбувається безпосередньо на пристрої для забезпечення конфіденційності та економії коштів. Збережіть цю тег-інформацію в конфігурації та перевірте процес Ollama перед прийняттям запитів.

9. Інтерфейс FastAPI

GET /health
POST /query

Перевірка стану системи за допомогою зондів; запит до шляху RAG. Зробіть сервіс мінімалістичним — використовуйте ту саму схему обробки, що й CLI.

Нагадування про повний процес обробки запитів:

Question
   ↓
Semantic Retrieval
   ↓
Retrieved Chunks
   ↓
CrossEncoder Reranking
   ↓
Grounded Prompt
   ↓
Llama 3.2
   ↓
Answer + Citations

10. Оцінка

Questions evaluated: 5
Questions passed: 5
Keyword Match Rate: 100.00%
Hit Rate@K
Recall@K
MRR
Answer Relevance
Faithfulness
Citation Correctness

Перевірка ключових слів та показники пошуку (частота влучань, рекал, MRR, релевантність відповідей) допомагають виявити приховані зниження якості, коли змінюються ембеддинги чи запити.

11. pytest

API health endpoint
Document chunking
Document retrieval
3 passed

Тести на стан покриття коду, розділення на частини та процес пошуку дозволяють швидко виявити проблеми.

12. Урок Docker

Часто трапляються несподіванки щодо розміру зображень, коли моделі потрапляють у окремі шари:

1.36 GB
1.36 GB
2.56 KB

Належним чином ігноруйте кеші та віртуальні середовища:

.venv/
__pycache__/
*.pyc
.pytest_cache/
.git/
.github/
.env
chroma_db/
data/sample/*.pdf
*.log

Краще монтувати кеші моделей під час виконання, щоб розмір файлів залишався невеликим.

13. GitHub Actions

Push / Pull Request
        ↓
GitHub Actions
        ↓
Checkout Repository
        ↓
Set Up Python
        ↓
Install Dependencies
        ↓
Run pytest

Запити push та pull мають виконувати перевірку формату коду, модульні тести, а також за потреби — простий тест оцінки з використанням фікстур.

Стек, складність, наступні кроки

Document Processing
        ↓
Chunking
        ↓
Embeddings
        ↓
Vector Storage
        ↓
Retrieval
        ↓
Reranking
        ↓
Prompt Construction
        ↓
LLM Generation
        ↓
Citation Handling
        ↓
Evaluation
        ↓
API
        ↓
Testing
        ↓
Deployment

Складні проблеми полягали не стільки у необхідності виклику LLM, скільки у межах чанків, затримках під час переранкування, форматуванні цитат та надмірному розмірі шарів Docker. Наступні оновлення: гібридний пошук, більший набір даних для оцінки з мітками, автентифікація перед FastAPI та можливості моніторингу затримок під час отримання даних.

Підхід у стилі продакшн означає, що процеси оцінки та пакування відбуваються разом із ідеями, записаними в ноутбуці — але це не означає, що один ноутбук може замінити команду платформи.

Відстежуйте розмір та ступінь перекриття чанків у конфігурації, щоб експерименти залишалися порівнянними між різними гілками.

Відстежуйте розмір та ступінь перекриття чанків у конфігурації, щоб експерименти залишалися порівнянними між різними гілками.

Відстежуйте розмір та ступінь перекриття чанків у конфігурації, щоб експерименти залишалися порівнянними між різними гілками.

Відстежуйте розмір та ступінь перекриття чанків у конфігурації, щоб експерименти залишалися порівнянними між різними гілками.

Відстежуйте розмір та ступінь перекриття чанків у конфігурації, щоб експерименти залишалися порівнянними між різними гілками.

Відстежуйте розмір та ступінь перекриття частин у конфігурації, щоб експерименти залишалися порівнянними між різними гілками.

Відстежуйте розмір та ступінь перекриття частин у конфігурації, щоб експерименти залишалися порівнянними між різними гілками.

Відстежуйте розмір та ступінь перекриття частин у конфігурації, щоб експерименти залишалися порівнянними між різними гілками.

Відстежуйте розмір та ступінь перекриття частин у конфігурації, щоб експерименти залишалися порівнянними між різними гілками.

Відстежуйте розмір та ступінь перекриття частин у конфігурації, щоб експерименти залишалися порівнянними між різними гілками.

Відстежуйте розмір та ступінь перекриття частин у конфігурації, щоб експерименти залишалися порівнянними між різними гілками.

Відстежуйте розмір та ступінь перекриття частин у конфігурації, щоб експерименти залишалися порівнянними між різними гілками.

Відстежуйте розмір та ступінь перекриття частин у конфігурації, щоб експерименти залишалися порівнянними між різними гілками.

Відстежуйте розмір та ступінь перекриття частин у конфігурації, щоб експерименти залишалися порівнянними між різними гілками.

Відстежуйте розмір та ступінь перекриття частин у конфігурації, щоб експерименти залишалися порівнянними між різними гілками.

Відстежуйте розмір та ступінь перекриття частин у конфігурації, щоб експерименти залишалися порівнянними між різними гілками.

Відстежуйте розмір та ступінь перекриття частин у конфігурації, щоб експерименти залишалися порівнянними між різними гілками.

Відстежуйте розмір та ступінь перекриття частин у конфігурації, щоб експерименти залишалися порівнянними між різними гілками.

Відстежуйте розмір та ступінь перекриття частин у конфігурації, щоб експерименти залишалися порівнянними між різними гілками.

Відстежуйте розмір та ступінь перекриття частин у конфігурації, щоб експерименти залишалися порівнянними між різними гілками.

Відстежуйте розмір та ступінь перекриття частин у конфігурації, щоб експерименти залишалися порівнянними між різними гілками.

Відстежуйте розмір та ступінь перекриття частин у конфігурації, щоб експерименти залишалися порівнянними між різними гілками.

Відстежуйте розмір та ступінь перекриття частин у конфігурації, щоб експерименти залишалися порівнянними між різними гілками.

Відстежуйте розмір та ступінь перекриття частин у конфігурації, щоб експерименти залишалися порівнянними між різними гілками.

Відстежуйте розмір та ступінь перекриття частин у конфігурації, щоб експерименти залишалися порівнянними між різними гілками.

Відстежуйте розмір та ступінь перекриття частин у конфігурації, щоб експерименти залишалися порівнянними між різними гілками.

Відстежуйте розмір та ступінь перекриття частин у конфігурації, щоб експерименти залишалися порівнянними між різними гілками.

Відстежуйте розмір та ступінь перекриття частин у конфігурації, щоб експерименти залишалися порівнянними між різними гілками.

Відстежуйте розмір та ступінь перекриття частин у конфігурації, щоб експерименти залишалися порівнянними між різними гілками.

Відстежуйте розмір та ступінь перекриття частин у конфігурації, щоб експерименти залишалися порівнянними між різними гілками.

Відстежуйте розмір та ступінь перекриття частин у конфігурації, щоб експерименти залишалися порівнянними між різними гілками.

Відстежуйте розмір та ступінь перекриття частин у конфігурації, щоб експерименти залишалися порівнянними між різними гілками.

Відстежуйте розмір та ступінь перекриття частин у конфігурації, щоб експерименти залишалися порівнянними між різними гілками.

Відстежуйте розмір та ступінь перекриття частин у конфігурації, щоб експерименти залишалися порівнянними між різними гілками.

Відстежуйте розмір та ступінь перекриття частин у конфігурації, щоб експерименти залишалися порівнянними між різними гілками.

Відстежуйте розмір та ступінь перекриття частин у конфігурації, щоб експерименти залишалися порівнянними між різними гілками.

Відстежуйте розмір та ступінь перекриття частин у конфігурації, щоб експерименти залишалися порівнянними між різними гілками.

Відстежуйте розмір та ступінь перекриття частин у конфігурації, щоб експерименти залишалися порівнянними між різними гілками.

Відстежуйте розмір та ступінь перекриття частин у конфігурації, щоб експерименти залишалися порівнянними між різними гілками.

Відстежуйте розмір та ступінь перекриття частин у конфігурації, щоб експерименти залишалися порівнянними між різними гілками.

Відстежуйте розмір та ступінь перекриття частин у конфігурації, щоб експерименти залишалися порівнянними між різними гілками.

Відстежуйте розмір та ступінь перекриття частин у конфігурації, щоб експерименти залишалися порівнянними між різними гілками.

Відстежуйте розмір та ступінь перекриття частин у конфігурації, щоб експерименти залишалися порівнянними між різними гілками.

Відстежуйте розмір та ступінь перекриття частин у конфігурації, щоб експерименти залишалися порівнянними між різними гілками.

Відстежуйте розмір та ступінь перекриття частин у конфігурації, щоб експерименти залишалися порівнянними між різними гілками.

Відстежуйте розмір та ступінь перекриття частин у конфігурації, щоб експерименти залишалися порівнянними між різними гілками.

Відстежуйте розмір та ступінь перекриття частин у конфігурації, щоб експерименти залишалися порівнянними між різними гілками.

Відстежуйте розмір та ступінь перекриття частин у конфігурації, щоб експерименти залишалися порівнянними між різними гілками.

Відстежуйте розмір та ступінь перекриття частин у конфігурації, щоб експерименти залишалися порівнянними між різними гілками.

Відстежуйте розмір та ступінь перекриття частин у конфігурації, щоб експерименти залишалися порівнянними між різними гілками.

Відстежуйте розмір та ступінь перекриття частин у конфігурації, щоб експерименти залишалися порівнянними між різними гілками.

Відстежуйте розмір та ступінь перекриття частин у конфігурації, щоб експерименти залишалися порівнянними між різними гілками.

Відстежуйте розмір та ступінь перекриття частин у конфігурації, щоб експерименти залишалися порівнянними між різними гілками.

Відстежуйте розмір та ступінь перекриття частин у конфігурації, щоб експерименти залишалися порівнянними між різними гілками.

Відстежуйте розмір та ступінь перекриття частин у конфігурації, щоб експерименти залишалися порівнянними між різними гілками.

Відстежуйте розмір та ступінь перекриття частин у конфігурації, щоб експерименти залишалися порівнянними між різними гілками.

Відстежуйте розмір та ступінь перекриття частин у конфігурації, щоб експерименти залишалися порівнянними між різними гілками.

Відстежуйте розмір та ступінь перекриття частин у конфігурації, щоб експерименти залишалися порівнянними між різними гілками.

Відстежуйте розмір та ступінь перекриття частин у конфігурації, щоб експерименти залишалися порівнянними між різними гілками.

Відстежуйте розмір та ступінь перекриття частин у конфігурації, щоб експерименти залишалися порівнянними між різними гілками.

Відстежуйте розмір та ступінь перекриття частин у конфігурації, щоб експерименти залишалися порівнянними між різними гілками.

Відстежуйте розмір та ступінь перекриття частин у конфігурації, щоб експерименти залишалися порівнянними між різними гілками.

Відстежуйте розмір та ступінь перекриття частин у конфігурації, щоб експерименти залишалися порівнянними між різними гілками.

Відстежуйте розмір та ступінь перекриття частин у конфігурації, щоб експерименти залишалися порівнянними між різними гілками.

Відстежуйте розмір та ступінь перекриття частин у конфігурації, щоб експерименти залишалися порівнянними між різними гілками.

Відстежуйте розмір та ступінь перекриття частин у конфігурації, щоб експерименти залишалися порівнянними між різними гілками.

Відстежуйте розмір та ступінь перекриття частин у конфігурації, щоб експерименти залишалися порівнянними між різними гілками.

Відстежуйте розмір та ступінь перекриття частин у конфігурації, щоб експерименти залишалися порівнянними між різними гілками.

Відстежуйте розмір та ступінь перекриття частин у конфігурації, щоб експерименти залишалися порівнянними між різними гілками.

Відстежуйте розмір та ступінь перекриття частин у конфігурації, щоб експерименти залишалися порівнянними між різними гілками.

Відстежуйте розмір та ступінь перекриття частин у конфігурації, щоб експерименти залишалися порівнянними між різними гілками.