Kỹ thuật PAL (Program-Aided Language Models)

PAL là một phương pháp tiên tiến kết hợp giữa các mô hình ngôn ngữ (Language Models) với các chương trình để cải thiện khả năng giải quyết các nhiệm vụ phức tạp. Cụ thể, PAL sử dụng các đoạn mã chương trình (code) để hỗ trợ quá trình xử lý và giải quyết các bài toán mà mô hình ngôn ngữ phải đối mặt.

Nguồn hình ảnh: Gao và cộng sự, (2022)

Giải thích chi tiết về PAL

  1. Mục tiêu chính của PAL:
    • Tăng cường khả năng giải quyết bài toán: Các mô hình ngôn ngữ thường gặp khó khăn khi xử lý các bài toán phức tạp yêu cầu các bước suy luận nhiều bước hoặc tính toán phức tạp. Bằng cách tích hợp các chương trình, PAL giúp mô hình ngôn ngữ có thể thực hiện các bước này một cách hiệu quả hơn.
    • Giảm thiểu lỗi và nâng cao độ chính xác: Sử dụng các chương trình cho phép các bước xử lý được thực hiện một cách rõ ràng và có thể kiểm chứng, giảm thiểu nguy cơ lỗi phát sinh từ việc suy luận hoặc tính toán không chính xác của mô hình ngôn ngữ.
  2. Cách hoạt động của PAL:
    • Phân tích yêu cầu và chuyển đổi thành chương trình: Khi nhận được một nhiệm vụ, mô hình ngôn ngữ sẽ phân tích yêu cầu và chuyển đổi nó thành một đoạn mã chương trình. Đoạn mã này có thể là một thuật toán hoặc một loạt các bước tính toán cụ thể.
    • Thực thi chương trình: Đoạn mã chương trình sau đó được thực thi trên một nền tảng lập trình phù hợp. Kết quả của việc thực thi này sẽ cung cấp đầu ra chính xác hoặc các bước trung gian cần thiết để giải quyết nhiệm vụ ban đầu.
    • Kết hợp kết quả vào mô hình ngôn ngữ: Kết quả từ chương trình được kết hợp lại vào mô hình ngôn ngữ để tạo ra câu trả lời hoặc giải pháp cuối cùng.
  3. Ví dụ về PAL:
    • Bài toán toán học: Nếu nhiệm vụ là giải một bài toán toán học phức tạp, mô hình ngôn ngữ có thể viết một đoạn mã Python để tính toán. Chẳng hạn, nếu được yêu cầu tính tổng các số nguyên từ 1 đến 1000, mô hình ngôn ngữ có thể tạo ra đoạn mã: codesum(range(1, 1001)) Đoạn mã này sau đó được thực thi để cung cấp kết quả cuối cùng.
    • Xử lý dữ liệu: Đối với nhiệm vụ xử lý dữ liệu phức tạp, như lọc và tính toán trên một tập dữ liệu lớn, mô hình ngôn ngữ có thể tạo ra mã SQL để thực hiện các truy vấn cần thiết và xử lý dữ liệu.
  4. Ưu điểm của PAL:
    • Khả năng xử lý tốt hơn: Nhờ sử dụng các chương trình, PAL có thể xử lý các bài toán phức tạp mà mô hình ngôn ngữ đơn thuần không thể giải quyết chính xác.
    • Linh hoạt và mở rộng: Kỹ thuật PAL cho phép mô hình ngôn ngữ tận dụng sức mạnh của nhiều ngôn ngữ lập trình và công cụ tính toán khác nhau.
    • Hiệu quả và chính xác: Các bước xử lý được thực hiện bằng các chương trình cụ thể, giúp giảm thiểu sai sót và nâng cao độ chính xác của kết quả.

Một ví dụ về triển khai PAL

Hãy xem một ví dụ sử dụng LangChain và OpenAI GPT-3. Chúng tôi quan tâm đến việc phát triển một ứng dụng đơn giản có thể diễn giải câu hỏi đang được hỏi và đưa ra câu trả lời bằng cách tận dụng trình thông dịch Python.

Cụ thể, chúng tôi quan tâm đến việc tạo ra một chức năng cho phép sử dụng LLM để trả lời các câu hỏi yêu cầu hiểu rõ về ngày tháng. Chúng tôi sẽ cung cấp cho LLM lời nhắc bao gồm một số mẫu được áp dụng từ đây.

Nạp những thư viện cần:

import openai
from datetime import datetime
from dateutil.relativedelta import relativedelta
import os
from langchain.llms import OpenAI
from dotenv import load_dotenv

