Mở đầu — vì sao bài này quan trọng
Hãy tưởng tượng bạn vừa được giao xây một sản phẩm AI: một trợ lý trả lời câu hỏi dựa trên kho tài liệu nội bộ của công ty. Bạn mở tài liệu của OpenAI, thấy một hàm chat.completions.create gọi rất gọn. "Dễ mà", bạn nghĩ. Nhưng khi bắt tay vào làm thật, bạn nhận ra một lời gọi API chỉ là một mảnh rất nhỏ. Bạn còn phải: cắt tài liệu thành từng đoạn (chunking), tạo embedding, lưu vào vector database, truy vấn ra đoạn liên quan, ghép chúng vào prompt, quản lý lịch sử hội thoại (memory), gọi thêm công cụ bên ngoài (tool calling), rồi xử lý streaming để trả về từng chữ cho người dùng. Mỗi mảnh này lại có hàng chục biến thể và ngoại lệ.
Đây chính là lý do tồn tại của AI infrastructure layer — tầng hạ tầng phần mềm nằm giữa mô hình ngôn ngữ (LLM) và ứng dụng của bạn. Các framework như LangChain, LlamaIndex, Haystack hay Semantic Kernel ra đời để làm "chất keo" (glue) nối các mảnh rời rạc lại, đóng gói sẵn những mẫu thiết kế lặp đi lặp lại (RAG, agents, chains) để bạn không phải viết lại từ đầu.
Trong bài này, bạn sẽ hiểu rõ tầng hạ tầng này gồm những gì, khi nào nên dùng framework và khi nào nên tự viết, cách chọn framework phù hợp, và những cạm bẫy khiến nhiều đội ở Việt Nam mất hàng tuần chỉ để gỡ rối. Đây là kiến thức nền tảng — nó quyết định tốc độ và độ bền của mọi sản phẩm AI bạn xây sau này.
Khái niệm cốt lõi
AI infrastructure layer là gì
Hãy hình dung một sản phẩm AI như một cỗ máy gồm nhiều bộ phận:
- LLM (GPT, Claude, Gemini, Llama): bộ não suy luận.
- Vector database (Pinecone, Weaviate, Qdrant, pgvector): trí nhớ dài hạn, lưu tri thức dưới dạng vector.
- Tools/APIs: tay chân — gọi thời tiết, tra cứu đơn hàng, chạy code.
- Memory: trí nhớ ngắn hạn của cuộc hội thoại.
- Orchestration: bộ điều phối quyết định bước nào chạy trước, bước nào sau.
Các framework phổ biến và điểm mạnh riêng
LangChain là framework nổi tiếng nhất, có tính "tổng lực". Nó cung cấp khái niệm chains (chuỗi các bước xử lý nối tiếp), agents (LLM tự quyết định gọi công cụ nào), và tích hợp sẵn hàng trăm nhà cung cấp LLM, vector DB, tool. Điểm mạnh là bao phủ rộng và cộng đồng khổng lồ; điểm yếu là từng bị chê "trừu tượng quá đà", khó debug. Phiên bản mới với LangGraph đã giải quyết nhiều vấn đề này bằng cách mô hình hóa luồng agent thành đồ thị trạng thái rõ ràng.
LlamaIndex tập trung sâu vào RAG và indexing dữ liệu. Nếu bài toán của bạn là "hỏi đáp trên kho tài liệu", LlamaIndex có các cấu trúc chỉ mục (index) tinh vi hơn: từ đơn giản như vector index đến phức tạp như tree index, knowledge graph index. Nó cũng có bộ data connectors (LlamaHub) đọc được dữ liệu từ Notion, Google Drive, Slack, SQL...
Haystack (của Deepset) hướng đến production và pipeline rõ ràng, được nhiều đội enterprise ưa chuộng vì kiến trúc tường minh, dễ kiểm thử.
Semantic Kernel (của Microsoft) mạnh trong hệ sinh thái .NET/C#, phù hợp doanh nghiệp đã dùng Azure.
Ngoài ra còn Vercel AI SDK thiên về frontend/streaming (sẽ nói kỹ ở Bài 24), và Pydantic AI, Instructor cho việc lấy đầu ra có cấu trúc (structured output).
Vì sao nên dùng framework — và cái giá phải trả
Lợi ích rõ ràng nhất là tốc độ và tính chuẩn hóa. Những mẫu như RAG, ReAct agent, conversational memory đã được cộng đồng thử nghiệm hàng triệu lần. Bạn không cần phát minh lại. Framework cũng giúp đổi nhà cung cấp dễ dàng: hôm nay dùng GPT-4o, mai muốn thử Claude hay Gemini chỉ cần đổi vài dòng cấu hình thay vì viết lại toàn bộ.
Nhưng cái giá là abstraction overhead. Framework che giấu chi tiết, và khi có lỗi hoặc cần tối ưu, sự che giấu đó trở thành bức tường. Bạn cũng gánh thêm rủi ro phụ thuộc: framework nâng cấp phiên bản là code có thể vỡ. Đây là sự đánh đổi cốt lõi mà bạn phải cân nhắc ở mỗi dự án.
Nguyên tắc "framework không phải tất cả hoặc không gì cả"
Một hiểu lầm phổ biến: nghĩ rằng phải chọn dùng framework cho toàn bộ dự án hoặc không dùng gì. Thực tế, cách khôn ngoan nhất là dùng framework cho phần đúng việc của nó. Ví dụ, dùng LlamaIndex chỉ cho khâu indexing và retrieval, còn phần gọi LLM và xử lý business logic thì tự viết bằng SDK thuần. Tư duy "chọn công cụ theo từng lớp" (per-layer) sẽ giúp bạn tránh bị khóa cứng.
Tình huống thực tế
Ví dụ 1 — Startup fintech ở TP.HCM: khi framework cứu tiến độ
Một startup fintech 12 người tại Quận 1 cần ra mắt chatbot hỗ trợ khách hàng tra cứu chính sách vay tiêu dùng trong 6 tuần để kịp vòng gọi vốn. Kho tài liệu gồm khoảng 400 file PDF hợp đồng và quy định.
Đội chọn LlamaIndex vì bài toán thuần RAG. Nhờ có sẵn PDF loader, chunking mặc định và tích hợp Qdrant, họ dựng được bản chạy thử (prototype) trong 3 ngày thay vì 2 tuần nếu tự viết. Đến tuần thứ 4 họ đã có bản demo cho nhà đầu tư.
Bài học: Khi bài toán rơi đúng vào "vùng ngọt" (sweet spot) của framework — ở đây là RAG tài liệu — và bạn bị áp lực thời gian, framework tiết kiệm cho bạn hàng chục ngày công. Đừng tự viết lại những gì đã được chuẩn hóa tốt.
Ví dụ 2 — Đội thương mại điện tử Đông Nam Á: khi abstraction trở thành gánh nặng
Một công ty e-commerce quy mô khu vực (giả định tên ShopSEA) dùng LangChain agents để xây trợ lý gợi ý sản phẩm. Ban đầu mọi thứ chạy tốt với vài trăm người dùng. Nhưng khi lên 50.000 lượt hỏi mỗi ngày, họ gặp ba vấn đề: chi phí token tăng vọt vì framework âm thầm nhồi thêm nhiều "system prompt" ẩn; độ trễ (latency) cao vì mỗi agent step gọi LLM nhiều lần không cần thiết; và khi có bug, log của framework quá nhiều tầng khiến kỹ sư mất 2 ngày mới tìm ra nguyên nhân.
Cuối cùng họ viết lại phần agent core bằng SDK thuần của nhà cung cấp, chỉ giữ LangChain cho phần kết nối vector DB. Chi phí giảm khoảng 35%, độ trễ p95 giảm gần một nửa.
Bài học: Framework tuyệt vời để bắt đầu nhanh, nhưng ở quy mô lớn và khi cần kiểm soát chặt chi phí/độ trễ, abstraction có thể phản tác dụng. Hãy sẵn sàng "bóc" bớt framework ở những đường dẫn nóng (hot path).
Ví dụ 3 — Đội nội bộ ngân hàng: chọn Haystack vì tính tường minh
Một ngân hàng lớn tại Hà Nội xây hệ thống tra cứu quy định nội bộ cho nhân viên tín dụng. Yêu cầu quan trọng nhất không phải tốc độ ra mắt mà là khả năng kiểm thử, kiểm toán và giải thích được từng bước — vì lý do tuân thủ. Họ chọn Haystack vì pipeline được định nghĩa rõ ràng thành các thành phần (component) nối với nhau, mỗi bước có thể kiểm thử độc lập và log minh bạch.
Bài học: Tiêu chí chọn framework không chỉ là "cái nào phổ biến nhất", mà là "cái nào khớp với ràng buộc quan trọng nhất của dự án". Với môi trường bị quản lý chặt (regulated), tính tường minh quan trọng hơn tốc độ.
Hướng dẫn từng bước
Đây là quy trình thực tế để quyết định và triển khai tầng hạ tầng AI cho một dự án mới:
Bước 1 — Xác định bài toán thuộc mẫu nào. Sản phẩm của bạn chủ yếu là RAG (hỏi đáp trên dữ liệu), agent (tự động ra quyết định gọi công cụ), hay chỉ là chain đơn giản (một chuỗi prompt cố định)? Việc gọi tên đúng mẫu giúp bạn chọn framework hợp lý: RAG → nghiêng LlamaIndex; agent phức tạp → LangGraph; pipeline enterprise → Haystack.
Bước 2 — Đánh giá ràng buộc dự án. Liệt kê ba ràng buộc quan trọng nhất theo thứ tự: tốc độ ra mắt, chi phí, độ trễ, tính tường minh, khả năng khóa nhà cung cấp. Framework tối ưu cho tốc độ ra mắt nhưng có thể yếu ở kiểm soát chi phí và độ trễ.
Bước 3 — Dựng prototype nhanh bằng framework. Luôn bắt đầu bằng framework để có bản chạy được trong vài ngày. Đừng tối ưu sớm. Mục tiêu giai đoạn này là kiểm chứng ý tưởng, không phải hoàn hảo về kỹ thuật.
Bước 4 — Đo lường thực tế. Trước khi lên production, đo ba chỉ số: số token trung bình mỗi request (để tính chi phí), độ trễ p50/p95, và số lần gọi LLM ẩn mà framework thực hiện. Nhiều đội sốc khi phát hiện framework gọi LLM gấp 3-4 lần họ tưởng.
Bước 5 — Xác định hot path và cân nhắc "bóc" framework. Với những luồng chạy nhiều nhất và nhạy cảm về chi phí/độ trễ, cân nhắc viết lại bằng SDK thuần để kiểm soát hoàn toàn. Giữ framework cho những phần ít quan trọng hơn về hiệu năng.
Bước 6 — Cô lập sự phụ thuộc. Bọc (wrap) mọi lời gọi framework sau một lớp interface do bạn tự định nghĩa. Nhờ đó, nếu sau này muốn đổi từ LangChain sang code thuần hay đổi framework, bạn chỉ sửa một chỗ thay vì cả codebase.
Lỗi thường gặp & mẹo
Lỗi 1 — Dùng framework cho việc quá đơn giản. Nếu bạn chỉ cần gọi LLM một lần với prompt cố định, đừng lôi cả LangChain vào. Một lời gọi SDK thuần 5 dòng còn dễ đọc và dễ bảo trì hơn. Framework chỉ đáng giá khi độ phức tạp đủ lớn.
Lỗi 2 — Không đọc kỹ prompt mà framework tự sinh. Nhiều framework nhồi thêm system prompt, few-shot examples ẩn vào request. Điều này làm tăng token, tăng chi phí và đôi khi làm mô hình trả lời sai lệch. Mẹo: bật chế độ verbose/debug và đọc chính xác payload gửi đến LLM.
Lỗi 3 — Nâng cấp phiên bản mù quáng. Các framework AI thay đổi API rất nhanh, đôi khi phá vỡ tương thích ngược. Mẹo: ghim (pin) phiên bản trong file dependencies, đọc changelog trước khi nâng cấp, và có bộ test tự động cho các luồng chính.
Lỗi 4 — Khóa cứng vào một framework từ ngày đầu. Nếu toàn bộ business logic của bạn quấn chặt vào abstraction của framework, việc thoát ra sau này rất đau. Mẹo: luôn có lớp interface trung gian của riêng bạn.
Lỗi 5 — Bỏ qua evaluation vì tin framework "chạy là được". Framework giúp code chạy, nhưng không đảm bảo chất lượng câu trả lời. Việc đánh giá chất lượng là chủ đề riêng (Bài 9), nhưng nhớ rằng framework không thay thế được nó.
Mẹo tổng quát: Hãy xem framework như "giàn giáo" (scaffolding) để xây nhanh, chứ không phải nền móng vĩnh viễn. Bạn có thể giữ giàn giáo ở nơi ít quan trọng và thay bằng kết cấu bền vững ở nơi trọng yếu.
Bài tập thực hành
Bài tập 1 — Phân loại mẫu kiến trúc. Lấy 3 ý tưởng sản phẩm AI bất kỳ (ví dụ: trợ lý tra cứu chính sách nhân sự, bot đặt lịch khám bệnh, công cụ tóm tắt tin tức). Với mỗi ý tưởng, xác định nó thuộc mẫu RAG, agent hay chain, và ghi lý do. Sau đó chọn framework phù hợp và giải thích.
Bài tập 2 — Dựng prototype RAG. Dùng LlamaIndex hoặc LangChain, xây một RAG đơn giản trên 10 file PDF của bạn: nạp tài liệu, tạo index, và hỏi 5 câu. Ghi lại thời gian bạn hoàn thành và những chỗ framework giúp bạn tiết kiệm công sức.
Bài tập 3 — Đo abstraction overhead. Với prototype ở bài tập 2, bật chế độ debug/verbose và ghi lại: mỗi câu hỏi thực sự gọi LLM bao nhiêu lần, tốn bao nhiêu token, và prompt cuối cùng gửi đi trông ra sao. So sánh với hình dung ban đầu của bạn.
Bài tập 4 — Thiết kế lớp interface. Viết (bằng pseudocode) một interface trung gian có tên RetrievalService với các hàm index(documents) và query(question). Cho thấy bạn có thể cắm LlamaIndex vào phía sau interface này, và nếu sau đổi sang code thuần thì chỉ cần sửa một lớp.
Tóm tắt
AI infrastructure layer là tầng phần mềm nối LLM với vector database, tools và memory — làm "chất keo" gắn các mảnh của sản phẩm AI. Các framework như LangChain, LlamaIndex, Haystack, Semantic Kernel đóng gói sẵn những mẫu lặp đi lặp lại (RAG, agents, chains), giúp bạn xây nhanh và dễ đổi nhà cung cấp.
Điểm mấu chốt cần nhớ:
- Framework tuyệt vời để bắt đầu nhanh, đặc biệt khi bài toán rơi đúng vùng ngọt của nó (LlamaIndex cho RAG, LangGraph cho agent phức tạp, Haystack cho enterprise tường minh).
- Cái giá là abstraction overhead: token ẩn, độ trễ, khó debug. Ở quy mô lớn hoặc hot path, hãy sẵn sàng "bóc" framework và viết SDK thuần.
- Đừng chọn tất-cả-hoặc-không: dùng framework cho đúng lớp việc của nó, tự viết phần còn lại.
- Luôn cô lập sự phụ thuộc sau một lớp interface riêng để không bị khóa cứng.
- Chọn theo ràng buộc quan trọng nhất của dự án, không chỉ theo độ phổ biến.