Chào mừng bạn đến với bài hướng dẫn của HolySheep AI! Hôm nay mình sẽ hướng dẫn bạn xây dựng một hệ thống hỏi đáp (Q&A) thông minh sử dụng LangChain và RetrievalQA. Bài viết này dành cho người mới bắt đầu hoàn toàn, không cần kinh nghiệm lập trình API trước đó.
RetrievalQA Là Gì Và Tại Sao Nó Quan Trọng?
RetrievalQA là một mẫu thiết kế (design pattern) trong LangChain cho phép bạn xây dựng chatbot có thể trả lời câu hỏi dựa trên dữ liệu của riêng bạn. Thay vì chỉ dựa vào kiến thức có sẵn của AI, hệ thống sẽ:
- Tìm kiếm (Retrieval): Tìm đoạn văn bản liên quan nhất từ tài liệu của bạn
- Tổng hợp (Generation): Dùng AI để đọc kết quả và trả lời câu hỏi
Chuẩn Bị Môi Trường
1. Cài Đặt Các Thư Viện Cần Thiết
pip install langchain langchain-community \
langchain-openai tiktoken faiss-cpu \
python-dotenv pypdf docx2txt
2. Thiết Lập API Key
Đầu tiên, bạn cần đăng ký tài khoản tại HolySheep AI để nhận API key miễn phí. HolySheep hỗ trợ thanh toán qua WeChat và Alipay, với độ trễ chỉ dưới 50ms và tiết kiệm đến 85% chi phí so với các nhà cung cấp khác.
# Tạo file .env trong thư mục project
touch .env
Thêm nội dung sau vào .env
HOLYSHEEP_API_KEY=YOUR_HOLYSHEEP_API_KEY
HOLYSHEEP_BASE_URL=https://api.holysheep.ai/v1
Xây Dựng Hệ Thống RetrievalQA Chi Tiết
Bước 1: Tải Và Xử Lý Tài Liệu
import os
from dotenv import load_dotenv
from langchain_community.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
Load environment variables
load_dotenv()
Tải tài liệu PDF
loader = PyPDFLoader("your_document.pdf")
documents = loader.load()
Chia nhỏ tài liệu thành các đoạn (chunks)
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=1000, # Kích thước mỗi đoạn
chunk_overlap=200, # Độ chồng lấn giữa các đoạn
length_function=len
)
chunks = text_splitter.split_documents(documents)
print(f"Đã chia thành {len(chunks)} đoạn văn bản")
Bước 2: Tạo Vector Database
Vector database cho phép tìm kiếm ngữ nghĩa nhanh chóng. Ở đây mình sử dụng FAISS, một thư viện miễn phí và hiệu quả.
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import FAISS
Sử dụng HolySheep API cho embeddings
embeddings = OpenAIEmbeddings(
model="text-embedding-3-small",
openai_api_key=os.getenv("HOLYSHEEP_API_KEY"),
openai_api_base=os.getenv("HOLYSHEEP_BASE_URL")
)
Tạo vector database từ các chunks
vectorstore = FAISS.from_documents(
documents=chunks,
embedding=embeddings
)
Lưu database để sử dụng sau
vectorstore.save_local("faiss_index")
print("Vector database đã được tạo và lưu thành công!")
Bước 3: Xây Dựng Chain Hoàn Chỉnh
from langchain_openai import ChatOpenAI
from langchain.chains import RetrievalQA
Khởi tạo LLM với HolySheep
llm = ChatOpenAI(
model="gpt-4.1", # $8/1M tokens - tiết kiệm 85%+
temperature=0.3,
openai_api_key=os.getenv("HOLYSHEEP_API_KEY"),
openai_api_base=os.getenv("HOLYSHEEP_BASE_URL")
)
Tạo RetrievalQA chain
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff", # Đưa tất cả docs vào một lần
retriever=vectorstore.as_retriever(
search_kwargs={"k": 3} # Lấy 3 kết quả liên quan nhất
),
return_source_documents=True # Trả về nguồn tham chiếu
)
Hỏi câu hỏi
query = "Nội dung chính của tài liệu là gì?"
result = qa_chain.invoke({"query": query})
print("Câu trả lời:", result["result"])
print("\nNguồn tham chiếu:")
for doc in result["source_documents"]:
print(f"- Trang {doc.metadata.get('page', 'N/A')}")
Triển Khai Giao Diện Chat Đơn Giản
Để tạo trải nghiệm tương tác, mình sẽ hướng dẫn bạn tạo một giao diện chat cơ bản.
from langchain_openai import ChatOpenAI
from langchain_community.vectorstores import FAISS
from langchain_openai import OpenAIEmbeddings
import chainlit as cl
Khởi tạo khi bắ