EnglishVui và trải nghiệm của mình với agentic framework

Gần đây mình hứng thú với AI Agent + các agentic framework và muốn explore thêm nhiều thứ về mảng này. Mình tin rằng với sự cách mạng của AI, chúng ta hoàn toàn có thể tự động hóa rất nhiều nghiệp vụ trong nhiều mảng khác nhau. Điều này sẽ mang lại nhiều giá trị thú vị.
Để trải nghiệm, mình đã dành thời gian cuối tuần để xây dựng một dự án nho nhỏ: EnglishVui (https://www.englishvui.com - một trang web chia sẻ những câu chuyện song ngữ). Điểm đặc biệt của những câu chuyện này là: vui, siêu ngắn, sử dụng những từ ngữ thông dụng của native speakers mà chúng ta ít thấy trong sách giáo khoa + có audio file với giọng đọc của người Mỹ bản xứ để người học luyện nghe.
Tất cả những câu chuyện được tạo ra hoàn toàn bằng AI, và mỗi ngày được post tự động. Mọi người có thể chọn hoặc nghe ngẫu nhiên một câu chuyện bất kì tùy thích.
Và dưới đây là một số trải nghiệm mà mình có được trong 2 ngày xây dựng website này. Mình hy vọng nó đem lại một số kinh nghiệm hữu ích cho những bạn đang có hứng thú với AI Agent và agentic framework.
Phác thảo về giải pháp
Đây là một dự án nhỏ - chủ yếu xoáy sâu vào việc tạo nội dung, và mục đích chính là để mình trải nghiệm nhiều hơn với việc làm việc trên agentic framework. Vì vậy mình bắt đầu với một số lựa chọn dưới đây:
- CrewAI: agentic framework được mình sử dụng. Nhiệm vụ chính của CrewAI là workflow để sinh ra nội dung của câu chuyện, bao gồm cả việc tạo ra ảnh giới thiệu + file âm thanh để đọc những đoạn hội thoại trong câu chuyện.
- PayloadCMS: một headless CMS để lưu trữ nội dung. Thỉnh thoảng mình cần duyệt lại nội dung trước khi cho phép nó được hiển thị trên website.
- Website: xây dựng đơn giản với NextJS.
- Media: các file mp3 sẽ được lưu trữ ở Cloudflare R2 và serving thông qua Cloudflare CDN. Hình ảnh mình sử dụng hoàn toàn từ Pollinations AI
Toàn bộ hạ tầng mình sử dụng của Vercel vì khá tiện để setup cho các dự án nhỏ. Đồng thời mình serve toàn bộ content thông qua Cloudflare CDN (kể cả html để tối ưu nhiều nhất có thể về performance)
Mô hình về mặt process rất đơn giản: CrewAI được mình host trên con Mac Mini ở nhà. Setup cron để nó post bài tự động ở một số thời điểm xác định. CrewAI sẽ post nội dung lên PayloadCMS. Phần còn lại, website sẽ sử dụng API của Payload CMS để load nội dung và hiển thị.
Vài trải nghiệm vui
Trải nghiệm với CrewAI
CrewAI là một agentic framework rất thú vị, flexible, cho phép mình setup toàn bộ agentic workflow as code. Mình có tham khảo qua 2 courses của bạn founder João Moura (khá hữu ích) và cũng học được nhiều từ việc đục documentation trên CrewAI. Mình share lại 2 courses (hoàn toàn miễn phí) này cho những anh em nào hứng thú
https://learn.deeplearning.ai/courses/multi-ai-agent-systems-with-crewai
https://learn.deeplearning.ai/courses/practical-multi-ai-agents-and-advanced-use-cases-with-crewai
Trước đây mình cũng từng build một mini Agentic framework có vài feature tương tự CrewAI (framework Kaizen trên Java), nên mình nắm những concept của CrewAI khá nhanh).
Trong dự án này, mình sử dụng flow của CrewAI. Với flow, ta có thể tạo một thiết kế với các step như sau:

