TopDev AI Robot TopDev
#AI & Trợ lý lập trình#Backend & Microservices#Cơ sở dữ liệu & Tối ưu

Xây dựng hệ thống RAG nội bộ bằng LangChain và Qdrant Vector Database

Minh Trí (AI Engineer)
📖 2 phút đọc 💬 1 phản hồi
⚡ Tóm tắt 30 giây bởi TopDev AI
AI Overview

Vì sao các doanh nghiệp đều cần RAG Retrieval-Augmented Generation? Đưa dữ liệu nội bộ tài liệu quy trình, wiki kỹ thuật, API docs vào LLM là bài toán cấp thiết của mọi công ty tech. Thay vì fine-tun…

☰ Mục lục bài viết (4 phần) Mở / Đóng mục lục

Vì sao các doanh nghiệp đều cần RAG (Retrieval-Augmented Generation)?#

Đưa dữ liệu nội bộ (tài liệu quy trình, wiki kỹ thuật, API docs) vào LLM là bài toán cấp thiết của mọi công ty tech. Thay vì fine-tuning tốn kém hàng nghìn USD, RAG là kiến trúc tối ưu nhất: vừa bảo mật dữ liệu, vừa cập nhật tri thức mới theo thời gian thực (real-time).

Trong bài viết này, mình chia sẻ kiến trúc xây dựng RAG pipeline sử dụng LangChain và Qdrant Vector Database (mã nguồn mở, hiệu năng cao viết bằng Rust).

Kiến trúc Pipeline cơ bản#

Pipeline gồm 3 bước chính:

  1. Document Ingestion: Đọc tài liệu Markdown/PDF $\rightarrow$ Chunking văn bản.
  2. Embedding & Indexing: Chuyển đổi text chunk thành vector và lưu vào Qdrant.
  3. Retrieval & QA: Tìm kiếm vector tương đồng (Cosine Similarity) $\rightarrow$ Gắn vào Prompt cho LLM trả lời.
PYTHON
from langchain_community.vectorstores import Qdrant
from langchain_openai import OpenAIEmbeddings
from langchain_text_splitters import RecursiveCharacterTextSplitter
from qdrant_client import QdrantClient

# 1. Khởi tạo client kết nối tới Qdrant
client = QdrantClient(url="http://localhost:6333")

# 2. Chia nhỏ tài liệu thành các chunks hợp lý
text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=600,
    chunk_overlap=80,
    separators=["\n\n", "\n", " ", ""]
)
docs = text_splitter.split_documents(raw_documents)

# 3. Tạo Vector Store và đánh chỉ mục
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
vectorstore = Qdrant(
    client=client,
    collection_name="tech_internal_docs",
    embeddings=embeddings
)
vectorstore.add_documents(docs)

3 lưu ý sống còn để RAG không trả lời lan man#

  • Kích thước Chunk: Đừng để chunk quá lớn (>1.500 tokens) vì sẽ làm loãng thông tin liên quan, nhưng cũng đừng quá nhỏ (<200 tokens) khiến mất ngữ cảnh đoạn văn.
  • Chunk Overlap: Luôn duy trì overlap khoảng 10-15% giữa các đoạn để không bị đứt gãy câu chữ giữa chừng.
  • Reranker: Sau khi Qdrant trả về Top 10 documents, nên sử dụng thêm một model Reranker (như Cohere Rerank) để chọn ra Top 3 tài liệu sát nhất trước khi gửi cho LLM.

Góc thảo luận#

Anh em đang tự host Vector Database nào cho hệ thống RAG nội bộ? Giữa Qdrant, Milvus và pgvector trên PostgreSQL, lựa chọn nào mang lại tỉ lệ hiệu năng/chi phí tốt nhất?


Xem thêm nội dung liên quan:

Chia sẻ thảo luận này:

Thảo luận

1 phản hồi

Ý kiến từ cộng đồng kỹ sư TopDev
💬

Tham gia thảo luận

Cộng đồng mở · Đăng nhập 1-chạm qua Google
  1. Thu Trang (Backend Engineer)
    #1

    Nếu team đã có sẵn cụm PostgreSQL trong production thì dùng extension pgvector cũng rất ổn với quy mô dưới 1 triệu vector. Nhưng khi dữ liệu scale lên trên chục triệu bản ghi kèm metadata filtering phức tạp thì Qdrant bằng Rust thực sự bỏ xa về latency tìm kiếm.

Bài liên quan trong #AI & Trợ lý lập trình

1
TopDev AI Companion
AI
✓ Đã sao chép link