Giới thiệu
LLM
Các mô hình ngôn ngữ lớn như LLM/GPT mở ra khả năng giải quyết nhiều vấn đề phức tạp mà trước đây, lập trình truyền thống thường gặp khó khăn. Chúng có thể hiểu và phản hồi với ngôn ngữ tự nhiên, tự động hóa công việc, tạo ra mã lập trình, và thậm chí tư vấn trong nhiều lĩnh vực chuyên môn. Điều này giúp tăng cường hiệu suất, tiết kiệm thời gian và mở rộng khả năng sáng tạo trong cả lập trình và các ứng dụng khác.
Một ví dụ cụ thể trong quá trình dạy viết code Python, các chương trình dạy trước đây gặp rất nhiều khó khăn trong việc review source code được viết bởi người học. Thường thì công việc này được thực hiện bởi một người có kinh nghiệm, và tất nhiên đi kèm một chi phí rất cao. Nay, với khả năng đã được chứng mình của các mô hình như GPT (nhất là GPT4), GPT hoàn toàn có khả năng thực hiện việc review đánh giá chất lượng source code của người học, từ đó đưa ra gợi ý cũng như đóng góp kịp thời trong quá trình học.
Việc ứng dụng GPT mang lại lợi ích rất rõ ràng là chi phí được giảm đi đáng kể, mang lại kết quả nhanh và ổn định.
Nhưng đi kèm với đó, vấn đề của GPT cũng như LLM nói chung là tính tự nhiên trong ngôn ngữ. Đây là ưu điểm khi nó tương tác với người, nhưng cũng là khuyết điểm của chính nó. Với cùng một input đầu vào, GPT có thể cho ra output là những câu trả lời khác nhau (nội dung có thể giống nhau, hoặc không), như ví dụ bên dưới:
Mỗi lần được kích hoạt, GPT thường phản hồi với định dạng nội dung biến đổi, điều này tạo thách thức cho các hệ thống hiện tại, những hệ thống này thường được thiết kế để phù hợp với các định dạng đầu vào và đầu ra cố định. Rất khó để một hệ thống web có thể phân tích dòng chữ được tạo ra bởi GPT.
Lấy ví dụ một hệ thống Web hiển thị kết quả review, hệ thống web này không thể nào xác định được lỗi của source code hiện tại là nghiêm trọng hay không? Source code đã đáp ứng được yêu cầu hay chưa?
Những ứng dụng hiện có
Các hệ thống hiện tại thường không hoạt động theo phương thức linh hoạt. Chẳng hạn, giao tiếp giữa frontend và backend được cố định bằng cách sử dụng định dạng như JSON hoặc XML, không cho phép thay đổi một cách tùy tiện từ một phía. Tương tự như trong lập trình, việc đầu vào và đầu ra của một module hoặc một hàm được xác định và thiết kế từ trước. Bất kỳ sự thay đổi nào về kiểu dữ liệu trả về của một hàm có thể gây ra sự cố cho toàn bộ hệ thống.
JSON
JSON là một ví dụ điển hình cho việc thiết kế input và output từ trước. Mỗi trường trong file JSON đã được xác định và thống nhất về ngữ nghĩa trong các thành phần của hệ thống. Tương tự, XML cũng có thể được sử dụng trong một vai trò tương đương, phục vụ như một phương thức để truyền tải và lưu trữ dữ liệu một cách có cấu trúc.
Để triển khai ý tưởng trao đổi dữ liệu một cách mượt mà giữa các hệ thống bằng JSON trong bối cảnh của một ứng dụng review source code ở trên, ta có thể tạo ra một định dạng JSON như bên dưới. Giả sử ứng dụng này nhận input là source code và trả về output là một chuỗi JSON mô tả các vấn đề tìm được trong code, bao gồm số dòng, cột, nội dung review, và độ quan trọng của từng vấn đề:
Trong ví dụ này, JSON trả về một mảng các “reviews” với mỗi phần tử chứa thông tin cụ thể về lỗi được phát hiện trong source code: số dòng và cột mà lỗi xuất hiện, nội dung mô tả vấn đề, và mức độ quan trọng của lỗi. Định dạng JSON này giúp đảm bảo rằng cả ứng dụng gửi và ứng dụng nhận đều có thể hiểu và xử lý thông tin một cách nhất quán, từ đó tối ưu hóa quá trình review và cải thiện chất lượng code.
Ứng dụng
Quay trở lại với ví dụ đã nêu, một ứng dụng web dành cho việc học lập trình Python, với giao diện cho phép người dùng nhập mã lệnh. Ứng dụng này tích hợp trợ lý AI có khả năng không chỉ giải thích và hỗ trợ người học, mà còn đánh giá mã nguồn của họ.
Điều này giúp người học nâng cao kỹ năng lập trình của mình thông qua phản hồi được cung cấp một cách trực quan, chỉ ra chính xác vị trí cần được sửa đổi trong mã nguồn (dòng và cột cụ thể).
Quy trình này được thực hiện thông qua backend, nơi xử lý việc đánh giá và sau đó gửi kết quả về frontend dưới dạng JSON đã được xác định trước để hiển thị.
Những tính năng truyền thống như việc chạy code, chạy test đều đã được hoàn thành rất tốt, ở đây chỉ quan tâm đến tính năng review source code.
Thiết kế ứng dụng
JSON được dùng để backend gửi nội dung review cho frontend hiển thị. Trong định dạng này, quy định các thông tin như sau:
- Vị trí source code cần review
- Nhận xét
- Gợi ý để người học có thể cải thiện chất lượng source code
Mô hình hệ thống được thể hiện thông qua hình vẽ sau:
Thiết kế prompt cho LLM
Prompt là một đoạn văn bản ngắn nhằm giao tiếp với LLM / GPT. Nhiệm vụ chính của prompt là thông báo cho LLM về nhu cầu của người dùng đồng thời có thể hướng dẫn nó cách giải quyết vấn đề để cho ra kết quả mong muốn.
Input
Trong bài toán của chúng ta, Input cho prompt là source code, bài toán mà người dùng đang cố gắng giải.
Output
Là kết quả quá trình review source code, quá trình này được thực hiện bởi AI & output theo format json đã trình bày ở trên. Khi đi vào ứng dụng thực tế, review source code cần được thực hiện theo một tiêu chuẩn và một quy trình được thiết kế trước, ở đây dừng lại ở mức demo, nên GPT sẽ toàn quyền xem xét review source code theo kiến thức mà nó có.
Coding
Prompt được thiết kế như sau:
Chúng ta có thể thấy rõ ràng một kỹ thuật trong prompt đã được dùng để bắt buộc GPT output ra theo định dạng mà ta mong muốn.
Sử dụng thư viện Langchain, chúng ta có thể code dễ dàng với API của OpenAI như sau:
Chương trình hoàn toàn có thể được thực hiện mà không cần tới Langchain, nhưng với framework này, source code sẽ gọn gàng và dễ quản lý hơn.
Sau khi chạy chương trình như trên, chúng ta có output như sau:
Với kết quả trong định dạng json như thế này hoàn toàn có thể được sử dụng cho các bước tiếp theo trong hệ thống. Ví dụ, Web hoàn toàn có thể đọc kết quả này, hiển thị gợi ý đúng vị trí (dòng, cột) trong source code, để người dùng có cái nhìn trực quan hơn.
Chạy test thêm khi source code đã được update:
Chúng ta có kết quả review như sau, chứng tỏ tính khả thi cũng như hiệu quả của GPT:
Mở rộng
Không chỉ giới hạn ở JSON, khả năng mở rộng này còn áp dụng cho nhiều định dạng khác như XML, YAML, v.v. Điều này cho phép tích hợp linh hoạt vào hầu hết các hệ thống hiện có, đem lại trải nghiệm người dùng tốt nhất.
Đó là sự kết hợp mạnh mẽ giữa khả năng thực hiện đa dạng các tác vụ phức tạp của AI và hệ thống cũng như giao diện người dùng đã được triển khai trước đó.