Ana içeriğe geç

LMQL’ye Giriş: SQL ile Büyük Dil Modelleri Arasındaki Köprü

LLM’ler için yenilikçi bir programlama dili olan LMQL (Language Models Query Language) hakkında bilmeniz gereken her şeyi keşfedin.
· 12 dk. oku

Yapay Zeka ile Keşfedin

Structured Query Language ya da kısaca SQL (çoğunlukla “sequel” olarak telaffuz edilir), bir veritabanı yönetim sistemi içinde verileri depolamak, almak, yönetmek ve işlemek için kullanılan bildirime dayalı bir programlama dilidir.

IBM araştırmacıları Raymond Boyce ve Donald Chamberlain tarafından 1970’lerin başında geliştirildi, ancak ticari olarak yalnızca 1979’da, günümüzde Oracle adını taşıyan Relational Software, Inc.’in kendi uygulamasını sunmasıyla kullanıma açıldı.

Günümüzde SQL, basitliği ve büyük veri setlerini verimli bir şekilde yönetip analiz etme yeteneği sayesinde yaygın olarak standart bir ilişkisel veritabanı yönetim sistemi (RDBMS) dili olarak kabul edilmektedir; bu da onu giderek daha fazla veriye dayanan dünyamızda vazgeçilmez kılar.

Ancak veriye dayalı dünya evriliyor.

Yapay zekâ hızla popülerlik kazanıyor ve büyük dil modelleri pek çok görev için son derece güçlü araçlar olarak öne çıkıyor. Tek sorun, bu dil modelleriyle etkileşimin zaman zaman yabancı bir dille konuşuyormuş gibi hissettirmesi. İşte LMQL burada devreye giriyor.

LMQL, ETH Zürich’teki SRI Lab tarafından geliştirildi ve geliştiricilerle dil modelleri arasında kişisel bir tercüman görevi görüyor. Başka bir deyişle, LMQL SQL’in gücünü dil modelleri alanına taşıyarak onlarla etkileşimi daha akıcı, daha verimli ve daha keyifli hale getiriyor.

Bu eğitimin geri kalanında şunları ele alacağız:

  • LMQL nedir?
  • Neden LMQL?
  • LMQL nasıl kurulur
  • LMQL’in pratik kullanım alanları
  • LMQL’in sınırlamaları
  • En iyi uygulamalar

LMQL nedir?

LMQL (Language Models Query Language), Büyük Dil Modelleri (LLM’ler) için yenilikçi bir programlama dilidir. Bildirime dayalı, SQL benzeri unsurları, buyurgan (imperatif) bir betik sözdizimiyle harmanlayarak LLM’lerden bilgi çıkarmak veya yanıt üretmek için daha yapılandırılmış ve sezgisel bir yol sunar.

Ayrıca LMQL, Python’un bir üst kümesidir; yani yeni özellikler getirerek Python’un yeteneklerini genişleten bir uzantı gibi davranır. Bu sayede geliştiriciler, metin ve kod içeren doğal dil istemleri oluşturabilir; sorguların esnekliğini ve ifade gücünü artırabilir.

Belgelere göre, “LMQL, geleneksel programlamayı kodunuz içinde LLM’leri çağırma yeteneğiyle iç içe geçirmenin yeni bir yolunu sunar. LLM etkileşimini, şablonlama dillerinin ötesine geçerek, program kodunuzun düzeyinde yerel olarak entegre eder.”

Programlama dili, yaratıcıları tarafından Prompting is Programming: A Query Lnague for Large Language Models başlıklı bir araştırma makalesinde, “LMP” (Language Model Prompting) adını verdikleri olguyu mümkün kılmak için bir çözüm olarak sunuldu.

Bağlam olarak, büyük dil modelleri soru yanıtlama ve kod üretimi gibi çeşitli görevlerde olağanüstü performans sergilemiştir. Temelde LLM’ler, verilen girdilere dayanarak istatistiksel olasılıklar üzerinden mantıklı diziler üretmede yetkindir.

Bu yetenekten yararlanarak kullanıcılar, dil talimatları veya örneklerle LLM’leri yönlendirip çeşitli aşağı akış görevlerinin yürütülmesini tetikleyebilir. Gelişmiş istem teknikleri, kullanıcılar, dil modeli ve hesap makinesi gibi harici araçlar arasında etkileşimi bile mümkün kılar.

