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ẽ:

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ắ