RAG với dữ liệu phi cấu trúc

RAG (Retrieval-Augmented Generation) là một phương pháp tiên tiến kết hợp giữa truy xuất thông tin và sinh ngôn ngữ tự nhiên, đặc biệt hiệu quả khi làm việc với dữ liệu phi cấu trúc. Thay vì chỉ dựa vào dữ liệu huấn luyện sẵn có, RAG chủ động tìm kiếm và khai thác thông tin từ các nguồn bên ngoài để tạo ra câu trả lời chính xác và giàu ngữ cảnh hơn. Điều này đặc biệt hữu ích trong các tình huống mà dữ liệu không được tổ chức theo cấu trúc rõ ràng, như văn bản tự do, tài liệu PDF hoặc nội dung web.

Khai phá dữ liệu phi cấu trúc với Retrieval-Augmented Generation (RAG)

Hãy tưởng tượng bạn đang phải đối mặt với hàng tá tài liệu, báo cáo dài dòng, hợp đồng, email, hay các tệp PDF, Word, PowerPoint… và bạn chỉ cần một mảnh thông tin nhỏ ẩn sâu bên trong đó. Việc tìm kiếm, tóm tắt hoặc phân tích những dữ liệu này theo cách thủ công thật sự mất thời gian và gây mệt mỏi.

Đây chính là thách thức của dữ liệu phi cấu trúc – những loại dữ liệu không tuân theo định dạng hàng cột quen thuộc như trong cơ sở dữ liệu hay bảng tính. Và đó cũng là lý do chúng ta cần đến RAG.

RAG (Retrieval-Augmented Generation) là giải pháp giúp bạn:

Trong chương này, bạn sẽ:
Làm quen với thư viện LangChain – công cụ chính giúp xử lý tài liệu phi cấu trúc.
Học cách xử lý nhiều loại dữ liệu: Excel, Word, PowerPoint, PDF, EPUB…
Xây dựng hệ thống retrieval từ các tài liệu này.
Tùy chỉnh các hàm để truy xuất và sinh câu trả lời có ý nghĩa từ dữ liệu thực tế.

Kết quả sau chương học:
Bạn sẽ sở hữu bộ công cụ hoàn chỉnh để làm việc với dữ liệu phi cấu trúc: từ việc tải, chia nhỏ văn bản, đến truy xuất thông tin và tạo nội dung có giá trị. Tất cả được áp dụng trong các bài tập thực tế, nhiều coding và ví dụ minh họa rõ ràng.

Dữ liệu phi cấu trúc có mặt ở khắp nơi – email, báo cáo, mạng xã hội, sách điện tử… và khả năng khai thác nó không chỉ là kỹ năng kỹ thuật, mà là một siêu năng lực.
Hãy cùng bắt đầu hành trình này!

Tác giả: Đỗ Ngọc Tú
Công Ty Phần Mềm VHTSoft

Giới thiệu về Thư viện LangChain – Chìa khóa để xử lý dữ liệu phi cấu trúc

Vì sao cần LangChain?

Ở phần trước, chúng ta đã sử dụng API của OpenAI để xử lý hình ảnh và văn bản. Tuy nhiên, có một vấn đề:

Mỗi trang được xử lý riêng lẻ → Chúng ta bỏ lỡ mối liên kết giữa các trang.

Hãy tưởng tượng nếu điều này xảy ra với cả một tài liệu PowerPoint, một bảng tính Excel, hoặc một cuốn sách điện tử dài hàng trăm trang. Việc chỉ xử lý từng phần riêng biệt là không hiệu quả.

Vì thế, ta cần một công cụ mạnh mẽ hơn. Đó chính là LangChain.

LangChain là gì?

LangChain là một thư viện và framework cực kỳ mạnh mẽ, được thiết kế để:

Nói đơn giản: LangChain giúp bạn kết nối các bước xử lý dữ liệu lại với nhau – như một chuỗi (chain).

Tại sao nên dùng LangChain?

LangChain được xây dựng để giúp bạn tập trung vào việc trích xuất thông tin, thay vì viết hàng đống đoạn mã rối rắm. Nó cung cấp:

