Chia Sẻ Khóa Học Local GenAI RAG Với LlamaIndex, Ollama & Elasticsearch [Khóa 5701 A]
Xây dựng một Generative AI Platform với Retrieval Augmented Generation cùng Elasticsearch, LlamaIndex, Ollama và Mistral.
Retrieval-Augmented Generation (RAG) là bước thực hành tiếp theo sau semantic indexing & search. Trong khóa học này, bạn sẽ xây dựng một local-first RAG pipeline hoàn chỉnh, có khả năng tiếp nhận các PDF, lưu trữ các chunked vector trong Elasticsearch, truy xuất context phù hợp và generate các câu trả lời có căn cứ với Mistral LLM chạy cục bộ thông qua Ollama.
Chúng ta sẽ cùng nhau làm việc từ đầu đến cuối trên một kịch bản cụ thể: tìm kiếm CV của sinh viên để trả lời các câu hỏi như "Ai đã làm việc ở đâu?" hoặc "Ai có kinh nghiệm về Spark?". Bạn sẽ thiết lập một Dockerized stack (FastAPI, Elasticsearch, Kibana, Streamlit, Ollama) và kết nối chúng với LlamaIndex để bạn có thể tập trung vào logic, thay vì boilerplate. Trong quá trình này, bạn sẽ tìm hiểu những điểm mạnh của RAG, những điểm yếu của nó (precision/recall, hallucination), và cách thiết kế cho production.
Cuối cùng, bạn sẽ có một ứng dụng hoạt động: upload các PDF → extract text → tạo JSON sạch → chunk & embed → index vào Elasticsearch → truy vấn qua Streamlit → generate câu trả lời với Mistral, fully reproducible trên máy của bạn.
Tôi sẽ học được gì?
Từ Search đến RAG:
Xem lại semantic search và mở rộng nó sang RAG: trước tiên hãy truy xuất các chunk liên quan, sau đó generate các câu trả lời có căn cứ. Xem cách LlamaIndex kết nối dữ liệu của bạn với LLM và lý do tại sao chunk size và overlap lại quan trọng đối với recall & precision.
Xây dựng Pipeline:
Sử dụng FastAPI để chấp nhận tải lên PDF và kích hoạt ingestion flow: text extraction, JSON shaping, chunking, embeddings và indexing vào Elasticsearch, tất cả đều được phối hợp với LlamaIndex để giảm thiểu boilerplate.
Làm việc với Elasticsearch:
Tạo một index cho các CV chunk với vector và metadata. Hiểu về similarity search vs. các truy vấn keyword, cách các vector field được lưu trữ và cách khám phá các document và score với Kibana.
Streamlit Chat Interface:
Xây dựng một Streamlit UI đơn giản để đặt câu hỏi bằng ngôn ngữ tự nhiên. Chuyển đổi debug mode để kiểm tra các chunk nào được hỗ trợ câu trả lời và sử dụng các metadata filter (ví dụ: by person) để tăng độ chính xác cho các truy vấn được nhắm mục tiêu.
Ingestion & JSON Shaping:
Trích xuất văn bản thô từ PDF bằng PyMuPDF, sau đó để Ollama (Mistral) tạo lossless JSON (escaped character, preserved structure). Xử lý các sự cố định dạng JSON không thường xuyên với retries và strict prompting.
Cải thiện chất lượng câu trả lời:
Tìm hiểu các lever thực tế để cải thiện kết quả:
- ✓ Tune chunk size/overlap & top-K retrieval.
- ✓ Add richer metadata (vai trò, kỹ năng, vị trí) cho hybrid filtering.
- ✓ Thử nghiệm với các embedding model và prompt nghiêm ngặt hơn.
- ✓ Xem xét các structured output (ví dụ: JSON lists) cho các list-style question.
Dockerized Setup:
Sử dụng Docker Compose để khởi động full stack (FastAPI, Elasticsearch, Kibana, Streamlit và Ollama (Mistral) để bạn có thể chạy toàn bộ hệ thống cục bộ với cấu hình nhất quán.
Bonus: Các Production Pattern:
Khám phá cách các prototype map này tương thích với thiết kế có khả năng mở rộng:
- ✓ Lưu trữ các upload trong một data lake (ví dụ: S3) và trigger processing với một message queue (Kafka/SQS).
- ✓ Autoscale worker cho chunking và embeddings.
- ✓ Hoán đổi các LLM backend (ví dụ: Bedrock/OpenAI) đằng sau các clean API.
- ✓ Persist chat history trong MongoDB/Postgres và replace Streamlit với một React/Next.js UI.