Một bài viết khá hay mình đọc được trên blog của Huyen Chip, xin phép dịch lại để chia sẻ với mọi người, danh xưng “tôi” trong bài viết là tác giả Huyen Chip
Lưu
Series bài viết: Xây dựng ứng dụng với các mô hình ngôn ngữ lớn LLMs
Bài viết này bao gồm 3 phần:
- Phần 1 sẽ thảo luận về những thách thức trong việc triển khai một ứng dựng LLM và những phương án giải quyết tôi từng thấy
- Phần 2 sẽ thảo luận về việc làm cách nào để xây dựng đa chức năng với những luồng điều khiển khác nhau (như câu lệnh if hay vòng lặp for) và tích hợp các công cụ (như thực thi SQL, bash, trình duyệt webs, API bên thứ 3) và nhiều thứ phức tạp và mạnh mẽ hơn nữa vào ứng dụng của bạn.
- Phần 3 sẽ bao gồm một vài sản phẩm tiềm năng mà tôi đã thấy các công ty khác xây dựng dựa trên LLMs và cách để xây dựng chúng từ cũng chức năng nhỏ hơn
Ứng dụng đa chức năng
Trong ví dụ về đánh giá độ gây tranh cãi của một twitter được mô tả trong Phần 1, nó chỉ bao gồm một nhiệm vụ duy nhất: với một text đầu vào, đưa ra điểm đánh giá về sự tranh cãi. Tuy nhiên, hầu hết các ứng dụng đều phức tạp hơn. Hãy xem xét một ứng dụng giúp “nói chuyện với dữ liệu” khi chúng ta muốn kết nối với cơ sở dữ liệu và truy vấn cơ sở dữ liệu này bằng ngôn ngữ tự nhiên. Hãy tưởng tượng có một bảng chứa các giao dịch thẻ tín dụng. Bạn muốn hỏi những điều như: “Có bao nhiêu khách hàng ở Quy Nhơn và tên của họ là gì?” và cơ sở dữ liệu của bạn sẽ trả về: “Có 9 khách hàng ở Quy Nhơn và họ là …”.
Một cách để làm điều này là viết một chương trình thực hiện chuỗi các nhiệm vụ sau:
- Nhiệm vụ 1: chuyển đổi đầu vào từ ngôn ngữ tự nhiên của người dùng thành truy vấn SQL [LLM]
- Nhiệm vụ 2: thực thi truy vấn SQL trong cơ sở dữ liệu [SQL]
- Nhiệm vụ 3: chuyển đổi kết quả SQL thành phản hồi bằng ngôn ngữ tự nhiên để hiển thị cho người dùng [LLM]
Các Agent, công cụ và luồng điều khiển
Tôi đã tiến hành một cuộc khảo sát nhỏ với những người tôi biết và có vẻ như hiện tại vẫn chưa có sự nhất quán về thuật ngữ.
Thuật ngữ (“agent”) được sử dụng rất nhiều để chỉ một ứng dụng có thể thực hiện nhiều nhiệm vụ theo luồng điều khiển cho trước (xem phần Luồng điều khiển bên dưới). Một nhiệm vụ có thể sử dụng một hoặc nhiều công cụ. Trong ví dụ trên, SQL executor là một ví dụ về công cụ.
Lưu ý: Một số người trong khảo sát của tôi cũng không đồng tình với việc sử dụng thuật ngữ “agent” trong ngữ cảnh này vì nó đã được sử dụng quá nhiều trong ngữ cảnh khác (ví dụ: “agent” để chỉ một đối tượng học trong học tăng cường).
Công cụ, hay plugin
Ngoài SQL executor, đây là một số ví dụ khác về tools/plugins:
- tìm kiếm (ví dụ: sử dụng Google Search API hoặc Bing API)
- trình duyệt web (ví dụ: cho một URL, lấy nội dung của nó)
- trình thực thi bash
- máy tính số học
Các tool hay plugin cơ bản là cùng 1 thứ. Bạn có thể coi plugin là các công cụ được tích hợp trong cửa hàng plugin của OpenAI. Khi viết bài này, các plugin của OpenAI vẫn chưa publish cho tất cả mọi người, nhưng bất kỳ ai cũng có thể tạo và sử dụng các công cụ bằng cách đăng ký subscription.
Luồng điều khiển: Xử lý tuần tự, xử lý song song, lệnh điều kiện, vòng lặp
Ví dụ trên là một ví dụ về luồng điều khiển “xử lý tuần tự”, trong đó một nhiệm vụ được thực thi sau khi nhiệm vụ khác hoàn thành, thường là do nhiệm vụ thứ hai phụ thuộc vào output của nhiệm vụ thứ nhất. Ví dụ, truy vấn SQL chỉ có thể được thực thi sau khi nó đã được dịch từ yêu cầu của người dùng.
“Xử lý song song” là quy trình thực thi các nhiệm vụ A và B cùng một lúc.
“Lệnh điều kiện” là ví dụ về việc thực thi nhiệm vụ A hoặc nhiệm vụ B tùy thuộc vào đầu vào.
“Vòng lặp” quá trình lặp lại việc thực thi nhiệm vụ A cho đến khi một điều kiện nhất định được đáp ứng. Ví dụ, hãy tưởng tượng rằng bạn sử dụng hành động duyệt web để lấy nội dung của một trang web và tiếp tục sử dụng hành động duyệt web để lấy nội dung của các liên kết được tìm thấy trên trang web đó cho đến khi mô hình LLM cảm thấy đã có đủ thông tin để trả lời câu hỏi ban đầu.
Lưu ý: “xử lý song song” có thể hữu ích trong vài trường hợp nhưng tôi chưa thấy nhiều ứng dụng sử dụng nó.
Xây dựng luồng điều khiển trong LLM
Trong software truyền thống, điều kiện cho các luồng điều khiển là hoàn toàn rõ ràng và logic. Với LLM (luồng điều khiển còn được gọi là các agent), các điều kiện cũng có thể được xác định thông qua prompt.
Ví dụ, nếu bạn muốn agent của bạn chọn giữa ba hành động là tìm kiếm, thực thi SQL và Chat, bạn phải giải thích cách nó lựa chọn một trong những hành động đó. Nói cách khác, bạn có thể sử dụng LLM để quyết định điều kiện của luồng điều khiển! Ví dụ:
You have access to three tools: Search, SQL executor, and Chat.
Search is useful when users want information about current events or products.
SQL executor is useful when users want information that can be queried from a database.
Chat is useful when users want general information.
Provide your response in the following format:
Input: { input }
Thought: { thought }
Action: { action }
Action Input: { action_input }
Observation: { action_output }
Thought: { thought }
Kiểm thử agent
Để đảm bảo độ tin cậy của agent, chúng ta cần xây dựng và kiểm thử từng nhiệm vụ một cách riêng biệt trước khi kết hợp chúng. Có hai loại lỗi chính:
- Một hoặc nhiều nhiệm vụ gặp lỗi. Nguyên nhân có thể là:
- Luồng điều khiển sai: model lựa chọn một hành động không được định trước
- Một hoặc nhiều nhiệm vụ cho kết quả không chính xác
- Tất cả các nhiệm vụ đều cho kết quả chính xác nhưng giải pháp tổng thể không chính xác. Press et al. (2022) gọi đây là “composability gap” (khoảng trống trong quá trình kết hợp): có thể đánh giá thông qua tỷ lệ giữa câu hỏi mà mô hình trả lời sai trên số câu hỏi mà mô hình trả lời đúng các câu hỏi phụ.
Tương tự như khi phát triển software, bạn có thể và nên viết unit test cho các thành phần cũng như luồng điều khiển. Đối với mỗi thành phần, bạn có thể xác định các cặp (input, output mong đợi) như các ví dụ đánh giá, và hãy chạy lại đánh giá mỗi khi bạn cập nhật prompt hoặc luồng điều khiển. Bạn cũng có thể thực hiện kiểm thử tích hợp cho toàn bộ ứng dụng.
Series Bài viết:
1 Response
[…] Previous (Huyen Chip) Large Language Model : Khả năng tích hợp đa nhiệm vụ trong LLM R… […]