Khám phá cách LangGraph, LangMem và MongoDB Atlas kết hợp để tạo ra các AI Agent có khả năng ghi nhớ thông minh, học hỏi từ tương tác và mang lại trải nghiệm cá nhân hóa, giúp giải quyết vấn đề “mất trí nhớ” của AI hiện đại.
Khám phá bí quyết giảm độ trễ ứng dụng bằng cách tối ưu hóa giao dịch database. So sánh cách PostgreSQL (SQL) và MongoDB (NoSQL) xử lý roundtrip, từ multi-statement chậm chạp đến single-document siêu tốc, giúp app của bạn mượt mà hơn!
Khám phá Spring AI 1.0, cách tích hợp các mô hình ngôn ngữ lớn (LLM) và truy vấn vector với MongoDB Atlas, xây dựng ứng dụng AI thông minh sử dụng RAG trong Java và Spring Boot.
Êy, chào bạn! Bạn có bao giờ nghĩ đến việc xây dựng một ứng dụng AI phức tạp, không chỉ là một con chatbot đơn thuần, mà còn có thể có nhiều 'nhân cách' khác nhau không? Nếu câu trả lời là 'có', thì bạn đã đến đúng chỗ rồi đấy! Đây chính là nhật ký hành trình mà chúng mình đã đi qua để tạo ra một nền tảng chat đa-nhân-cách cực kỳ xịn sò, từ con số 0 đến khi nó 'lên sóng' luôn! <img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://i.imgur.com/your_ai_journey_start.png' alt='Bắt đầu hành trình AI của bạn'> **Tầm nhìn bá đạo: Một nền tảng, vạn trí tuệ!** Mục tiêu ban đầu của team không chỉ là tạo ra một AI biết nói chuyện, mà là một 'sân chơi' nơi bạn có thể tạo ra các 'chuyên gia' AI khác nhau, tùy chỉnh chúng theo ý muốn và dùng bất cứ khi nào cần. Nghe như phim viễn tưởng nhỉ? Nhưng giờ đây nó là thật! Với ứng dụng này, bạn có thể: * **Tạo 'sếp' AI mới:** Đặt tên, gán 'nhân cách' (tính cách, hướng dẫn cụ thể) cho từng AI. * **Chọn chuyên gia:** Muốn hỏi về sales? Chọn anh Alex sales. Muốn về code? Chọn anh dev. * **Nhớ dai như vắt:** AI sẽ nhớ hết các cuộc trò chuyện trước đó, giúp bạn có những cuộc đối thoại mượt mà không bị 'mất não'. * **Trả lời siêu cấp:** Các câu trả lời sẽ được định dạng đẹp mắt bằng Markdown, có danh sách, có code, có in đậm rõ ràng. <img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://truyentranh.letranglan.top/api/v1/proxy?url=https://i.imgur.com/multi_agent_platform.png' alt='Nền tảng AI đa nhân cách'> **Phần 1: Xây móng vững chắc với Backend NestJS và 'cuộc hẹn' đầu tiên với AI** Mọi công trình vĩ đại đều cần một nền móng thật vững, đúng không? Với backend, tụi mình chọn NestJS – một framework Node.js cực kỳ 'bá đạo' về kiến trúc module và khả năng mở rộng. Nó sinh ra để dành cho các dự án phức tạp, đặc biệt là khi kết hợp với Angular ở frontend. **1.1. Chuẩn bị 'sân chơi'** Bắt đầu với Nest CLI, sau đó ngay lập tức, chúng mình áp dụng một quy tắc 'vàng': quản lý cấu hình bằng biến môi trường. Nghĩa là, các khóa API bí mật của Gemini sẽ không nằm 'lộ thiên' trong code mà được giấu kín trong file `.env`. Ai mà biết được bạn có bao nhiêu 'con át chủ bài' đúng không nào? ```bash # Tạo dự án mới nest new gemini-nest-backend # Cài gói quản lý cấu hình npm install @nestjs/config # Tạo file .env ở thư mục gốc # .env GEMINI_API_KEY=KHOA_API_BI_MAT_CUA_BAN_O_DAY ``` Sau đó, chỉ cần 'bật đèn xanh' cho NestJS biết là phải tải các biến này lên là xong! **1.2. Lần đầu 'chạm mặt' API: 'Chào thế giới!' của AI** Mục tiêu đầu tiên là thử xem 'mối lương duyên' với API Gemini có thành công không. Thế là, chúng mình tạo một service 'mini' để lo phần giao tiếp này. ```bash # Tạo các thành phần cần thiết cho chat nest g module chat nest g controller chat nest g service chat ``` Trong `ChatService`, ban đầu nó chỉ có một nhiệm vụ cực kỳ đơn giản: nhận vào một câu hỏi và gửi nó đến Gemini để nhận về câu trả lời. Giống như bạn nhắn tin hỏi Google vậy, nhưng là qua code! **1.3. 'Mở cổng' API đầu tiên** Có dịch vụ rồi, nhưng làm sao để thế giới bên ngoài gửi câu hỏi vào được? À, chúng ta cần một 'cánh cổng' HTTP! `ChatController` chính là 'người gác cổng' đó. Nó định nghĩa ra một con đường (`/chat`) và phương thức (`POST`), nhận dữ liệu từ yêu cầu và chuyển cho `ChatService` xử lý. <img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://i.imgur.com/nestjs_first_api.png' alt='Endpoint API đầu tiên với NestJS'> Xong phần này, chúng ta đã có một backend 'ngon lành cành đào', an toàn và sẵn sàng 'lớn mạnh'. Nó đã có thể nhận câu hỏi, hỏi AI mạnh nhất của Google và trả lời thông minh. Nhưng đây mới chỉ là khởi đầu thôi! **Phần 2: Bí mật 'nhớ dai' của AI: Trí nhớ ngắn hạn và dài hạn** Một AI mà cứ 'não cá vàng' không nhớ câu hỏi trước đó thì làm sao mà trò chuyện được đúng không? Nó sẽ chỉ là một 'thầy bói' hỏi gì đáp nấy thôi! Ở phần này, chúng ta sẽ biến 'thầy bói' thành một 'người kể chuyện', giúp nó có trí nhớ. **2.1. Trí nhớ ngắn hạn: Quản lý 'phiên chat'** Để Gemini 'nhớ' những gì đã nói, chúng ta phải gửi lại toàn bộ lịch sử cuộc trò chuyện mỗi khi có tin nhắn mới. Thư viện Gemini có một chiêu 'độc' là `startChat` giúp làm điều này dễ dàng. Ban đầu, team dùng `sessionId` (ID duy nhất cho mỗi cuộc trò chuyện) và lưu các 'phiên chat' này trong bộ nhớ RAM của server. Nghĩa là, mỗi khi có ai đó bắt đầu chat, team sẽ kiểm tra xem có `sessionId` này không. Nếu có thì tiếp tục cuộc trò chuyện cũ, còn không thì tạo một cái mới. Nghe có vẻ ổn, đúng không? Nhưng đời không như mơ... **2.2. 'Não cá vàng' của RAM: Sao phải dùng database?** Lưu phiên chat trong RAM thì nhanh thật, nhưng lại có hai điểm yếu 'chí mạng': * **Dễ bay hơi:** Nếu server lỡ bị khởi động lại (vì cập nhật, lỗi hay gì đó), toàn bộ cuộc trò chuyện đang dở dang sẽ... bốc hơi không dấu vết! Coi như công cốc! * **Không thể 'nhân bản':** Khi ứng dụng 'lớn' lên, cần nhiều server cùng chạy để phục vụ người dùng (kiểu như nhiều tổng đài viên cùng trả lời cuộc gọi). Nếu một người dùng chat với server A, rồi tin nhắn tiếp theo lại nhảy sang server B, thì server B sẽ 'ngơ ngác' vì đâu có biết cuộc trò chuyện đó bắt đầu từ server A! Vậy giải pháp là gì? Chính là 'thánh thần' **Database**! **2.3. Trí nhớ dài hạn: Kết nối với MongoDB** Chúng mình chọn MongoDB – một 'ông trùm' database NoSQL, siêu linh hoạt để lưu trữ những dữ liệu phức tạp như lịch sử trò chuyện. Dùng thêm Mongoose làm 'người phiên dịch' giúp NestJS nói chuyện với MongoDB dễ hơn. <img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://i.imgur.com/mongodb_connection.png' alt='Kết nối NestJS với MongoDB'> Giờ đây, NestJS đã biết cách 'đi đường vòng' để kết nối đến MongoDB một cách an toàn thông qua biến môi trường. Và chúng ta cũng định nghĩa ra 'khuôn mẫu' cho dữ liệu cuộc trò chuyện (gọi là Schema) để MongoDB biết nó sẽ lưu trữ những gì. **2.4. 'Nâng cấp' Chat Service: Trò chuyện 'không quên'** Cuối cùng, chúng mình 'đại tu' lại `ChatService` để nó 'học' cách nhớ dai. ```typescript // ... async run(prompt: string, sessionId: string): Promise<string> { // 1. Tìm lịch sử trò chuyện trong MongoDB bằng sessionId. const conversation = await this.conversationModel.findOne({ sessionId }).exec(); const history: Content[] = conversation ? conversation.history : []; // 2. Bắt đầu phiên chat với Gemini, dùng lịch sử đã lấy ra. const chat = this.generativeModel.startChat({ history }); // 3. Gửi tin nhắn mới của người dùng. const result = await chat.sendMessage(prompt); // 4. Lấy lịch sử ĐÃ ĐƯỢC CẬP NHẬT (có cả tin nhắn vừa gửi và trả lời). const updatedHistory = await chat.getHistory(); // 5. Lưu lịch sử đầy đủ này ngược lại vào MongoDB. // 'upsert: true' nghĩa là: nếu không tìm thấy sessionId thì tạo mới, còn không thì cập nhật. await this.conversationModel.findOneAndUpdate( { sessionId }, { history: updatedHistory }, { upsert: true, new: true }, ).exec(); const response = result.response; return response.text(); } ``` Với kiến trúc này, AI của chúng ta giờ đây có trí nhớ siêu hạng, bền vững. Mỗi cuộc trò chuyện có thể dừng lại và tiếp tục bất cứ lúc nào, và ứng dụng sẵn sàng mở rộng mà không sợ mất dữ liệu. AI đã biết 'nhớ'! **Phần 3: AI 'lên cấp': Có cá tính riêng với Persona!** Ở các phần trước, chúng ta đã có một backend 'khỏe mạnh' và một AI có trí nhớ. Nhưng nó vẫn chỉ là một 'người máy' trả lời chung chung. Giờ là lúc chúng ta 'truyền hồn' cho nó, biến nó thành một 'chuyên gia' đúng nghĩa bằng cách 'tiêm' một 'siêu bối cảnh' – một Persona – để hướng dẫn mọi hành động và lời nói của nó. **3.1. 'Bộ gen' của một Persona AI** Để 'dạy' một Mô hình Ngôn ngữ Lớn (LLM) như Gemini, cách hiệu quả nhất là dùng "system prompt" hay gọi là "Persona". Nó giống như một bộ hướng dẫn chi tiết được cung cấp ngay từ đầu cuộc trò chuyện, làm 'sổ tay' cho AI trong suốt phiên làm việc. Một persona xịn xò sẽ giúp phân biệt giữa một 'đồ chơi' và một 'công cụ kinh doanh' thực sự. Nó cần có: * **Danh tính & Vai trò:** Bạn là ai? (Ví dụ: "Bạn là Alex, một tư vấn viên bán hàng cấp cao"). * **Nhiệm vụ & Mục tiêu:** Mục đích chính của bạn là gì? (Ví dụ: "Mục tiêu của bạn là hiểu nỗi đau của khách hàng và lên lịch demo"). * **Giọng điệu & Tính cách:** Bạn nên nói chuyện như thế nào? (Ví dụ: "Chuyên nghiệp, tư vấn, chủ động, không bao giờ 'kiểu người bán hàng'"). * **Kiến thức chuyên biệt:** Bạn biết những gì? (Ví dụ: "Bạn hiểu rõ các module Tài chính, Kho hàng và Bán hàng của Nexus ERP..."). * **Giới hạn & Hạn chế:** Bạn TUYỆT ĐỐI không được làm gì? (Ví dụ: "Bạn không bao giờ thảo luận giá cả; hãy hướng khách hàng đến demo"). * **Định dạng phản hồi:** Bạn nên trả lời như thế nào? (Ví dụ: "Sử dụng định dạng Markdown cho rõ ràng, có danh sách và in đậm"). <img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://i.imgur.com/ai_persona_concept.png' alt='Khái niệm Persona AI'> **3.2. 'Cấy' Persona vào Backend** Với cấu trúc persona đã có, việc đưa nó vào NestJS lại 'dễ như ăn kẹo'. Chúng mình tạo một file riêng cho persona để code gọn gàng, sạch đẹp. ```typescript // src/utils/persona.ts export const ERP_SALES_PERSONA = `Bạn là Alex, một chuyên gia cấp cao về giải pháp doanh nghiệp và tư vấn bán hàng của hệ thống quản lý ERP tiên tiến mang tên "Nexus ERP". Bạn không phải là một chatbot chung chung, bạn là một chuyên gia thực thụ. ... `; ``` Điều kỳ diệu xảy ra khi chúng ta bắt đầu một cuộc trò chuyện mới. Thay vì một lịch sử trống rỗng, chúng ta 'đút' persona vào đó. ```typescript // src/chat/chat.service.ts (Phần thay đổi trong phương thức run) if (history.length === 0) { // Nếu là cuộc trò chuyện mới history = [ { role: 'user', parts: [{ text: ERP_SALES_PERSONA }] }, // "Người dùng" (chúng ta) đưa hướng dẫn. { role: 'model', parts: [{ text: 'Entendido. Eu sou Alex, especialista em soluções do Nexus ERP. Estou pronto para ajudar.' }] }, // "Mô hình" (AI) chấp nhận vai trò mới. ]; } // ... phần còn lại giữ nguyên ``` **3.3. Kết quả: Một 'chuyên gia' theo yêu cầu!** Sự thay đổi này đã mang lại hiệu quả 'ngoạn mục'. * **Hỏi người dùng:** "Chào bạn, khỏe không?" * **AI TRƯỚC khi có Persona:** "Chào bạn! Mình khỏe, còn bạn thì sao? Mình có thể giúp gì cho bạn hôm nay?" (Chung chung, bị động) * **AI SAU khi có Persona:** "Chào bạn! Mình rất khỏe. Mình là Alex, tư vấn viên giải pháp của Nexus ERP. Để mình hiểu rõ hơn cách giúp bạn, bạn có thể chia sẻ một chút về công ty và những thách thức quản lý bạn đang gặp phải không?" (Tập trung, chủ động, đúng mục tiêu kinh doanh!) <img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://i.imgur.com/ai_persona_output.png' alt='Ví dụ AI có persona'> AI của chúng ta từ một 'hành khách' đã trở thành 'người lái xe' của cuộc trò chuyện! **3.4. Bước tiến hóa tiếp theo: Function Calling** Mặc dù dự án này tập trung vào persona động, nhưng 'Function Calling' là một tính năng cực kỳ đáng để khám phá của Gemini. Nó cho phép AI không chỉ trả lời, mà còn 'chỉ đạo' backend của chúng ta chạy một chức năng nào đó – ví dụ, tra giá sản phẩm theo thời gian thực hoặc kiểm tra hàng tồn kho – sau đó dùng kết quả đó để xây dựng câu trả lời cuối cùng. Điều này biến AI từ 'kẻ biết tuốt' thành 'người hành động', mở ra khả năng tích hợp thời gian thực với bất kỳ API hay nguồn dữ liệu nào khác. Một công cụ mạnh mẽ trong 'kho vũ khí' của lập trình viên AI! **Phần 4: 'Mở cửa sổ' cho AI: Giao diện người dùng với Angular** Ở các phần trước, chúng ta đã 'rèn' được một backend NestJS mạnh mẽ. AI của chúng ta giờ đây có trí nhớ lâu bền với MongoDB và một 'tính cách' rõ ràng nhờ persona. Nhưng tất cả sự thông minh đó vẫn còn 'nhốt' trong server. Ở phần này, chúng ta sẽ xây dựng 'cánh cửa' để nhìn vào thế giới đó: một giao diện người dùng 'lung linh' và mượt mà với Angular. Kiến trúc dựa trên component, kiểu dữ liệu mạnh mẽ với TypeScript và một hệ sinh thái 'đồ sộ' của Angular khiến nó trở thành 'người tình lý tưởng' của backend NestJS, tạo ra một trải nghiệm phát triển full-stack 'ăn khớp' và mạnh mẽ. **4.1. Khởi động và 'cây cầu' thần kỳ (CORS)** Chúng mình chọn cách tiếp cận hiện đại của Angular với các component 'độc lập' (standalone), bỏ qua sự rườm rà của NgModules cho từng tính năng và làm kiến trúc đơn giản hơn nhiều. ```bash # Tạo dự án Angular mới với component standalone ng new gemini-angular-chat --standalone ``` Việc cung cấp các dịch vụ toàn cục như HttpClient giờ đây được thực hiện trong file `app.config.ts`. <img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://i.imgur.com/angular_setup_cors.png' alt='Cấu hình Angular và CORS'> Và đừng quên 'cây cầu' quan trọng nhất - CORS! Trước khi frontend có thể 'gõ cửa' backend, chúng ta phải 'dặn dò' backend tin tưởng frontend của mình. Nếu không, trình duyệt sẽ 'tống cổ' tất cả các yêu cầu. Nhắc lại bước 'thần thánh' trong backend NestJS: ```typescript // src/main.ts (trong NestJS) async function bootstrap() { const app = await NestFactory.create(AppModule); app.enableCors({ origin: 'http://localhost:4200', // Cho phép yêu cầu từ ứng dụng Angular của chúng ta }); await app.listen(3000); } bootstrap(); ``` **4.2. 'Người đưa tin': Tạo ChatService** Trong Angular, Service là 'xương sống' cho việc giao tiếp với các API bên ngoài. Nó 'ôm trọn' logic HTTP, giúp các component của chúng ta 'sạch bong' và chỉ tập trung vào việc hiển thị giao diện. ```typescript // src/app/services/chat.service.ts import { Injectable } from '@angular/core'; import { HttpClient } from '@angular/common/http'; import { Observable } from 'rxjs'; // Định nghĩa giao diện để đảm bảo an toàn kiểu dữ liệu export interface ApiResponse { response: string; sessionId: string; } @Injectable({ providedIn: 'root'}) export class ChatService { private readonly apiUrl = 'http://localhost:3000/chat'; // URL backend của chúng ta constructor(private http: HttpClient) { } sendMessage(prompt: string, sessionId?: string
Học cách xây dựng một AI trợ lý siêu thị tự động hóa việc mua sắm hàng tuần. Sử dụng Google ADK, Gemini 2.0 Flash và MongoDB Atlas Vector Search để tìm kiếm sản phẩm thông minh và quản lý giỏ hàng.
Khám phá vai trò quan trọng của kiểm thử phần mềm, đặc biệt là kiểm thử tích hợp (integration testing) cho REST API. Tìm hiểu cách triển khai test API hiệu quả với TypeScript, Express và Prisma trong bài viết chi tiết này!
Xin chào các bạn! Hôm nay, chúng ta sẽ cùng khám phá một "vũ khí" mới toanh, cực kỳ lợi hại trong thế giới lập trình AI: **Spring AI 1.0**! Đây là dự án "cây nhà lá vườn" từ đội ngũ Spring đình đám, mà bạn có thể đã biết qua cái tên quen thuộc Josh Long - Anh chàng Spring Developer Advocate cực kỳ nhiệt huyết và cũng là YouTuber tại @coffeesoftware. <br><br> Sau một thời gian phát triển "thần tốc" cùng với sự bùng nổ của AI, Spring AI 1.0 đã chính thức ra mắt. Tưởng tượng xem: bạn có thể kết nối ứng dụng Spring Boot của mình với các mô hình ngôn ngữ lớn (LLM), công cụ tìm kiếm vector, hay thậm chí là tạo ảnh chỉ bằng vài dòng code! Nghe "chanh sả" không? <br><br> Java và Spring đang ở vị trí vàng để "cưỡi" con sóng AI này. Hàng tỉ công ty đang chạy ứng dụng của họ trên Spring Boot, và giờ đây, việc "ghép nối" logic nghiệp vụ với dữ liệu vào các mô hình AI trở nên dễ như ăn kẹo! Không còn đau đầu với mớ bòng bong kết nối nữa đâu nhé. <br><br> Mà khoan, nếu bạn chỉ muốn "xem code cho nóng", thì đây là kho báu dành cho bạn: ghé thăm <a href="https://github.com/mongodb-developer/springairag">kho GitHub của chúng mình</a> ngay! <br><br> <img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq9m9bwlel6jjonrdraxm.png' alt='Tổng quan kiến trúc ứng dụng AI'> <br><br> **Spring AI là gì mà nghe oách vậy?** <br><br> Đơn giản thôi, Spring AI là một "cầu nối" giúp bạn nói chuyện với đủ loại mô hình AI khác nhau. Tưởng tượng như một dàn nhạc giao hưởng, mỗi nhạc cụ có nhiệm vụ riêng, và Spring AI là nhạc trưởng vậy! <br><br> Chúng ta có: <br> * **Mô hình Tạo ảnh (Image models):** Chỉ cần gõ vài chữ, "bùm", bạn có ngay một bức ảnh nghệ thuật! <br> * **Mô hình Chuyển đổi giọng nói thành văn bản (Transcription models):** Nghe cái tên là biết rồi, biến lời bạn nói thành chữ viết trong nháy mắt. <br> * **Mô hình Nhúng (Embedding models):** Cái này hơi "hack não" một chút. Nó biến mọi loại dữ liệu (từ chữ, số, đến hình ảnh) thành một dãy số được gọi là vector. Dãy số này "tóm tắt" ý nghĩa của dữ liệu, giúp chúng ta tìm kiếm những thứ có ý nghĩa tương tự nhau siêu nhanh. <br> * **Mô hình Trò chuyện (Chat models):** Cái này thì chắc ai cũng quen rồi, phải không? Chắc bạn đã từng "buôn dưa lê" với ChatGPT hay Bard rồi nhỉ? Đây chính là "ngôi sao" của làng AI hiện tại đó! Chúng có thể giúp bạn sửa văn bản, làm thơ... nhưng tuyệt đối đừng bảo chúng kể chuyện cười nhé (ít nhất là bây giờ)! Chúng rất "đỉnh", nhưng mà cũng có vài "chuyện khó nói"... <br><br> <img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzv22i2qg7buz1qer9tht.jpg' alt='Các mô hình và giải pháp AI'> <br><br> **À, cái "chuyện khó nói" của AI là gì?** <br><br> Các mô hình AI mạnh mẽ thật đấy, nhưng chúng cũng có những "điểm yếu chí mạng" của riêng mình. May mắn thay, Spring AI đã có sẵn những "liều thuốc đặc trị" cho từng vấn đề: <br> * **Mô hình Chat và System Prompts:** Mấy em AI chat hay bị "lạc đề" lắm! Để chúng trả lời đúng trọng tâm, bạn cần cung cấp một "system prompt" – như một lời dặn dò cấu trúc, cài đặt giọng điệu và ngữ cảnh cho mọi cuộc trò chuyện. <br> * **Quản lý bộ nhớ:** AI không có "não cá vàng" đâu... à quên, thực ra chúng không có bộ nhớ vốn có. Để chúng nhớ được bạn là ai và bạn đã nói gì, bạn cần phải "nhắc bài" cho chúng thông qua các cơ chế quản lý bộ nhớ. <br> * **Gọi công cụ (Tool calling):** Tưởng tượng AI như một "con người thông thái" nhưng lại bị "cấm cung". Tính năng gọi công cụ cho phép bạn "mở cửa sổ" để AI có thể "thao tác" với các chức năng cụ thể khi cần, ví dụ như tra cứu thông tin hay thực hiện một hành động nào đó. <br> * **Truy cập dữ liệu và Kỹ thuật Prompt (Prompt Engineering):** AI không tự động biết về cơ sở dữ liệu "bí mật" của công ty bạn đâu. Bạn có thể "tiêm" thông tin vào prompt, nhưng mà nhét nhiều quá thì nó cũng "bội thực" và tốn kém lắm! <br> * **Tạo sinh được tăng cường truy xuất (RAG - Retrieval-augmented generation):** Thay vì "nhồi nhét" cả tấn dữ liệu vào prompt, RAG như một "phao cứu sinh" vậy. Nó sẽ dùng một kho vector (kiểu như MongoDB Atlas) để chỉ tìm kiếm những thông tin CẦN THIẾT và LIÊN QUAN NHẤT. Cách này giúp giảm độ phức tạp, giảm kích thước phản hồi, mà lại tăng độ chính xác và tiết kiệm chi phí nữa chứ! <br> * **Xác thực phản hồi:** Đôi khi AI có thể "chém gió" tự tin nhưng lại sai bét nhè (gọi là "ảo giác"). Các mô hình đánh giá sẽ giúp kiểm tra lại, đảm bảo phản hồi của AI luôn đúng chuẩn. <br> * **Tích hợp và quy trình làm việc với MCP:** Không có hệ thống AI nào "một mình một cõi" cả. Với Model Context Protocol (MCP), bạn có thể kết nối ứng dụng Spring AI của mình với các dịch vụ khác hỗ trợ MCP, bất kể ngôn ngữ hay nền tảng, tạo ra các quy trình làm việc có cấu trúc và có mục tiêu rõ ràng. <br><br> Điều tuyệt vời là, Spring AI được thiết kế cực kỳ thân thiện với những ai đã quen dùng Spring Boot! Bạn có thể dễ dàng bắt đầu trên <a href="https://start.spring.io">Spring Initializr</a>. Với các cấu hình tự động được "tinh chỉnh" (autoconfiguration) của Spring AI, bạn sẽ có ngay một môi trường làm việc chuẩn "convention-over-configuration" quen thuộc. Hơn nữa, Spring AI còn hỗ trợ tính năng "quan sát" (observability) với Spring Boot Actuator và Micrometer, giúp bạn theo dõi "sức khỏe" ứng dụng dễ dàng. Đặc biệt, nó còn cực kỳ "hợp cạ" với GraalVM và Virtual Threads, giúp bạn xây dựng các ứng dụng AI siêu nhanh và hiệu quả, có khả năng mở rộng "khủng khiếp"! <br><br> **Khi Spring AI "kết duyên" cùng MongoDB** <br><br> Dù bạn là "tay mơ" hay đã là "lão làng" của MongoDB, thì cơ sở dữ liệu này vẫn là một nền tảng hiện đại, linh hoạt cho việc phát triển AI. MongoDB lưu trữ dữ liệu dưới dạng JSON, cực kỳ phù hợp để xử lý các loại dữ liệu không cấu trúc hoặc bán cấu trúc như tin nhắn chat, tài liệu hay dữ liệu người dùng. <br><br> Và đây mới là điểm nhấn: Với <a href="https://www.mongodb.com/products/platform/atlas-vector-search/?utm_campaign=devrel&utm_source=third-party-content&utm_medium=cta&utm_content=Spring+AI+MongoDB+RAG&utm_term=tim.kelly">Atlas Vector Search</a>, MongoDB còn "nâng cấp" thêm sự linh hoạt này bằng cách cho phép bạn lưu trữ và tìm kiếm các "vector embeddings" (dãy số biểu diễn ý nghĩa dữ liệu) ngay cạnh dữ liệu ứng dụng của bạn – tất cả TRONG MỘT NƠI DUY NHẤT! <br><br> Tưởng tượng một mô tả sản phẩm hay một phiếu hỗ trợ khách hàng được "dịch" thành một vector 512 chiều (một danh sách các con số ghi lại ý nghĩa của nó). Việc này giúp kiến trúc của bạn trở nên siêu đơn giản: không cần database vector riêng biệt, không cần pipeline tùy chỉnh, và không phải đau đầu đồng bộ dữ liệu giữa các hệ thống nữa! Nếu bạn dùng Java, <a href="https://www.mongodb.com/docs/drivers/java/sync/current/?utm_campaign=devrel&utm_source=third-party-content&utm_medium=cta&utm_content=Spring+AI+MongoDB+RAG&utm_term=tim.kelly">MongoDB Java Sync Driver</a> và <a href="https://spring.io/projects/spring-ai">Spring AI</a> sẽ giúp bạn tích hợp tìm kiếm ngữ nghĩa và các tính năng dựa trên LLM trực tiếp vào ứng dụng. <br><br> **RAG là gì mà "thần thánh" vậy? (Retrieval-Augmented Generation)** <br><br> Bạn có thấy mấy em LLM đôi khi "ngơ ngác" vì kiến thức cũ rích, hay "chém gió" bừa bãi không? Đó là lúc RAG "ra tay" giải cứu! RAG (Retrieval-Augmented Generation) là một "chiêu thức" cực kỳ mạnh mẽ để "nâng cấp" chất lượng phản hồi của các mô hình ngôn ngữ lớn (LLM). Nó hoạt động bằng cách "kết hợp" LLM với một hệ thống truy xuất tài liệu – ví dụ như MongoDB Atlas Vector Search – để "định hướng" câu trả lời của LLM dựa trên thông tin THỰC TẾ và MỚI NHẤT. <br><br> **Tại sao cần dùng RAG?** <br> Khi làm việc với LLM "chay" (chỉ một mình nó), bạn sẽ gặp vài "rắc rối" sau: <br> * **Kiến thức lỗi thời:** LLM được huấn luyện dựa trên dữ liệu "chụp ảnh nhanh" của internet tại một thời điểm nào đó, nên chúng không thể biết được những sự kiện mới nhất. <br> * **Thiếu ngữ cảnh:** Chúng không thể truy cập dữ liệu riêng tư hoặc dữ liệu chuyên ngành của bạn trừ khi bạn "đút" cho chúng. <br> * **Ảo giác (Hallucinations):** Thiếu đi ngữ cảnh đáng tin cậy, LLM có thể "tự tin" bịa ra những thông tin nghe có vẻ hợp lý nhưng thực ra sai bét! <br><br> RAG giải quyết những vấn đề này bằng cách "bổ sung" ngữ cảnh từ thế giới thực vào quá trình tạo sinh: <br> * **Bước 1: "Nhồi" dữ liệu (Ingest):** Biến tài liệu nội bộ hoặc dữ liệu chuyên ngành của bạn thành các vector embeddings và lưu trữ chúng trong một kho vector như MongoDB Atlas. <br> * **Bước 2: "Đi tìm" (Retrieve):** Khi người dùng hỏi một câu hỏi, sử dụng MongoDB Atlas Vector Search để tìm kiếm các tài liệu có ý nghĩa liên quan dựa trên "ý nghĩa" của câu hỏi – chứ không chỉ là khớp từ khóa đơn thuần. <br> * **Bước 3: "Sáng tác" (Generate):** Đưa các tài liệu vừa tìm được cho LLM làm ngữ cảnh, để nó có thể tạo ra những phản hồi chính xác và phù hợp. <br><br> Kiến trúc này là "kim chỉ nam" để xây dựng các chatbot thông minh, hệ thống hỏi đáp tài liệu, hoặc trợ lý nội bộ có thể "lý luận" dựa trên kiến thức riêng của tổ chức bạn, chứ không chỉ dựa vào những gì mô hình được huấn luyện ban đầu. <br><br> Kết hợp API của Spring AI với MongoDB Atlas Vector Search, bạn có thể xây dựng các ứng dụng AI thông minh, sẵn sàng sản xuất mà không cần "rời xa" hệ sinh thái Java thân thuộc. Nào, chúng ta hãy bắt tay vào xây dựng ứng dụng AI RAG đầu tiên của mình nhé! <br><br> <img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feudawofp4t5c39q9y4mi.png' alt='Mô tả luồng hoạt động của ứng dụng RAG'> <br><br> Đây là sơ đồ mô tả cách ứng dụng của chúng ta sẽ hoạt động. Người dùng gửi câu hỏi đến endpoint chat. Câu hỏi sẽ được "nhúng" (embedded) bằng mô hình AI của chúng ta, và vector nhúng này sau đó được sử dụng để truy xuất các tài liệu liên quan trong cơ sở dữ liệu bằng tính năng tìm kiếm vector. Các tài liệu này, cùng với system prompt và bộ nhớ chat tùy chọn, sẽ được áp dụng để duy trì ngữ cảnh. Những tài liệu này được "tiêm" vào prompt, và LLM sẽ tạo ra một phản hồi có ngữ cảnh, sau đó được trả về cho người dùng. <br><br> **Bắt tay xây dựng ứng dụng: Gặp gỡ những "boss" cún cưng!** <br><br> Chúng ta sẽ xây dựng một "trung tâm" nhận nuôi chó ảo có tên **Pooch Palace**! Cứ như một trại cứu trợ chó online vậy đó, nơi bạn có thể tìm và nhận nuôi những "thành viên bốn chân" mới. Và cũng như bất kỳ trung tâm nào, mọi người sẽ muốn "phỏng vấn" mấy em cún đúng không? Vậy nên, chúng ta sẽ xây dựng một "trợ lý" AI để làm công việc đó! <br><br> Mục tiêu của chúng ta là tạo ra một trợ lý giúp tìm "người bạn đời" trong mơ của ai đó – à không, của chó chứ! Cụ thể là chú chó **Prancer**, được mô tả một cách "kinh dị" nhưng cực kỳ hài hước: **“một con chó quỷ ám, thần kinh, ghét đàn ông, ghét động vật, ghét trẻ con và trông như một con quái vật Gremlin.”** Nghe là thấy "chất" rồi phải không? Chú chó này từng "gây bão mạng" vài năm trước khi chủ cũ tìm nhà mới cho nó đó! Quảng cáo của chú ta thì phải nói là "cười ra nước mắt"! Bạn có thể xem bài đăng gốc trên <a href="https://www.facebook.com/tyfanee.fortuna/posts/10219752628710467">Facebook</a>, trên <a href="https://www.buzzfeednews.com/article/amberjamieson/prancer-chihuahua">Buzzfeed News</a>, trên <a href="https://www.usatoday.com/story/news/nation/2021/04/12/chihuahua-hates-men-and-children-goes-viral-facebook-meet-prancer/7186543002/">USA Today</a>, và cả <a href="https://www.nytimes.com/2021/04/28/us/prancer-chihuahua-adopted-connecticut.html">New York Times</a> nữa! <br><br> Chúng ta sẽ xây dựng một endpoint HTTP đơn giản sử dụng tích hợp Spring AI với một LLM (ở đây là OpenAI, nhưng bạn có thể dùng bất cứ mô hình nào bạn thích như Ollama, Amazon Bedrock, Google Gemini, HuggingFace, vân vân và mây mây – tất cả đều được Spring AI hỗ trợ!). Mục đích là để AI phân tích câu hỏi của chúng ta và đưa ra lời khuyên – sau khi đã "ngó nghiêng" qua danh sách chó trong trung tâm (và trong database của chúng ta) – xem chú chó nào sẽ là "một nửa" phù hợp nhất cho chúng ta. <br><br> **Bắt đầu thôi: "Chuẩn bị đồ nghề" cho dự án!** <br><br> Để "làm theo" hướng dẫn này, bạn sẽ cần chuẩn bị vài thứ sau đây: <br> * **Java 24 và Maven:** Đảm bảo đã cài sẵn trên máy nhé. <br> * **MongoDB Atlas Cluster:** Một <a href="https://www.mongodb.com/docs/atlas/getting-started/?utm_campaign=devrel&utm_source=third-party-content&utm_medium=cta&utm_content=Spring+AI+MongoDB+RAG&utm_term=tim.kelly">cluster MongoDB Atlas</a> (gói M0 miễn phí là đủ dùng rồi!). <br> * **Tài khoản OpenAI và API Key:** Một tài khoản OpenAI có sẵn <a href="https://platform.openai.com/api-keys">API key</a>. <br><br> Sau khi có đủ "nguyên liệu", bạn hãy ghé <a href="https://start.spring.io">Spring Initializr</a>, tạo một dự án mới với Artifact ID là `mongodb`, và thêm các dependency sau: <br> * `Web` <br> * `Actuator` <br> * `GraalVM` <br> * `Devtools` <br> * `OpenAI` <br> * `MongoDB Atlas Vector Database` <br><br> Chúng ta đang dùng Java 24 và Apache Maven, nhưng bạn có thể điều chỉnh nếu muốn. Tải file `.zip` về và mở nó trong IDE yêu thích của bạn. <br><br> Tiếp theo, chúng ta cần thêm các thuộc tính sau vào file `application.properties`: <br><br> ```properties spring.application.name=mongodb # ai spring.ai.openai.api-key=<YOUR_OPENAI_CREDENTIAL_HERE> # mongodb spring.data.mongodb.uri=<YOUR_MONGODB_ATLAS_CONNECTION_STRING_HERE> spring.data.mongodb.database=rag # mongodb atlas vector store spring.ai.vectorstore.mongodb.collection-name=vector_store spring.ai.vectorstore.mongodb.initialize-schema=true # scale spring.threads.virtual.enabled=true # health management.endpoints.web.exposure.include=* management.endpoint.health.show-details=always ``` <br><br> Hãy cùng "giải mã" vài giá trị cấu hình nhé: <br> * Mục `ai`: Bạn sẽ điền API key của OpenAI vào đây. **Lưu ý quan trọng:** Bạn NÊN đưa cái này ra môi trường biến (environment variable) như `SPRING_AI_OPENAI_API_KEY` để tránh lỡ tay commit key lên GitHub nhé! <br> * Mục `mongodb`: Đây là các thông tin kết nối cơ bản đến MongoDB của bạn. Bạn cũng nên lấy chuỗi kết nối từ tài khoản MongoDB Atlas và đưa nó ra environment variable để bảo mật. <br> * Mục `mongodb atlas vector store`: Chúng ta "dặn dò" MongoDB Atlas Vector Search tạo cho chúng ta một collection tên là `vector_store`. Việc đặt `initialize-schema` thành `true` sẽ giúp Spring AI tự động tạo <a href="https://www.mongodb.com/docs/atlas/atlas-vector-search/vector-search-type/?utm_campaign=devrel&utm_source=third-party-content&utm_medium=cta&utm_content=Spring+AI+MongoDB+RAG&utm_term=tim.kelly">index tìm kiếm vector</a> trên collection của chúng ta. Quá tiện lợi! <br> * Mục `scale`: Chúng ta bật tính năng "virtual threads" siêu việt của Java lên. Lát nữa sẽ nói kỹ hơn về cái này nhé. <br> * Mục `health`: Dùng để cấu hình Spring Boot Actuator hiển thị thêm thông tin chi tiết về "sức khỏe" của ứng dụng. Phần này cũng sẽ được nhắc đến sau. <br><br> **Khởi tạo "kho tàng" vector của chúng ta!** <br><br> Giờ thì chúng ta sẽ "viết code" một chút nhé! Trong lớp chính `MongodbApplication.java`, chúng ta sẽ khởi tạo collection bằng cách đọc dữ liệu từ một file `.json` và đưa vào MongoDB Atlas Vector Store. Bạn có thể tìm thấy file `dogs.json` này trong <a href="https://github.com/mongodb-developer/springairag">repo GitHub của chúng mình</a>. Hãy tải nó về và thêm vào thư mục `resources` trong ứng dụng của bạn với tên `dogs.json`. <br><br> Tiếp theo, chúng ta mở lớp `MongodbApplication` và thêm đoạn code sau để "nhắc nhở" JVM đọc tài nguyên mới: <br><br> ```java @ImportRuntimeHints(MongoApplication.Hints.class) @SpringBootApplication public class MongodbApplication { public static void main(String[] args) { SpringApplication.run(MongoApplication.class, args); } static final Resource DOGS_JSON_FILE = new ClassPathResource("/dogs.json"); static class Hints implements RuntimeHintsRegistrar { @Override public void registerHints(RuntimeHints hints, ClassLoader classLoader) { hints.resources().registerResource(DOGS_JSON_FILE); } } // TBD } ``` <br><br> Và bây giờ, chúng ta cần "tải" dữ liệu này vào kho vector! Thêm đoạn code dưới đây vào lớp `MongodbApplication`, và chúng ta sẽ cùng xem nó làm gì nhé: <br><br> ```java @Bean ApplicationRunner mongoDbInitialzier(MongoTemplate template, VectorStore vectorStore, @Value("${spring.ai.vectorstore.mongodb.collection-name}") String collectionName, ObjectMapper objectMapper) { return args -> { if (template.collectionExists(collectionName) && template.estimatedCount(collectionName) > 0) return; var documentData = DOGS_JSON_FILE.getContentAsString(Charset.defaultCharset()); var jsonNode = objectMapper.readTree(documentData); jsonNode.spliterator().forEachRemaining(jsonNode1 -> { var id = jsonNode1.get("id").intValue(); var name = jsonNode1.get("name").textValue(); var description = jsonNode1.get("description").textValue(); var dogument = new Document("id: %s, name: %s, description: %s".formatted( id, name, description )); vectorStore.add(List.of(dogument)); }); }; } ``` <br><br> Cái `ApplicationRunner` này sẽ đọc dữ liệu từ file `dogs.json` và ghi vào MongoDB Atlas thông qua giao diện `Spring AI VectorStore`. Mỗi bản ghi được viết dưới dạng một chuỗi đơn giản như `id: %s, name: %s, description: %s`. Định dạng không quá quan trọng, miễn là bạn giữ nó nhất quán. Đây sẽ là dữ liệu chúng ta dùng để tạo embedding, nên hãy đảm bảo nó chứa tất cả thông tin bạn muốn tham chiếu. <br><br> Điều tuyệt vời là `VectorStore` tự động xử lý cả việc tạo embedding VÀ lưu trữ chỉ trong MỘT bước! Nó sử dụng `EmbeddingModel` được hỗ trợ bởi OpenAI (hay bất kỳ mô hình nào bạn cấu hình) để chuyển đổi mỗi chuỗi thành một vector, sau đó lưu trữ vector đó vào MongoDB Atlas. Nếu collection đích chưa tồn tại, Spring AI sẽ tự động tạo nó và định nghĩa một chỉ mục vector trên trường `embedding`. Điều này có nghĩa là collection và index của bạn sẵn sàng để tìm kiếm tương đồng ngay lập tức sau khi nạp dữ liệu, không cần thiết lập thủ công gì cả! <br><br> <img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://i.imgur.com/data_ingestion_flow.png' alt='Luồng nạp dữ liệu vào Vector Store'> <br><br> **Xây dựng "trợ lý" AI: Từ A đến Á!** <br><br> Giờ thì đến phần "dễ thở" nhất đây: xây dựng "trợ lý" AI của chúng ta! Chúng ta sẽ định nghĩa `AdoptionController`. Đây là một Spring MVC controller đơn giản, chuyên nhận các yêu cầu và "nhờ" mô hình AI giới thiệu chó dựa trên thông tin người dùng cung cấp. <br><br> ```java @Controller @ResponseBody class AdoptionController { private final ChatClient ai; private final InMemoryChatMemoryRepository memoryRepository; AdoptionController(ChatClient.Builder ai, VectorStore vectorStore) { var system = """ Bạn là một trợ lý AI giúp mọi người nhận nuôi chó từ trung tâm Pooch Palace có các chi nhánh tại Antwerp, Seoul, Tokyo, Singapore, Paris, Mumbai, New Delhi, Barcelona, San Francisco, và London. Thông tin về các chú chó có sẵn sẽ được trình bày bên dưới. Nếu không có thông tin, hãy trả lời lịch sự rằng chúng ta không có chó nào có sẵn. """; this.memoryRepository = new InMemoryChatMemoryRepository(); this.ai = ai .defaultSystem(system) .defaultAdvisors(new QuestionAnswerAdvisor(vectorStore)) .build(); } /// TBD } ``` <br><br> Cho đến giờ, chúng ta chỉ mới định nghĩa một constructor, nơi chúng ta "tiêm" vào đối tượng `Spring AI ChatClient.Builder`. `ChatClient` chính là "trái tim" của API, giúp chúng ta giao tiếp với `ChatModel` (mà đã được cấu hình tự động để kết nối với OpenAI, Ollama, hay bất cứ mô hình nào). <br><br> Chúng ta muốn mọi tương tác với mô hình chat đều có vài "mặc định" hợp lý, trong đó có một `system prompt`. `System prompt` này giống như việc bạn "cài đặt tính cách" cho AI vậy đó! Nó định hình cách mô hình nên trả lời tất cả các câu hỏi sau đó. Trong trường hợp này, chúng ta "huấn luyện" nó trả lời mọi thứ như thể nó là nhân viên của trung tâm nhận nuôi chó Pooch Palace vậy. Nhờ đó, nó sẽ lịch sự từ chối hoặc lái câu chuyện sang chủ đề khác nếu câu hỏi không liên quan đến việc nhận nuôi chó. <br><br> Ngoài ra, chúng ta còn sử dụng `QuestionAnswerAdvisor` được hỗ trợ bởi MongoDB `VectorStore`. Điều này đảm bảo rằng mô hình chỉ cố gắng trả lời các câu hỏi dựa trên các tài liệu liên quan – cụ thể là các mục khớp vector từ cơ sở dữ liệu chó cưng của chúng ta. <br><br> À, "Advisors" là một khái niệm hay ho của Spring AI đấy! Hãy coi chúng như những "bộ lọc", hay "người điều phối" vậy. Chúng sẽ xử lý yêu cầu TRƯỚC và SAU khi gửi đến mô hình ngôn ngữ lớn. `QuestionAnswerAdvisor` này cần thêm một dependency nữa trong `pom.xml`: <br><br> ```xml <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-advisors-vector-store</artifactId> </dependency> ``` <br><br> `Advisor` này sẽ tìm kiếm trong MongoDB Atlas vector store mỗi khi có yêu cầu, thực hiện tìm kiếm tương đồng để xem có dữ liệu nào liên quan đến câu hỏi của người dùng không. Ví dụ, khi ai đó hỏi về một chú chó có đặc điểm cụ thể, nó sẽ tìm kiếm những chú chó phù hợp. Kết quả chúng ta nhận được chỉ là một phần nhỏ trong số tất cả các chú chó có sẵn để nhận nuôi. Chúng ta sẽ chỉ gửi PHẦN DỮ LIỆU LIÊN QUAN đó cho mô hình. Nhớ nhé, mỗi tương tác với mô hình đều tốn kém – cả tiền bạc và độ phức tạp! Vì vậy, gửi càng ít dữ liệu càng tốt. <br><br> Mô hình sau đó sẽ kết hợp `system prompt` của chúng ta, câu hỏi của người dùng và dữ liệu được bao gồm từ kho vector để đưa ra phản hồi. <br><br> **À, mô hình không nhớ gì đâu!** Cứ tưởng tượng chúng như cô cá Dory trong "Đi tìm Nemo" ấy! Vì vậy, chúng ta cấu hình thêm một `advisor` nữa, chuyên giữ lại bản ghi cuộc trò chuyện giữa bạn và AI, rồi "nhắc bài" cho AI những gì đã được nói. Nhờ đó, nó sẽ "nhớ" bạn từ yêu cầu này sang yêu cầu khác. <br><br> <img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://i.imgur.com/ai_memory_icon.png' alt='Mô hình AI và trí nhớ'> <br><br> Giờ thì, chúng ta sẽ thêm một endpoint vào `AdoptionController` để giao tiếp với trợ lý AI, có "chút trí nhớ" nhé! Điều này giúp trợ lý của chúng ta duy trì nhật ký trò chuyện cục bộ (10 tin nhắn gần nhất), theo dõi cuộc hội thoại và cung cấp thêm ngữ cảnh cho LLM. <br><br> ```java @GetMapping("/{user}/dogs/assistant") String inquire(@PathVariable String user, @RequestParam String question) { var memory = MessageWindowChatMemory.builder() .chatMemoryRepository(memoryRepository) .maxMessages(10) .build(); var memoryAdvisor = MessageChatMemoryAdvisor.builder(memory).build(); return this.ai .prompt() .user(question) .advisors(a -> a .advisors(memoryAdvisor) .param(ChatMemory.CONVERSATION_ID, user) ) .call() .content(); } ``` <br><br> Với tất cả mọi thứ đã được thiết lập, bạn có thể khởi chạy chương trình và "thử nghiệm" ngay! <br><br> `http :8080/tkelly/dogs/assistant question=="do you have any neurotic dogs?"` <br><br> Khi mọi thứ đã vào đúng vị trí, bạn sẽ thấy nó trả lời rằng có một chú chó tên Prancer mà chúng ta có thể quan tâm. (Ôi, chúng ta sẽ quan tâm lắm chứ!) <br><br> ```text Có, chúng tôi có một chú chó thần kinh sẵn sàng để nhận nuôi. Gặp gỡ Prancer, một chú chó quỷ ám, thần kinh, không ưa người, động vật hay trẻ nhỏ, và trông giống một con Gremlin. Nếu bạn quan tâm đến Prancer hoặc muốn biết thêm thông tin, cứ hỏi nhé! ``` <br><br> Và thế là xong! Chỉ trong tích tắc, chúng ta đã từ "con số 0" trở thành "người hùng AI", giúp kết nối mọi người với chú chó trong mơ... hay cơn ác mộng của họ! <br><br> **Đưa AI ra môi trường sản phẩm: "Chơi lớn" luôn!** <br><br> Spring AI không chỉ dừng lại ở mấy dự án "thú cưng" vui vui đâu nhé! Nó được thiết kế cho các ứng dụng cấp doanh nghiệp, và để "ăn khớp" với các ứng dụng Spring hiện có của bạn. Để đưa ứng dụng AI "ra trận", bạn cần đảm bảo các yếu tố bảo mật, khả năng mở rộng và khả năng quan sát. Cùng "mổ xẻ" từng phần nhé: <br><br> **1. Bảo mật: Chắc chắn như "áo giáp"!** <br> Việc dùng Spring Security để "khóa chặt" ứng dụng web này thì "dễ như ăn kẹo" rồi. Bạn có thể dùng `Principal#getName` của người dùng đã xác thực làm ID cuộc trò chuyện luôn! Còn dữ liệu trong các collection thì sao? MongoDB có cơ chế <a href="https://www.mongodb.com/products/capabilities/security/encryption/?utm_campaign=devrel&utm_source=third-party-content&utm_medium=cta&utm_content=Spring+AI+MongoDB+RAG&utm_term=tim.kelly">mã hóa dữ liệu tại chỗ</a> cực kỳ mạnh mẽ để bảo vệ thông tin của bạn. <br><br> <img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://i.imgur.com/security_shield.png' alt='Bảo mật trong ứng dụng AI'> <br><br> **2. Khả năng mở rộng (Scalability): Đón "ngàn người truy cập"!** <br> Mỗi khi bạn gửi một yêu cầu HTTP đến LLM (hoặc nhiều database), bạn đang "chặn" luồng (thread) thực thi của mình. Một luồng đáng lẽ phải hoạt động lại cứ ngồi "chơi xơi nước" chờ đợi thì phí phạm quá! Java 21 đã mang đến cho chúng ta "virtual threads" (luồng ảo) – những "siêu nhân" có thể cải thiện đáng kể khả năng mở rộng cho các dịch vụ bị giới hạn bởi IO (input/output). Chỉ cần bật nó trong `application.properties`: <br><br> ```properties spring.threads.virtual.enabled=true ``` <br><br> Thay vì ngồi chờ IO hoàn thành, virtual threads sẽ "giải phóng" tài nguyên, giúp ứng dụng của bạn mở rộng hiệu quả hơn khi tải trọng tăng cao. <br><br> <img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://i.imgur.com/scalability_icon.png' alt='Khả năng mở rộng với Virtual Threads'> <br><br> **3. GraalVM Native Images: Ứng dụng "siêu gọn, siêu nhanh"!** <br> <a href="https://www.graalvm.org/">GraalVM</a> có khả năng biên dịch ứng dụng Java thành các file thực thi gốc (native executables), giúp giảm đáng kể thời gian khởi động và mức tiêu thụ bộ nhớ. Đây là cách để biên dịch ứng dụng Spring AI của bạn: <br><br> Nếu bạn đã cài đặt GraalVM làm SDK, bạn có thể biến ứng dụng Spring AI này thành một native image cụ thể cho từng hệ điều hành và kiến trúc một cách dễ dàng: <br><br> ```bash ./mvnw -DskipTests -Pnative native:compile ``` <br><br> Việc này có thể mất khoảng một phút hoặc hơn trên hầu hết các máy, nhưng khi hoàn thành, bạn có thể chạy file binary đó một cách dễ dàng: <br><br> ```bash ../target/mongodb ``` <br><br> Chương trình này sẽ khởi động nhanh hơn RẤT NHIỀU so với khi chạy trên JVM! Bạn có thể cân nhắc tắt `ApplicationRunner` mà chúng ta đã tạo trước đó, vì nó sẽ thực hiện IO khi khởi động, làm chậm quá trình này. Trên máy của tôi, nó khởi động chưa đến một phần mười giây! Thậm chí còn tuyệt vời hơn, bạn sẽ thấy ứng dụng này chỉ chiếm một phần RẤT NHỎ bộ nhớ RAM so với khi chạy trên JVM. <br><br> <img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://i.imgur.com/graalvm_icon.png' alt='GraalVM Native Images'> <br><br> **4. Đóng gói cho Docker: "Chạy mọi nơi"!** <br> Bạn có thể nói: "Nghe hay đấy, nhưng tôi cần ứng dụng này chạy trên MỌI nền tảng đám mây, và điều đó có nghĩa là phải đóng gói nó thành Docker image!" Dễ ợt! <br><br> ```bash ./mvnw -DskipTests -Pnative spring-boot:build-image ``` <br><br> Chờ một chút nhé, có thể mất thêm một phút nữa. Khi hoàn thành, bạn sẽ thấy tên của Docker image đã được tạo ra. Bạn có thể chạy nó, nhớ ghi đè các host và port mà nó tham chiếu trên máy chủ của bạn nhé. Thật ngạc nhiên, trên macOS, ứng dụng này khi chạy trên một máy ảo macOS mô phỏng Linux lại còn chạy nhanh hơn (ngay từ đầu luôn!) so với chạy trực tiếp trên macOS. Thật đáng kinh ngạc! <br><br> <img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://i.imgur.com/docker_icon.png' alt='Đóng gói Docker'> <br><br> **5. Khả năng quan sát (Observability): Luôn "để mắt" đến ứng dụng!** <br> Ứng dụng này "ngon" đến mức tôi cá nó sẽ lên báo, y như chú chó Prancer của chúng ta vậy! Và khi điều đó xảy ra, bạn nên theo dõi tài nguyên hệ thống và quan trọng hơn là số lượng token đã dùng. Mọi yêu cầu gửi đến LLM đều tốn chi phí – ít nhất là độ phức tạp, nếu không muốn nói là tiền bạc. Spring Boot Actuator, được hỗ trợ bởi <a href="https://micrometer.io/">Micrometer</a>, cung cấp các chỉ số (metrics) ngay lập tức. <br><br> Truy cập endpoint metrics để theo dõi mức sử dụng token và các chỉ số quan trọng khác: <br><br> `http://localhost:8080/actuator/metrics` <br><br> Tuyệt vời! Bạn có thể sử dụng Micrometer để chuyển tiếp các chỉ số đó đến cơ sở dữ liệu <a href="https://www.mongodb.com/docs/manual/core/timeseries-collections/?utm_campaign=devrel&utm_source=third-party-content&utm_medium=cta&utm_content=Spring+AI+MongoDB+RAG&utm_term=tim.kelly">MongoDB time-series</a> của bạn để có một "bảng điều khiển" tổng quan, một dashboard duy nhất! <br><br> <img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://i.imgur.com/observability_dashboard.png' alt='Dashboard giám sát ứng dụng'> <br><br> **MongoDB Atlas: Đầy đủ tính năng và khả năng mở rộng!** <br> <a href="https://www.mongodb.com/atlas/database/?utm_campaign=devrel&utm_source=third-party-content&utm_medium=cta&utm_content=Spring+AI+MongoDB+RAG&utm_term=tim.kelly">MongoDB Atlas</a> là dịch vụ đám mây được quản lý cho MongoDB, cung cấp khả năng mở rộng và tính sẵn sàng cao trên nhiều nhà cung cấp dịch vụ đám mây. Với Atlas, MongoDB sẽ lo liệu mọi thứ từ sao lưu, giám sát, nâng cấp và vá lỗi – giúp bạn tập trung vào việc xây dựng ứng dụng, chứ không phải "đau đầu" duy trì hạ tầng. Nếu quản lý database không phải là "nghề chính" của bạn, tại sao không giao phó nó cho những người đã tạo ra MongoDB chứ? <br><br> **Lời kết** <br> Vậy là xong! Bạn vừa xây dựng một ứng dụng AI "xịn sò", sẵn sàng cho môi trường sản xuất, được cung cấp bởi Spring AI và MongoDB chỉ trong "nháy mắt"! Chúng ta mới chỉ "gãi nhẹ" bề mặt của tảng băng chìm thôi. Hãy khám phá Spring AI 1.0 ngay hôm nay tại <a href="https://start.spring.io">Spring Initializr</a> và tìm hiểu thêm về MongoDB Atlas cùng <a href="https://docs.spring.io/spring-ai/reference/api/vectordbs/mongodb.html">hỗ trợ vector store</a> nhé. <br><br> Nếu bạn muốn xem thêm những gì bạn có thể làm với MongoDB, Spring và AI, hãy xem hướng dẫn của chúng tôi về <a href="https://dev.to/mongodb/building-a-real-time-ai-fraud-detection-system-with-spring-kafka-and-mongodb-2jbn">xây dựng hệ thống phát hiện gian lận AI thời gian thực với Spring Kafka và MongoDB</a>. Nếu bạn chỉ muốn bắt đầu với Spring và MongoDB, chúng tôi cũng có một <a href="https://www.mongodb.com/developer/products/mongodb/springdata-getting-started-with-java-mongodb/?utm_campaign=devrel&utm_source=third-party-content&utm_medium=cta&utm_content=Spring+AI+MongoDB+RAG&utm_term=tim.kelly">hướng dẫn về điều đó</a>!
Tìm hiểu về Model Context Protocol (MCP) - tiêu chuẩn mới giúp các mô hình ngôn ngữ lớn (LLMs) tương tác hiệu quả với thế giới bên ngoài, khắc phục hạn chế của RAG và Function Call.
Khám phá cách xây dựng ứng dụng RAG đa phương thức với MongoDB Atlas Vector Search và Voyage AI. Bài hướng dẫn chi tiết về xử lý văn bản, hình ảnh, bảng biểu, so sánh CLIP và VLM, và tối ưu hiệu suất.
Tìm hiểu sâu về Model Context Protocol (MCP) và cách nó giải quyết các hạn chế của RAG trong việc tương tác với dữ liệu. Hướng dẫn chi tiết cách dùng MCP để truy vấn MongoDB với ServBay và VS Code/Cline, giúp bạn xây dựng các AI Agent mạnh mẽ hơn.
Bạn muốn tăng tốc MongoDB của mình? TechPrane vừa tung ra video mới hướng dẫn chi tiết cách tối ưu hóa tải công việc MongoDB bằng cách kết hợp sức mạnh của Claude AI và MCP. Hãy cùng khám phá các bước thực tế với MongoDB Atlas để đạt được hiệu suất vượt trội!
Bạn nghĩ MongoDB không xử lý được giao dịch phức tạp? Sai rồi nhé! Khám phá sức mạnh của MongoDB Transactions trong Node.js với Mongoose, từ cách cài đặt, ví dụ chuyển tiền thực tế, đến những lỗi thường gặp và cách khắc phục. Đảm bảo dữ liệu luôn nhất quán như ngân hàng!
Bạn có bao giờ tự hỏi vì sao ChatGPT cứ quên tên bạn sau mỗi cuộc trò chuyện? Hay trợ lý AI của bạn mãi không nhớ bạn thích câu trả lời ngắn gọn? Vấn đề nằm ở một "bí mật" nho nhỏ: đa số ứng dụng AI hiện nay đều "vô trạng thái" (stateless) – tức là chúng không hề lưu giữ ký ức từ các lần tương tác trước. Cứ như mắc bệnh mất trí nhớ tạm thời vậy! Nhưng sẽ thế nào nếu các "công dân" AI của chúng ta có thể nhớ? Nếu chúng có thể xây dựng "tình bạn", học hỏi từ những thất bại, và dần dần "hiểu" được sở thích của người dùng qua thời gian? Đây chính là lời hứa hẹn tuyệt vời từ các hệ thống trí nhớ cho AI (agent memory systems), và chúng sắp sửa thay đổi hoàn toàn cách chúng ta xây dựng ứng dụng AI đấy!<img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://i.imgur.com/AI_forgetting.png' alt='AI bot với dấu hỏi và những khoảng trống trong đầu'>Chào bạn! Bạn thử nghĩ xem, những người thông minh nhất mà bạn biết, điều gì làm họ nổi bật? Chắc chắn là khả năng nhớ lại thông tin cần thiết đúng lúc, rút ra bài học từ những trải nghiệm đã qua, xây dựng kiến thức dựa trên nền tảng cũ, và duy trì ngữ cảnh xuyên suốt các cuộc tương tác. Như Richmond Alake đã cực kỳ thông thái chỉ ra trong bài nói chuyện của mình: Nếu AI sinh ra để bắt chước trí tuệ con người, mà trí tuệ con người lại gắn liền mật thiết với ký ức, thì việc các "đặc vụ" AI của chúng ta cũng cần trí nhớ là điều "hiển nhiên như 2+2=4" vậy! Đây chính xác là những siêu năng lực chúng ta cần trang bị cho các "đặc vụ" AI của mình!<img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://i.imgur.com/human_brain_memory.png' alt='Bộ não con người với các kết nối ký ức'>Thế giới AI đã tiến hóa nhanh đến chóng mặt! Chúng ta đã đi từ các Chatbot "ngây thơ" (2022) chỉ biết hỏi đáp đơn giản, đến Hệ thống RAG "uyên bác" (2023) có thể tra cứu kiến thức chuyên sâu, rồi Agent biết dùng công cụ (2024) – tức là các mô hình ngôn ngữ lớn (LLM) đã có thể "tay chân" hơn, biết dùng các hàm để làm việc. Và giờ là Agent có trí nhớ (hiện tại) – các hệ thống có trạng thái, biết xây dựng mối quan hệ! Mỗi bước tiến đều mang lại những khả năng mới, nhưng trí nhớ chính là chiếc chìa khóa vạn năng để mở khóa trí tuệ thực sự cho các "đặc vụ" AI.<img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://i.imgur.com/AI_evolution_timeline.png' alt='Dòng thời gian tiến hóa của AI'>Giờ thì, hãy cùng "mổ xẻ" các loại trí nhớ mà "đặc vụ" AI của bạn cần, cùng với cách chúng hoạt động nhé!Đầu tiên và cơ bản nhất: **Trí nhớ đàm thoại (Conversational Memory)**. Nghe tên là biết rồi đó, nó giúp AI nhớ được những gì đã nói trong một cuộc trò chuyện. Tưởng tượng như một cuốn sổ ghi chép lại mọi tin nhắn bạn và AI đã trao đổi. Nhiệm vụ của nó là lưu trữ toàn bộ lịch sử tin nhắn, thông tin về người dùng và các chủ đề chính. Cách hoạt động đơn giản thôi: mỗi khi bạn gửi tin nhắn, AI sẽ ghi lại nó vào "cuốn sổ" này, kèm theo thời gian và người gửi, đếm xem bạn đã nói bao nhiêu câu. Khi cần, AI sẽ lật lại "cuốn sổ" để tìm những tin nhắn gần đây hoặc tóm tắt nội dung cuộc trò chuyện, giúp nó hiểu ngữ cảnh và phản hồi phù hợp.<img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://i.imgur.com/chatbot_history.png' alt='Giao diện Chatbot với lịch sử tin nhắn'>Tiếp theo là **Trí nhớ thực thể (Entity Memory)**. Cái này giống như một "sổ danh bạ" đặc biệt của AI vậy. Nó giúp AI theo dõi thông tin về những người, đồ vật, địa điểm, hoặc các khái niệm quan trọng được nhắc đến trong cuộc trò chuyện. Nhiệm vụ của nó là lưu giữ các chi tiết về "thực thể" (ví dụ: tên khách hàng, tên sản phẩm, địa chỉ), các thuộc tính của chúng (khách hàng tên gì, bao nhiêu tuổi), mối quan hệ giữa chúng (khách hàng A mua sản phẩm B), và những lần chúng được nhắc đến. Khi bạn nhắc đến một cái tên hay một sản phẩm, AI sẽ tự động "cập nhật hồ sơ" cho thực thể đó và tạo ra các "liên kết" để tìm kiếm thông tin liên quan dễ dàng hơn.<img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://i.imgur.com/knowledge_graph.png' alt='Đồ thị tri thức với các nút và kết nối'>Giờ đến **Trí nhớ tình tiết (Episodic Memory)**. Đây là kiểu trí nhớ lưu giữ các chuỗi sự kiện và trải nghiệm đã diễn ra. Nó giống như một cuốn "nhật ký" của AI, ghi lại từng "tập phim" tương tác, từ khi bắt đầu đến kết thúc, bao gồm cả kết quả (thành công, thất bại) và những bài học rút ra. Mỗi khi AI hoàn thành một tác vụ (ví dụ: hỗ trợ khách hàng), nó sẽ ghi lại toàn bộ "tập phim" đó, kèm theo tóm tắt và các "mã nhúng" (embedding) để dễ dàng tìm kiếm sau này. Khi gặp một tình huống tương tự trong tương lai, AI có thể "lật lại nhật ký" để tìm các "tập phim" giống nhau, xem thử lần trước đã làm gì, kết quả ra sao, và rút ra kinh nghiệm để làm tốt hơn.<img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://i.imgur.com/AI_learning_from_experience.png' alt='AI học hỏi từ kinh nghiệm với dấu tích và dấu X'>Còn đây là **Trí nhớ thủ tục (Procedural Memory)** – hay còn gọi là "trí nhớ về cách làm". Đây là nơi AI lưu trữ các quy trình và kỹ năng đã học được, y như cách não bộ con người lưu giữ kỹ năng đi xe đạp hay bơi lội vậy. Nó ghi nhớ "công thức" thực hiện các hành động, từng bước một, kèm theo điều kiện áp dụng và kết quả mong muốn. Khi AI thực hiện một loạt hành động thành công, nó sẽ "học" và ghi lại trình tự đó như một "thủ tục", đồng thời theo dõi mức độ thành công và thời gian thực hiện. Khi gặp một mục tiêu tương tự, AI sẽ tự động chọn "thủ tục" nào có tỷ lệ thành công cao nhất và phù hợp với ngữ cảnh hiện tại để thực hiện.<img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://i.imgur.com/robot_performing_task.png' alt='Robot thực hiện chuỗi nhiệm vụ'>**Trí nhớ ngữ nghĩa (Semantic Memory)** là kho kiến thức tổng quát của AI về thế giới xung quanh. Nó giống như một cuốn bách khoa toàn thư mà AI có thể truy cập bất cứ lúc nào. Nó lưu trữ các sự thật, khái niệm, và kiến thức chung (ví dụ: "Trái Đất quay quanh Mặt Trời", "Paris là thủ đô của Pháp"). Nó còn có khả năng tự kiểm tra để đảm bảo thông tin chính xác và không mâu thuẫn. Khi một sự thật mới được học, AI sẽ thêm nó vào kho kiến thức của mình, đồng thời kiểm tra xem có mâu thuẫn với thông tin đã có không. Nếu có, nó sẽ tìm cách giải quyết dựa trên độ tin cậy của nguồn. Bạn có thể hỏi AI bất cứ điều gì, và nó sẽ dùng "trí nhớ ngữ nghĩa" này để tìm câu trả lời chính xác nhất.<img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://i.imgur.com/AI_knowledge_base.png' alt='Cơ sở tri thức của AI'>Còn đây là **Trí nhớ làm việc (Working Memory)** – hay còn gọi là trí nhớ ngắn hạn. Nó giống như cái "bàn làm việc" của AI, nơi nó giữ những thông tin đang cần xử lý ngay lập tức cho tác vụ hiện tại. Nhiệm vụ của nó là giữ các thông tin cần thiết cho mục tiêu hiện tại của AI, quản lý ngữ cảnh, và loại bỏ những thứ không còn liên quan để "bàn làm việc" luôn gọn gàng. AI liên tục cập nhật "bàn làm việc" này, có một "cơ chế chú ý" để ưu tiên thông tin quan trọng. Những thông tin không còn cần thiết sẽ bị "quên" đi (chỉ tạm thời thôi nhé), và những thông tin cực kỳ quan trọng có thể được chuyển sang "trí nhớ dài hạn" để lưu giữ lâu hơn.<img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://i.imgur.com/short_term_memory_AI.png' alt='Một tấm bảng tạm thời hoặc bảng trắng cho những suy nghĩ của AI'>**Trí nhớ cá tính (Persona Memory)** là thứ tạo nên "con người" cho AI của bạn. Đây là nơi nó lưu giữ tính cách, phong cách giao tiếp, chuyên môn, giá trị và các hành vi đã học được. Nó xác định cách AI "ứng xử" – nó sẽ nói chuyện thân thiện hay trang trọng? Hài hước hay nghiêm túc? Nó có chuyên môn về lĩnh vực gì? Khi AI được "sinh ra", nó có một bộ "tính cách" ban đầu. Quan trọng hơn, AI có thể học và thích nghi dựa trên phản hồi của người dùng. Nếu bạn thích nó nói chuyện dí dỏm, nó sẽ dần dần "định hình" để trở nên hài hước hơn. Đây chính là cách AI xây dựng một "tính cách" riêng biệt và cá nhân hóa trải nghiệm cho từng người dùng.<img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://i.imgur.com/AI_personality.png' alt='Avatar AI với các đặc điểm tính cách/biểu tượng cảm xúc khác nhau'>Cuối cùng là **Trí nhớ công cụ (Toolbox Memory)**. Nghe tên là thấy "dụng cụ" rồi đúng không? Nó giúp AI nhớ và chọn đúng công cụ cần thiết để hoàn thành nhiệm vụ, ví dụ như gọi API, tìm kiếm trên web, hay tính toán. Nó lưu trữ thông tin về tất cả các công cụ mà AI có thể sử dụng (tên, mô tả, chức năng, cách dùng). Quan trọng hơn, nó còn theo dõi xem công cụ nào hoạt động tốt, công cụ nào hay "trục trặc". Khi đối mặt với một nhiệm vụ, AI sẽ "lục" kho công cụ này, không chỉ dựa vào mô tả mà còn dựa vào hiệu suất trong quá khứ (công cụ nào làm tốt nhất, nhanh nhất). Cứ như bạn biết chính xác cái tua vít nào là tốt nhất cho công việc vậy!<img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://i.imgur.com/AI_toolbox.png' alt='Một bàn tay chọn công cụ từ hộp công cụ có nhãn AI'>Sau khi đã biết về từng loại trí nhớ, chúng ta cần một "nhạc trưởng" để điều phối tất cả: đó chính là **Hệ thống Quản lý Trí nhớ (Memory Management System)**. Nó chịu trách nhiệm cho toàn bộ "vòng đời" của một ký ức, từ khi hình thành đến khi được sử dụng và thậm chí là "lãng quên". Nhiệm vụ chính của "nhạc trưởng" này là: tạo ra (phân tích thông tin mới để biến nó thành một "ký ức"), lưu trữ (cất giữ ký ức vào đúng loại trí nhớ phù hợp), truy xuất (tìm kiếm và lấy ra những ký ức liên quan), tổng hợp (kết hợp nhiều mảnh ký ức lại thành một bức tranh tổng thể), cập nhật (thay đổi nội dung khi có thông tin mới), và lãng quên (di chuyển những ký ức ít quan trọng hoặc đã cũ đi vào "kho lưu trữ", giải phóng không gian).<img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://i.imgur.com/memory_manager_orchestration.png' alt='Người điều khiển dàn nhạc, với các nhạc cụ được dán nhãn là các loại bộ nhớ'>Richmond cũng nhắc đến các "tín hiệu trí nhớ" (memory signals) như tính gần đây hay tần suất. Đây chính là cách AI quyết định ký ức nào quan trọng và dễ được nhớ lại hơn, giống như cách não bộ chúng ta hoạt động vậy. Có mấy "tín hiệu" chính này: **Tính gần đây (Recency)**: Ký ức càng mới thì càng dễ nhớ. **Tần suất (Frequency)**: Ký ức nào được "lặp lại" hay sử dụng thường xuyên thì càng in sâu. **Tầm quan trọng (Importance)**: AI sẽ đánh giá mức độ quan trọng dựa trên ngữ cảnh và sở thích người dùng. **Cảm xúc (Emotion)**: Ký ức nào gắn với "cảm xúc" thì thường được ghi nhớ tốt hơn. **Bất ngờ (Surprise)**: Những thông tin không ngờ tới, khác với dự đoán của AI, cũng sẽ được ghi nhớ sâu sắc hơn. Tất cả các "tín hiệu" này sẽ được tổng hợp lại để AI quyết định xem nên "ưu tiên" ký ức nào khi bạn cần!<img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://i.imgur.com/memory_signals_AI.png' alt='Sơ đồ giống não bộ với các mũi tên và trọng số cho các tín hiệu bộ nhớ khác nhau'>Để những hệ thống trí nhớ AI này thực sự hoạt động "ngon lành" trong thực tế, chúng ta cần chú ý đến 3 yếu tố quan trọng: **1. Khả năng mở rộng (Scalability):** Vấn đề là AI cần lưu trữ và xử lý lượng dữ liệu khổng lồ. Giải pháp là phân chia dữ liệu ra nhiều nơi (sharding) và tạo "chỉ mục" (indexing) để tìm kiếm nhanh, cùng với caching (bộ nhớ đệm) để tăng tốc độ truy cập.<img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://i.imgur.com/scalable_database.png' alt='Các máy chủ cơ sở dữ liệu phân tán hoạt động cùng nhau'>**2. Quyền riêng tư và Bảo mật (Privacy and Security):** Ký ức của AI chứa rất nhiều thông tin nhạy cảm. Giải pháp là mã hóa dữ liệu quan trọng, áp dụng "kiểm soát truy cập" nghiêm ngặt, và luôn có "nhật ký kiểm toán" để ghi lại mọi hoạt động.<img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://i.imgur.com/data_security_lock.png' alt='Biểu tượng ổ khóa trên dữ liệu/mạng'>**3. Tối ưu hóa hiệu suất (Performance Optimization):** Ai cũng muốn AI phản hồi nhanh "như chớp"! Giải pháp là sử dụng các chiến lược tìm kiếm thông minh như "tìm kiếm lai" (hybrid search) kết hợp nhiều cách tìm cùng lúc. Ngoài ra, các "mã nhúng" (embeddings) cần được tạo ra trước để khi tìm kiếm chỉ việc so sánh các con số, nhanh hơn rất nhiều.<img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://i.imgur.com/fast_data_processing.png' alt='Đồng hồ tốc độ hoặc biểu tượng xử lý nhanh'>Giờ thì, hãy cùng xem một "đặc vụ" AI chăm sóc khách hàng sẽ trở nên "thông minh" thế nào khi được trang bị đầy đủ các loại trí nhớ này nhé!Tưởng tượng bạn là một khách hàng gọi điện (hoặc chat) với AI để hỏi về một vấn đề phức tạp. AI của chúng ta sẽ làm gì? 1. "Tải" ký ức liên quan: Ngay lập tức, AI sẽ lục lọi mọi thông tin về bạn: lịch sử trò chuyện trước đó (trí nhớ đàm thoại), các sản phẩm bạn đã mua, vấn đề bạn từng gặp (trí nhớ thực thể và tình tiết), và cả sở thích giao tiếp của bạn (trí nhớ cá tính). 2. Cập nhật "bàn làm việc": AI ghi lại tin nhắn hiện tại của bạn vào "trí nhớ làm việc" để tập trung xử lý. 3. Trích xuất thông tin quan trọng: Nó sẽ nhận diện tên sản phẩm, số đơn hàng hay bất kỳ "thực thể" nào bạn nhắc đến để cập nhật vào "sổ danh bạ" của mình. 4. Tìm kiếm trải nghiệm tương tự: AI "lật nhật ký" để xem có khách hàng nào từng gặp vấn đề giống bạn không, và đã giải quyết như thế nào. Từ đó, nó rút ra bài học. 5. Phản hồi siêu "chất": Dựa trên tất cả các ký ức đã thu thập, AI tạo ra một phản hồi không chỉ giải quyết vấn đề mà còn cá nhân hóa, đúng với phong cách bạn thích, và thậm chí còn nhắc lại những điều bạn từng nói để thể hiện sự "quan tâm"! 6. Lưu lại toàn bộ tương tác: Sau khi xong, toàn bộ cuộc trò chuyện, các bước xử lý, kết quả, và cả "cảm xúc" của bạn (nếu có thể phân tích) đều được lưu lại để AI học hỏi cho lần sau. 7. Cập nhật hồ sơ khách hàng: Hồ sơ của bạn sẽ được "làm mới" với thông tin về lần tương tác cuối cùng, số lần bạn đã liên hệ, và các chủ đề bạn quan tâm. Đó! Cứ như có một người bạn thân thiết, siêu trí tuệ làm trợ lý chăm sóc khách hàng cho bạn vậy!<img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://i.imgur.com/customer_service_AI.png' alt='Khách hàng vui vẻ tương tác với một đặc vụ AI thông minh'>Tương lai còn thú vị hơn nữa! Richmond đã nhấn mạnh sự hợp tác giữa các nhà khoa học thần kinh và kỹ sư AI. Hãy cùng "vén màn" một chút về những gì sắp tới: Củng cố ký ức như giấc ngủ: Giống như khi chúng ta ngủ, não bộ củng cố những ký ức quan trọng từ trí nhớ ngắn hạn sang dài hạn. AI cũng sẽ học cách "ngủ" để củng cố các bài học quan trọng, làm cho chúng trở nên bền vững hơn. Tái hiện ký ức: Não bộ con người thường "tua lại" các trải nghiệm cũ để củng cố các mô hình thần kinh. AI cũng sẽ có khả năng "tua lại" các tình huống đã xảy ra để học hỏi sâu hơn, củng cố các kỹ năng và quy trình. Dự đoán theo trí nhớ: AI sẽ có thể "dự đoán" những gì sẽ xảy ra dựa trên kinh nghiệm và kiến thức đã có. Nếu điều gì đó xảy ra khác với dự đoán, AI sẽ rất "ngạc nhiên" và dùng sự "ngạc nhiên" đó để điều chỉnh và học hỏi, giống như cách chúng ta học từ những điều bất ngờ trong cuộc sống vậy.<img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://i.imgur.com/AI_brain_synapses.png' alt='Hình ảnh trừu tượng của bộ não AI với các kết nối giống tế bào thần kinh'>Qua hành trình khám phá này, bạn đã thấy rồi đấy, trí nhớ không chỉ là một "tính năng hay ho" mà là **nền tảng của trí tuệ** cho các "đặc vụ" AI! Khi trang bị đầy đủ hệ thống trí nhớ, chúng ta có thể biến những ứng dụng AI "vô tri" thành những "sinh vật" thông minh thực thụ, có khả năng: Xây dựng mối quan hệ chân thật với người dùng; Học hỏi từ kinh nghiệm và cải thiện theo thời gian; Duy trì ngữ cảnh mượt mà trong mọi tương tác; Thích nghi với sở thích cá nhân; Đưa ra quyết định tốt hơn dựa trên những gì đã xảy ra. Những công cụ và mô hình chúng ta đã thảo luận – từ MongoDB linh hoạt cho đến khả năng tìm kiếm vector "thần sầu" – đều sẵn sàng để bạn xây dựng những hệ thống trí nhớ AI đẳng cấp thế giới ngay hôm nay. Hãy nhớ kỹ lời của Richmond: chúng ta không chỉ đang xây dựng AI, chúng ta đang **kiến tạo trí tuệ**. Và trí tuệ mà không có ký ức thì cũng giống như việc cố gắng sống mà bị mất trí nhớ vĩnh viễn vậy đó! Hãy bắt đầu từ những bước nhỏ – có thể là triển khai trí nhớ đàm thoại trước. Sau đó, dần dần thêm các loại trí nhớ khác khi "đặc vụ" AI của bạn trở nên tinh vi hơn. Người dùng của bạn chắc chắn sẽ nhận ra sự khác biệt, và các "đặc vụ" AI cuối cùng cũng có thể xây dựng những mối quan hệ bền chặt, biến AI trở nên thực sự có giá trị!<img src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://i.imgur.com/AI_intelligence_blocks.png' alt='Các khối xây dựng trí tuệ với bộ nhớ ở nền tảng'>À, nếu bạn muốn "nhâm nhi" sâu hơn về chủ đề này, đừng quên xem bài thuyết trình tuyệt vời của Richmond Alake về "Kiến trúc Trí nhớ cho Agent" tại MongoDB nhé! Anh ấy làm việc tại MongoDB và là tác giả của thư viện mã nguồn mở Memoripy mà chúng ta đã nhắc đến. Kết nối với Richmond trên LinkedIn để cập nhật thêm những insight "đỉnh cao" về việc xây dựng hệ thống trí nhớ cho các "đặc vụ" AI nha!<video controls src='https://truyentranh.letranglan.top/api/v1/proxy?url=https://www.youtube.com/embed/W2HVdB4Jbjs'></video>
Bạn có bao giờ thắc mắc làm thế nào để tìm kiếm thông tin nhanh chóng trong thế giới AI đang bùng nổ? PostgreSQL với pgvector là một lựa chọn phổ biến, nhưng liệu nó có đủ mạnh mẽ khi kết hợp tìm kiếm vector với các bộ lọc dữ liệu khác? Bài viết này sẽ "bung bét" mọi thứ, từ việc "nuôi" pgvector đến cách nó xử lý dữ liệu vector "khổng lồ" và tại sao tính năng "lọc trước" lại quan trọng đến vậy. Chúng ta sẽ cùng nhau khám phá "cuộc chiến" giữa tốc độ và độ chính xác, và tìm ra những "mẹo vặt" để tối ưu hóa việc tìm kiếm của bạn!
Bạn nghĩ mình cần MongoDB hay NoSQL? Hãy khám phá JSONB của Postgres – giải pháp linh hoạt, mạnh mẽ và tiết kiệm chi phí, giúp bạn quản lý dữ liệu linh hoạt như MongoDB nhưng vẫn giữ được sức mạnh của SQL truyền thống.
Khám phá cách xây dựng ứng dụng RAG đa phương thức (multimodal) sử dụng văn bản, hình ảnh và bảng biểu. Tìm hiểu sự khác biệt giữa mô hình nhúng CLIP và VLM, và cách chúng ảnh hưởng đến hiệu suất RAG.
Bạn muốn xây dựng ứng dụng AI thông minh có thể hiểu cả chữ, ảnh và bảng biểu? Bài viết này sẽ hướng dẫn bạn cách tạo một ứng dụng RAG đa phương thức đỉnh cao, sử dụng các công nghệ mới nhất như MongoDB Atlas Vector Search, mô hình nhúng đa phương thức của Voyage AI và LLM Gemini 2.0 Flash. Khám phá sự khác biệt giữa các kiến trúc mô hình và cách đánh giá hiệu suất để AI của bạn thực sự 'hiểu' thế giới dữ liệu đa dạng!
Khám phá lý do tại sao các AI hiện tại hay quên và làm thế nào các hệ thống trí nhớ có thể biến chúng thành những tác nhân AI thông minh, có khả năng học hỏi và xây dựng mối quan hệ thực sự. Tìm hiểu 8 loại trí nhớ quan trọng và cách triển khai chúng.
Bạn muốn tạo ứng dụng web thông minh? Hướng dẫn chi tiết này sẽ chỉ cho bạn cách 'se duyên' Django và MongoDB, tận dụng sức mạnh Tìm kiếm Vector và LLM để xây dựng một ứng dụng công thức nấu ăn AI siêu tiện lợi. Từ A đến Z, mọi bước đều được giải thích dễ hiểu, vui vẻ!
Tìm hiểu cách AI tự hành của Vercel AI SDK, Vector Search của MongoDB và biểu diễn vector của Voyage AI đang cách mạng hóa việc xây dựng đội ngũ trong ngành HR, giúp tìm kiếm nhân tài và quản lý dự án hiệu quả hơn.