- Hướng dẫn thực hành dành cho nhà phát triển nhằm giải quyết tính không ổn định khi mô hình ngôn ngữ lớn (LLM) tạo ra các định dạng có cấu trúc như JSON, XML, mã nguồn, v.v.
- Do đặc tính xác suất, đầu ra có thể bị hỏng theo cách không tất định; tài liệu này trình bày các kỹ thuật cấu trúc hóa mang tính xác định để khắc phục điều đó
- Bao quát toàn bộ quy trình, từ nguyên lý hoạt động bên trong, lựa chọn công cụ và kỹ thuật, đến triển khai, mở rộng, tối ưu chi phí và cải thiện chất lượng đầu ra
- Tổng hợp thông tin mới nhất của lĩnh vực tạo sinh có cấu trúc đang thay đổi nhanh chóng dưới dạng tài liệu được cập nhật liên tục
- Là tài liệu tham khảo thiết yếu cho các nhà phát triển sử dụng LLM theo hướng lập trình cho các tác vụ như trích xuất dữ liệu, tạo mã, gọi công cụ
Sự cần thiết của đầu ra LLM có cấu trúc
- LLM thường tạo được đầu ra hợp lệ về mặt cú pháp như JSON, XML, mã nguồn, nhưng do đặc tính xác suất nên vẫn có thể phát sinh lỗi định dạng hoặc kết quả không hoàn chỉnh
- Điều này gây ra vấn đề trong các quy trình tự động hóa như trích xuất dữ liệu, tạo mã và gọi công cụ
- Để giải quyết các vấn đề này, cần có phương pháp đầu ra có cấu trúc mang tính xác định (Deterministic)
- Cuốn sổ tay đề cập toàn diện đến các công cụ và kỹ thuật để giúp nhà phát triển triển khai đầu ra có cấu trúc một cách ổn định
Nội dung chính của sổ tay
- Bao gồm các chủ đề thực tiễn như nguyên lý hoạt động bên trong, công cụ và kỹ thuật tối ưu, tiêu chí chọn công cụ, cách xây dựng, triển khai và mở rộng hệ thống, tối ưu độ trễ và chi phí, nâng cao chất lượng đầu ra
- Mỗi mục được xây dựng theo cách tiếp cận từng bước mà nhà phát triển có thể áp dụng trực tiếp
- Tích hợp và hệ thống hóa nghiên cứu mới nhất và các công cụ mã nguồn mở liên quan đến đầu ra có cấu trúc trong một tài liệu duy nhất
Tính cập nhật và cập nhật liên tục
- Công nghệ tạo sinh có cấu trúc đang phát triển rất nhanh, khiến các tài liệu hiện có nhanh chóng trở nên lỗi thời
- Cuốn sổ tay này được duy trì như một tài liệu sống (living document) được cập nhật định kỳ
- Nhà phát triển có thể truy cập thông tin mới nhất tại một nơi mà không cần phải lục tìm qua nhiều bài báo, blog hay kho GitHub
Cách sử dụng
- Có thể đọc toàn bộ theo thứ tự hoặc dùng như một tài liệu tham khảo để tra cứu ngay chủ đề cần thiết
- Được cấu trúc xoay quanh nhà phát triển thực tế, cho phép tham khảo nhanh khi cần giải quyết một vấn đề cụ thể
Người tạo và cộng đồng
- Cuốn sổ tay do đội ngũ Nanonets xây dựng
- Thông qua bản tin cộng đồng nhà phát triển LLM, họ cung cấp các insight mới nhất, đột phá cùng những công cụ và kỹ thuật hữu ích theo chu kỳ hai tuần một lần
1 bình luận
Ý kiến trên Hacker News
Một hướng dẫn thật sự rất đẹp. Tôi đặc biệt thích hiệu ứng chuyển tab trên nhiều trang
Tôi cứ nghĩ mình đã hiểu khá rõ về grammar-constrained generation (thậm chí cũng từng đóng góp một vài phần cho phần triển khai grammar của llama.cpp), nhưng vẫn rút ra được những góc nhìn mới từ hướng dẫn này
Tôi nghĩ đầu ra có cấu trúc là một trong những tính năng bị đánh giá thấp nhất của các engine LLM. Nhờ ràng buộc ngữ pháp, có thể dùng LLM một cách ổn định như một phần của pipeline lớn hơn, chẳng hạn agent gọi công cụ
Đầu ra có thể sai về mặt ngữ nghĩa, nhưng về mặt cú pháp thì luôn đúng. Điều này đặc biệt quan trọng khi dùng mô hình cục bộ
Ví dụ như ví dụ bộ lọc spam chạy trên Raspberry Pi của Jart, nếu áp grammar để TinyLlama chỉ được xuất
"yes"hoặc"no", nó sẽ hoạt động ổn định ngay cả trên phần cứng nhỏMột hướng dẫn rất xuất sắc. Tôi từng nghiên cứu về structured generation trong chương trình tiến sĩ, nên chia sẻ thêm vài tài liệu cho những ai quan tâm
Về thư viện có Outlines, Guidance, XGrammar
Về bài báo, tôi đề xuất Efficient Guided Generation for Large Language Models, Automata-based constraints for language model decoding, Pitfalls, Subtleties, and Techniques in Automata-Based Subword-Level Constrained Generation
Về bài blog có LLM Decoding with Regex Constraints và Coalescence: making LLM inference 5x faster
Một hướng dẫn được sắp xếp rất tốt. Nếu muốn tìm hiểu thêm về tối ưu hóa Guidance & llguidance, có thể xem bài báo ngắn do chúng tôi viết
Hướng dẫn này bao quát tốt hai phương pháp mà mọi người thường dùng. Tuy vậy, constrained generation có thể khác với phân phối gốc của LLM
Ví dụ khi LLM tạo một đối tượng có cấu trúc dài, nó có thể ưa thích các mẫu như ‘…’, nhưng sinh có ràng buộc sẽ ép nó đóng bằng dấu ngoặc kép hay ký tự kết thúc tương tự, từ đó có thể dẫn đến kết quả sai hơn
Ngược lại, resampling ổn định hơn vì nó lặp lại cho đến khi có kết quả hợp lệ
Ngoài ra, thay vì cứ nối thêm lỗi schema vào ngữ cảnh và làm văn cảnh dài ra, tôi nghĩ đơn giản là thử lại sẽ tốt hơn về cả chất lượng lẫn chi phí
Tôi tò mò liệu các mô hình SoTA như Opus, Gemini... có còn cần output schema enforcement hay không
Dạo này các mô hình khi sinh JSON hay code hầu như không còn lỗi cú pháp, nên tôi muốn biết nội bộ họ vẫn còn làm kiểm chứng schema hay không
Tôi hiểu là với mô hình nhỏ thì structured generation là cần thiết
json\n, nên việc chỉ định JSON response schema vẫn là cách an toànViệc ép đầu ra có cấu trúc sẽ gây suy giảm hiệu năng. Tùy trường hợp, nó có thể chậm hơn 2 đến 3 lần. Cần cân nhắc xem cái giá đó có đáng chấp nhận trong từng tình huống hay không
Một hướng dẫn thật sự đáng kinh ngạc. Giá như có tài liệu như thế này từ một năm trước thì tốt biết mấy. Tôi chắc chắn sẽ chia sẻ cho những người xung quanh
Hướng dẫn hay lắm. Tôi đặc biệt thích sơ đồ masked decoding
Tôi tò mò không biết có định dạng đầu ra nào đáng tin cậy hơn và dễ parse hơn JSON không. YAML hay TOML đều có nhược điểm riêng, nhưng xét về số token hay chi phí thì có thể lại tốt hơn
Tôi tò mò về tech stack của trang tài liệu/cookbook. Nó không giống MkDocs hay GitBook, nên muốn biết đã dùng gì