Bài viết

AI Engineering

10 Bài Học Thực Chiến Khi Xây Dựng Ecommerce AI Chatbot Với LangGraph

Chia sẻ 10 key takeaways quan trọng nhất sau hơn 1 tháng vật lộn xây dựng Ecommerce Chatbot có thể thay thế nhân viên bán hàng, từ Query Expansion đến Response Merger.

11/03/2026 · 13 phút đọc · Lê Huy Thái

10 Bài Học Thực Chiến
  • Query Expansion — mở rộng query TRƯỚC khi search; synonym dict nhỏ, impact lớn
  • LangGraph Pipeline — graph-based agent kiểm soát được, debug dễ hơn 10× so với ReAct
  • Multi-Intent Routing — parallel vs sequential do code quyết định, có whitelist rõ ràng
  • 3-tầng Memory — context nóng + progressive summary + cross-session profile; đặt summary ở ĐẦU prompt
  • Tool Engineering — data trả về tốt hơn = chatbot thông minh hơn, không cần đổi prompt
  • Vector Search + Reranking — exact match scoring sau semantic search, 0 API call thêm
  • CRAG (Corrective RAG) — tự chấm điểm và viết lại query trước khi trả "không tìm thấy"
  • Giới hạn rõ ràng — structured unsupportedReason, không hallucinate bao giờ
  • Code làm toán, LLM dùng ngôn ngữ — sort/filter bằng code, LLM sai ~40% khi làm toán
  • Response Merger — gộp N đoạn thành 1 tin nhắn tự nhiên qua 1 LLM call

Trong lúc có nhiều người vẫn nghi ngờ việc Agentic AI có thể ứng dụng trong thực tế như thế nào, thì mình đang triển khai một MVP mà nếu dự án này thành công — có lẽ nhiều người sẽ phải... ra đường.

Xin chào các bạn, lâu ghê không post một bài, bởi vì hơn 1 tháng nay mình đang bận xây dựng một Ecommerce Assistant — có thể gọi là Chatbot cho việc bán hàng. Nhờ cơ hội móc nối với một nền tảng có sẵn 30–40.000 shop, triển khai thử nghiệm Ecommerce Chatbot mà mình tin rằng thông minh hơn đa số các chatbot đang được tích hợp vào các trang bán hàng ngoài thị trường, có khả năng thay thế các vị trí Sale, Trực page, Chăm sóc khách hàng... Và nếu MVP này thành công thì sao? Chẳng phải là rất nhiều người đang làm các vị trí đó phải ra đường hay sao?

Nhưng bài viết này không phải để khoe — mà có thể nó sắp trở thành một minh chứng thực tế cho sức mạnh của Agentic AI áp dụng vào thực tế. Mục đích chính của bài này là chia sẻ lại những key takeaways mình vọc vạch được sau khi vật lộn với dự án này xuyên Tết.

Tệp người đọc hướng tới các bạn lập trình viên đang quan tâm tới việc tích hợp AI vào các dự án từ đơn giản tới phức tạp nhất (AI Application Engineer) nói chung, và các bạn đang muốn xây dựng những Agentic AI thông minh nói riêng.

Chatbot làm được gì?

Sơ qua về Chatbot: Tại sao nó có thể thay thế nhân viên bán hàng?

Khả năngChi tiết
Nhớ mọi thứ về ShopChỉ cần đưa data, chatbot không bao giờ quên các thông tin quan trọng về shop mà nó đang làm việc.
Trò chuyện dài full luồngTheo chân người mua qua mọi giai đoạn của việc bán hàng, trò chuyện tư vấn không khác gì một nhân viên.
Tư vấn sản phẩmKhách hỏi bằng ngôn ngữ bình thường, không cần gõ đúng tên. "Cho xem mấy loại đồ ăn vặt lành mạnh" — nó hiểu ý, tìm theo nghĩa chứ không chỉ keyword.
Quản lý giỏ hàng"Mua 2 lọ dầu dừa với 3 hộp ngũ cốc" — hiểu là 2 hành động, thêm từng cái, báo kết quả từng cái.
Đặt đơn hàng trong chatHỏi SĐT, địa chỉ, tóm tắt đơn, xác nhận, tạo đơn. Những lần đặt sau? Nhớ thông tin cũ, không hỏi lại.
Nhớ ngữ cảnh dàiChat 50 tin nhắn vẫn nhớ khách thích gì, budget bao nhiêu, dị ứng gì.
Xử lý multi-intent"Thêm ngũ cốc vào giỏ, tìm sữa hạt rồi xóa giỏ hàng luôn" — 2 yêu cầu trong 1 tin nhắn, xử lý cả 2.
Biết giới hạnHỏi review sản phẩm, mã giảm giá (chưa hỗ trợ) — thẳng thắn nói chưa hỗ trợ, gợi ý liên hệ shop, chứ không bịa.
10 Bài Học

1. Query Expansion — Đừng để LLM chịu trách nhiệm hiểu hết ngôn ngữ người dùng

