Галоўная / Артыкулы

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

Бі-энкодэр для выявлення інформацыі плюс прэцызна крос-энкодэра ўтвараюць стандартную дваэтапную схему для 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

Правільна ігнараваць кэшы і virtualenvs:

.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 request-аў должны выканаваць лінт, тэсты на елементарныя сітуацыі, а таксама, за выборам, просты задачу ацэнкі з фіксатрамі.

Стак, сложнасць, наступныя крокі

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

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

Падход у стыле працы ў рэальных умовах значыць, што ацэнка і пакаванне ведуцца разам з ідэямі з нотбуків — але гэта не значыць, што адна ноутбук можа заменіць команду платформы.

Сачыце за размарам і перакрыццем чанкаў у настройкі, каб эксперыменты заставаліся порупачнымі межа рамкамі.

Сачыце за размарам і перакрыццем чанкаў у настройкі, каб эксперыменты заставаліся порупачнымі межа рамкамі.

Сачыце за размарам і перакрыццем чанкаў у настройкі, каб эксперыменты заставаліся порупачнымі межа рамкамі.

Сачыце за размарам і перакрыццем чанкаў у настройкі, каб эксперыменты заставаліся порупачнымі межа рамкамі.

Сачыце за размарам і перакрыццем чанкаў у настройкі, каб эксперыменты заставаліся порупачнымі межа рамкамі.

Значэнні розмеру чакаў і ўзаемнае перакрыцця трэба фіксаваць у настройках, каб эксперыменты заставаліся парабелнымі между разнымі варыянтамі.

Значэнні розмеру чакаў і ўзаемнае перакрыцця трэба фіксаваць у настройках, каб эксперыменты заставаліся парабелнымі между разнымі варыянтамі.

Значэнні розмеру чакаў і ўзаемнае перакрыцця трэба фіксаваць у настройках, каб эксперыменты заставаліся парабелнымі между разнымі варыянтамі.

Значэнні розмеру чакаў і ўзаемнае перакрыцця трэба фіксаваць у настройках, каб эксперыменты заставаліся парабелнымі между разнымі варыянтамі.

Значэнні розмеру чакаў і ўзаемнае перакрыцця трэба фіксаваць у настройках, каб эксперыменты заставаліся парабелнымі между разнымі варыянтамі.

Значэнні розмеру чакаў і ўзаемнае перакрыцця трэба фіксаваць у настройках, каб эксперыменты заставаліся парабелнымі между разнымі варыянтамі.

Значэнні розмеру чакаў і ўзаемнае перакрыцця трэба фіксаваць у настройках, каб эксперыменты заставаліся парабелнымі между разнымі варыянтамі.

Значэнні розмеру чакаў і ўзаемнае перакрыцця трэба фіксаваць у настройках, каб эксперыменты заставаліся парабелнымі между разнымі варыянтамі.

Значэнні розмеру чакаў і ўзаемнае перакрыцця трэба фіксаваць у настройках, каб эксперыменты заставаліся парабелнымі между разнымі варыянтамі.

Значэнні розмеру чакаў і ўзаемнае перакрыцця трэба фіксаваць у настройках, каб эксперыменты заставаліся парабелнымі между разнымі варыянтамі.

Значэнні розмеру чакаў і ўзаемнае перакрыцця трэба фіксаваць у настройках, каб эксперыменты заставаліся парабелнымі между разнымі варыянтамі.

Значэнні розмеру чакаў і ўзаемнае перакрыцця трэба фіксаваць у настройках, каб эксперыменты заставаліся парабелнымі между разнымі варыянтамі.

Значэнні розмеру чакаў і ўзаемнае перакрыцця трэба фіксаваць у настройках, каб эксперыменты заставаліся парабелнымі между разнымі варыянтамі.

Значэнні розмеру чакаў і ўзаемнае перакрыцця трэба фіксаваць у настройках, каб эксперыменты заставаліся парабелнымі между разнымі варыянтамі.

Значэнні розмеру чакаў і ўзаемнае перакрыцця трэба фіксаваць у настройках, каб эксперыменты заставаліся парабелнымі между разнымі варыянтамі.

Значэнні розмеру чакаў і ўзаемнае перакрыцця трэба фіксаваць у настройках, каб эксперыменты заставаліся парабелнымі между разнымі варыянтамі.

Значэнні розмеру чакаў і ўзаемнае перакрыцця трэба фіксаваць у настройках, каб эксперыменты заставаліся парабелнымі между разнымі варыянтамі.

