Hầu hết mọi người đều có thể viết prompt cho một LLM. Nhưng việc tích hợp nó vào một sản phẩm có khả năng chịu được lưu lượng truy cập thực tế lại là một bài toán hoàn toàn khác. Nếu bạn muốn chuyển từ việc gõ văn bản vào cửa sổ chat sang việc triển khai AI trong môi trường production, bạn cần hiểu cách các lớp trong stack thực sự kết nối với nhau. Nó không phải là phép màu. Đó là một chuỗi các vấn đề kỹ thuật riêng biệt, và mỗi lớp đều có những dạng lỗi riêng.
Hãy để tôi trình bày cách một hệ thống AI hiện đại hoạt động, từ khoảnh khắc bạn gõ một từ cho đến khi một agent hoàn thành một tác vụ.
Nền tảng: Cách các mô hình tư duy
Về cốt lõi, một mô hình ngôn ngữ lớn chỉ làm đúng một việc: dự đoán token tiếp theo. Token đó có thể là từ tiếp theo, một phần của từ, hoặc thậm chí là một ký hiệu. Mọi thứ khác—thơ ca, mã nguồn, khả năng lập luận—đều là những hành vi phát sinh từ việc thực hiện nhiệm vụ duy nhất đó ở quy mô lớn.
Hành trình từ prompt của bạn đến phản hồi của mô hình diễn ra như sau.
Tokenization là bước đầu tiên. Văn bản thô không có ý nghĩa đối với một mạng thần kinh, vì vậy mô hình sẽ chia các từ của bạn thành các mảnh và ánh xạ mỗi mảnh thành một con số. Từ "tokenization" có thể trở thành ba token riêng biệt. Cụm từ "New York" có thể là một hoặc hai, tùy thuộc vào từ điển (vocabulary). Những con số này không phải ngẫu nhiên; chúng đến từ một từ điển cố định mà mô hình đã học được trong quá trình huấn luyện.
Khi các từ đã trở thành những con số, chúng cần có ý nghĩa. Embeddings chuyển đổi những con số đó thành các vector—những danh sách dài các giá trị dấu phẩy động giúp đặt các khái niệm tương tự lại gần nhau trong không gian toán học. "King" và "Queen" nằm gần nhau. "Paris" và "Berlin" tụ lại một nhóm nhưng ở một khu vực khác với "Python" hay "JavaScript".
Nhưng chỉ riêng các vector thì sẽ làm mất đi thứ tự. Positional encoding cho mô hình biết vị trí của từng token trong câu. Nếu không có nó, "The dog bit the man" và "The man bit the dog" sẽ trông giống hệt nhau.
Tiếp theo là attention mechanism. Đây là nơi mô hình xem xét tất cả các token trong đầu vào và quyết định xem token nào quan trọng để dự đoán token tiếp theo. Khi bạn hỏi: "Công ty được thành lập khi nào, và ai đang lãnh đạo?", mô hình cần liên kết "founded" với một ngày tháng và "leads" với tên của một CEO. Attention tạo ra những kết nối đó.
Các hoạt động này xếp chồng lên nhau thành các layers—thường là hàng chục lớp—trong đó các lớp đầu xử lý cú pháp và các lớp sau xây dựng khả năng lập luận trừu tượng. Ở đâu đó ở giữa, các feed-forward networks lưu trữ các liên kết thực tế. Đây là nơi mô hình lưu giữ kiến thức rằng Paris là thủ đô của Pháp, hoặc một API cụ thể yêu cầu một JSON payload. Nó không hẳn là một cơ sở dữ liệu, mà là một mạng lưới các trọng số (weights) được nén lại để kích hoạt các khuôn mẫu.
Cuối cùng, decoding chuyển đổi các biểu diễn vector nội bộ trở lại thành các token mà con người có thể đọc được. Mô hình không "biết" rằng nó đang viết tiếng Anh; nó chỉ đơn giản là xếp hạng hàng nghìn token tiếp theo có thể xảy ra và chọn ra token có xác suất cao nhất, lặp đi lặp lại cho đến khi đạt đến điều kiện dừng.
Lớp RAG: Cung cấp bộ nhớ cho mô hình
Một mô hình cơ sở (base model) bị đóng băng theo thời gian. Các trọng số của nó nắm bắt thông tin internet cho đến một ngày cắt mốc nhất định, và nó không thể truy cập các tài liệu riêng tư của bạn trừ khi bạn cung cấp chúng. Điều đó khiến nó trở nên vô dụng đối với hầu hết các tác vụ kinh doanh. Retrieval-Augmented Generation, hay RAG, khắc phục điều này bằng cách cung cấp cho mô hình một thư viện bên ngoài để nó có thể tham khảo trước khi trả lời.
Thiết lập này về mặt khái niệm thì đơn giản nhưng thực tế lại rất phức tạp. Đầu tiên, bạn lấy các tài liệu của mình và áp dụng chunking. Bạn không thể ném một tệp PDF dài hàng trăm trang vào cửa sổ prompt. Bạn chia nó thành các đoạn văn, các phần hoặc các khối ngữ nghĩa đủ nhỏ để nằm trong giới hạn ngữ cảnh (context limit) của mô hình mà vẫn giữ được ý nghĩa.
Mỗi chunk sẽ đi qua một embedding model và trở thành một vector, giống như các token bên trong LLM. Các vector này nằm trong một vector database—một kho lưu trữ chuyên dụng được thiết kế để tìm kiếm sự tương đồng thay vì tìm kiếm chính xác. Khi người dùng đặt câu hỏi, bạn nhúng (embed) truy vấn của họ và hỏi cơ sở dữ liệu: "Những chunk nào có ý nghĩa gần nhất với vector này?"
Chỉ riêng tìm kiếm vector thô thường sẽ bỏ lỡ các kết quả khớp chính xác. Một hệ thống production tốt sẽ sử dụng hybrid search, kết hợp giữa khớp từ khóa và sự tương đồng về ngữ nghĩa. Nếu ai đó hỏi về "SLA-99 compliance", bạn sẽ muốn tài liệu thực sự chứa chuỗi ký tự đó, chứ không chỉ là một tài liệu có cảm giác tương tự.
Sau khi truy xuất, re-ranking sẽ lọc bỏ nhiễu. Việc tìm kiếm ban đầu có thể trả về hai mươi chunk, nhưng chỉ có ba hoặc bốn chunk hàng đầu thực sự hữu ích. Một bộ re-ranker sẽ chấm điểm mức độ liên quan và loại bỏ phần còn lại trước khi bất kỳ thứ gì được đưa vào LLM, giúp tiết kiệm token và giảm thiểu sự ảo tưởng (hallucinations).
Lớp Agent: Thực hiện hành động
RAG cho phép mô hình đọc. Agent cho phép nó hành động.
Về cơ bản, một agent là một LLM nằm trong một vòng lặp. Nó quan sát, suy luận, hành động, và sau đó lại quan sát. Nếu bạn yêu cầu một agent đặt vé máy bay, nó không chỉ mô tả cách thức đặt vé hoạt động. Nó chia nhỏ nhiệm vụ thành các bước, gọi các hàm phù hợp, đọc các phản hồi và điều chỉnh.
Vòng lặp trông như sau. Quan sát: agent đọc trạng thái hiện tại—yêu cầu của bạn, kết quả của các lần gọi công cụ trước đó, hoặc bất kỳ lỗi nào. Suy luận: LLM quyết định bước tiếp theo cần làm gì, thường bằng cách tạo ra một kế hoạch có cấu trúc hoặc lựa chọn từ các tùy chọn đã được định nghĩa trước. Hành động: nó gọi một công cụ.
Công cụ là cách các agent tương tác với thế giới thực. Chúng được định nghĩa bằng các JSON schema để cho mô hình biết chính xác các tham số mà một API cần. LLM không thực hiện các yêu cầu HTTP tùy tiện. Nó điền thông tin vào một schema. "Gọi weather API với city: London và units: metric." Nếu công cụ trả về nhiệt độ, agent sẽ đưa
