Chuyển đến nội dung chính

Giới thiệu về LMQL: Cây cầu nối giữa SQL và các mô hình ngôn ngữ lớn

Tìm hiểu mọi điều bạn cần biết về LMQL, viết tắt của Language Models Query Language, một ngôn ngữ lập trình đổi mới dành cho LLM.
· 12 phút đọc

Khám phá cùng AI

Structured Query Language, hay SQL (thường phát âm là “sequel”) là một ngôn ngữ lập trình tuyên bố dùng để lưu trữ, truy xuất, quản lý và thao tác dữ liệu trong hệ quản trị cơ sở dữ liệu.

SQL được phát triển bởi hai nhà nghiên cứu của IBM là Raymond Boyce và Donald Chamberlain vào đầu những năm 1970 nhưng chỉ trở nên khả dụng thương mại vào năm 1979 khi Relational Software, Inc., nay đã đổi tên thành Oracle, giới thiệu bản triển khai của họ.

Ngày nay, SQL được rộng rãi chấp nhận như tiêu chuẩn của hệ quản trị cơ sở dữ liệu quan hệ (RDBMS) nhờ sự đơn giản và khả năng quản lý, phân tích hiệu quả các tập dữ liệu lớn, khiến nó không thể thiếu trong thế giới ngày càng dựa trên dữ liệu của chúng ta.

Nhưng thế giới dựa trên dữ liệu đang thay đổi.

Trí tuệ nhân tạo đang bùng nổ, và các mô hình ngôn ngữ lớn đã trở thành những công cụ cực kỳ mạnh mẽ cho nhiều tác vụ. Vấn đề là việc tương tác với các mô hình ngôn ngữ này đôi khi giống như nói chuyện bằng một ngôn ngữ xa lạ. Đây chính là lúc LMQL xuất hiện.

LMQL được phát triển bởi SRI Lab tại ETH Zürich và đóng vai trò như một “phiên dịch viên” cá nhân giữa nhà phát triển và mô hình ngôn ngữ của họ. Cụ thể, LMQL mang sức mạnh của SQL vào lĩnh vực mô hình ngôn ngữ, giúp tương tác trở nên mượt mà, hiệu quả và thú vị hơn.

Trong phần còn lại của hướng dẫn này, chúng ta sẽ bàn về:

  • LMQL là gì?
  • Tại sao lại là LMQL?
  • Cách thiết lập LMQL
  • Ứng dụng thực tiễn của LMQL
  • Hạn chế của LMQL
  • Thực hành tốt nhất

LMQL là gì?

LMQL, viết tắt của Language Models Query Language, là một ngôn ngữ lập trình đổi mới dành cho các mô hình ngôn ngữ lớn (LLM). Cụ thể, nó kết hợp các yếu tố mang tính tuyên bố giống SQL với cú pháp kịch bản mang tính mệnh lệnh để cung cấp cách có cấu trúc và trực quan hơn nhằm trích xuất thông tin hoặc tạo phản hồi từ LLM.

Thêm vào đó, LMQL là một siêu tập của Python, nghĩa là nó hoạt động như một phần mở rộng giới thiệu tính năng mới và mở rộng khả năng của Python. Điều này cho phép nhà phát triển tạo các prompt ngôn ngữ tự nhiên chứa cả văn bản và mã, nâng cao tính linh hoạt và biểu đạt của truy vấn.

Theo tài liệu, “LMQL cung cấp một cách mới để đan xen lập trình truyền thống với khả năng gọi LLM ngay trong mã của bạn. Nó vượt xa các ngôn ngữ templating truyền thống bằng cách tích hợp tương tác với LLM một cách nguyên bản ở cấp độ mã chương trình.”

Ngôn ngữ lập trình này được các tác giả giới thiệu trong bài báo nghiên cứu có tiêu đề Prompting is Programming: A Query Lnague for Large Language Models như một giải pháp để kích hoạt hiện tượng họ gọi là “LMP,” tức Language Model Prompting.

Về bối cảnh, các mô hình ngôn ngữ lớn đã thể hiện hiệu năng vượt trội ở nhiều tác vụ như hỏi đáp và sinh mã. Về cơ bản, LLM giỏi tự động tạo ra các chuỗi logic dựa trên đầu vào cho trước bằng cách sử dụng xác suất thống kê.

Tận dụng khả năng này, người dùng có thể hướng dẫn LLM với các chỉ dẫn ngôn ngữ hoặc ví dụ để kích hoạt việc thực thi nhiều tác vụ hạ nguồn. Các kỹ thuật prompting nâng cao thậm chí cho phép tương tác giữa người dùng, mô hình ngôn ngữ và các công cụ bên ngoài như máy tính.