Значэнні розмеру чакаў і ўзаемнае перакрыцця трэба фіксаваць у настройках, каб эксперыменты заставаліся парабелнымі между разнымі варыянтамі.

Значэнні розмеру чакаў і ўзаемнае перакрыцця трэба фіксаваць у настройках, каб эксперыменты заставаліся парабелнымі между разнымі варыянтамі.

Значэнні розмеру чакаў і ўзаемнае перакрыцця трэба фіксаваць у настройках, каб эксперыменты заставаліся парабелнымі между разнымі варыянтамі.

Значэнні розмеру чакаў і ўзаемнае перакрыцця трэба фіксаваць у настройках, каб эксперыменты заставаліся парабелнымі между разнымі варыянтамі.

Значэнні розмеру чакаў і ўзаемнае перакрыцця трэба фіксаваць у настройках, каб эксперыменты заставаліся парабелнымі между разнымі варыянтамі.

Значэнні розмеру чакаў і ўзаемнае перакрыцця трэба фіксаваць у настройках, каб эксперыменты заставаліся парабелнымі между разнымі варыянтамі.

Значэнні розмеру чакаў і ўзаемнае перакрыцця трэба фіксаваць у настройках, каб эксперыменты заставаліся парабелнымі между разнымі варыянтамі.

Значэнні розмеру чакаў і ўзаемнае перакрыцця трэба фіксаваць у настройках, каб эксперыменты заставаліся парабелнымі между разнымі варыянтамі.

Значэнні розмеру чакаў і ўзаемнае перакрыцця трэба фіксаваць у настройках, каб эксперыменты заставаліся парабелнымі между разнымі варыянтамі.

Значэнні розмеру чакаў і ўзаемнае перакрыцця трэба фіксаваць у настройках, каб эксперыменты заставаліся парабелнымі между разнымі варыянтамі.

Значэнні розмеру чакаў і ўзаемнае перакрыцця трэба фіксаваць у настройках, каб эксперыменты заставаліся парабелнымі между разнымі варыянтамі.

Значэнні розмеру чакаў і ўзаемнае перакрыцця трэба фіксаваць у настройках, каб эксперыменты заставаліся парабелнымі между разнымі варыянтамі.

Значэнні розмеру чакаў і ўзаемнае перакрыцця трэба фіксаваць у настройках, каб эксперыменты заставаліся парабелнымі между разнымі варыянтамі.

Значэнні розмеру чакаў і ўзаемнае перакрыцця трэба фіксаваць у настройках, каб эксперыменты заставаліся парабелнымі между разнымі варыянтамі.

Значэнні розмеру чакаў і ўзаемнае перакрыцця трэба фіксаваць у настройках, каб эксперыменты заставаліся парабелнымі между разнымі варыянтамі.

Значэнні розмеру чакаў і ўзаемнае перакрыцця трэба фіксаваць у настройках, каб эксперыменты заставаліся парабелнымі между разнымі варыянтамі.

Значэнні розмеру чакаў і ўзаемнае перакрыцця трэба фіксаваць у настройках, каб эксперыменты заставаліся парабелнымі между разнымі варыянтамі.

Значэнні розмеру чакаў і ўзаемнае перакрыцця трэба фіксаваць у настройках, каб эксперыменты заставаліся парабелнымі между разнымі варыянтамі.

Значэнні розмеру чакаў і ўзаемнае перакрыцця трэба фіксаваць у настройках, каб эксперыменты заставаліся парабелнымі между разнымі варыянтамі.

Значэнні розмеру чакаў і ўзаемнае перакрыцця трэба фіксаваць у настройках, каб эксперыменты заставаліся парабелнымі между разнымі варыянтамі.

Значэнні розмеру чакаў і ўзаемнае перакрыцця трэба фіксаваць у настройках, каб эксперыменты заставаліся парабелнымі между разнымі варыянтамі.

Значэнні розмеру чакаў і ўзаемнае перакрыцця трэба фіксаваць у настройках, каб эксперыменты заставаліся парабелнымі между разнымі варыянтамі.

Значэнні розмеру чакаў і ўзаемнае перакрыцця трэба фіксаваць у настройках, каб эксперыменты заставаліся парабелнымі между разнымі варыянтамі.

Значэнні розмеру чакаў і ўзаемнае перакрыцця трэба фіксаваць у настройках, каб эксперыменты заставаліся парабелнымі между разнымі варыянтамі.

Значэнні розмеру чакаў і ўзаемнае перакрыцця трэба фіксаваць у настройках, каб эксперыменты заставаліся парабелнымі между разнымі варыянтамі.

Значэнні розмеру чакаў і ўзаемнае перакрыцця трэба фіксаваць у настройках, каб эксперыменты заставаліся парабелнымі между разнымі варыянтамі.

Значэнні розмеру чакаў і ўзаемнае перакрыцця трэба фіксаваць у настройках, каб эксперыменты заставаліся парабелнымі между разнымі варыянтамі.

Значэнні розмеру чакаў і ўзаемнае перакрыцця трэба фіксаваць у настройках, каб эксперыменты заставаліся парабелнымі между разнымі варыянтамі.

Значэнні розмеру чакаў і ўзаемнае перакрыцця трэба фіксаваць у настройках, каб эксперыменты заставаліся парабелнымі между разнымі варыянтамі.

Значэнні розмеру чакаў і ўзаемнае перакрыцця трэба фіксаваць у настройках, каб эксперыменты заставаліся парабелнымі между разнымі варыянтамі.

Значэнні розмеру чакаў і ўзаемнае перакрыцця трэба фіксаваць у настройках, каб эксперыменты заставаліся парабелнымі между разнымі варыянтамі.

Значэнні розмеру чакаў і ўзаемнае перакрыцця трэба фіксаваць у настройках, каб эксперыменты заставаліся парабелнымі между разнымі варыянтамі.

Значэнні розмеру чакаў і ўзаемнае перакрыцця трэба фіксаваць у настройках, каб эксперыменты заставаліся парабелнымі между разнымі варыянтамі.

Значэнні розмеру чакаў і ўзаемнае перакрыцця трэба фіксаваць у настройках, каб эксперыменты заставаліся парабелнымі между разнымі варыянтамі.

Значэнні розмеру чакаў і ўзаемнае перакрыцця трэба фіксаваць у настройках, каб эксперыменты заставаліся парабелнымі между разнымі варыянтамі.

Значэнні розмеру чакаў і ўзаемнае перакрыцця трэба фіксаваць у настройках, каб эксперыменты заставаліся парабелнымі между разнымі варыянтамі.

Значэнні розмеру чакаў і ўзаемнае перакрыцця трэба фіксаваць у настройках, каб эксперыменты заставаліся парабелнымі между разнымі варыянтамі.

Значэнні розмеру чакаў і ўзаемнае перакрыцця трэба фіксаваць у настройках, каб эксперыменты заставаліся парабелнымі между разнымі варыянтамі.

Значэнні розмеру чакаў і ўзаемнае перакрыцця трэба фіксаваць у настройках, каб эксперыменты заставаліся парабелнымі между разнымі варыянтамі.

Значэнні розмеру чакаў і ўзаемнае перакрыцця трэба фіксаваць у настройках, каб эксперыменты заставаліся парабелнымі между разнымі варыянтамі.

Значэнні розмеру чакаў і ўзаемнае перакрыцця трэба фіксаваць у настройках, каб эксперыменты заставаліся парабелнымі между разнымі варыянтамі.

Значэнні розмеру чакаў і ўзаемнае перакрыцця трэба фіксаваць у настройках, каб эксперыменты заставаліся парабелнымі между разнымі варыянтамі.

Значэнні розмеру чакаў і ўзаемнае перакрыцця трэба фіксаваць у настройках, каб эксперыменты заставаліся парабелнымі между разнымі варыянтамі.

Значэнні розмеру чакаў і ўзаемнае перакрыцця трэба фіксаваць у настройках, каб эксперыменты заставаліся парабелнымі между разнымі варыянтамі.

Значэнні розмеру чакаў і ўзаемнае перакрыцця трэба фіксаваць у настройках, каб эксперыменты заставаліся парабелнымі между разнымі варыянтамі.

Значэнні розмеру чакаў і ўзаемнае перакрыцця трэба фіксаваць у настройках, каб эксперыменты заставаліся парабелнымі между разнымі варыянтамі.

У настройках трэба фіксаваць размер чакаў і ступень перакрыцча, ўбліжкі эксперыменты застаюцца порównымі между разнымі варыянтамі.

У настройках трэба фіксаваць размер чакаў і ступень перакрыцча, ўбліжкі эксперыменты застаюцца порównымі между разнымі варыянтамі.

У настройках трэба фіксаваць размер чакаў і ступень перакрыцча, ўбліжкі эксперыменты застаюцца порównымі между разнымі варыянтамі.