Các thành phần chính trong LangChain

  1. Document Loaders
    Dùng để tải các tài liệu từ nhiều định dạng khác nhau (PDF, DOCX, Excel,...)

  2. Text Splitters
    Giúp chia nhỏ văn bản lớn thành từng phần nhỏ, tránh vượt quá giới hạn token của mô hình AI.

  3. Embeddings
    Dùng để chuyển văn bản thành vector, giúp hệ thống hiểu nội dung để tìm kiếm và truy vấn.

  4. Vector Stores
    Là nơi lưu trữ các embedding, giúp truy xuất thông tin nhanh chóng dựa trên nội dung.

  5.  Language Models (LLMs)
    Kết nối với mô hình như GPT để tạo câu trả lời, tóm tắt văn bản, viết lại nội dung,...

Kết nối với OpenAI thông qua LangChain

LangChain cho phép bạn cấu hình kết nối đến GPT dễ dàng. Dưới đây là các thông số cơ bản:

Tham số Ý nghĩa
api_key Khóa truy cập OpenAI của bạn
model Chọn GPT-3.5, GPT-4,...
temperature Mức độ sáng tạo của kết quả (0 = chính xác, 1 = sáng tạo)
max_tokens Giới hạn độ dài đầu ra
n Số kết quả muốn tạo ra (mặc định là 1)
stop Ký tự/dấu hiệu để dừng sinh văn bản
presence_penalty Phạt nếu từ đã xuất hiện trước đó (giảm lặp lại)
frequency_penalty Phạt nếu từ xuất hiện nhiều lần (kiểm soát tần suất lặp)

Thực tế, bạn chỉ cần dùng api_key, model, và temperature là đủ để bắt đầu.

LangChain + OpenAI là bộ công cụ mạnh mẽ giúp bạn:

Sắp tới, chúng ta sẽ đi sâu vào từng phần: từ cách tải tài liệu, chia nhỏ văn bản, đến xây dựng hệ thống tìm kiếm và sinh câu trả lời – tất cả đều thực hành, có ví dụ cụ thể.

Hãy chuẩn bị sẵn máy tính, trình soạn mã và tài liệu cần xử lý. Chúng ta bắt đầu hành trình cùng LangChain!

Tác giả: Đỗ Ngọc Tú
Công Ty Phần Mềm VHTSoft

Xử lý File Excel Không Cấu Trúc với LangChain

Tình huống thực tế

Hãy tưởng tượng bạn được giao nhiệm vụ phân tích một file Excel khổng lồ chứa đầy các phản hồi của khách hàng.

File này có:

Làm sao bạn lọc ra thông tin quan trọng từ một “rừng dữ liệu” như vậy?

Đây chính là lúc bạn cần đến LangChain – một thư viện mạnh mẽ giúp xử lý dữ liệu không có cấu trúc.

Mục tiêu của bài học:

Sau bài này, bạn sẽ biết cách:

  1. Tải file Excel vào LangChain

  2. Chia nhỏ dữ liệu để xử lý tốt hơn

  3. Tạo embeddings từ dữ liệu để phục vụ cho phân tích, tìm kiếm hoặc sinh nội dung

Bước 1: Tải dữ liệu Excel

Chúng ta dùng UnstructuredExcelLoader trong module langchain_community.

Cú pháp cơ bản:

from langchain_community.document_loaders import UnstructuredExcelLoader

loader = UnstructuredExcelLoader("reviews.xlsx", mode="elements")
docs = loader.load()

mode="elements" giúp chia nhỏ từng phần trong file Excel.

Bước 2: Chia nhỏ nội dung (Chunking)

Lý do: Các mô hình ngôn ngữ có giới hạn số lượng token. Nếu bạn đưa vào quá nhiều chữ, nó sẽ bị cắt mất nội dung.

Giải pháp: Dùng RecursiveCharacterTextSplitter

from langchain.text_splitter import RecursiveCharacterTextSplitter

splitter = RecursiveCharacterTextSplitter(chunk_size=2000, chunk_overlap=200)
chunks = splitter.split_documents(docs)

Ví dụ:

Gợi ý:

Bước 3: Tạo Embeddings (biểu diễn ngữ nghĩa)

Dùng OpenAIEmbeddings từ LangChain để biến các đoạn văn bản thành vector ngữ nghĩa.

from langchain_openai import OpenAIEmbeddings

embeddings = OpenAIEmbeddings(model="text-embedding-3-large")

Mô hình text-embedding-3-large là phiên bản tốt nhất hiện tại của OpenAI.