Thách thức nằm ở việc đạt hiệu năng tối tân hoặc điều chỉnh LLM cho các tác vụ cụ thể, vốn thường đòi hỏi triển khai những chương trình phức tạp theo tác vụ và vẫn phụ thuộc vào tương tác ứng biến.

Prompting cho mô hình ngôn ngữ là một lĩnh vực mới nổi đang thu hút sự quan tâm để giải quyết các vấn đề này. LMQL tuân theo các nguyên tắc của LMP, bao gồm cung cấp cho LLM sự kết hợp trực quan giữa text prompting và scripting, đồng thời cho phép người dùng chỉ định ràng buộc lên đầu ra của mô hình ngôn ngữ.

Tại sao lại là LMQL?

Thế hệ mô hình ngôn ngữ mới hơn có thể được prompting tương đối dễ dàng bằng ví dụ hoặc chỉ dẫn. Tuy nhiên, để khai thác hết tiềm năng của chúng và luôn bắt kịp khi các mô hình mới được phát hành, bạn cần hiểu sâu cách thức hoạt động bên trong của chúng cũng như các thư viện và triển khai đặc thù nhà cung cấp.

Ví dụ, hạn chế quá trình giải mã vào một danh sách từ hoặc cụm từ hợp lệ có thể khó vì mô hình ngôn ngữ làm việc với token. Dù bạn dùng LLM cục bộ hay qua API, chúng khá tốn kém vì là các mạng rất lớn.

LMQL có thể giảm số lần gọi (invoke) mô hình ngôn ngữ (LM) bằng cách tận dụng hành vi định sẵn và không gian tìm kiếm do các ràng buộc giới thiệu.

Một lý do khác cho LMQL là nhiều kỹ thuật prompting có thể yêu cầu trao đổi qua lại giữa mô hình ngôn ngữ và người dùng (như ta thấy ở chatbot như ChatGPT) hoặc các giao diện chuyên biệt cao, chẳng hạn dùng để thực hiện tính toán số học với logic điều khiển bên ngoài.

Triển khai những prompt này đòi hỏi nhiều công việc thủ công và tương tác với quy trình giải mã của mô hình, điều này hạn chế tính tổng quát của các triển khai kết quả. Cuối cùng, vì một LM chỉ có thể sinh một token (dưới từ) tại một thời điểm, việc hoàn tất có thể cần nhiều lần gọi.

Các LM hiện có không cung cấp chức năng ràng buộc đầu ra, điều vốn quan trọng khi LM được dùng trong sản xuất. Ví dụ, hãy tưởng tượng bạn đang xây dựng một ứng dụng phân tích cảm xúc để đánh dấu các đánh giá tiêu cực. Chương trình sẽ kỳ vọng LLM phản hồi kiểu như “tích cực”, “tiêu cực” hoặc “trung tính”.

Tuy nhiên, khá thường xuyên, LLM có thể trả lời kiểu “Cảm xúc cho bài đánh giá của khách hàng là tích cực”, điều này khó để API của bạn xử lý. Do đó, ràng buộc là cực kỳ hữu ích.

Với LMQL, bạn có thể kiểm soát đầu ra bằng các điều khoản dễ hiểu với con người thay vì các token mà LMs sử dụng.

Thiết lập LMQL

LMQL có thể cài đặt cục bộ hoặc dùng trực tuyến qua Playground IDE trên web. Lưu ý nếu bạn muốn dùng các mô hình tự lưu trữ qua Transformers hoặc llama.cpp, bạn phải cài LMQL cục bộ. Cách làm như sau:

Cài đặt và thiết lập môi trường

Cài đặt LMQL cục bộ khá đơn giản.

Bạn chỉ cần chạy lệnh sau trong môi trường Python >= 3.10:

pip install lmql

Nếu bạn định chạy mô hình trên GPU cục bộ, bạn phải cài LMQL trong môi trường có PyTorch >= 1.11 hỗ trợ GPU.

Đây là lệnh để cài LMQL cùng các phụ thuộc GPU qua pip:

pip install lmql[hf]

Lưu ý: cài phụ thuộc trong môi trường ảo là thực hành tốt.

Sau khi cài đặt, bạn có ba cách để chạy chương trình LMQL:

1. Playground
Bạn có thể khởi chạy một phiên bản Playground IDE cục bộ

lmql playground

Lệnh này sẽ mở Playground IDE trên trình duyệt, nếu không tự mở, hãy truy cập http://localhost:3000.

Lưu ý cách này yêu cầu cài đặt Node.js.

2. Giao diện dòng lệnh
Một lựa chọn thay thế Playground là công cụ dòng lệnh. Công cụ này dùng để thực thi các tệp .lmql cục bộ. Để dùng, chỉ cần chạy lệnh sau:

lmql run

