Memperkenalkan DSPy: Mengoptimalkan Pipeline Model Bahasa dengan Modular dan Teleprompters

Kukuh T Wicaksono
7 min readJun 28, 2024

--

Pendahuluan

Komunitas Machine Learning (ML) sedang menjelajahi teknik-teknik baru untuk membuat model bahasa (LM) dan menyusun pipeline yang dapat menyelesaikan tugas-tugas kompleks. Sayangnya, pipeline LM yang ada biasanya diimplementasikan menggunakan “template prompt” yang dikodekan secara manual. Pendekatan ini sering kali tidak efisien dan sulit untuk diskalakan. Untuk mengatasi masalah ini, diperkenalkanlah DSPy, sebuah model pemrograman yang mengabstraksi pipeline LM sebagai grafik transformasi teks.

Model bahasa (Language Models/LMs) telah memungkinkan peneliti untuk membangun sistem NLP dengan tingkat abstraksi yang lebih tinggi dan kebutuhan data yang lebih rendah daripada sebelumnya. Ini telah memicu perkembangan teknik “prompting” dan finetuning ringan untuk menyesuaikan LMs dengan tugas baru, memunculkan penalaran sistematis, dan melengkapinya dengan sumber yang diambil atau alat-alat lainnya. DSPy hadir untuk memberikan pendekatan sistematis dalam mengembangkan dan mengoptimalkan pipeline LM dengan memanfaatkan graf transformasi teks.

Apa Itu DSPy?

DSPy adalah model pemrograman yang mengabstraksi pipeline LM sebagai graf transformasi teks imperatif, di mana LM dipanggil melalui modul deklaratif. Modul-modul DSPy dapat diparameterisasi, artinya mereka dapat belajar bagaimana menerapkan komposisi teknik prompting, finetuning, augmentasi, dan reasoning. DSPy dilengkapi dengan kompilator yang mengoptimalkan setiap pipeline DSPy untuk memaksimalkan metrik yang diberikan.

Studi Kasus

1. Masalah Kata Matematika : DSPy dapat meningkatkan kinerja dalam menyelesaikan masalah kata matematika (GMS8K) dengan menerapkan teknik prompting yang dioptimalkan. GMS8K (Grade 8 Mathematics Word Problems)

GMS8K adalah dataset yang dirancang untuk mengevaluasi kemampuan 
model AI dalam menyelesaikan masalah kata matematika tingkat kelas 8.
Dataset ini berisi berbagai jenis masalah matematika yang biasanya
dihadapi oleh siswa kelas 8, termasuk masalah aritmatika,
aljabar, geometri, dan statistik. Masalah kata dalam dataset ini
mengharuskan model untuk memahami teks,
mengekstrak informasi relevan, dan melakukan perhitungan yang tepat
untuk mencapai jawaban yang benar.

Teknik yang digunakan untuk meningkatkan kinerja:
1. Optimized Prompting: Menggunakan teknik prompting yang
dioptimalkan dapat membantu model untuk lebih baik memahami
konteks dan struktur masalah kata.
Ini melibatkan pemberian petunjuk yang tepat sehingga model
dapat memproses informasi dengan lebih efektif.
2. Contextual Understanding:
Fokus pada pemahaman konteks masalah, termasuk mengenali kata
kunci dan frasa penting yang menunjukkan operasi matematika yang diperlukan.

2. Menjawab Pertanyaan Multi-hop : DSPy juga menunjukkan kinerja unggul dalam menjawab pertanyaan multi-hop (HotPotQA), dengan menggunakan strategi seperti chain of thought, multi-chain reflection, dan retrieval-augmented question answering.

HotPotQA adalah dataset yang dirancang untuk menguji kemampuan 
model AI dalam menjawab pertanyaan
yang membutuhkan penalaran multi-hop.
Pertanyaan multi-hop memerlukan model untuk
menggabungkan informasi dari beberapa sumber atau langkah untuk
mencapai jawaban yang benar.
HotPotQA mengharuskan model untuk tidak hanya menemukan informasi
relevan di beberapa dokumen tetapi juga mengaitkan informasi tersebut
untuk menghasilkan jawaban yang benar.

Strategi yang digunakan untuk meningkatkan kinerja:
1. Chain of Thought: Teknik ini melibatkan pemecahan pertanyaan
menjadi beberapa langkah pemikiran terstruktur,
memungkinkan model untuk mengikuti alur logika yang jelas
dalam menjawab pertanyaan.
2. Multi-Chain Reflection: Melibatkan penggunaan beberapa jalur
pemikiran paralel untuk mengeksplorasi berbagai kemungkinan jawaban
dan kemudian merefleksikan hasil tersebut untuk memilih jawaban yang
paling sesuai.
3. Retrieval-Augmented Question Answering: Menggunakan teknik
retrieval untuk mengumpulkan informasi dari sumber eksternal
atau database besar, kemudian mengintegrasikan informasi tersebut
untuk menjawab pertanyaan dengan lebih akurat.

Keunggulan DSPy

1. Pemrograman Modular : DSPy mendorong pembuatan pipeline LM baru dengan mendekati pemrograman modular, mirip dengan abstraksi jaringan saraf di mana banyak lapisan umum dapat dikomposisikan secara modular dalam arsitektur yang kompleks.

2. Optimisasi Otomatis : DSPy mengalihkan teknik prompting string-based, termasuk teknik yang kompleks seperti Chain of Thought dan ReAct, ke dalam modul deklaratif yang memiliki tanda tangan berbahasa alami. Modul-modul ini kemudian dioptimalkan oleh kompilator DSPy untuk meningkatkan kualitas atau mengurangi biaya.

3. Parameterisasi Modul : Setiap modul DSPy dapat belajar perilaku yang diinginkan dengan mengumpulkan demonstrasi yang berguna dalam pipeline, mirip dengan lapisan jaringan saraf dalam PyTorch.

Kompilator DSPy

Kompilator DSPy mengoptimalkan program DSPy untuk meningkatkan kualitas atau mengurangi biaya. Kompilator ini menggunakan teleprompter, yang merupakan optimizer yang menentukan bagaimana modul harus belajar dari data. Dengan cara ini, kompilator secara otomatis memetakan modul deklaratif ke komposisi prompting, finetuning, reasoning, dan augmentasi yang berkualitas tinggi.

Modul Built-in di DSPy

DSPy memiliki modul-modul seperti ChainOfThought, ProgramOfThought, MultiChainComparison, dan ReAct yang mendukung berbagai tanda tangan. Modul-modul ini mengubah teknik prompting menjadi fungsi modular yang dapat diterapkan pada pipeline mana pun.

Sebagai contoh, mengubah Predict menjadi ChainOfThought dalam program di atas akan menghasilkan sistem yang berpikir langkah demi langkah sebelum menghasilkan output.

DSPy, atau Dynamic Structured Prompting for Python , adalah sebuah framework yang memungkinkan pengguna untuk mengubah teknik prompting menjadi fungsi modular yang dapat diterapkan pada berbagai pipeline. Beberapa modul penting dalam DSPy adalah:

1. ChainOfThought : Modul ini digunakan untuk menerapkan teknik pemikiran berantai (chain of thought) dalam prompting. Teknik ini membantu model AI untuk menyusun alur pemikiran yang logis dan terstruktur dalam menjawab pertanyaan atau menyelesaikan masalah. Dengan menggunakan ChainOfThought, model dapat menghasilkan tanggapan yang lebih mendalam dan terperinci.

2. ProgramOfThought : Modul ini berfungsi untuk mengimplementasikan teknik pemrograman pemikiran (program of thought). Teknik ini mengarah pada penyusunan jawaban dengan pendekatan mirip dengan pemrograman, di mana setiap langkah atau blok pemikiran diproses secara sekuensial atau terstruktur seperti sebuah program komputer.

3. MultiChainComparison : Modul ini memungkinkan perbandingan antara berbagai rantai pemikiran (chains of thought) yang berbeda. Dengan membandingkan beberapa alur pemikiran, modul ini dapat membantu dalam memilih jawaban terbaik atau paling logis dari beberapa alternatif yang mungkin.

4. ReAct : Modul ReAct menggabungkan reaksi (react) dan tindakan (act) dalam satu proses prompting. Teknik ini digunakan untuk menciptakan interaksi yang lebih responsif dan adaptif antara model AI dan pengguna. Dengan ReAct, model dapat memberikan tanggapan yang lebih dinamis dan sesuai dengan konteks percakapan yang sedang berlangsung.

Modul-modul ini mendukung berbagai tanda tangan (signatures), yang berarti setiap modul memiliki antarmuka atau metode tertentu yang dapat disesuaikan dengan kebutuhan spesifik pengguna. Dengan kata lain, pengguna dapat menggunakan fungsi-fungsi modular ini dalam pipeline yang berbeda sesuai dengan kebutuhan aplikasi atau masalah yang ingin diselesaikan.

Secara keseluruhan, DSPy menawarkan fleksibilitas dan modularitas dalam teknik prompting, memungkinkan pengguna untuk membangun pipeline AI yang lebih efisien, terstruktur, dan adaptif.

Teleprompters untuk Otomatisasi Prompting dalam Pipeline

Ketika mengkompilasi program DSPy, kita biasanya memanggil teleprompter, yang merupakan optimizer yang mengambil program, set pelatihan, dan metrik, lalu mengembalikan program yang dioptimalkan. Berbagai teleprompter menerapkan strategi yang berbeda untuk optimisasi.

Set pelatihan di DSPy dapat kecil, hanya beberapa contoh saja. Contoh pelatihan ini mungkin tidak lengkap, yaitu hanya nilai input yang diperlukan. Label untuk langkah-langkah pipeline tidak diperlukan, kecuali jika digunakan dalam metrik. Hal ini sangat penting untuk modularitas karena membangun pipeline baru di DSPy hanya memerlukan kompilasi ulang kode pipeline baru, tanpa anotasi data yang spesifik.

Metrik dan Optimisasi

Metrik dapat berupa konsep sederhana seperti exact match (EM) atau F1, tetapi bisa juga berupa program DSPy yang mempertimbangkan berbagai faktor. Misalnya, kita dapat mengkompilasi modul RAG dengan dataset pasangan pertanyaan-jawaban dan metrik EM untuk bootstrap demonstrasi few-shot.

Sebagai contoh:

```python
# Set pelatihan kecil dengan hanya pertanyaan dan jawaban akhir
qa_trainset = [dspy.Example(question="What is the capital of France?", answer="Paris")]
# Teleprompter akan bootstrap label yang hilang: rantai penalaran dan konteks pengambilan
teleprompter = dspy.BootstrapFewShot(metric=dspy.evaluate.answer_exact_match)
compiled_rag = teleprompter.compile(RAG(), trainset=qa_trainset)
```

Dalam contoh ini, teleprompter BootstrapFewShot mensimulasikan RAG pada contoh pelatihan dan mengumpulkan demonstrasi dari setiap modul yang secara kolektif menghasilkan output yang valid.

Modularitas dan Komposisi Teleprompter

Teleprompter dapat disusun dengan menentukan program guru. DSPy akan mengambil sampel demonstrasi dari program ini untuk optimisasi prompt. Komposisi ini memungkinkan pipeline yang sangat kaya, di mana program yang mahal mengawasi program yang lebih murah.

Sebagai contoh, kita bisa memulai dengan RAG yang telah dikompilasi menggunakan model besar Llama2–13b-chat, tetapi kemudian melakukan fine-tuning pada Flan-T5-large untuk menciptakan program yang efisien.

Kesimpulan

DSPy memperkenalkan pendekatan baru yang revolusioner dalam memanfaatkan teknik prompting modular untuk optimisasi model bahasa. Dengan tanda tangan deklaratif, modul parameterisasi, dan teleprompter otomatis, DSPy memungkinkan pembangunan pipeline LM yang lebih efisien dan efektif.

Deklaratif dalam konteks ini merujuk pada gaya pemrograman di mana fokus utamanya adalah pada apa yang harus dicapai, bukan bagaimana cara mencapainya. Ini berarti bahwa dalam pendekatan deklaratif, Anda menentukan tujuan akhir atau hasil yang diinginkan, dan sistem atau framework akan menangani detail implementasinya.

Pada DSPy, tanda tangan deklaratif mengindikasikan bahwa pengguna dapat mendefinisikan apa yang ingin dicapai dengan modul atau pipeline tanpa harus menentukan langkah-langkah rinci untuk mencapainya. Sebagai contoh, dalam konteks optimisasi model bahasa, pengguna bisa menentukan tujuan seperti “meningkatkan akurasi prediksi” atau “mengurangi waktu pemrosesan” dan DSPy akan menggunakan teknik prompting modular untuk mewujudkan tujuan tersebut.

Beberapa keuntungan dari pendekatan deklaratif ini antara lain:

1. Simplicity and Clarity : Membuat kode lebih mudah dibaca dan dipahami karena fokus pada tujuan akhir daripada proses yang kompleks.
2. Abstraction : Mengurangi kebutuhan untuk memahami detail teknis yang mendalam, sehingga pengguna dapat fokus pada hasil yang diinginkan.
3. Efficiency : Sistem dapat mengoptimalkan cara mencapai tujuan yang ditentukan, sering kali lebih baik daripada pendekatan manual.
4. Reusability : Tanda tangan deklaratif memungkinkan penggunaan kembali kode dan konfigurasi untuk berbagai tujuan tanpa harus memodifikasi langkah-langkah spesifik.

Dengan menggunakan tanda tangan deklaratif, DSPy memungkinkan pengguna untuk membangun pipeline model bahasa yang efisien dan efektif, menghemat waktu dan usaha dalam proses pengembangan dan optimisasi model.

Mari mulai eksplorasi Anda dengan DSPy dan nikmati kemudahan serta efisiensinya dalam pemrograman model bahasa besar! DSPy tersedia di [https://github.com/stanfordnlp/dspy](https://github.com/stanfordnlp/dspy).

--

--