Lưu ý:

Tổng kết

Chúng ta đã học:

  1. Cách nạp dữ liệu Excel vào LangChain

  2. Cách chia nhỏ văn bản để xử lý hiệu quả

  3. Cách tạo embeddings để chuẩn bị cho các tác vụ phân tích AI

Từ khóa quan trọng:

Tác giả: Đỗ Ngọc Tú
Công Ty Phần Mềm VHTSoft

 

 

Thiết lập môi trường xử lý dữ liệu không có cấu trúc với LangChain

Trong phần này, chúng ta sẽ thiết lập môi trường làm việc để xử lý dữ liệu không có cấu trúc bằng thư viện LangChain và các công cụ liên quan.

Chúng ta sẽ thực hiện điều này thông qua Google Colaboratory, một công cụ tuyệt vời để viết và chạy mã Python trực tuyến, đồng thời dễ dàng tích hợp với Google Drive.

Bước 1: Tạo môi trường làm việc trên Google Colab

Đây sẽ là nơi bạn viết các đoạn mã để xử lý dữ liệu.

Bước 2: Cài đặt các thư viện cần thiết

Thư viện chính:

!pip install langchain-community langchain openai faiss-cpu
Bước 3: Thiết lập API Key cho OpenAI

Sử dụng Google Colab, bạn có thể lưu API Key dưới dạng dữ liệu người dùng:

from google.colab import userdata

OPENAI_API_KEY = userdata.get('janai_course')
Bước 4: Kết nối với Google Drive

Google Drive sẽ là nơi chứa các file dữ liệu như .xlsx, .pdf, .docx, .epub...

from google.colab import drive
drive.mount('/content/drive')

Sau đó bạn đổi thư mục làm việc sang thư mục dữ liệu:

%cd /content/drive/MyDrive/your-folder-path
Bước 5: Import các module quan trọng
# Load dữ liệu Excel
from langchain_community.document_loaders import UnstructuredExcelLoader

# Chia nhỏ dữ liệu
from langchain.text_splitter import RecursiveCharacterTextSplitter

# Gọi LLM và tạo Embeddings
from langchain_openai import ChatOpenAI, OpenAIEmbeddings

# Vector store - FAISS
from langchain.vectorstores.faiss import FAISS

# Hiển thị Markdown trong notebook
from IPython.display import display, Markdown

Tổng kết

Trong bài giảng này, bạn đã:

Tác giả: Đỗ Ngọc Tú
Công Ty Phần Mềm VHTSoft

 

Đọc và xử lý dữ liệu Excel với LangChain

Trong bài học này, chúng ta sẽ:

  1. Đọc dữ liệu từ file Excel

  2. Phân tích và hiển thị dữ liệu

  3. Chia nhỏ dữ liệu thành các chunk để chuẩn bị cho việc tạo embeddings

Bước 1: Đọc dữ liệu Excel

Chúng ta sẽ sử dụng UnstructuredExcelLoader từ langchain_community để đọc file reviews.xlsx.
Đây là tập dữ liệu chứa các đánh giá và bình luận đến ngày 21 tháng 8 năm 2024.

from langchain_community.document_loaders import UnstructuredExcelLoader

loader = UnstructuredExcelLoader("reviews.xlsx", mode="elements")
docs = loader.load()

Ghi chú: mode="elements" giúp tách nội dung trong Excel thành các phần tử nhỏ như từng dòng, từng ô – điều này giúp xử lý linh hoạt hơn.

Bước 2: Hiển thị dữ liệu

Hiển thị 5 phần tử đầu tiên để kiểm tra kết quả:

docs[:5]

Bạn sẽ thấy một số dữ liệu hiển thị như TD, TR – điều này thể hiện dữ liệu gốc được biểu diễn theo dạng bảng.

Bước 3: Chia nhỏ văn bản (Chunking)

Tại sao cần chunk?
Thực hiện chia nhỏ
from langchain.text_splitter import RecursiveCharacterTextSplitter

text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=2000,
    chunk_overlap=200
)

chunks = text_splitter.split_documents(docs)

Hiển thị 5 chunk đầu tiên:

chunks[:5]

Mẹo:

Ghi chú về dữ liệu

Khi hiển thị chunk, có thể bạn sẽ thấy các thẻ như <td> hoặc <tr>:

