My Blog

“Bugs are your enemies, so you have killed one.
Now your software is having one bug less.
Mistakes are good as long as they are not repeating.
What you learn today, prepares you for tomorrow”

– Developer’s Best Practice

RAG là gì? Và tại sao mấy ông AI cứ nhắc hoài?
RAG là gì? Và tại sao mấy ông AI cứ nhắc hoài?June 6, 2025AIRAG – viết tắt của “Retrieval-Augmented Generation” – nghe thì có vẻ ngầu, nhưng thực ra hiểu đơn giản thì nó là một cách giúp mấy con AI… đỡ ngu hơn khi trả lời câu hỏi. Nếu bạn đã sử dụng AI cho công việc chuyên môn, chắc chắn có lúc bạn sẽ thấy AI “hallucinate” ra những câu trả lời rất khó hiểu. Vấn đề của AI: Hay “nói xạo” vì… quên sách giáo khoa AI như ChatGPT, Claude, hay mấy con LLM khác – thật ra chỉ là mấy cỗ máy đoán chữ siêu cấp, bản chất là một function khổng lồ dài dằng dặc. “Function” (= Model) này được huấn luyện từ cả tấn dữ liệu có sẵn, nhưng sau huấn luyện thì không còn truy cập được mấy dữ liệu đó nữa (trừ khi update model). Thành ra, hỏi mấy câu “kiến thức mới”, hoặc “nội bộ công ty”, thì nó đành bịa đại hoặc xin lỗi. Ví dụ:• Hỏi: “Trong chính sách công ty mình có bao nhiêu ngày phép năm?”• AI: “Thông thường ở Việt Nam là 12 ngày…” (hên xui đúng, mà cũng hên xui sai bét) RAG ra đời: Cho AI… đi tra Google trước khi trả lời RAG là kỹ thuật giúp AI lấy thêm kiến thức tức thì từ một kho dữ liệu (VD: tài liệu công ty, cơ sở tri thức, database sản phẩm…). Quy trình kiểu như này: 1. Nhận câu hỏi từ người dùng 2. Đi tìm tài liệu liên quan (gọi là bước “retrieval” – tìm kiếm) 3. Đưa tài liệu đó vào làm “bài gợi ý” cho AI 4. AI dựa vào tài liệu đó để viết câu trả lời chính xác hơn Nói dễ hiểu thì giống như bạn hỏi trợ lý của mình một câu khó. Thay vì đoán mò, nó chạy đi lục tài liệu rồi quay lại trả lời cẩn thận hơn. Một ví dụ dễ hình dung Bạn xây một chatbot cho công ty bảo hiểm, khách vào hỏi: “Nếu tôi bị tai nạn xe ở nước ngoài thì có được đền không?” Bình thường AI sẽ… đoán mò. Nhưng nếu bạn tích hợp RAG: • Nó sẽ tìm file PDF “Chính sách bảo hiểm du lịch 2025” • Lọc ra đoạn có nội dung liên quan • Trả lời: “Theo chính sách năm 2025, nếu bạn có gói mở rộng quốc tế thì được bồi thường trong trường hợp tai nạn ở nước ngoài.” Trả lời mượt, đúng, và đáng tin hơn nhiều! Làm sao để xây RAG? Tóm tắt ngắn gọn:• Bước 1: Tạo “vector database” từ tài liệu (dùng tools như FAISS, Weaviate, hoặc Pinecone)• Bước 2: Khi có câu hỏi, nhúng (embed) nó và tìm kiếm trong vector DB• Bước 3: Lấy kết quả và nhét vào prompt để AI trả lời Nếu bạn xài LangChain hoặc LlamaIndex thì mấy bước này có sẵn như block lego, ghép là chạy thôi. Tổng kết RAG không phải là siêu năng lực, nhưng là cách cực kỳ thực tế để giúp AI:• Trả lời đúng hơn, cập nhật hơn• Hiểu được “kiến thức nội bộ”• Tránh nói nhảm, bịa chuyện Nếu bạn đang xây AI assistant, chatbot cho công ty, hay hệ thống hỏi đáp – đừng bỏ qua RAG. Nếu bạn muốn biết cách implement RAG cho LLM của mình thì để lại comment và mình sẽ lên bài hướng dẫn nhé! Peace! [...] Read more...
Hướng Dẫn Setup AI Blog to Podcast Agent
Hướng Dẫn Setup AI Blog to Podcast AgentMay 19, 2025AIDưới đây là bài viết giới thiệu nhanh về repo Awesome LLM Apps và hướng dẫn chạy thử “AI Blog to Podcast Agent” trên máy Mac của bạn. Mình sẽ lần lượt đi qua: Giới thiệu chung về repo Tại sao nên khám phá Điểm nhấn “AI Blog to Podcast Agent” Hướng dẫn chạy trên macOS 1. Giới thiệu chung Repo Awesome LLM Apps là một kho tàng tổng hợp các ứng dụng LLM (Large Language Models) được xây dựng với kỹ thuật Retrieval-Augmented Generation (RAG) và AI Agents. Tính đến thời điểm hiện tại, repo này đã thu hút hơn 32.2k sao trên GitHub, phản ánh sự quan tâm mạnh mẽ của cộng đồng. Cách đây 3 tháng, repo đã vượt mốc 15k+ sao, cho thấy số lượng stars vẫn đang tăng đều đặn. 2. Tại sao nên khám phá repo này Retrieval-Augmented Generation (RAG) là kỹ thuật cho phép LLM truy vấn và kết hợp thông tin mới từ các tài liệu bên ngoài trước khi sinh đầu ra, từ đó giảm thiểu tình trạng “hallucination” và cập nhật dữ liệu tức thì. Các AI Agents trong repo tận dụng RAG và khả năng tự động hóa của mô hình LLM để thực thi linh hoạt các tác vụ chuyên biệt, như xử lý email, phân tích dữ liệu, thậm chí tự động hóa quy trình kinh doanh. 3. Điểm nhấn: “AI Blog to Podcast Agent” Trong nhóm Starter AI Agents, project AI Blog to Podcast Agent có nhiệm vụ chuyển đổi tự động một bài blog thành tập podcast, đầy đủ âm thanh và cấu trúc chương trình. Bạn có thể dùng công cụ này để đưa nội dung blog lên nền tảng audio như Spotify, Anchor… mà không cần thủ công cắt ghép tiếng nói. 4. Hướng dẫn chạy trên macOS local Dưới đây là ví dụ minh họa cách chạy “AI Blog to Podcast Agent” ngay trên máy Mac của bạn: Lưu ý: Nếu project không có file main.py, vui lòng kiểm tra trong thư mục xem tên script chính là gì (ví dụ agent.py, app.py) và chạy tương ứng; thông tin này thường được ghi trong README của mỗi agent. 5. Kết luận Repo Awesome LLM Apps không chỉ giúp bạn khám phá các cách ứng dụng LLM với RAG và AI Agents, mà còn cung cấp hàng chục tutorial mẫu để bạn tự tay thực hành. Chúc bạn trải nghiệm vui vẻ và sáng tạo ra nhiều agent hữu ích! Nếu bạn thấy hữu ích, đừng quên star repo và follow tác giả để cập nhật thêm nhiều project mới nhé! Nguồn tham khảo GitHub Repo: Awesome LLM Apps (Shubhamsaboo)  Wikipedia: Retrieval-Augmented Generation  Wikipedia: Large Language Model  [...] Read more...
Trait – Mixin in PHP? – PART 2
Trait – Mixin in PHP? – PART 2May 19, 2025PHPDưới đây là phần 2 (và cũng là phần cuối) của series “Trait – Mixin trong PHP”. Ở phần này chúng ta sẽ đi sâu vào cách xử lý xung đột, mở rộng khả năng của Trait và các ví dụ thực tiễn. Mời các bạn xem lại phần 1 tại đây: https://dangnh.cf/2018/06/01/trait-mixin-in-php/ 1. Giải quyết xung đột giữa các Trait Khi một class use nhiều trait và có phương thức trùng tên, PHP sẽ báo lỗi. Để tránh, ta dùng hai từ khóa: 1.1. insteadof Chọn phương thức của trait này thay vì của trait kia: 1.2. as Đổi tên (alias) cho phương thức để vẫn có thể gọi cả hai: 2. Các tính năng nâng cao của Trait 2.1. Abstract method trong Trait Bạn có thể khai báo phương thức abstract trong trait, buộc class kế thừa phải triển khai: 2.2. Trait với thuộc tính static và const Trait cho phép định nghĩa static property và const: 2.3. Thuộc tính và phương thức private/protected Trait có thể khai báo method private hay protected, chỉ class chứa trait biết dùng: 2.4. Trait thừa kế Trait Trait cũng có thể use trait khác: 3. Ví dụ thực tế 3.1. Trait “SoftDelete” cho Model Giờ chỉ cần use SoftDelete, mọi class đều có tính năng xóa mềm. 3.2. Trait “Timestampable” Tự động quản lý created_at/updated_at: 4. Best Practices khi dùng Trait Giữ trait nhỏ, chuyên biệt: Mỗi trait chỉ đảm nhận một nhiệm vụ duy nhất. Đặt tên rõ ràng: Ví dụ Loggable, Notifiable, SoftDeleteable… Tránh trait quá “nặng”: Nếu trait chứa quá nhiều logic, cân nhắc tách thành class helper hoặc service. Tài liệu đầy đủ: Khai báo @method hay @property trong DocBlock nếu trait “inject” thêm method hay property cho IDE. 5. Kết luận Trait là công cụ mạnh mẽ giúp tái sử dụng code và “mixin” behavior vào nhiều class khác nhau mà không cần đa kế thừa. Tuy nhiên, lạm dụng quá nhiều trait có thể làm code rối và khó theo dõi. Hãy thiết kế trait gọn, rõ ràng, và áp dụng cho những hàm thực sự chung nhất. Cảm ơn bạn đã theo dõi series về Trait trong PHP. Chúc các bạn áp dụng hiệu quả và happy coding!   Tài liệu liên quan: PHP Manual – Traits: https://www.php.net/manual/en/language.oop5.traits.php  PHP Manual – Conflict Resolution: https://www.php.net/manual/en/language.oop5.traits.php#traits.conflict.resolution [...] Read more...
Service Container & DI “sành điệu” với Laravel
Service Container & DI “sành điệu” với LaravelJanuary 20, 2020PHPHi, long time no see 😀 Laravel là một framework nổi tiếng nhất trong cộng đồng PHP, 1 phần là vì cấu trúc tuyệt vời của nó. Khi nói đến architectural concepts của Laravel, không thể không nhắc tới Service Container. Khi bạn đụng đến 1 bài toán lớn hơn, cần sử dụng nhiều services, dependencies… thì bạn sẽ cần hiểu và sử dụng được Service Container. [...] Read more...
Trait – Mixin in PHP? <p1>
Trait – Mixin in PHP? June 1, 2018PHP / Web developmentHi guys 🙂 Như các bạn có lẽ đã biết, PHP là 1 ngôn ngữ single inheritance, tức là nó sẽ có 1 số nhược điểm như: Mất thời gian & công sức khi tìm hiểu/chạy hệ thống. Ví dụ: 1 class có 10 levels các class cha, thì về cơ bản nó sẽ phải chạy qua cả 10 levels đó để chạy 1 function mà nó thừa kế Class cha và class con bị ràng buộc với nhau. Tức là ta không thể tách riêng biệt 1 class nào để sử dụng được. Theo thời gian, thêm, sửa, xóa các chức năng cần phải rất cẩn thận, nhiều trường hợp là gần như không thể do độ phức tạp của cây thừa kế các class đó. Cực kì không linh hoạt trong nhiều trường hợp. Ví dụ bạn chỉ cần 1 class đơn giản, chứa vài cái functions bạn hay sử dụng trong hệ thống, class này có thể dính dáng đến nhiều phần khác nhau trong hệ thống, nên việc thừa kế nó có vẻ sẽ tạo nên 1 nút xoắn cực khó gỡ trong cây thừa kế các class. May mắn thay, từ PHP5.4, chúng ta đã có Trait để giải quyết các vấn đề nói trên. Nhưng liệu Trait có phải là Holy Grail cho PHP? Liệu khi nào nên dùng Trait? Khi nào thì phải tránh? Mời các bạn kéo xuống dưới để tìm hiểu cùng mình nhé 😉 Trait là gì? Traits is a mechanism for code reuse in single inheritance languages such as PHP. A Trait is intended to reduce some limitations of single inheritance by enabling a developer to reuse sets of methods freely in several independent classes living in different class hierarchies. Source … okay… hơi lằng nhằng phải không? Ngắn gọn thì Trait cũng giống như 1 abstract class vậy. Bạn chứa các methods, properties trong đó, nhưng bạn không thể instantiate (tạo object) nó được. Nói dễ hiểu, Trait là 1 mớ code bạn có thể dùng bất cứ chỗ nào bạn muốn. Simple as that 🙂 Nghe thì đơn giản thôi nhưng mà hơi bị hay đấy. Next, làm nào để dùng Trait? Phải cho ví dụ cụ thể người ta mới hiểu được chứ, đúng không!? Sử dụng Trait thế nào? Ở đây mình sẽ trình bày cho các bạn cách sử dụng Trait trong rất nhiều trường hợp, có thể sẽ hơi dài, chịu khó đọc nhé 😉 Ví dụ đơn giản: Về quyền ưu tiên, nếu trùng tên function của Trait với function của Base class, thì chuyện gì sẽ xảy ra? To be continue… [...] Read more...
Setup Nginx, PHP, MySQL and phpMyAdmin on macOS High Sierra
Setup Nginx, PHP, MySQL and phpMyAdmin on macOS High SierraJanuary 12, 2018Environment / Web developmentRecently I bought a Mac and with all the curiosity, I upgraded to the newest OS which is High Sierra. I heard a lot about the ease of setting up development environment on Mac with package manager like brew Beside, I have used Linux and Windows simultaneously for almost a year, so I thought an OS based on Unix? How hard could it be? WELL I WAS DEAD WRONG! I needed Nginx, PHP 5.6, MySQL version 5.*, phpMyAdmin is optional since I can use MySQL Workbench or Navicat instead. After 2 days of burying myself in bash command, I finally found the Sacred Scroll – The tutorial of my Lifetime – The true Saviour. Now that I cleansed my development environment, it is my duty to introduce it to you guys – The lost Warriors, the SACRED SCROLL!!!!! Link: https://gist.github.com/johnantoni/07df65898456ace4307d5bb6cbdc7f51 Just click the link, give it a star, and follow it exactly, your development environment should be smell like rose again. Any discussions are welcome! Side note: Dear Apple, stop messing up our homebrew and our development environment. Or I will switch back to Linux. – A new Apple user. [...] Read more...
stdClass là gì? Làm thế nào để có Dynamic Properties trong PHP?
stdClass là gì? Làm thế nào để có Dynamic Properties trong PHP?May 25, 2017PHPChào các bạn, mình là Đăng, và mình đã trở lại rồi đâyy  Nếu bạn là 1 người rất hay tò mò nghịch ngợm, giống tôi, thì chắc hẳn bạn đã từng lang thang trong core của mấy thằng PHP framework như Laravel hay Yii, và chắc cmn cú là các bạn cũng đã thấy từ khóa stdClass quanh quẩn trong đó vài lần rồi. Okay vậy bây giờ chúng ta cùng xắn tay áo lên để tìm hiểu xem nó là cái quái gì mà bọn dev khủng nó thích dùng thế nhở? [...] Read more...
What is stdClass? And Dynamic Properties in PHP?
What is stdClass? And Dynamic Properties in PHP?May 25, 2017PHPWell hello there, I’m back If you are a curious person, like me, you must have wandered in the core code of PHP frameworks like Laravel or Yii, and you must have seen this stdClass here and there. Now, let’s see what is that and how it helps us to code cleaner and more efficient. Okay if you came from or know even just a little Java, you’ll familiar with this concept called Dynamic Properties, to create a new object in Java somehow it’ll look like this: Well, before PHP 5.4 object’s properties must be predefined before we can set or get it with the magic method. What a bumper! But luckily, now we can define a new object as quick and dynamic as this: See? Sometimes all that is necessary is a property bag to throw key value pairs into. One way is to use array, but this requires quoting all keys. Another way is to use dynamic properties on an instance of StdClass. StdClass is a sparsely documented class in PHP which has no predefined properties. You can even cast an array directly to an object in a sec: To conclusion, Objects are really useful when you’re working with a large data structure, as you can have an object with nested sub-arrays in it. And StdClass (std stand for standard)is just a generic ’empty bag’ class that’s used when casting other types to objects with what ever properties you want in them. BUT despite what the others say, StdClass is not the base class for objects in PHP. Please remember that. Next week I’ll be back with you guys to discuss about Trait  See ya Dang.NH [...] Read more...
Làm toán giải trí một tí nhỉ?
Làm toán giải trí một tí nhỉ?May 19, 2017PHPOk, chào tất cả anh em Chả là cuối tuần, ở nhà rảnh rang, trời thì se se lạnh, mũi hơi tắc, chỉ muốn co ro quấn chăn ôm laptop cho ấm. Lang thang thi cái cuộc thi lập trình của bọn Top Career gì đó :v vô tình vấp phải 1 bài test demo, mà mình thấy khá hay, nên muốn chia sẻ lên đây cho cả nhà Đề bài: A zero-indexed array A consisting of N integers is given. An equilibrium index of this array is any integer P such that 0 ≤ P < N and the sum of elements of lower indices is equal to the sum of elements of higher indices, i.e. A[0] + A[1] + … + A[P−1] = A[P+1] + … + A[N−2] + A[N−1]. Sum of zero elements is assumed to be equal to 0. This can happen if P = 0 or if P = N−1. For example, consider the following array A consisting of N = 8 elements: A[0] = -1 A[1] = 3 A[2] = -4 A[3] = 5 A[4] = 1 A[5] = -6 A[6] = 2 A[7] = 1 P = 1 is an equilibrium index of this array, because: A[0] = −1 = A[2] + A[3] + A[4] + A[5] + A[6] + A[7] P = 3 is an equilibrium index of this array, because: A[0] + A[1] + A[2] = −2 = A[4] + A[5] + A[6] + A[7] P = 7 is also an equilibrium index, because: A[0] + A[1] + A[2] + A[3] + A[4] + A[5] + A[6] = 0 and there are no elements with indices greater than 7. P = 8 is not an equilibrium index, because it does not fulfill the condition 0 ≤ P < N. Write a function: function solution($A); that, given a zero-indexed array A consisting of N integers, returns any of its equilibrium indices. The function should return −1 if no equilibrium index exists. For example, given array A shown above, the function may return 1, 3 or 7, as explained above. Assume that: N is an integer within the range [0..100,000]; each element of array A is an integer within the range [−2,147,483,648..2,147,483,647]. Complexity: expected worst-case time complexity is O(N); expected worst-case space complexity is O(N), beyond input storage (not counting the storage required for input arguments). Elements of input arrays can be modified. Dịch đại khái là: Ta có 1 indexed array A gồm N phần tử là các số tự nhiên bất kỳ. Tìm chỉ số cân bằng P sao cho P là – Key của array A – Thỏa mãn điều kiện: A[0] + A[1] + … + A[P−1] = A[P+1] + … + A[N−2] + A[N−1]. – P = 0 hoặc P= N-1 đều có thể là giá trị đúng – Có thể có nhiều hoặc 1 giá trị P – Nếu không có giá trị nào, function cần return -1 Các điều kiện về complexity, assumption mời xem phần tiếng Anh nhé, lười dịch 😀 Rồi, đề bài là như vậy, yêu cầu viết 1 function dưới ngôn ngữ nào cũng được, thời gian làm bài là 30 phút. GIẢI (Đây là cách giải của mình, ai có cách nào hay hơn thì comment nhé ) Hướng giải của mình là sẽ chia mảng 1 chiều này thành 2 phần, Tổng Trái và Tổng Phải. Sau đó chạy dần từ trái qua phải của mảng và so sánh 2 tổng này với nhau. EZPZ phải không? :)) Mình code PHP nhé, đầu tiên gán giá trị default phát (thói quen thôi, PHP không cần initialize biến) Rồi, bây giờ lặp qua cái array A xem sao nhỉ? Bắt đầu so sánh, và phải trừ dần $sumRight  tăng dần $sumLeft với giá trị của mỗi element Trông có vẻ ổn ổn rồi đấy nhỉ :)) Nhưng thực ra là đếch ổn, mình còn chưa check null cơ mà =)) cái cơ bản nhất còn suốt ngày quên đây Ok done! Nào, bây giờ test thôi! Chuẩn đét :)) Test thử với dữ liệu khác xem sao Done! Hy vọng anh em giải toán vui vẻ :)) có solution nào ngon hơn nhớ comment -_- đừng có ém hàng [...] Read more...
When to make a move?
When to make a move?March 30, 2017OthersThis is very interesting question that when I should move to another organization, but I can not answer it in simple words. You know your career path and if your current organization is enough to put you at your final destination, then why do you want to leave it. Leaving an organization just because of few bucks is never a good reason, even leaving organizations too frequently is not a good idea though you are getting great position and big hikes, this is simply because you are losing your credibility and none of the good companies will rely on you because you are always behind money and position, so who knows when you will leave them. If you have some internal HR or Management issues within your organization, then try to resolve them because you never know your next organization may have even bigger issues than your current organization. You can discuss your issues with your manager, director or with HR and resolve them gracefully. If you see no further growth and good career options in the current organization and same time your learning curve got a saturation, then its time to make a shift to another organization. There may be a situation when you are not getting a fat salary and having great position in your current organization but you are learning a lot, which will add a lot of value in your resume and your career, then better to stick with the current organization until your learning is over. – Source: Don’t remember, sorry :”> – [...] Read more...