Zorluk, en güncel performansa ulaşmak veya LLM’leri belirli görevlere uyarlamaktır; bu genellikle karmaşık, göreve özel programların uygulanmasını gerektirir ve yine de doğaçlama etkileşimlere bağımlı olabilir.

Dil modeli istemleme, bu sorunları ele almak için ivme kazanan yeni bir disiplindir. LMQL, metin istemleme ile betiklemeyi sezgisel bir şekilde birleştirmek ve kullanıcıların dil modeli çıktısı üzerinde kısıtlamalar belirlemesini sağlamak gibi LMP ilkelerine bağlıdır.

Neden LMQL?

Yeni nesil dil modelleri kavramsal olarak örnekler veya talimatlarla kolayca yönlendirilebilir. Ancak onları tam potansiyelleriyle kullanmak ve yeni modeller çıktıkça güncel kalmak, iç işleyişlerinin ve sağlayıcıya özgü kütüphane ve uygulamaların derinlemesine anlaşılmasını gerektirir.

Örneğin, çözümlenmiş çıktıyı yasal kelime veya ifade listesiyle sınırlamak zor olabilir; çünkü dil modelleri token’larla çalışır. LLM’leri yerelde ya da bir API üzerinden kullansanız da, devasa ağlar oldukları için oldukça maliyetlidirler.

LMQL, önceden ayarlanmış davranışlardan ve kısıtlamaların getirdiği arama daraltmasından yararlanarak dil modeli (LM) çağrı sayısını azaltabilir.

LMQL’in bir başka nedeni de, pek çok istem tekniğinin dil modeli ile kullanıcı arasında (örneğin ChatGPT gibi sohbet botlarında gördüğümüz) karşılıklı yazışma veya harici kontrol mantığıyla aritmetik hesaplama yapmak için kullanılanlar gibi yüksek derecede uzmanlaşmış arayüzler gerektirebilmesidir.

Bu istemlerin uygulanması, modelin çözümleme (decoding) prosedürleriyle yoğun manuel çalışma ve etkileşim gerektirir; bu da ortaya çıkan uygulamaların genelleştirilebilirliğini sınırlar. Son olarak, bir LM yalnızca tek bir (alt kelime) token’ı aynı anda üretebildiğinden, tamamlamak için birden çok çağrı gerekebilir.

Mevcut LM’ler, üretim ortamında kullanıldıklarında hayati önem taşıyan çıktı kısıtlama işlevselliği sunmaz. Örneğin, olumsuz yorumları işaretleyecek bir duygu analizi uygulaması geliştirdiğinizi düşünün. Program, LLM’in “olumlu”, “olumsuz” veya “nötr” gibi bir yanıt vermesini beklerdi.

Ancak LLM çoğu zaman “Verilen müşteri yorumu için duygu olumludur” gibi bir şey söyleyebilir; bu da API’nizin işlemesi için zordur. Bu nedenle kısıtlamalar son derece faydalıdır.

LMQL ile, LML’lerin kullandığı token’lar yerine insanlar tarafından anlaşılabilir terimlerle çıktıyı kontrol edebilirsiniz.

LMQL’in Kurulumu

LMQL’i yerel olarak kurabilir veya web tabanlı Playground IDE üzerinden çevrimiçi kullanabilirsiniz. Transformers veya llama.cpp üzerinden self-host edilen modelleri kullanmak isterseniz LMQL’i yerel olarak kurmanız gerekir. İşte nasıl:

Kurulum ve Ortam Ayarı

LMQL’i yerelde kurmak oldukça basittir.

Tek yapmanız gereken, Python >= 3.10 ortamında aşağıdaki komutu çalıştırmaktır:

pip install lmql

Modelleri yerel bir GPU üzerinde çalıştırmayı düşünüyorsanız, LMQL’i GPU destekli bir PyTorch >= 1.11 kurulumuna sahip bir ortamda kurmalısınız.

pip ile GPU bağımlılıklarıyla birlikte LMQL’i kurmak için çalıştırmanız gereken komut şöyledir:

pip install lmql[hf]