Điều này là bình thường khi xử lý dữ liệu dạng bảng – bạn có thể lọc hoặc xử lý thêm nếu muốn dữ liệu "sạch" hơn.

Tổng kết

Bạn vừa học cách:

Tác giả: Đỗ Ngọc Tú
Công Ty Phần Mềm VHTSoft

 

Xây dựng Hệ thống Truy xuất Thông tin với LangChain + OpenAI

Trong bài học này, chúng ta sẽ:

  1. Tạo embeddings từ dữ liệu

  2. Lưu embeddings vào cơ sở dữ liệu (vector store)

  3. Xây dựng một retrieval system – hệ thống tìm kiếm văn bản dựa trên ý nghĩa

  4. Truy vấn dữ liệu bằng câu hỏi thực tế

Bước 1: Tạo Embeddings

Chúng ta sẽ dùng mô hình OpenAI text-embedding-3-large để chuyển các chunk văn bản thành vector số.

from langchain_openai import OpenAIEmbeddings

embeddings = OpenAIEmbeddings(
    model="text-embedding-3-large",
    openai_api_key="YOUR_API_KEY"
)

Lưu ý: Tên model cần có dấu gạch ngang (-) thay vì dấu gạch dưới (_)
Sai: "text_embedding_3_large" → Đúng: "text-embedding-3-large"

Bước 2: Tạo Vector Store (Database)

Chúng ta lưu các embeddings vào một cơ sở dữ liệu để có thể tìm kiếm lại.

from langchain.vectorstores import FAISS

db = FAISS.from_documents(chunks, embeddings)

Ghi chú: FAISS là một thư viện nhanh và hiệu quả để tìm kiếm vector tương tự.

Bước 3: Truy vấn hệ thống

Bây giờ chúng ta có thể bắt đầu truy vấn hệ thống:

query = "Give me my worst reviews"
results = db.similarity_search_with_score(query, k=5)

Cosine Similarity: đo góc giữa hai vector – càng gần nhau, góc càng nhỏ → văn bản càng liên quan

Kết quả Truy vấn

Kết quả sẽ là danh sách các đoạn văn bản giống với truy vấn:

for doc, score in results:
    print(doc.page_content, "\nScore:", score)

Bạn có thể thấy dữ liệu có thể còn lộn xộn (ví dụ có <td>, <tr>), điều này sẽ được cải thiện bằng bước xử lý sau.

Giải thích thêm

Tác giả: Đỗ Ngọc Tú
Công Ty Phần Mềm VHTSoft



Xây dựng hệ thống RAG với LangChain và OpenAI

Mục tiêu

1. Tổng quan về bước retrieval

Sau khi hệ thống retrieval trả về kết quả, bạn sẽ nhận được một danh sách các tài liệu (docs_files) tương ứng với truy vấn của bạn.

Cấu trúc dữ liệu
len(docs_files)  # số lượng kết quả
docs_files[0]    # (page_content, score)

2. Hợp nhất văn bản để dùng trong bước generation

Trước khi sinh câu trả lời, chúng ta cần ghép các page_content thành một khối văn bản lớn:

context_text = "\n\n".join([doc.page_content for doc, score in docs_files])

Mục đích:

3. Tạo prompt đơn giản cho mô hình sinh

prompt = f"""Based on this context:

{context_text}

Please answer this question:
{query}

If you don’t know the answer, just say you don’t know."""

Lưu ý:

4. Gọi OpenAI API thông qua LangChain

from langchain.chat_models import ChatOpenAI

model = ChatOpenAI(
    openai_api_key=API_KEY,
    model_name="gpt-4o",
    temperature=0
)

5. Thực thi truy vấn và hiển thị kết quả

response_text = model.invoke(prompt).content
display(Markdown(response_text))

6. Phân tích và đánh giá kết quả

7. Hướng phát triển tiếp theo

8. Kết luận

Dù chưa tối ưu, nhưng bạn đã hoàn tất một pipeline RAG đơn giản:

  1. Tìm kiếm thông tin (Retrieval): trả về các đoạn văn bản liên quan.

  2. Ghép context: tạo ngữ cảnh thống nhất.

  3. Sinh văn bản (Generation): mô hình trả lời dựa vào context và truy vấn.

Tác giả: Đỗ Ngọc Tú
Công Ty Phần Mềm VHTSoft