AI Hunter
Member
Bạn có một file PDF chứa thông tin nhạy cảm (báo cáo tài chính, bí mật công nghệ, hồ sơ nhân sự...) và muốn dùng AI để phân tích nó? Tuy nhiên, bạn sợ rằng nếu upload lên ChatGPT hay Gemini, dữ liệu của bạn có thể bị rò rỉ hoặc bị dùng để train lại model?
Giải pháp dành cho bạn là **Local RAG**: Chạy AI ngay trên máy tính cá nhân.
Chúng ta sẽ sử dụng kiến trúc **RAG (Retrieval-Augmented Generation)**. Thay vì để AI "chém gió" dựa trên trí nhớ, chúng ta sẽ ép nó đọc tài liệu của mình trước khi trả lời.
Các thành phần chính:
Bước 1: Cài đặt "Trái tim" Ollama
Truy cập Ollama.com, tải và cài đặt bản cho Windows/Mac/Linux.
Sau khi cài xong, mở Terminal/CMD và chạy lệnh sau để tải model Llama 3 (phiên bản 8 tỷ tham số):
Bước 2: Cài đặt thư viện Python
Dưới đây là đoạn code Python hoàn chỉnh (`app.py`). Nó tích hợp cả giao diện web và logic xử lý AI.
Tại sao chúng ta dùng **OllamaEmbeddings**?
Bình thường, để máy tính hiểu văn bản, ta phải chuyển chữ thành số (Vector). OpenAI có API làm việc này rất tốt nhưng tốn phí. Ở đây, chúng ta ép chính con Llama 3 trên máy tính làm việc này luôn. Kết quả là hệ thống hoàn toàn offline 100%.
Lưu ý về cấu hình máy:
Chúc các bạn thành công bảo vệ dữ liệu của mình!
Giải pháp dành cho bạn là **Local RAG**: Chạy AI ngay trên máy tính cá nhân.
- Bảo mật tuyệt đối: Dữ liệu không bao giờ rời khỏi máy tính của bạn (rút dây mạng vẫn chạy tốt).
- Miễn phí: Không tốn tiền API OpenAI.
- Mạnh mẽ: Sử dụng Llama 3 (Meta) hoặc Mistral - những model mã nguồn mở mạnh nhất hiện nay.
1. Kiến trúc hệ thống
Chúng ta sẽ sử dụng kiến trúc **RAG (Retrieval-Augmented Generation)**. Thay vì để AI "chém gió" dựa trên trí nhớ, chúng ta sẽ ép nó đọc tài liệu của mình trước khi trả lời.
Các thành phần chính:
- Ollama: Phần mềm giúp chạy các model AI (LLM) trên máy tính cá nhân cực nhẹ.
- LangChain: Framework giúp kết nối AI với dữ liệu PDF.
- ChromaDB: Kho lưu trữ vector (Vector Database) để AI tìm kiếm thông tin nhanh chóng.
- Streamlit: Thư viện Python giúp tạo giao diện web chat đẹp mắt chỉ trong nháy mắt.
2. Cài đặt môi trường
Bước 1: Cài đặt "Trái tim" Ollama
Truy cập Ollama.com, tải và cài đặt bản cho Windows/Mac/Linux.
Sau khi cài xong, mở Terminal/CMD và chạy lệnh sau để tải model Llama 3 (phiên bản 8 tỷ tham số):
Mã:
ollama pull llama3
Bước 2: Cài đặt thư viện Python
Mã:
pip install langchain langchain-community langchain-core pypdf chromadb ollama streamlit
3. Triển khai Code (Full Source)
Dưới đây là đoạn code Python hoàn chỉnh (`app.py`). Nó tích hợp cả giao diện web và logic xử lý AI.
Python:
import streamlit as st
import tempfile
import os
from langchain_community.document_loaders import PyPDFLoader
from langchain_community.vectorstores import Chroma
from langchain_community.embeddings import OllamaEmbeddings
from langchain_community.llms import Ollama
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.chains import RetrievalQA
# --- CẤU HÌNH ---
MODEL_NAME = "llama3" # Đảm bảo bạn đã chạy 'ollama pull llama3'
# Tiêu đề trang
st.set_page_config(page_title="Chat với PDF (Offline)", page_icon="🔒")
st.title("🔒 Chat với tài liệu mật (Local RAG)")
# --- SIDEBAR: Upload File ---
with st.sidebar:
st.header("1. Nạp dữ liệu")
uploaded_file = st.file_uploader("Upload file PDF của bạn", type="pdf")
if uploaded_file is not None:
# Lưu file tạm thời để LangChain đọc
with tempfile.NamedTemporaryFile(delete=False, suffix=".pdf") as tmp_file:
tmp_file.write(uploaded_file.getvalue())
tmp_file_path = tmp_file.name
st.success("Đã upload file thành công!")
# Nút xử lý
if st.button("2. Số hóa dữ liệu (Embedding)"):
with st.spinner("Đang đọc và số hóa tài liệu... (Sẽ mất vài giây)"):
# 1. Load PDF
loader = PyPDFLoader(tmp_file_path)
data = loader.load()
# 2. Cắt nhỏ văn bản
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
splits = text_splitter.split_documents(data)
# 3. Tạo Vector DB với Ollama Embeddings
embeddings = OllamaEmbeddings(model=MODEL_NAME)
vectorstore = Chroma.from_documents(documents=splits, embedding=embeddings)
# Lưu vào Session State để dùng lại
st.session_state.vectorstore = vectorstore
st.success(f"✅ Đã số hóa xong {len(splits)} đoạn văn bản!")
# Xóa file tạm
os.remove(tmp_file_path)
# --- GIAO DIỆN CHAT ---
if "messages" not in st.session_state:
st.session_state.messages = []
# Hiển thị lịch sử chat
for message in st.session_state.messages:
with st.chat_message(message["role"]):
st.markdown(message["content"])
# Ô nhập liệu
if prompt := st.chat_input("Hỏi gì đó về tài liệu này..."):
# 1. Hiển thị câu hỏi của người dùng
st.chat_message("user").markdown(prompt)
st.session_state.messages.append({"role": "user", "content": prompt})
# 2. Xử lý câu trả lời
if "vectorstore" in st.session_state:
with st.spinner("AI đang đọc tài liệu và suy nghĩ..."):
llm = Ollama(model=MODEL_NAME)
# Tạo chuỗi RAG
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
retriever=st.session_state.vectorstore.as_retriever(),
)
response = qa_chain.invoke({"query": prompt})
answer = response['result']
# Hiển thị câu trả lời
st.chat_message("assistant").markdown(answer)
st.session_state.messages.append({"role": "assistant", "content": answer})
else:
st.warning("⚠️ Vui lòng upload và số hóa file PDF trước!")
4. Hướng dẫn chạy
- Lưu đoạn code trên thành file
app.py. - Mở Terminal tại thư mục đó.
- Chạy lệnh:
Mã:
streamlit run app.py - Trình duyệt sẽ tự bật lên với giao diện Chatbot.
5. Giải thích chuyên sâu
Tại sao chúng ta dùng **OllamaEmbeddings**?
Bình thường, để máy tính hiểu văn bản, ta phải chuyển chữ thành số (Vector). OpenAI có API làm việc này rất tốt nhưng tốn phí. Ở đây, chúng ta ép chính con Llama 3 trên máy tính làm việc này luôn. Kết quả là hệ thống hoàn toàn offline 100%.
Lưu ý về cấu hình máy:
- Để chạy mượt Llama 3 (8B), máy bạn nên có RAM từ 8GB trở lên (tốt nhất là 16GB).
- Nếu có GPU rời (NVIDIA), tốc độ trả lời sẽ cực nhanh (chỉ 1-2 giây). Nếu chạy bằng CPU, có thể mất 10-20 giây cho một câu trả lời.
Chúc các bạn thành công bảo vệ dữ liệu của mình!
Bài viết liên quan