Khách gõ "sữa hạt" nhưng trong database tên sản phẩm là "Sữa Hạt Macca Nguyên Chất 500ml". Vector search có thể tìm được, nhưng không phải lúc nào cũng chính xác — đặc biệt với tiếng Việt và tên sản phẩm đặc thù.

Mình xây 1 lớp Query Expansion chạy TRƯỚC khi search:

"sữa hạt" → ["sữa hạt", "sữa hạt macca", "sữa hạt điều", "sữa hạt óc chó"...]

Dùng synonym dictionary (~70 entries viết tay + auto-expand từ catalog).


Bài học #2 — Kiến trúc
Dùng LangGraph — Thiết kế Agent như một pipeline có kiểm soát

Đây là quyết định kiến trúc quan trọng nhất. Ban đầu mình dùng ReAct agent — LLM tự nghĩ, tự chọn tool, tự chạy. Demo thì đẹp, nhưng production thì nightmare: LLM gọi tool sai, gọi thừa, chạy vòng vòng, debug muốn khóc.

Chuyển sang LangGraph — thiết kế pipeline dưới dạng đồ thị với nhiều node chuyên biệt:

  • Supervisor: Phân loại intent
  • Product Advisor: Tìm sản phẩm
  • Cart Manager: Quản lý giỏ hàng
  • Order Manager: Đặt đơn hàng

Code quyết định node nào chạy, thứ tự nào. LLM chỉ lo phần "suy nghĩ" trong phạm vi của nó.

Kết quả? Debug dễ hơn 10 lần, chính xác hơn nhiều, và quan trọng nhất — KIỂM SOÁT ĐƯỢC.


3. Multi-Intent: Parallel và Sequential — Khách nói 1 câu nhưng muốn 2 thứ

"Tìm sữa hạt rồi thêm 2 lọ dầu dừa vào giỏ" — đây là 2 intent khác nhau. Nếu chatbot chỉ xử lý 1 thì khách bực lắm.

Mình dùng node Supervisor với Chain-of-Thought reasoning — bắt LLM phải giải thích suy luận TRƯỚC khi commit intent. Sau đó tách thành sub-queries, route vào đúng node chuyên biệt.

Nhưng đây mới là phần hay: KHÔNG PHẢI cặp intent nào cũng chạy song song được.

Trường hợpLý do
Tìm sản phẩm + Trả lời câu hỏi chungKhông đụng gì nhau — chạy độc lập hoàn toàn

Mình define 1 whitelist các cặp an toàn để parallel, còn lại default sequential. Code quyết định, không phải LLM.


4. Conversation Memory — Chatbot không nhớ thì không bằng Google

Chat được 20–30 tin nhắn mà chatbot quên sạch context, hỏi lại từ đầu — khách bỏ đi.

Nhưng nhồi hết 50 tin nhắn vào context LLM cũng không ổn — tốn token, chậm, và có 1 hiện tượng gọi là "Lost in the Middle" — LLM chú ý đầu và cuối tin nhắn tốt, nhưng quên mất thông tin ở giữa.

Mình xây 3 tầng memory:

  1. 01
    Context nóng

    Giữ nguyên ~8 tin nhắn gần nhất — không nén, không mất chi tiết quan trọng.

  2. 02
    Progressive Summary

    Tự động tóm tắt tin nhắn cũ hơn thành vài câu khi vượt ngưỡng. LLM đọc tóm tắt thay vì full history.

  3. 03
    Cross-session Profile (sắp tới)

    Lưu preferences khách vào Redis, quay lại hôm sau vẫn nhớ — không hỏi lại sở thích.


5. Làm Tool càng xịn, Chatbot càng thông minh

Nhiều người tập trung prompt engineering nhưng quên mất: chatbot chỉ thông minh bằng TOOLS mà nó có.

Ban đầu tool search sản phẩm chỉ trả tên + giá. Chatbot được hỏi "sản phẩm này làm từ gì" — không biết. Thêm description vào tool result — chatbot trả lời được ngay, KHÔNG CẦN đổi prompt.


6. Vector Search thôi chưa đủ — Cần thêm Reranking

Vector search (semantic) hiểu ý tốt — "đồ uống lành mạnh" tìm được sữa hạt, trà thảo mộc. Nhưng exact match thì kém — khách gõ đúng tên sản phẩm mà có khi trả kết quả khác.

Mình thêm 1 lớp reranking sau vector search — chấm điểm lại kết quả bằng code thuần:

Tiêu chíĐiểm cộng
Tên sản phẩm match chính xác+3 điểm
Keyword trùng+1 điểm
Category đúng+0.5 điểm

Chạy trên server, 0 API call thêm, mà chất lượng kết quả tăng 20–35%. Rẻ mà hiệu quả.

20–35%

Cải thiện chất lượng search

Sau khi thêm reranking layer

0

API call thêm

Reranking chạy thuần code trên server