3. Tích hợp Python
Vì là siêu tập, LMQL có thể chạy trực tiếp trong chương trình Python. Tất cả những gì bạn cần làm là import gói lmql. Mọi mã truy vấn phải chạy qua lmql.run hoặc với decorator @lmql.query.

Khi sử dụng các mô hình Transformer cục bộ trong Playground IDE hoặc công cụ dòng lệnh, trước tiên bạn phải khởi chạy một phiên bản LMQL Inference API cho mô hình tương ứng bằng cách chạy lệnh lmql serve-model.

Hiểu cú pháp LMQL

Một chương trình LMQL gồm năm phần cơ bản, mỗi phần đóng vai trò quan trọng quyết định hành vi của truy vấn. Các thành phần gồm:

  • Query
  • Decoder
  • Model
  • Constraints
  • Distribution

Hãy đi sâu vào từng phần.

Query

Phương tiện giao tiếp chính giữa mô hình ngôn ngữ và người dùng là khối query.

Đây là một truy vấn LMQL cơ bản:

# Source: https://lmql.ai/docs/
"Say 'this is a test':[RESPONSE]" where len(TOKENS(RESPONSE)) < 25

—-- Model Output—--
"""
Say 'this is a test': RESPONSE This is a test
"""

Khối query coi mọi chuỗi ở cấp cao nhất là một truy vấn trực tiếp tới mô hình ngôn ngữ. Tương tự f-string trong Python, các chuỗi truy vấn này hỗ trợ hai trường con escape đặc biệt.

Lưu ý cụm mà mô hình ngôn ngữ sẽ sinh được biểu diễn bằng [varname]. Đây còn gọi là một “khoảng trống” (hole) - chúng ta sẽ nói đến mệnh đề where ngay sau đây.

Bạn cũng có thể truy xuất giá trị biến từ phạm vi hiện tại bằng {varname}.

Ví dụ:

# Source: https://lmql.ai/docs/language/overview.html
# review to be analyzed
review = """We had a great stay. Hiking in the mountains was fabulous and the food is really good."""

# use prompt statements to pass information to the model
"Review: {review}"

Decoder

LMQL hỗ trợ nhiều thuật toán giải mã dùng để sinh văn bản từ phân phối token của mô hình ngôn ngữ. Điều này cho phép chỉ định thuật toán giải mã ngay đầu truy vấn.

Có hai cách để chỉ định thuật toán giải mã cần dùng:

1. Là một phần của truy vấn - bạn chỉ định thuật toán và tham số như một phần của truy vấn. Theo tài liệu LMQL, “Điều này đặc biệt hữu ích nếu lựa chọn decoder của bạn liên quan đến chương trình cụ thể bạn đang viết.” Cách viết trong mã như sau:

# Source: https://lmql.ai/docs/language/decoding.html
# use beam search with beam width 2 for
# the entire program
beam(n=2)

# uses beam search to generate RESPONSE 
"This is a query with a specified decoder: [RESPONSE]"

2. Bên ngoài - bạn chỉ định thuật toán và tham số giải mã bên ngoài, tức là tách biệt với chương trình thực tế. Lưu ý điều này chỉ khả dụng khi LMQL được dùng trong ngữ cảnh Python

# Source: https://lmql.ai/docs/language/decoding.htmlimport lmql

@lmql.query(model="openai/text-davinci-003", decoder="sample", temperature=1.8)
def tell_a_joke():
    '''lmql
    """A list good dad joke. A indicates the punchline:
    Q:[JOKE]
    A:[PUNCHLINE]""" where STOPS_AT(JOKE, "?") and  STOPS_AT(PUNCHLINE, "\n")
    '''

tell_a_joke() # uses the decoder specified in @lmql.query(...)
tell_a_joke(decoder="beam", n=2) # uses a beam search decoder with n=2

Model

LMQL được các nhà phát triển định nghĩa là “ngôn ngữ giao diện cấp cao cho việc sinh văn bản.” Điều này có nghĩa nó không gắn với một mô hình sinh văn bản cụ thể. Thay vào đó, nhiều mô hình sinh văn bản được hỗ trợ ở phía backend, như OpenAI model, llama.cpp và HuggingFace Transformers.

Tải mô hình khá đơn giản. Bạn có thể dùng hàm lmql.model(...), hàm này trả về một đối tượng lmql.LMM.

Ví dụ như sau:

# Source: https://lmql.ai/docs/models/
lmql.model("openai/gpt-3.5-turbo-instruct") # OpenAI API model
lmql.model("random", seed=123) # randomly sampling model
lmql.model("llama.cpp:<YOUR_WEIGHTS>.gguf") # llama.cpp model

lmql.model("local:gpt2") # load a `transformers` model in-process
lmql.model("local:gpt2", cuda=True, load_in_4bit=True) # load a `transformers` model in process with additional arguments
lmql.model("gpt2") # access a `transformers` model hosted via `lmql serve-model`