Để tạo ra một câu chuyện, đầu tiên ta cần một ý tưởng ngẫu nhiên. Sau đó, tạo ra nội dung câu chuyện từ ý tưởng. Khi câu chuyện đã được tạo, sẽ trigger 2 tasks là: tạo hình ảnh để mình họa câu chuyện với Pollinations, và đồng thời tạo ra file mp3 đọc nội dung tiếng Anh với ElevenLabs. Về mặt integration thì không có gì phức tạp, nhưng khi đi sâu vào chi tiết thì có nhiều điểm khá thú vị khi mình thiết kế flow và các agent.
Một số điểm hay ho khi thiết kế trên Agentic framework
Điểm 1 - việc sinh ra chủ đề ngẫu nhiên với LLM là một thử thách
Nếu bạn đưa ra một câu prompt và yêu cầu LLM tạo ra một ý tưởng ngẫu nhiên về những chủ đề xung quanh cuộc sống -> bạn sẽ thường xuyên gặp lại những ý tưởng trùng lặp về mặt nội dung. Bất kể ta có sử dụng memory và đưa vào ràng buộc không được trùng lặp với ý tưởng cũ đã có, thì kết quả cũng không có cải thiện đáng kể. Mình test trên cả gpt-4o, gemini-pro-1.5 ... và có cùng kết luận tương tự.
Để giải quyết vấn đề này, ta cần đưa thêm yếu tố ngẫu nhiên vào prompt. Ví dụ: tạo một ý tưởng sáng tạo cho câu chuyện về chủ đề <X>. Trong đó, X sẽ được pick randomly từ một tập chủ đề đã có. Đoạn pick random chủ đề X này mình code thêm chút và dùng AI để generate ra một tập chủ đề khoảng 1000 giá trị rồi pick từ đó để đưa vào prompt.
Một kiểu prompt khác có thể sáng tạo hơn, như: tạo một ý tưởng sáng tạo cho câu chuyện về chủ đề <X> kết hợp với <Y>. Kiểu này ta sẽ ra được những ý tưởng rất điên: "hãy sáng tạo một ý tưởng câu chuyện về chủ đề "con rùa" kết hợp với "phi hành gia".
Điểm 2 - LLM / Agent thường gặp khó khăn khi được yêu cầu "sáng tạo" và "kĩ luật" cho cùng một task
Bước "Tạo ra câu chuyện từ ý tưởng" trên flow được mình hiện thực với Crew. Crew tạm hiểu là một nhóm các Agent được giao một số task và thực hiện một mục tiêu nào đó. Sai lầm đầu tiên của mình là chỉ tạo ra một agent là "Story writer" để gánh một task "Create story" với các yêu cầu chính như sau:
- Tạo ra nội dung câu chuyện song ngữ một cách sáng tạo, sử dụng những từ ngữ thường dùng như native speakers, viết theo cấu trúc: <vietnamese_sentence> (english_sentence). Câu vietnamese_sentence phải thuần Việt, không có tiếng Anh.
- Extract những từ nên học. Sau đó đưa vào phần Notes, giải thích, cho ví dụ.
- Cuối cùng tổng hợp kết quả vào một cấu trúc output mình mong đợi.
Kết quả mình nhận được là: nội dung nếu sáng tạo thì nó sẽ giữ luôn cả những từ tiếng Anh bên trong câu tiếng Việt. Nếu tối ưu để nó có thể follow được rule "tiếng Việt thuần Việt" hoặc tạo cấu trúc đúng, thì nội dung nó sáng tạo lại rất dở. Mình đã thử tối ưu từ prompt + temperature ... nhưng vô hiệu.
Sau đó, mình thử lại bằng cách tạo ra 3 agent khác nhau để tách biệt vai trò:
- Story writer: tập trung vào việc sáng tạo nội dung thật hay. Output chỉ cần tạo ra câu chuyện song ngữ với các cặp câu Anh - Việt. Ông này cần sáng tạo + một ít kĩ luật ở chỗ follow vụ "câu tiếng Việt phải thuần Việt".
- English teacher: đóng vai một giáo viên dạy tiếng Anh, giúp tách ra những từ ngữ nên học và build phần notes với các ví dụ dễ hiểu. Cô này không cần quá nhiều sáng tạo, chỉ cần tuân thủ "luật" ở chỗ lọc ra các từ ngữ thông dụng (chỉ sáng tạo thêm ở đoạn tạo ví dụ)
- Story producer: tổng hợp toàn bộ output của Story Writer và English teacher, build ra structure mình mong muốn. Agent này thuần túy tuân thủ luật để tạo ra output đúng cấu trúc.
Với thiết kế này thì mình hoàn toàn đạt được output như mong đợi và câu chuyện cũng khá sáng tạo.
Điểm 3 - việc thiết lập các vai trò khác nhau, áp dụng chiến lược chia để trị là khá quan trọng khi làm việc với các Agentic framework
Điểm này có thể thấy rõ ràng qua ví dụ ở trên. Nếu mình thực hiện việc thiết kế các role tốt, tách bạch thì output đưa ra sẽ tốt hơn nhiều. Trong course "Multi AI Agent Systems with crewAI" của João Moura, bạn cũng đưa ra một "mental framework": ta hãy tưởng tượng mình như một manager khi làm thiết kế trong các agentic framework. Hãy hình dung mình cần những vị trí nào trong thực tế, các vị trí này cần gì. Sau đó là phác họa những task cụ thể, với output cụ thể rõ ràng.
Tuy nhiên, khi đi vào thực tế, sẽ có những "vị trí" xuất hiện để tối ưu về mặt kĩ thuật. Ví dụ ở case này mình cần "Story producer" về mặt bản chất chỉ là một agent giúp tổng hợp kết quả (chứ ko thể liên hệ được với vị trí nào ở ngoài đời cả 😄)
Khi thực hiện chia để trị, ta cũng sẽ tối ưu được cả thêm về chi phí. Có thể lựa chọn LLM nào cho ông agent nào sao cho hiệu quả + ít tốn kém.
Điểm 4 - kết quả được tạo ra từ AI nói chung là bất định và cần được kiểm tra / giám sát chặt chẽ
Dù mình đã đưa ràng buộc cho việc không được tạo ra nội dung nhạy cảm, bạo lực, nhảm nhí ... nhưng kết quả AI sinh ra đôi khi vẫn không như mong đợi. Ví dụ: nó tạo ra một câu chuyện khá nhảm nhí về Brad Pitt và Angelina Jolie sưu tầm "da rốn", hoặc một cuộc họp mà 2 ông lao vào choảng nhau ...
Có một option để giải quyết vấn đề là sử dụng một Agent khác để review lại câu chuyện và phản hồi để sửa đổi nội dung. Tuy nhiên, khi thực hiện những design của workflow có bước review này thường phát sinh khá nhiều step cần LLM (vì nó sẽ quay lại back and forth giữa các agent để modify, review ... and loop cho đến khi đạt kết quả). Thường sẽ tốn khá nhiều token .. cho các LLM.
Hiện tại mình sẽ randomly review các bài viết được sinh ra từ workflow trước để tiết kiệm chi phí cho giải pháp hiện tại + đồng thời improve thêm prompt để trải nghiệm thêm.
Điểm 5 - chỉ sử dụng LLM cho những task thật sự cần
Điều này sẽ giúp ta tiết kiệm được rất nhiều và tiết kiệm chi phí hơn. Ví dụ: mình hoàn toàn có thể yêu cầu Story writer giúp highlight những từ cần ghi nhớ sau khi English teacher đã extract ra các cụm từ này. Tuy nhiên, việc này hoàn toàn có thể hiện thực trên code lúc render câu chuyện (flexible hơn, và ít tốn token hơn).
Chúng ta sử dụng AI hiệu quả chính là tiết kiệm tiền cho bản thân và cũng góp phần bảo vệ môi trường nữa nhé.
Trải nghiệm nhiều hơn với v0 + Github Copilot (new agent features)
Mình không có background về design. Do đó, bước xây dựng prototype mình sử dụng v0 để tạo ra design mong muốn. Sau khi ưng ý với ouput của v0, mình copy prototype code vào, và sử dụng Github Copilot để hoàn thiện phần còn lại. Github vừa ra đời tính năng agent (tương tự như Cursor, nó có thể giúp mình cài đặt dependencies, tự hoàn thành một feature nho nhỏ, fix bug ...). Thậm chí, nó giúp mình tạo luôn nội dung trang. Ví dụ: https://www.englishvui.com/gioi-thieu) toàn bộ nội dung này được Copilot tạo và mình hoàn toàn ko chỉnh sửa thêm bất cứ dòng nào sau đó).
Tips với Github Copilot: mình nên giao task cho nó từng phần nhỏ thì sẽ hiệu quả hơn là một task phức tạp. Nói chung chia để trị là một nghệ thuật và có thể áp dụng được trong rất nhiều ngữ cảnh khác nhau.
Một lưu ý chung: tất cả những nhận định của mình trong bài viết này có thể là bias và cần được kiểm chứng thêm trên những use case khác. Đồng thời, với sự nâng cấp của các LLM, cho dù các nhận định này có đúng ở thời điểm hiện tại, nhưng trong tương lai vẫn cần phải xét lại.
Nếu bạn có thắc mắc nào liên quan đến những điểm mình chia sẻ thì cứ gửi email cho mình: [email protected]
Trân trọng
Comments ()