Not: bağımlılıkları sanal bir ortamda kurmak iyi bir uygulamadır.

Kurulumdan sonra LMQL programlarını çalıştırmak için üç seçeneğiniz vardır:

1. Playground
Yerel bir Playground IDE örneği başlatabilirsiniz

lmql playground

Bu komut, tarayıcı tabanlı bir Playground IDE başlatacaktır; eğer otomatik açılmazsa http://localhost:3000 adresine gidin.

Bu yöntemin Node.js kurulumu gerektirdiğini unutmayın.

2. Komut satırı arayüzü
Playground’a alternatif olarak komut satırı aracını kullanabilirsiniz. Bu araç yerel .lmql dosyalarını çalıştırmak için kullanılabilir. Kullanmak için aşağıdaki komutu çalıştırmanız yeterlidir:

lmql run

3. Python entegrasyonu
Üst küme olduğundan, LMQL bir Python programının içinden doğrudan çalıştırılabilir. Yapmanız gereken tek şey lmql paketini içe aktarmaktır. Tüm sorgu kodu lmql.run aracılığıyla veya @lmql.query dekoratörüyle çalıştırılmalıdır.

Playground IDE’de veya komut satırı aracında yerel Transformer modellerini kullanırken, ilgili model için lmql serve-model komutunu çalıştırarak önce bir LMQL Inference API örneği başlatmanız gerekir.

LMQL Sözdizimini Anlama

Bir LMQL programı, bir sorgunun davranışını belirlemede hayati rol oynayan beş temel bölümden oluşur. Bu bileşenler şunlardır:

  • Sorgu
  • Çözücü (Decoder)
  • Model
  • Kısıtlamalar
  • Dağıtım (Distribution)

Şimdi her birine daha yakından bakalım.

Sorgu

Dil modeli ile kullanıcı arasındaki birincil iletişim aracı sorgu bloğudur.

İşte temel bir LMQL sorgusu:

# 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
"""

Sorgu bloğu, en üst düzeydeki her dizeyi dil modeline doğrudan bir sorgu olarak ele alır. Python f-string’lerine benzer şekilde bu sorgu dizeleri, iki özel kaçışlı alt alanı destekler.

Dil modelinin üreteceği ifadenin [varname] ile temsil edildiğine dikkat edin. Bu aynı zamanda bir “boşluk” (hole) olarak bilinir – where (koşul) ifadesine birazdan geleceğiz.

Geçerli kapsamdan bir değişkenin değerini almak için {varname} de kullanılabilir.

Örneğin:

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

# modele bilgi aktarmak için istem cümlelerini kullanın
"Review: {review}"

Çözücü (Decoder)

Bir dil modelinin token dağılımından metin üretmek için kullanılan çeşitli çözümleme algoritmaları LMQL tarafından desteklenir. Bu, kullanılacak çözümleme algoritmasının bir sorgunun başında belirtilmesini sağlar.

Kullanılacak çözümleme algoritmasını belirtmenin iki yolu vardır:

1. Sorgunun parçası olarak – burada algoritma ve parametreleri, sorgunun bir parçası olarak belirtilir. LMQL belgelerine göre, “Yazdığınız somut program için çözücü seçiminizin önemli olduğu durumlarda bu özellikle yararlı olabilir.” Koddaki görünümü şöyledir:

# Source: https://lmql.ai/docs/language/decoding.html
# tüm program için kiriş arama (beam search) ve genişlik 2 kullan
beam(n=2)

# RESPONSE üretmek için beam search kullanır
"This is a query with a specified decoder: [RESPONSE]"

2. Haricî olarak – burada çözümleme algoritması ve parametreleri, asıl programdan ayrı olarak haricî biçimde belirtilir. Bunun yalnızca LMQL’in bir Python bağlamında kullanıldığı durumlarda mümkün olduğunu unutmayın

# 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

Geliştiriciler LMQL’i “metin üretimi için yüksek seviyeli, ön uç bir dil” olarak tanımlar. Bu, belirli bir metin üretim modeline bağlı olmadığı anlamına gelir. Bunun yerine arka planda OpenAI model, llama.cpp ve HuggingFace Transformers gibi çeşitli metin üretim modelleri desteklenir.

Modelleri yüklemek oldukça basittir. Bir lmql.LMM nesnesi üreten lmql.model(...) işlevini kullanabilirsiniz.

Görünümü şöyledir:

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

lmql.model("local:gpt2") # `transformers` modelini süreç içinde yükle
lmql.model("local:gpt2", cuda=True, load_in_4bit=True) # ek argümanlarla süreç içinde `transformers` modeli yükle
lmql.model("gpt2") # `lmql serve-model` üzerinden barındırılan bir `transformers` modeline eriş

lmql.LLM nesnesi oluşturulduktan sonra, modeli sorgu programına iki yöntemden biriyle iletebilirsiniz:

1. Modeli haricî olarak belirtme

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

# varsayılan olarak 'chatgpt' kullanır
@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() # chatgpt kullanır
tell_a_joke(model=lmql.model("openai/text-davinci-003")) # text-davinci-003 kullanır

2. from yan tümcesiyle bir sorgu kullanma

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

Kısıtlamalar

LMQL’in başlıca cazibelerinden biri kısıtlama bileşenidir. LMQL, kullanıcıların dil modeli çıktısı üzerinde kısıtlamalar belirtmesine imkân tanır. Bu, betiklenmiş istemlemeyi, model çıktısının istenen noktada sona erdiğini garanti ederek kolaylaştırır ve çözümleme sırasında kullanıcıya model üzerinde kontrol sağlar.

Desteklenen kısıtlamalar şunlardır:

  • Durdurma İfadeleri
  • Sayı Türü Kısıtlamaları
  • Kümeye Göre Seçim
  • Karakter Uzunluğu
  • Token Uzunluğu
  • Regex Kısıtlamaları Önizleme
  • Kısıtlamaları Birleştirme
  • Özel

Daha fazla bilgi için LMQL belgelerindeki Kısıtlamalar sayfasına göz atın.

Dağıtım (Distribution)

Dağıtım talimatı LMQL’de kilit bir bileşendir. Üretilen sonuçların nasıl dağıtılacağını ve sunulacağını tanımlayarak çıktı biçimi ve yapısı üzerinde kontrol sağlar.

İşte çalışırken bir örnek:

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

    # modele bilgi aktarmak için istem cümlelerini kullanın
    "Review: {review}"
    "Q: What is the underlying sentiment of this review and why?"
    # [ANALYSIS] gibi şablon değişkenleri metin üretmek için kullanılır
    "A:[ANALYSIS]" where not "\n" in ANALYSIS

    # sınıflandırma üretmek için kısıtlı değişken kullanın
    "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

LMQL’in Sınırlamaları ve Topluluk Desteği

Tüm teknolojilerde olduğu gibi, LMQL’in de bazı sınırlamaları vardır. Örneğin:

  • LMQL kütüphanesi çok uzun zamandır ortada değil ve aşırı popüler değil. Sonuç olarak topluluk oldukça küçük ve takıldığınızda yardım alabileceğiniz haricî kaynaklar sınırlı.
  • Kütüphane belgeleri olması gerektiği kadar ayrıntılı değil.
  • OpenAI API ile ilgili sınırlamalar nedeniyle, en popüler ve en iyi performans gösteren modellere erişilemediğinden LMQL’i ChatGPT ile tam anlamıyla kullanmak mümkün değil.

Bunlar LMQL kullanmayı düşünen kullanıcılar için engel teşkil etse de, kütüphanenin hâlâ oldukça yeni olduğunu ve geliştirilmekte olduğunu belirtmek önemli – bu sınırlamalar ilerleyen sürümlerde çözülebilir.

Sonuç

LMQL, aynı zamanda Python’un bir üst kümesi olan SQL benzeri bir programlama dilidir. Bildirime dayalı unsurlarını buyurgan bir betik sözdizimiyle harmanlayarak LLM’lerden bilgi çıkarma veya yanıt üretme sürecini basitleştirir. Geliştiriciler, metin üretimini etkin biçimde kontrol etmek için LMQL’den yararlanabilir; bu da onu teknoloji sektöründeki çeşitli uygulamalar için son derece değerli bir araç hâline getirir.

Öğrenmeye devam etmek için şunlara göz atın:

Kurtis Pykes

Yazar

Kurtis Pykes

Konular

İlgili