Khi đối tượng lmql.LLM đã được tạo, bạn có thể truyền mô hình vào chương trình truy vấn theo một trong hai cách:

1. Chỉ định mô hình bên ngoài

# Source: https://lmql.ai/docs/models/
import lmql

# uses 'chatgpt' by default
@lmql.query(model="chatgpt")
def tell_a_joke():
    '''lmql
    """A great good dad joke. A indicates the punchline
    Q:[JOKE]
    A:[PUNCHLINE]""" where STOPS_AT(JOKE, "?") and \
                           STOPS_AT(PUNCHLINE, "\n")
    '''

tell_a_joke() # uses chatgpt
tell_a_joke(model=lmql.model("openai/text-davinci-003")) # uses text-davinci-003

2. Dùng truy vấn với mệnh đề from

# Source: https://lmql.ai/docs/models/
argmax
    "This is a query with a specified 'from'-clause: [RESPONSE]"
from
    "openai/text-ada-001"

Constraints

Một trong những điểm hấp dẫn chính của LMQL là thành phần ràng buộc. Đáng chú ý, LMQL cho phép người dùng chỉ định các ràng buộc lên đầu ra của mô hình ngôn ngữ. Điều này hỗ trợ scripted prompting bằng cách đảm bảo đầu ra mô hình kết thúc đúng điểm mong muốn và cũng trao quyền kiểm soát mô hình trong quá trình giải mã cho người dùng.

Các ràng buộc được hỗ trợ gồm:

  • Cụm dừng
  • Ràng buộc kiểu số
  • Lựa chọn từ một tập
  • Độ dài ký tự
  • Độ dài token
  • Xem trước ràng buộc Regex
  • Kết hợp ràng buộc
  • Tùy chỉnh

Hãy xem trang Constraints trong tài liệu LMQL để tìm hiểu thêm.

Distribution

Chỉ thị distribution là một thành phần then chốt trong LMQL. Nó cung cấp kiểm soát định dạng và cấu trúc đầu ra bằng cách xác định cách các kết quả sinh ra được phân phối và trình bày.

Ví dụ minh họa như sau:

# Source: https://lmql.ai/docs/language/overview.html
argmax
    # review to be analyzed
    review = """We had a great stay. Hiking in the mountains was fabulous and the food is really good."""

    # use prompt statements to pass information to the model
    "Review: {review}"
    "Q: What is the underlying sentiment of this review and why?"
    # template variables like [ANALYSIS] are used to generate text
    "A:[ANALYSIS]" where not "\n" in ANALYSIS

    # use constrained variable to produce a classification
    "Based on this, the overall sentiment of the message can be considered to be[CLS]"
distribution
   CLS in [" positive", " neutral", " negative"]

                  ----- Model Output ------
Review: We had a great stay. Hiking in the mountains was fabulous and the food is really good.
Q: What is the underlying sentiment of this review and why?
A: ANALYSIS The underlying sentiment of this review is positive because the reviewer had a great stay, enjoyed the hiking and found the food to be good.
Based on this, the overall sentiment of the message can be considered to be CLS

Hạn chế của LMQL và hỗ trợ cộng đồng

Như mọi công nghệ khác, LMQL cũng có vài hạn chế. Ví dụ:

  • Thư viện LMQL chưa xuất hiện lâu và chưa quá phổ biến. Do đó, cộng đồng còn khá nhỏ, và chỉ có một vài tài nguyên bên ngoài để hỗ trợ khi bạn gặp vướng mắc.
  • Tài liệu cho thư viện chưa chi tiết như mong đợi.
  • Hạn chế với OpenAI API đồng nghĩa với việc không thể tận dụng đầy đủ LMQL với ChatGPT vì các mô hình phổ biến và hiệu năng cao nhất không thể truy cập.

Mặc dù đây có thể là rào cản cho người dùng cân nhắc sử dụng LMQL, cần lưu ý thư viện vẫn còn khá mới và đang tiếp tục hoàn thiện – các hạn chế này có thể được giải quyết trong các phiên bản sau.

Kết luận

LMQL là một ngôn ngữ lập trình giống SQL đồng thời là siêu tập của Python. Nó đơn giản hóa quá trình trích xuất thông tin hoặc tạo phản hồi từ LLM bằng cách pha trộn các yếu tố tuyên bố với cú pháp kịch bản mang tính mệnh lệnh. Nhà phát triển có thể tận dụng LMQL để kiểm soát hiệu quả việc sinh văn bản, biến nó thành công cụ cực kỳ giá trị cho nhiều ứng dụng trong ngành công nghệ.

Để tiếp tục học, hãy xem:

Kurtis Pykes

Tác giả

Kurtis Pykes

Chủ đề

Liên quan