AI Hunter
Member
Bạn đã bao giờ muốn ChatGPT trả lời các câu hỏi dựa trên tài liệu nội bộ của công ty, một cuốn sách PDF cụ thể, hay ghi chú cá nhân của bạn chưa? Mặc định, các mô hình LLM (Large Language Model) không biết về dữ liệu riêng tư đó. Đây chính là lúc kỹ thuật RAG (Retrieval-Augmented Generation) phát huy tác dụng.
Trong bài viết này, chúng ta sẽ cùng nhau xây dựng một hệ thống RAG cơ bản bằng Python, sử dụng LangChain và ChromaDB để tạo ra một con bot có thể hiểu và trả lời dựa trên dữ liệu bạn cung cấp.
Hãy tưởng tượng LLM (như GPT-4) là một sinh viên xuất sắc đã đọc hết thư viện sách công cộng. Nhưng nếu bạn hỏi về "Quy định nghỉ phép năm 2025 của công ty A", sinh viên đó sẽ không biết (hoặc sẽ bịa ra - hallucination) vì tài liệu đó nằm trong tủ hồ sơ riêng của bạn.
Quy trình RAG hoạt động như sau:
Để thực hiện, bạn cần cài đặt các thư viện Python cần thiết. Mở terminal và chạy lệnh sau:
Giải thích nhanh các thư viện:
Chúng ta sẽ đi qua từng thành phần của hệ thống.
Đầu tiên, hãy import các module cần thiết và thiết lập API Key của bạn.
Thay vì tải file phức tạp, ta sẽ tạo một ngữ cảnh giả định. Ví dụ: thông tin về một sản phẩm công nghệ hư cấu tên là "SmartGlove X1".
Máy tính không hiểu văn bản, nó hiểu các con số (vector). Chúng ta cần chia nhỏ văn bản và chuyển nó thành vector (Embedding) để lưu vào ChromaDB.
Đây là bước kết hợp: Tìm kiếm dữ liệu liên quan -> Đưa cho AI -> Nhận câu trả lời.
Dưới đây là đoạn mã đầy đủ để bạn copy và chạy ngay lập tức.
Với đoạn code trên, bạn đã xây dựng thành công một hệ thống RAG tối giản. Điểm mạnh của phương pháp này là AI trả lời cực kỳ chính xác dựa trên dữ liệu bạn đưa vào, loại bỏ hiện tượng "chém gió" thường thấy.
Trong bài viết này, chúng ta sẽ cùng nhau xây dựng một hệ thống RAG cơ bản bằng Python, sử dụng LangChain và ChromaDB để tạo ra một con bot có thể hiểu và trả lời dựa trên dữ liệu bạn cung cấp.
1. RAG là gì và tại sao cần nó?
Hãy tưởng tượng LLM (như GPT-4) là một sinh viên xuất sắc đã đọc hết thư viện sách công cộng. Nhưng nếu bạn hỏi về "Quy định nghỉ phép năm 2025 của công ty A", sinh viên đó sẽ không biết (hoặc sẽ bịa ra - hallucination) vì tài liệu đó nằm trong tủ hồ sơ riêng của bạn.
Quy trình RAG hoạt động như sau:
- Retrieval (Truy xuất): Khi bạn hỏi, hệ thống sẽ tìm kiếm trong "tủ hồ sơ" (Vector Database) những đoạn văn bản liên quan nhất.
- Augmented (Tăng cường): Hệ thống kẹp đoạn văn bản vừa tìm được vào câu hỏi gốc.
- Generation (Tạo sinh): Gửi tất cả cho AI để nó trả lời dựa trên thông tin vừa được cung cấp.
2. Chuẩn bị môi trường
Để thực hiện, bạn cần cài đặt các thư viện Python cần thiết. Mở terminal và chạy lệnh sau:
Python:
pip install langchain langchain-openai langchain-community chromadb
Giải thích nhanh các thư viện:
langchain: Framework giúp kết nối các thành phần AI.langchain-openai: Để sử dụng model của OpenAI.chromadb: Một Vector Database mã nguồn mở, chạy ngay tại local mà không cần cài server phức tạp.
3. Triển khai Code từng bước
Chúng ta sẽ đi qua từng thành phần của hệ thống.
Bước 3.1: Import và Cấu hình
Đầu tiên, hãy import các module cần thiết và thiết lập API Key của bạn.
Python:
import os
from langchain_community.document_loaders import TextLoader
from langchain.text_splitter import CharacterTextSplitter
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain_community.vectorstores import Chroma
from langchain.chains import RetrievalQA
# Thay thế bằng API Key thực của bạn
os.environ["OPENAI_API_KEY"] = "sk-..."
Bước 3.2: Tạo dữ liệu giả lập (Knowledge Base)
Thay vì tải file phức tạp, ta sẽ tạo một ngữ cảnh giả định. Ví dụ: thông tin về một sản phẩm công nghệ hư cấu tên là "SmartGlove X1".
Python:
# Dữ liệu kiến thức riêng (Bạn có thể thay bằng nội dung file text/pdf)
knowledge_base = """
SmartGlove X1 là găng tay thông minh thế hệ mới nhất của TechCorp, ra mắt năm 2025.
Sản phẩm này hỗ trợ dịch thuật ngữ điệu bàn tay sang giọng nói theo thời gian thực.
Thời lượng pin của SmartGlove X1 lên tới 48 giờ sử dụng liên tục.
Nó có khả năng chống nước chuẩn IP68 và hỗ trợ kết nối Bluetooth 5.4.
Giá bán khởi điểm là 299 USD cho phiên bản cơ bản và 499 USD cho bản Pro.
"""
Bước 3.3: Chunking & Vector Store
Máy tính không hiểu văn bản, nó hiểu các con số (vector). Chúng ta cần chia nhỏ văn bản và chuyển nó thành vector (Embedding) để lưu vào ChromaDB.
Python:
# 1. Chia nhỏ văn bản (Chunking)
# Chúng ta chia văn bản thành các đoạn nhỏ để tìm kiếm chính xác hơn
text_splitter = CharacterTextSplitter(
separator="\n",
chunk_size=1000,
chunk_overlap=0
)
texts = text_splitter.create_documents([knowledge_base])
# 2. Tạo Vector Store (ChromaDB)
# Sử dụng OpenAI để tạo embedding và lưu vào ChromaDB (lưu tạm trong RAM)
embeddings = OpenAIEmbeddings()
db = Chroma.from_documents(texts, embeddings)
Bước 3.4: Tạo Chuỗi xử lý (Chain)
Đây là bước kết hợp: Tìm kiếm dữ liệu liên quan -> Đưa cho AI -> Nhận câu trả lời.
Python:
# Khởi tạo mô hình ngôn ngữ (LLM)
llm = ChatOpenAI(model_name="gpt-3.5-turbo", temperature=0)
# Tạo Chain truy vấn
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=db.as_retriever()
)
4. Code hoàn chỉnh & Chạy thử
Dưới đây là đoạn mã đầy đủ để bạn copy và chạy ngay lập tức.
Python:
import os
from langchain.text_splitter import CharacterTextSplitter
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain_community.vectorstores import Chroma
from langchain.chains import RetrievalQA
# --- CẤU HÌNH ---
# Hãy đảm bảo bạn đã export key hoặc điền trực tiếp vào đây
if "OPENAI_API_KEY" not in os.environ:
os.environ["OPENAI_API_KEY"] = "sk-YOUR_API_KEY_HERE"
def main():
# 1. Dữ liệu nguồn
raw_text = """
SmartGlove X1 là găng tay thông minh thế hệ mới nhất của TechCorp, ra mắt năm 2025.
Sản phẩm này hỗ trợ dịch thuật ngữ điệu bàn tay sang giọng nói theo thời gian thực.
Thời lượng pin của SmartGlove X1 lên tới 48 giờ sử dụng liên tục.
Nó có khả năng chống nước chuẩn IP68 và hỗ trợ kết nối Bluetooth 5.4.
Giá bán khởi điểm là 299 USD cho phiên bản cơ bản và 499 USD cho bản Pro.
"""
# 2. Xử lý dữ liệu
print("🔄 Đang nạp dữ liệu vào Vector Database...")
text_splitter = CharacterTextSplitter(separator="\n", chunk_size=500, chunk_overlap=0)
texts = text_splitter.create_documents([raw_text])
# 3. Tạo Vector DB
embeddings = OpenAIEmbeddings()
db = Chroma.from_documents(texts, embeddings)
# 4. Khởi tạo Chain
qa = RetrievalQA.from_chain_type(
llm=ChatOpenAI(temperature=0),
chain_type="stuff",
retriever=db.as_retriever()
)
# 5. Hỏi đáp
query = "SmartGlove X1 pin dùng được bao lâu?"
print(f"\n❓ Câu hỏi: {query}")
response = qa.invoke(query)
print(f"🤖 AI trả lời: {response['result']}")
if __name__ == "__main__":
main()
5. Tổng kết
Với đoạn code trên, bạn đã xây dựng thành công một hệ thống RAG tối giản. Điểm mạnh của phương pháp này là AI trả lời cực kỳ chính xác dựa trên dữ liệu bạn đưa vào, loại bỏ hiện tượng "chém gió" thường thấy.
Bài viết liên quan