RAG адзін у адзін з Chroma, FastAPI і Llama 3.2
Працюючы на базе RAG, асістэнт працюе цэпам: фрагментаванне PDF, перыякораванне за дапамою крос-кодэра, Chroma, Llama 3.2 на Ollama, FastAPI, Docker, pytest і GitHub Actions у рамках процэса CI.
Крыніцы: 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ымі между разнымі варыянтамі.