Khi bạn muốn sử dụng AI để phân tích những file tài liệu, tóm tắt, hoặc thậm chí chỉ để đặt câu hỏi. Thế thì sẽ gì sẽ xảy ra nếu dữ liệu bị lộ ra bên ngoài. Hãy xây dựng hệ thống RAG (Retrieval-Augmented Generation – Thế hệ Tăng cường Truy xuất) cục bộ của riêng mình — một cách để trò chuyện với các tệp PDF mà không cần kết nối internet.
Có Ollama và LangChain — một bộ đôi mạnh mẽ để xây dựng các hệ thống AI cục bộ. Ollama cho phép bạn chạy các mô hình ngôn ngữ lớn (LLM) cục bộ trên máy của mình, còn LangChain đơn giản hóa quy trình xây dựng ứng dụng AI bằng cách xử lý các tác vụ như tải tệp, tách văn bản và nhúng. Kết hợp lại, chúng là một bước đột phá cho bất kỳ ai coi trọng quyền riêng tư.
Sau đây là những gì tôi đã sử dụng để xây dựng hệ thống RAG tại địa phương của mình:
- Ollama: Một công cụ cho phép bạn chạy LLM cục bộ.
- LangChain: Một nền tảng Python giúp tóm tắt nhiều công việc khó khăn trong việc xây dựng ứng dụng AI.
- ChromaDB: Cơ sở dữ liệu vector để lưu trữ và truy xuất các phần nhúng (thông tin chi tiết hơn về phần này sau).
- Nomic Embed Text: Mô hình nhúng chuyển đổi văn bản thành vectơ để AI có thể hiểu.
Điều tuyệt vời nhất là gì? Tất cả các công cụ này đều là mã nguồn mở và có thể tùy chỉnh. Bạn có thể hoán đổi các thành phần dựa trên nhu cầu của mình — chẳng hạn như chọn một mô hình nhúng hoặc cơ sở dữ liệu vector khác. Giống như việc tự xây dựng bộ Lego AI của riêng bạn vậy.
Cách thức hoạt động:
- Tải tệp PDF của bạn: Sử dụng Trình tải PDF phi cấu trúc của LangChain, tôi đã nhập tài liệu của mình vào hệ thống. Chúng có thể là bất cứ thứ gì — sách, báo cáo, hoặc thậm chí là ghi chú của riêng bạn.
- Phân đoạn văn bản: Hệ thống chia văn bản thành các phần nhỏ hơn, dễ quản lý hơn (gọi là “chunk”) để AI có thể xử lý dễ dàng hơn.
- Tạo nhúng: Sử dụng Nomic Embed Text, các khối được chuyển đổi thành vectơ — một định dạng mà AI có thể hiểu được.
- Lưu trữ trong ChromaDB: Các vectơ được lưu trữ trong cơ sở dữ liệu vectơ cục bộ để truy xuất nhanh chóng.
- Truy vấn và trò chuyện: Khi bạn đặt câu hỏi, hệ thống sẽ truy xuất các phần có liên quan, tạo ra nhiều biến thể của truy vấn và gửi lại cho bạn câu trả lời tốt nhất.
Giống như có một thủ thư riêng biết rõ từng từ trong tài liệu của bạn và có thể tóm tắt hoặc trả lời các câu hỏi ngay lập tức.
Sau đây là cách tôi xây dựng hệ thống RAG cục bộ:
Bước 1: Cài đặt các phụ thuộc
pip install langchain unstructured chromadb ollama nomic
Các thư viện này sẽ giúp bạn tải tệp PDF, tạo nội dung nhúng, lưu trữ chúng trong cơ sở dữ liệu vector và truy vấn hệ thống.
Bước 2: Tải tệp PDF
from langchain.document_loaders import UnstructuredPDFLoader
# Load the PDF from the specified file path
loader = UnstructuredPDFLoader(“path/to/your/document.pdf”)
documents = loader.load()
Điều này sẽ tải và lưu trữ nội dung tài liệu PDF của bạn trong biến documents
Bước 3: Chia văn bản thành các phần
Bây giờ, chúng ta chia văn bản đã tải thành các phần nhỏ hơn. Điều này giúp tránh làm quá tải hệ thống với quá nhiều văn bản cùng một lúc. Chúng ta sẽ sử dụng hàm của LangChain RecursiveCharacterTextSplitter.
from langchain.text_splitter import RecursiveCharacterTextSplitter
# Initialize the text splitter with chunk size and overlap configuration
text_splitter = RecursiveCharacterTextSplitter(chunk_size=7500, chunk_overlap=500)
# Split the documents into chunks
chunks = text_splitter.split_documents(documents)
Xác chunk_size định kích thước tối đa của mỗi khối và chunk_overlap đảm bảo có một chút chồng chéo để duy trì ngữ cảnh.
Bước 4: Tạo nhúng
Bây giờ chúng ta chuyển đổi các đoạn văn bản thành các đoạn nhúng. Ở đây, chúng ta sẽ sử dụng mô hình nhúng của OpenAI, nhưng bạn có thể hoán đổi mô hình này với bất kỳ mô hình nhúng nào khác mà bạn thích (như Nomic hoặc Ollama, v.v.).
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma
# Initialize the OpenAI embeddings model
embeddings = OllamaEmbeddings(model=”nomic-embed-text”)
# Store the embeddings in a Chroma vector database
vectorstore = Chroma.from_documents(chunks, embeddings, collection_name=”local_rag”)
Chúng tôi sử dụng OpenAIEmbeddingsmô hình, nhưng nếu bạn thích dịch vụ nhúng khác, bạn có thể thay thế bằng mô hình phù hợp. Chromalà cơ sở dữ liệu vectơ nơi chúng tôi lưu trữ các nhúng này để truy xuất nhanh chóng.
Bước 5: Truy vấn hệ thống
Giờ đến phần thú vị — truy vấn hệ thống. Chúng ta sẽ sử dụng LangChain RetrievalQAvà thiết lập một mẫu nhắc nhở đơn giản để đặt câu hỏi dựa trên các dữ liệu nhúng đã lưu trữ.
from langchain.chains import RetrievalQA
from langchain.prompts import PromptTemplate
from langchain.llms import Ollama
# Define the prompt template
prompt_template = “””Answer the question based only on the following context:
{context}
Question: {question}
“””
prompt = PromptTemplate(template=prompt_template, input_variables=[“context”, “question”])
# Initialize the retriever
retriever = vectorstore.as_retriever()
# Set up the QA chain
qa_chain = RetrievalQA.from_chain_type(
llm=Ollama(model=”mistral”), # Use Mistral as the local LLM
chain_type=”stuff”, # Simple retrieval strategy
retriever=retriever,
chain_type_kwargs={“prompt”: prompt}
)
# Ask a question
query = “What is this document about?”
response = qa_chain.run(query)
print(response)
Đoạn mã này thiết lập một hệ thống truy vấn trong đó:
- Các phần tài liệu được lấy ra dựa trên mức độ liên quan đến câu hỏi.
- Hệ thống tạo ra phản hồi dựa trên ngữ cảnh của các phần có liên quan nhất.
Bước 6: Tối ưu hóa truy vấn với MultiQueryRetriever (Tùy chọn)
Để cải thiện kết quả truy vấn, hãy sử dụng LangChain MultiQueryRetriever. Công cụ này tạo ra nhiều biến thể của truy vấn để lấy ra các đoạn dữ liệu có liên quan hơn.
from langchain.retrievers.multi_query import MultiQueryRetriever
# Initialize the MultiQueryRetriever
multi_retriever = MultiQueryRetriever.from_llm(
retriever=vectorstore.as_retriever(),
llm=Ollama(model=”mistral”)
)
# Update the QA chain to use the multi-query retriever
qa_chain = RetrievalQA.from_chain_type(
llm=Ollama(model=”mistral”),
chain_type=”stuff”,
retriever=multi_retriever,
chain_type_kwargs={“prompt”: prompt}
)
# Ask a question
query = “What are the key points in this document?”
response = qa_chain.run(query)
print(response)
Bước 7: Chạy hệ thống ngoại tuyến
Sau khi mọi thứ được thiết lập xong, bạn có thể ngắt kết nối internet và chạy hệ thống cục bộ. Tất cả các thành phần — LLM, nhúng và cơ sở dữ liệu vector — đều ngoại tuyến.
Tại sao điều này hiệu quả
Mô hình cục bộ : Ollama và Nomic cho phép bạn chạy LLM và nhúng ngoại tuyến.
Tính mô-đun : Bạn có thể hoán đổi các thành phần (ví dụ: sử dụng mô hình nhúng hoặc cơ sở dữ liệu vector khác).
Quyền riêng tư : Dữ liệu của bạn sẽ không bao giờ rời khỏi máy tính của bạn.
Kiểm tra hệ thống
Tài liệu này nói về điều gì?
Việc xây dựng hệ thống này không phải là không có trở ngại. Lần thử đầu tiên của tôi đã làm máy tính của tôi bị sập vì quá trình này ngốn rất nhiều tài nguyên. Nếu bạn định thử, tôi khuyên bạn nên sử dụng một máy có GPU tốt. Ngoài ra, việc điều chỉnh kích thước khối và chồng chéo khối là rất quan trọng để tránh các vấn đề “lạc giữa chừng” khi AI bỏ lỡ ngữ cảnh chính.
Nhưng bài học lớn nhất là gì? Bạn không cần phải dựa vào công nghệ lớn để khai thác sức mạnh của AI. Với các công cụ phù hợp và một chút lập trình, bạn có thể xây dựng một thứ vừa mạnh mẽ vừa riêng tư.
Biến ứng dụng này thành ứng dụng Streamlit
Mặc dù mã nguồn hoạt động tốt, nhưng nó không thực sự thân thiện với người mới bắt đầu. Dự án tiếp theo của tôi là biến nó thành một ứng dụng Streamlit — một giao diện đơn giản, nơi bạn có thể tải lên tệp PDF, đặt câu hỏi và nhận câu trả lời mà không cần động đến một dòng mã nào. Hãy tưởng tượng bạn có một trợ lý riêng giống như ChatGPT, nhưng dành riêng cho tài liệu cá nhân, chạy hoàn toàn trên máy tính xách tay của bạn.
Cầm laptop, khởi động Ollama và bắt đầu trò chuyện với các tệp PDF của bạn. Biết đâu đấy, bạn có thể xây dựng nên một thứ gì đó lớn lao tiếp theo trong lĩnh vực AI — ngay tại phòng khách nhà mình.
Bài viết liên quan: