Prompt Mühendisliği

DSPy ile LLM’yi Optimize Etme: AI Sistemlerini Oluşturmak, Optimize Etmek ve Değerlendirmek için Adım Adım Kılavuz

mm
Unite.AI sitesini Google'daki tercih ettiğiniz kaynaklara ekleyin
DSPy is a framework for algorithmically optimizing LM prompts and weights

Büyük dil modellerinin (LLM) yetenekleri genişledikçe, bunların potansiyelini kullanan güçlü AI sistemleri geliştirmek giderek daha karmaşık hale geldi. Geleneksel yöntemler genellikle karmaşık.prompting teknikleri, fine-tuning için veri oluşturma ve belirli alanlara özgü kısıtlara uymayı sağlamak için manuel rehberlik içerir. Ancak bu süreç zahmetli, hata eğilimli ve ağır insan müdahalesine bağlı olabilir.

DSPy, AI sistemlerinin geliştirilmesini basitleştırmak için tasarlanmış devrimci bir çerçeve olan DSPy’ye girin. DSPy, LM.prompt’ları ve ağırlıklarını optimize etmek için sistematik bir yaklaşım sunar, böylece geliştiricilerin minimal manuel çabayla karmaşık uygulamalar oluşturmasına olanak tanır.

Bu kapsamlı kılavuzda, DSPy’nin temel prensiplerini, modüler mimarisini ve sunduğu güçlü özellikleri keşfedeceğiz. Ayrıca, DSPy’nin LLM’lerle AI sistemleri geliştirmeyi nasıl dönüştürebileceğini gösteren pratik örnekler sunacağız.

DSPy Nedir ve Neden Gerekir?

DSPy, programınızın akışını (modüller) her adımın parametrelerinden (LM.prompt’ları ve ağırlıkları) ayırır. Bu ayrım, LM.prompt’ları ve ağırlıklarının sistematik olarak optimize edilmesini sağlar, böylece daha karmaşık AI sistemleri daha yüksek güvenilirlik, öngörülebilirlik ve alanlara özgü kısıtlara uyma ile oluşturmanıza olanak tanır.

Geleneksel olarak, LLM’lerle AI sistemleri geliştirmek, problemi adımlara ayırma, her adım için karmaşık.prompt’lar oluşturma, fine-tuning için sentetik örnekler oluşturma ve LLM’leri belirli kısıtlara uymaya zorlama gibi zahmetli bir süreçti. Bu yaklaşım sadece zaman alıcı değildi, aynı zamanda hatalara eğilimlidir, çünkü boru hattı, LM veya veri中的 küçük değişiklikler bile.prompt’lar ve fine-tuning adımlarının kapsamlı bir şekilde yeniden çalışmasını gerektirebilirdi.

DSPy, optimize ediciler adı verilen LM sürücülü algoritmalar sunarak bu zorlukları ele alır. Bu algoritmalar, bir metriği en üst düzeye çıkarmak için LM çağrılarının.prompt’larını ve ağırlıklarını ayarlayabilir. Optimizasyon sürecini otomatikleştirerek, DSPy geliştiricilere minimal manuel müdahale ile güçlü AI sistemleri oluşturma yeteneği sağlar, böylece LM çıkışlarının güvenilirliği ve öngörülebilirliği artırılır.

DSPy’nin Modüler Mimarisi

DSPy’nin kalbinde, karmaşık AI sistemlerinin oluşturulmasını kolaylaştıran modüler bir mimari bulunur. Çerçeve, çeşitli.prompting tekniklerini soyutlayan bir dizi yerleşik modül sağlar, chẳng hạn như dspy.ChainOfThought ve dspy.ReAct. Bu modüller, daha büyük programlar oluşturmak için birleştirilebilir ve oluşturulabilir, böylece geliştiricilerin özel gereksinimlerine göre karmaşık boru hatları oluşturmasına olanak tanır.

Her modül, talimatlar, birkaç örnek ve LM ağırlıkları dahil olmak üzere öğrenilebilen parametreleri kapsüller. Bir modül çağrıldığında, DSPy’nin optimize edicileri bu parametreleri istenen metriği en üst düzeye çıkarmak için fine-tune edebilir, böylece LM çıkışlarının belirtilen kısıtlara ve gereksinimlere uymasını sağlar.

DSPy ile Optimizasyon

DSPy, AI sistemlerinin performansını ve güvenilirliğini artırmak için tasarlanmış bir dizi güçlü optimize edici sunar. Bu optimize ediciler, LM sürücülü algoritmaları kullanarak LM çağrılarının.prompt’larını ve ağırlıklarını ayarlar, böylece belirtilen metriği en üst düzeye çıkarır ve alanlara özgü kısıtlara uyma sağlar.

DSPy’de bulunan bazı önemli optimize ediciler şunlardır:

  1. BootstrapFewShot: Bu optimize edici, birkaç örnek kullanarak birkaç-shot öğrenmeyi uygular ve optimize edilmiş örnekleri.prompt’a dahil eder.
  2. BootstrapFewShotWithRandomSearch: BootstrapFewShot optimize edicisini, oluşturulan gösterimler üzerinde rastgele arama ile birkaç kez uygular.
  3. MIPRO: Her adımda talimatlar ve birkaç örnek oluşturur, talimat oluşturması veri bilinci ve gösterim bilincidir. Bayesian Optimization’u kullanarak oluşturma talimatları ve gösterimleri üzerinde etkili bir şekilde arar.
  4. BootstrapFinetune: Bir.prompt tabanlı DSPy programını, daha küçük LLM’ler için ağırlık güncellemelerine distiller, böylece altta yatan LLM’leri daha verimli hale getirmenizi sağlar.

Bu optimize edicileri kullanarak, geliştiriciler AI sistemlerini sistematik olarak optimize edebilir, böylece yüksek kaliteli çıkışlar elde ederken alanlara özgü kısıtlara ve gereksinimlere uyma sağlar.

DSPy ile Başlama

DSPy’nin gücünü göstermek için, bir soru-cevap sistemi oluşturmak için bir geri çağırma-augmented üretim (RAG) sistemi oluşturma pratiğine geçelim.

Adım 1: Dil Modelini ve Geri Çağırma Modelini Ayarlama

İlk adım, DSPy içinde dil modelini (LM) ve geri çağırma modelini (RM) yapılandırmayı içerir.

DSPy’yi kurmak için çalıştırın:

[kod dili=”Python”]

pip install dspy-ai

[/kod]

DSPy, birden fazla LM ve RM API’sini ve yerel model barındırmasını destekler, böylece tercih ettiğiniz modelleri entegre etmeyi kolaylaştırır.

[kod dili=”Python”]

import dspy

# LM ve RM’yi yapılandırın
turbo = dspy.OpenAI(model=’gpt-3.5-turbo’)
colbertv2_wiki17_abstracts = dspy.ColBERTv2(url=’http://20.102.90.50:2017/wiki17_abstracts’)

dspy.settings.configure(lm=turbo, rm=colbertv2_wiki17_abstracts)

[/kod]

Adım 2: Veri Setini Yükleme

Sonraki adımda, karmaşık soru-cevap çiftlerini içeren HotPotQA veri setini yükleyeceğiz.

[kod dili=”Python”]

from dspy.datasets import HotPotQA

# Veri setini yükleyin
dataset = HotPotQA(train_seed=1, train_size=20, eval_seed=2023, dev_size=50, test_size=0)

# ‘soru’ alanını girdi olarak belirtin
trainset = [x.with_inputs(‘soru’) for x in dataset.train]
devset = [x.with_inputs(‘soru’) for x in dataset.dev]

[/kod]

Adım 3: İmza Oluşturma

DSPy, modüllerin davranışını tanımlamak için imzalar kullanır. Bu örnekte, cevap oluşturma görevi için bir imza tanımlayacağız, girdi alanlarını (bağlam ve soru) ve çıktı alanını (cevap) belirterek.

[kod dili=”Python”]

class GenerateAnswer(dspy.Signature):
“””Kısa gerçek cevaplarla soruları cevapla.”””

context = dspy.InputField(desc=”ilgili gerçekleri içerebilir”)
question = dspy.InputField()
answer = dspy.OutputField(desc=”çoğunlukla 1 ile 5 kelime arasında”)

[/kod]

Adım 4: Boru Hattı Oluşturma

RAG boru hattımızı bir DSPy modülü olarak oluşturacağız, bu da alt modülleri (dspy.Retrieve ve dspy.ChainOfThought) ilan eden bir başlatma yöntemine ( __init__ ) ve soru sorarken bu modüllerin kontrol akışını tanımlayan bir ileri yöntemine ( forward ) sahiptir.

[kod dili=”Python”]

class RAG(dspy.Module):
def __init__(self, num_passages=3):
super().__init__()

self.retrieve = dspy.Retrieve(k=num_passages)
self.generate_answer = dspy.ChainOfThought(GenerateAnswer)

def forward(self, question):
context = self.retrieve(question).passages
prediction = self.generate_answer(context=context, question=question)
return dspy.Prediction(context=context, answer=prediction.answer)

[/kod]

Adım 5: Boru Hattını Optimize Etme

Boru hattı tanımlandıktan sonra, DSPy’nin optimize edicilerini kullanarak onu optimize edebiliriz. Bu örnekte, BootstrapFewShot optimize edicisini kullanacağız, bu da modüllerimiz için etkili.prompt’lar oluşturur ve seçer.

[kod dili=”Python”]

from dspy.teleprompt import BootstrapFewShot

# Doğrulama metriği
def validate_context_and_answer(example, pred, trace=None):
answer_EM = dspy.evaluate.answer_exact_match(example, pred)
answer_PM = dspy.evaluate.answer_passage_match(example, pred)
return answer_EM and answer_PM

# Optimize ediciyi ayarlayın
teleprompter = BootstrapFewShot(metric=validate_context_and_answer)

# Programı derleyin
compiled_rag = teleprompter.compile(RAG(), trainset=trainset)

[/kod]

Adım 6: Boru Hattını Değerlendirmek

Programı derledikten sonra, istenen doğruluk ve güvenilirliğe ulaşıp ulaşmadığını kontrol etmek için geliştirme setinde performansını değerlendirmek önemlidir.

[kod dili=”Python”]

from dspy.evaluate import Evaluate

# Değerlendiriciyi ayarlayın
evaluate = Evaluate(devset=devset, metric=validate_context_and_answer, num_threads=4, display_progress=True, display_table=0)

# Derlenen RAG programını değerlendirin
evaluation_result = evaluate(compiled_rag)

print(f”Değerlendirme Sonucu: {evaluation_result}”)

[/kod]

Adım 7: Model Geçmişini İnceleme

Modelin etkileşimlerini daha derinlemesine anlamak için, modelin geçmişini inceleyebilirsiniz.

[kod dili=”Python”]

# Modelin geçmişini inceleyin
turbo.inspect_history(n=1)

[/kod]

Adım 8: Tahminler Yapma

Boru hattı optimize edildikten ve değerlendirildikten sonra, yeni sorular için tahminler yapabilirsiniz.

[kod dili=”Python”]

# Örnek soru
question = “Gary Zukav’ın ilk kitabının hangi ödülü aldığı?”

# Derlenen RAG programını kullanarak bir tahmin yapın
prediction = compiled_rag(question)

print(f”Soru: {question}”)
print(f”Cevap: {prediction.answer}”)
print(f”Çağıran Bağlamlar: {prediction.context}”)

[/kod]

DSPy ile Minimal Çalışma Örneği

Şimdi, GSM8K veri setini ve OpenAI GPT-3.5-turbo modelini kullanarak DSPy ile başka bir minimal çalışma örneğine geçelim.

Ayarlar

İlk olarak, ortamınızın doğru şekilde yapılandırıldığından emin olun:

[kod dili=”Python”]

import dspy
from dspy.datasets.gsm8k import GSM8K, gsm8k_metric

# LM’yi yapılandırın
turbo = dspy.OpenAI(model=’gpt-3.5-turbo-instruct’, max_tokens=250)
dspy.settings.configure(lm=turbo)

# GSM8K veri setinden matematik sorularını yükleyin
gsm8k = GSM8K()
gsm8k_trainset, gsm8k_devset = gsm8k.train[:10], gsm8k.dev[:10]

print(gsm8k_trainset)

[/kod]

The gsm8k_trainset ve gsm8k_devset veri setleri, her biri bir soru ve cevap alanına sahip örneklerin bir listesini içerir.

Modül Tanımlama

Sonraki adımda, zincirleme düşünme için ChainOfThought modülünü kullanan bir özel program tanımlayacağız:

[kod dili=”Python”]

class CoT(dspy.Module):
def __init__(self):
super().__init__()
self.prog = dspy.ChainOfThought(“soru -> cevap”)

def forward(self, question):
return self.prog(question=question)

[/kod]

Modeli Derleme ve Değerlendirme

Şimdi, BootstrapFewShot teleprompter ile derleyelim:

[kod dili=”Python”]

from dspy.teleprompt import BootstrapFewShot

# Optimize ediciyi ayarlayın
config = dict(max_bootstrapped_demos=4, max_labeled_demos=4)

# gsm8k_metric ile optimize edin
teleprompter = BootstrapFewShot(metric=gsm8k_metric, **config)
optimized_cot = teleprompter.compile(CoT(), trainset=gsm8k_trainset)

# Değerlendiriciyi ayarlayın
from dspy.evaluate import Evaluate

evaluate = Evaluate(devset=gsm8k_devset, metric=gsm8k_metric, num_threads=4, display_progress=True, display_table=0)
evaluate(optimized_cot)

# Modelin geçmişini inceleyin
turbo.inspect_history(n=1)

[/kod]

Bu örnek, ortamınızı nasıl yapılandıracağınızı, bir özel modül nasıl tanımlayacağınızı, bir modeli nasıl derleyeceğinizi ve sağlanan veri seti ve teleprompter yapılandırmasıyla performansını nasıl değerlendireceğinizi gösterir.

DSPy’de Veri Yönetimi

DSPy, eğitim, geliştirme ve test kümeleri ile çalışır. Verilerinizdeki her örnek için, girişler, ara etiketler ve son etiketler gibi üç tür değeriniz vardır. Ara veya son etiketler isteğe bağlıdır, ancak birkaç örnek girişinin olması zorunludur.

Örnek Nesneleri Oluşturma

DSPy’de örnek nesneleri, faydalı araçlar sunan Python sözlüklerine benzer:

[kod dili=”Python”]

qa_pair = dspy.Example(soru=”Bu bir sorudur?”, cevap=”Bu bir cevaptır.”)

print(qa_pair)
print(qa_pair.soru)
print(qa_pair.cevap)

[/kod]

Çıktı:

[kod dili=”Python”]

Example({‘soru’: ‘Bu bir sorudur?’, ‘cevap’: ‘Bu bir cevaptır.’}) (input_keys=None)
Bu bir sorudur?
Bu bir cevaptır.

[/kod]

Giriş Anahtarlarını Belirtme

[kod dili=”Python”]

print(qa_pair.with_inputs(“soru”))
print(qa_pair.with_inputs(“soru”, “cevap”))

[/kod]

Değerler nokta operatörü ile erişilebilir ve inputs() ve labels() gibi yöntemler, yalnızca girdi veya girdi olmayan anahtarlara sahip yeni Örnek nesneleri döndürür.

DSPy’de Optimize Ediciler

DSPy optimize edicisi, bir DSPy programının parametrelerini (yani, prompt’lar ve/veya LM ağırlıkları) belirtilen metriği en üst düzeye çıkarmak için ayarlar. DSPy, her biri farklı stratejiler kullanan çeşitli yerleşik optimize ediciler sunar.

Kullanılabilir Optimize Ediciler

  • BootstrapFewShot: several örnek kullanarak birkaç-shot öğrenmeyi uygular ve optimize edilmiş örnekleri.prompt’a dahil eder.
  • BootstrapFewShotWithRandomSearch: BootstrapFewShot optimize edicisini, oluşturulan gösterimler üzerinde rastgele arama ile birkaç kez uygular.
  • COPRO: Her adımda yeni talimatlar ve birkaç örnek oluşturur, talimat oluşturması veri bilinci ve gösterim bilincidir. Bayesian Optimization’u kullanarak oluşturma talimatları ve gösterimleri üzerinde etkili bir şekilde arar.
  • MIPRO: Talimatları ve birkaç örnekleri, Bayesian Optimization’u kullanarak optimize eder.

Optimize Edici Seçme

Eğer nereden başlayacağınızı bilmiyorsanız, BootstrapFewShotWithRandomSearch kullanın:

Küçük veri setleri (10 örnek) için BootstrapFewShot kullanın.
Orta büyüklükteki veri setleri (50 örnek) için BootstrapFewShotWithRandomSearch kullanın.
Büyük veri setleri (300+ örnek) için MIPRO kullanın.

BootstrapFewShotWithRandomSearch kullanmak için:

[kod dili=”Python”]

from dspy.teleprompt import BootstrapFewShotWithRandomSearch

config = dict(max_bootstrapped_demos=4, max_labeled_demos=4, num_candidate_programs=10, num_threads=4)
teleprompter = BootstrapFewShotWithRandomSearch(metric=YOUR_METRIC_HERE, **config)
optimized_program = teleprompter.compile(YOUR_PROGRAM_HERE, trainset=YOUR_TRAINSET_HERE)

[/kod]

Optimize Edilmiş Programları Kaydetme ve Yükleme

Optimize ediciyi çalıştırdıktan sonra, programı gelecekteki kullanım için kaydedin:

optimized_program.save(YOUR_SAVE_PATH)

Kaydedilmiş bir programı yükleyin:

[kod dili=”Python”]

loaded_program = YOUR_PROGRAM_CLASS()
loaded_program.load(path=YOUR_SAVE_PATH)

[/kod]

İleri Düzey Özellikler: DSPy Assertleri

DSPy Assertleri, LM’lerin hesaplamalı kısıtlarını otomatik olarak uygulayarak, LM çıkışlarının güvenilirliğini, öngörülebilirliğini ve doğruluğunu artırır.

Assertleri Kullanma

Doğrulama fonksiyonlarını tanımlayın ve model oluşturulduktan sonra assertleri bildirin. Örneğin:

[kod dili=”Python”]

dspy.Suggest(
len(soru) <= 100,
"Soru kısa ve 100 karakterden az olmalıdır",
)

dspy.Suggest(
validate_query_distinction_local(prev_queries, soru),
“Soru şu alanlardan farklı olmalıdır: ” + “; “.join(f”{i+1}) {q}” for i, q in enumerate(prev_queries)),
)

[/kod]

Programları Assertlerle Dönüştürme

[kod dili=”Python”]

from dspy.primitives.assertions import assert_transform_module, backtrack_handler

baleen_with_assertions = assert_transform_module(SimplifiedBaleenAssertions(), backtrack_handler)

[/kod]

Alternatif olarak, programı doğrudan assertlerle etkinleştirin:

[kod dili=”Python”]

baleen_with_assertions = SimplifiedBaleenAssertions().activate_assertions()

[/kod]

Assert Tabanlı Optimizasyonlar

DSPy Assertleri, DSPy optimize edicileriyle birlikte çalışır, özellikle BootstrapFewShotWithRandomSearch ile birlikte:

  • Derleme ile Assertler
  • Derleme + Tahmin ile Assertler

SONUÇ

DSPy, LM’leri ve.prompt’larını optimize etmek için güçlü ve sistematik bir yaklaşım sunar. Bu örneklerde açıklanan adımları takip ederek, karmaşık AI sistemlerini oluşturabilir, optimize edebilir ve değerlendirebilirsiniz. DSPy’nin modüler tasarımı ve gelişmiş optimize edicileri, çeşitli LM’lerin verimli ve etkili bir şekilde entegre edilmesini sağlar, böylece NLP ve AI alanındaki herkes için değerli bir araç haline gelir.

Ya basit bir soru-cevap sistemi ya da daha karmaşık bir boru hattı oluşturuyor olun, DSPy yüksek performans ve güvenilirlik için gerekli esneklik ve dayanıklılık sağlar.

Son beş yıldır Makine Öğrenimi ve Derin Öğrenme dünyasına kendimi adamış bulunuyorum. Tutkum ve uzmanlığım, özellikle AI/ML'ye odaklanarak 50'den fazla çeşitli yazılım mühendisliği projesine katkıda bulunmama yol açtı. Süregelen meraklılığım da beni Doğal Dil İşleme alanına yöneltti, bu alana daha da derinlemesine girmeye hevesliyim.