Trước tiên hãy cấu hình một số thứ:

load_dotenv()
 
# API configuration
openai.api_key = os.getenv("OPENAI_API_KEY")
 
# for LangChain
os.environ["OPENAI_API_KEY"] = os.getenv("OPENAI_API_KEY")

Thiết lập mô hình:

llm = OpenAI(model_name='text-davinci-003', temperature=0)

Thiết lập lời nhắc và câu hỏi:

question = "Today is 27 February 2023. I was born exactly 25 years ago. What is the date I was born in MM/DD/YYYY?"
 
DATE_UNDERSTANDING_PROMPT = """
# Q: 2015 is coming in 36 hours. What is the date one week from today in MM/DD/YYYY?
# If 2015 is coming in 36 hours, then today is 36 hours before.
today = datetime(2015, 1, 1) - relativedelta(hours=36)
# One week from today,
one_week_from_today = today + relativedelta(weeks=1)
# The answer formatted with %m/%d/%Y is
one_week_from_today.strftime('%m/%d/%Y')
# Q: The first day of 2019 is a Tuesday, and today is the first Monday of 2019. What is the date today in MM/DD/YYYY?
# If the first day of 2019 is a Tuesday, and today is the first Monday of 2019, then today is 6 days later.
today = datetime(2019, 1, 1) + relativedelta(days=6)
# The answer formatted with %m/%d/%Y is
today.strftime('%m/%d/%Y')
# Q: The concert was scheduled to be on 06/01/1943, but was delayed by one day to today. What is the date 10 days ago in MM/DD/YYYY?
# If the concert was scheduled to be on 06/01/1943, but was delayed by one day to today, then today is one day later.
today = datetime(1943, 6, 1) + relativedelta(days=1)
# 10 days ago,
ten_days_ago = today - relativedelta(days=10)
# The answer formatted with %m/%d/%Y is
ten_days_ago.strftime('%m/%d/%Y')
# Q: It is 4/19/1969 today. What is the date 24 hours later in MM/DD/YYYY?
# It is 4/19/1969 today.
today = datetime(1969, 4, 19)
# 24 hours later,
later = today + relativedelta(hours=24)
# The answer formatted with %m/%d/%Y is
today.strftime('%m/%d/%Y')
# Q: Jane thought today is 3/11/2002, but today is in fact Mar 12, which is 1 day later. What is the date 24 hours later in MM/DD/YYYY?
# If Jane thought today is 3/11/2002, but today is in fact Mar 12, then today is 3/12/2002.
today = datetime(2002, 3, 12)
# 24 hours later,
later = today + relativedelta(hours=24)
# The answer formatted with %m/%d/%Y is
later.strftime('%m/%d/%Y')
# Q: Jane was born on the last day of Feburary in 2001. Today is her 16-year-old birthday. What is the date yesterday in MM/DD/YYYY?
# If Jane was born on the last day of Feburary in 2001 and today is her 16-year-old birthday, then today is 16 years later.
today = datetime(2001, 2, 28) + relativedelta(years=16)
# Yesterday,
yesterday = today - relativedelta(days=1)
# The answer formatted with %m/%d/%Y is
yesterday.strftime('%m/%d/%Y')
# Q: {question}
""".strip() + '\n'
llm_out = llm(DATE_UNDERSTANDING_PROMPT.format(question=question))
print(llm_out)

Điều này sẽ xuất ra như sau:

# If today is 27 February 2023 and I was born exactly 25 years ago, then I was born 25 years before.
today = datetime(2023, 2, 27)
# I was born 25 years before,
born = today - relativedelta(years=25)
# The answer formatted with %m/%d/%Y is
born.strftime('%m/%d/%Y')

Nội dung của llm_outlà một đoạn mã Python. Dưới đây, execlệnh được sử dụng để thực thi đoạn mã Python này.

exec(llm_out)
print(born)

Kết quả xuất ra như sau: 02/27/1998

Kết luận

PAL (Program-Aided Language Models) là một kỹ thuật mạnh mẽ giúp nâng cao khả năng của các mô hình ngôn ngữ thông qua việc tích hợp các chương trình. Kỹ thuật này không chỉ giúp mô hình xử lý tốt hơn các nhiệm vụ phức tạp mà còn đảm bảo độ chính xác và hiệu quả của quá trình xử lý. PAL mở ra nhiều tiềm năng trong việc ứng dụng mô hình ngôn ngữ vào các lĩnh vực yêu cầu tính toán và suy luận phức tạp.