7. Implement CRAG (Corrective RAG) — Đừng trả "Không tìm thấy" ở lần đầu

Khách hỏi "sữa hạt bán chạy nhất" — vector search trả kết quả kém — chatbot nói "không tìm thấy" — khách bỏ đi. Nhưng search lại với "sữa hạt" đơn giản hơn thì có kết quả!

Mình implement self-check theo 4 bước:

  1. 01
    Search lần đầu

    Thực hiện vector search với query gốc của người dùng.

  2. 02
    Tự chấm điểm

    Dựa trên similarity score — kết quả tốt hay kém?

  3. 03
    Viết lại query

    Nếu kém — LLM viết lại query đơn giản hơn (bỏ modifier như "bán chạy nhất", "mới nhất").

  4. 04
    Search lại

    Chỉ khi retry cũng fail mới thực sự trả về "không tìm thấy".

Chi phí thêm 1 lần gọi LLM khi fail, nhưng giảm ~30% tỷ lệ chatbot từ chối trả lời. Khách không bị bỏ rơi.

~30%

Giảm tỷ lệ từ chối trả lời

Nhờ CRAG retry trước khi báo lỗi

+1

LLM call khi fail

Chi phí retry — chỉ tốn khi cần thiết


8. Chỉ rõ giới hạn chức năng — Đừng để Chatbot bịa

Đây là điểm nhiều chatbot AI dở: khách hỏi gì cũng trả lời, kể cả bịa. "Sản phẩm này review 5 sao" — trong khi hệ thống không có review.

Mình define rõ ràng trong prompt và code: chatbot BIẾT mình không có tính năng review, không có mã giảm giá, không track đơn. Khi khách hỏi — trả lời thẳng thắn "chưa hỗ trợ", gợi ý liên hệ shop, chứ không hallucinate.

Ngoài ra, mình dùng structured output với field unsupportedReason:

// LLM phải classify LÝ DO không hỗ trợ
type UnsupportedReason =
  | "no_review_system"
  | "no_promotion_data"
  | "no_store_info";

// → Response template phù hợp với từng trường hợp

Bài học #9 — Sai lầm phổ biến nhất
Tuyệt đối đừng tin LLM làm toán

Khách nói "thêm cái đắt nhất vào giỏ" — 5 sản phẩm có giá khác nhau — LLM chọn. Kết quả? Sai ~40%. LLM rất kém so sánh số, bị ảnh hưởng bởi vị trí trong danh sách, thậm chí nhầm "đắt nhất" với "rẻ nhất".

Fix cực đơn giản:

detect keyword ("đắt nhất", "rẻ nhất")
  → code sort mảng theo giá
  → chọn đúng cái
  → inject cho LLM format response

Code sort thì luôn đúng, LLM sort thì may rủi.


10. Response Merger — Nhiều Node trả lời thì phải gộp thông minh

Khi chatbot xử lý 2–3 intent cùng lúc, mỗi node trả 1 đoạn response riêng. Nối bằng xuống dòng — tin nhắn rời rạc, lặp lời chào, thiếu tự nhiên.

Mình dùng 1 node Response Merger — nhận N đoạn response, mỗi đoạn được gắn type với thứ tự ưu tiên:

TypeƯu tiên
cart_updateCao — luôn đứng trước
product_listTrung bình
orderTrung bình
fallbackThấp nhất

LLM viết lại thành 1 tin nhắn tự nhiên, mạch lạc.

Ưu điểm
  • 1 response — trả nguyên, 0 LLM call
  • 2+ responses — 1 LLM call merge (~1–2 giây)
  • Trải nghiệm tự nhiên, không rời rạc
Nhược điểm
  • Thêm latency ~1–2 giây khi có multi-intent
  • Cần định nghĩa priority rõ ràng cho từng response type
Tổng kết

Nhìn lại: 3 điều quan trọng nhất

~40%

LLM sai khi sort giá

Lý do không giao toán cho LLM

~30%

Giảm tỷ lệ từ chối

Nhờ CRAG corrective retry

20–35%

Cải thiện search quality

Reranking layer, 0 chi phí API thêm

10 bài học trên là kết quả của hơn 1 tháng vật lộn với thực tế. Có vài điều mình muốn nhấn mạnh:

  • Prompt engineering có giới hạn — tool engineering, architecture engineering mới là nơi tạo ra sự khác biệt thật sự.
  • Code phải kiểm soát LLM, không phải ngược lại. Mọi logic deterministic phải do code xử lý.
  • Trải nghiệm người dùng là vua — chatbot thông minh nhưng trả lời rời rạc, quên context, hay bịa thì vẫn bị bỏ.

Bạn đang xây dựng AI Agent cho ecommerce?

Nếu bạn đang gặp khó khăn với bất kỳ bài học nào ở trên — query expansion, LangGraph pipeline, memory architecture — hãy liên hệ với mình. Mình sẵn sàng đào sâu hơn vào từng topic cụ thể.