Hệ thống tìm kiếm là trái tim của mọi nền tảng thương mại điện tử. Nếu khách hàng không thể tìm thấy sản phẩm, họ sẽ không mua nó.

Trong một thập kỷ qua, khi nói đến Search, mặc định chúng ta nói về Elasticsearch (với thuật toán BM25). Tuy nhiên, khi hành vi tìm kiếm của người dùng thay đổi—từ việc gõ những từ khóa cộc lốc (“giày chạy bộ nam”) sang những câu lệnh dài, chứa đầy ý định phức tạp (“tìm cho tôi một đôi giày chạy trail chống nước, size 42, dưới 2 triệu, có thể giao hàng trong hôm nay”), các cỗ máy tìm kiếm truyền thống bắt đầu bộc lộ tử huyệt.

Bài toán này đã đưa ngành E-commerce đi qua 3 giai đoạn tiến hóa kiến trúc, và hiện tại, chúng ta đang đứng ở bước ngoặt lớn nhất: Agentic Search.

1. Sự Sụp Đổ Của Lexical Search (Khớp Từ Khóa)

Lexical Search (tìm kiếm theo từ vựng) hoạt động dựa trên nguyên tắc “từ khóa khớp từ khóa”.

Điều này dẫn đến những trải nghiệm khách hàng tệ hại khi hệ thống không thể hiểu được các từ đồng nghĩa, lỗi chính tả, hoặc các khái niệm ngầm định. Bạn gõ “áo mùa đông”, hệ thống dùng Elasticsearch truyền thống có thể sẽ bỏ qua những chiếc “áo khoác lông cừu” cực kỳ phù hợp, chỉ vì trong tên sản phẩm không chứa đúng cụm từ “mùa đông”.

2. Giới Hạn Của Semantic Search (Tìm Kiếm Ngữ Nghĩa)

Để giải quyết vấn đề trên, ngành công nghiệp chuyển dịch sang Semantic Search (Vector Search). Các sản phẩm được mã hóa thành các Vector đa chiều (Embeddings) và lưu trữ trong Vector Database (như Qdrant, Milvus).

Semantic Search giải quyết xuất sắc bài toán “ngữ cảnh”. Nó hiểu rằng “áo mùa đông” và “áo khoác lông cừu” nằm gần nhau trong không gian vector.

Nhưng Semantic Search vẫn là một hệ thống thụ động (Passive System). Nó nhận một chuỗi Vector, tính toán khoảng cách hình học, và trả về một danh sách tĩnh (1-step workflow). Nó hoàn toàn bất lực trước Business Logic (Logic nghiệp vụ) theo thời gian thực.

Vector Database không thể trả lời được câu hỏi: “Sản phẩm này hiện tại có đang còn hàng ở kho Quận 1 không?”. Bạn không bao giờ nên (và không thể) lưu trữ những dữ liệu biến động liên tục từng giây như “Tồn kho” (Inventory) hay “Giá khuyến mãi flash-sale” (Dynamic Pricing) vào bên trong một Vector Database.

Agentic Search (Tìm kiếm qua tác nhân AI) giải quyết bài toán này bằng cách đặt một “Bộ Não điều phối” (Orchestration Layer) đứng trước các cơ sở dữ liệu. Thay vì để hệ thống truy vấn trực tiếp DB một cách thụ động, chúng ta giao quyền tự quyết (Autonomous) cho một AI Agent.

graph TD
    User([Khách hàng]) -- "Giày trail, < 2tr, giao ngay" --> Agent{AI Orchestrator}
    Agent -- "1. Vector Search" --> Qdrant[(Qdrant Vector DB)]
    Agent -- "2. Tool Calling" --> API[Inventory & Pricing API]
    Qdrant -. "Top 50 Semantic IDs" .-> Agent
    API -. "Lọc ra 5 IDs còn hàng ở kho gần nhất" .-> Agent
    Agent -- "3. Critique & Synthesize" --> User

Agentic Search chia nhỏ một truy vấn phức tạp thành một luồng suy luận nhiều bước:

  1. Phân Tích Ý Định (Intent Parsing): Khi nhận câu lệnh “giày chạy trail chống nước, dưới 2 triệu, giao ngay”, Agent không lập tức search. Nó phân rã câu lệnh thành:
    • Ngữ nghĩa: Giày chạy trail, chống nước $\rightarrow$ Cần Vector Search.
    • Bộ lọc cứng (Hard filter): Giá < 2.000.000 VNĐ.
    • Logic thời gian thực: Giao ngay $\rightarrow$ Cần gọi API Inventory Service để check kho gần nhất.
  2. RAG Chủ Động & Tool Calling: Agent sử dụng cơ chế Tool Calling (Function Calling). Nó ra lệnh cho backend Golang thực thi:
    • VectorSearch(query: "giày chạy trail chống nước", max_price: 2000000) $\rightarrow$ Trả về 50 Product IDs.
    • CheckLiveInventory(ids, location: "ho-chi-minh") $\rightarrow$ Lọc lại còn 5 IDs thực sự có sẵn.
  3. Kiểm Duyệt & Tổng Hợp (Critique & Synthesize): Agent tự kiểm tra lại kết quả, và cuối cùng tổng hợp thành một câu trả lời tự nhiên, chính xác tuyệt đối kèm theo danh sách sản phẩm.

4. Tại Sao Lại Là Golang + Qdrant?

Đa số các tutorial về AI hiện nay được viết bằng Python (LangChain, LlamaIndex). Tuy nhiên, khi đưa lên môi trường E-commerce thực tế với hàng chục ngàn Request Per Second (RPS), điểm yếu về Concurrency (Global Interpreter Lock - GIL) của Python trở thành một nút thắt cổ chai thảm họa.

Trong mô hình Agentic Search, hệ thống phải gọi hàng tá các API và DB queries cùng một lúc. Goroutines của Golang giải quyết bài toán này một cách hoàn hảo, giảm độ trễ (latency) xuống mức tối thiểu. Kết hợp với Qdrant — Vector Database được viết bằng Rust cực kỳ mạnh mẽ trong việc xử lý “Filtered Vector Search” — chúng ta có một stack hoàn hảo cho Production.

Series tiếp theo đây sẽ mổ xẻ chi tiết cách bạn có thể tự tay xây dựng hệ thống kiến trúc hạng nặng này.


👉 Bài tiếp theo: Part 1 - The Paradigm Shift: Kiến Trúc Agentic & Sức Mạnh Điều Phối Của Golang