Rekayasa prompt dengan DSPy

Joshua Noble

Data Scientist

DSPy adalah kerangka kerja Python sumber terbuka untuk membuat aplikasi model bahasa besar (LLM) dan menyempurnakan kinerjanya melalui kode, bukan dengan teknik sekali pakai untuk pengoptimalan prompt. Program DSPy memberikan cara modular untuk mengonfigurasi dan menyempurnakan aplikasi LLM dengan mengoptimalkan prompt untuk mendapatkan output yang akurat. Keuntungan utama dari DSPy adalah kerangka kerja ini memungkinkan Anda untuk melakukan rekayasa prompt dan pelacakan melalui kode Python dan tidak perlu melacak kinerja model sendiri.

Kekuatan DSPy terletak pada penggunaan AI generatif untuk menghasilkan bahasa alami dan kemudian menguji hasilnya untuk membuat prompt yang paling efektif. Hal ini memungkinkan Anda untuk membangun sistem AI yang dapat meningkatkan diri. Kerangka kerja ini mendukung beragam antarmuka untuk mengambil model dan model bahasa. Anda dapat menjalankan model secara setempat melalui sistem seperti ollama atau huggingface, atau menjalankannya menggunakan API jika Anda menggunakan ChatGPT atau GPT-4 dari OpenAI. DSPy mendukung berbagai contoh penggunaan seperti rantai pemikiran (CoT), pembuatan respons dengan pengambilan data yang ditingkatkan (RAG) serta perangkuman. 

Dalam tutorial ini, Anda akan menjalani alur kerja untuk membuat aplikasi menjawab pertanyaan RAG dengan DSPy di IBM watsonx. Anda akan menggunakan Llama 3 sebagai model bahasa dan ColBERT sebagai model pengambilan. Anda akan memiliki prompt penyempurnaan DSPy dan membantu menyusun beberapa pendekatan berbeda untuk menjawab pertanyaan, untuk melihat cara mendapatkan pembuatan jawaban yang lebih baik, bahkan dengan pertanyaan yang sangat kompleks.

Siapkan lingkungan Anda

Meskipun terdapat pilihan beberapa alat, tutorial ini akan memandu Anda untuk menyiapkan akun IBM menggunakan Jupyter Notebook.

Masuk ke watsonx.ai dengan akun IBM Cloud Anda.

Buat proyek watsonx.ai.

Anda bisa mendapatkan ID proyek dari dalam proyek Anda.

Kemudian klik tab 'Kelola' dan salin ID proyek dari bagian 'Detail' di halaman 'Umum'. Anda memerlukan ID ini untuk tutorial ini.

Selanjutnya, buat Jupyter Notebook di lingkungan yang Anda pilih. Anda akan menyalin kode dari tutorial ini ke dalam notebook baru. Atau, Anda dapat mengunduh notebook ini dari GitHub ke sistem lokal Anda dan mengunggahnya ke proyek watsonx.ai sebagai aset.

Siapkan instans layanan Watson Machine Learning (WML) dan kunci API

Buat instans layanan watsonx.ai Runtime (pilih wilayah yang sesuai dan pilih paket Lite, yang merupakan instans gratis).

Buat Kunci API di watsonx.ai Runtime.

Kaitkan layanan watsonx.ai Runtime ke proyek yang Anda buat di watsonx.ai.

Instal pustaka DSPy dan siapkan kredensial Anda

Untuk menggunakan DSPy, Anda akan melakukan instalasi pip sederhana. Anda juga akan menginstal dotenv untuk mengelola variabel lingkungan Anda:

!pip install dspy-ai python-dotenv;

Selanjutnya, Anda akan mengimpor pustaka yang diperlukan untuk seluruh tutorial ini:

import dspy
from dspy import LM
from dspy.datasets import HotPotQA
from dspy.teleprompt import BootstrapFewShot
import json
import os

from dotenv import load_dotenv
load_dotenv(os.getcwd()+’/.env’, override=True)

Untuk mengatur kredensial, Anda memerlukan WATSONX_APIKEY dan PROJECT_ID yang Anda buat di Langkah 1. Anda dapat menyimpannya di file .env di direktori Anda atau ganti teks placeholder. Anda juga akan mengatur URL yang berfungsi sebagai titik akhir API.

os.environ[‘WX_URL’] = “https://us-south.ml.cloud.ibm.com”
os.environ[‘WX_APIKEY’] = os.getenv(“WATSONX_APIKEY”, “”)

WATSONX_APIKEY= os.getenv(“WATSONX_APIKEY”, “”)
PROJECT_ID = os.getenv(“PROJECT_ID”,””)

Menggunakan watsonx dengan DSPy

Sekarang, Anda akan mengonfigurasi DSPy untuk bekerja dengan model watsonx dengan kelas DSPy LM. Kelas ini memungkinkan Anda memanggil API watsonx untuk membuat prompt baru dan respons terhadap prompt tersebut yang dapat Anda uji. Di bawahnya, DSPy menggunakan pustaka lain yang disebut LiteLLM untuk mengakses layanan watsonx. LiteLM menyediakan pembungkus sederhana untuk memanggil beraneka ragam API LLM menggunakan format OpenAI, termasuk Hugging face, Azure, dan watsonx.

Sebelum dapat mengakses akun watsonx, Anda perlu menyimpan token dari layanan watsonx dengan kunci API yang Anda buat pada langkah pertama. Panggil pustaka os untuk mengakses "https://iam.cloud.ibm.com/identity/token" dan ambil token Anda lalu simpan token untuk digunakan pada lain waktu.

token = os.popen(‘curl -k -X POST \
    --header “Content-Type: application/x-www-form-urlencoded” \
    --header “Accept: application/json” \
    --data-urlencode “grant_type=urn:ibm:params:oauth:grant-type:apikey” \
    --data-urlencode “apikey=’ + WATSONX_APIKEY + ‘” \
    “https://iam.cloud.ibm.com/identity/token”’).read()

Sekarang Anda dapat membuat instans LanguageModel yang menggunakan watsonx . Gunakan token yang telah Anda ambil sebelumnya sebagai kunci API dan kami akan menggunakan model 'llama-3-8b-instruct' dari Meta sebagai model bahasa Anda. Anda meneruskan jalur ke model tersebut ke DSPy untuk digunakan sebagai model bahasa Anda bersama dengan suhu (parameter) yang Anda inginkan agar digunakan oleh model bahasa tersebut. Informasi lebih lanjut tentang mengonfigurasi LiteLLM untuk menggunakan watsonx tersedia di dokumen GitHub mereka. Dalam hal ini parameter 0.7 memberi Anda kreativitas tanpa halusinasi berlebihan.

lm = dspy.LM(‘watsonx/meta-llama/llama-3-8b-instruct’, api_key=WATSONX_APIKEY, api_base=”https://us-south.ml.cloud.ibm.com”)

dspy.configure(lm=lm, trace=[], temperature=0.7, experimental=True)

Menambahkan model pengambilan

Sekarang, Anda memuat model pengambilan untuk R dari RAG Anda. Gunakan ColBERTv2 untuk memuat ekstrak dari kumpulan data Wikipedia 2017. ColBERT adalah model pencarian yang cepat dan akurat, memungkinkan pencarian berbasis BERT yang dapat diskalakan pada koleksi teks yang besar dalam waktu puluhan milidetik. ColBERT hanyalah salah satu dari banyak opsi yang dapat digunakan untuk mengambil informasi dari basis data vektor. Ini sebanding dengan basis data vektor lain seperti Qdrant, Milvus, Pinecone, Chroma, atau Weaviate.

Basis data vektor akan memiliki serangkaian informasi spesifik yang dapat diakses dengan cepat oleh model bahasa. Dalam kasus ini, Anda akan menggunakan serangkaian abstrak dari Wikipedia 2017 untuk memberikan berbagai fakta yang akan digunakan model bahasa Anda dalam pembuatan. Kombinasi ColBERT dan kumpulan data Wiki 17 ini juga sangat berguna karena versi ini dihosting secara gratis oleh tim DSPy untuk digunakan oleh siapa saja. Versi ini memberikan akses ke berbagai informasi tanpa mengharuskan Anda untuk menyerap data atau menyiapkan sistem basis data vektor Anda sendiri. Satu kekurangan dari kumpulan data ini adalah tidak berisi apa pun tentang peristiwa setelah tahun 2017, tetapi untuk tujuan demonstrasi, kumpulan data ini sangat berguna.

Jika Anda tertarik untuk menjalankan versi ColBERT dengan data Anda sendiri atau kumpulan data yang telah diperbarui, tutorial di sini akan membantu.

Setelah itu, muat kumpulan data HotPotQA dan pisahkan menjadi kumpulan pelatihan dan pengujian yang dapat Anda gunakan untuk menguji rantai pengambilan Anda. HotpotQA adalah kumpulan data menjawab pertanyaan yang berisi pertanyaan alami dan multi-hop, dengan pengawasan yang kuat terhadap fakta pendukung untuk memungkinkan sistem penjawaban pertanyaan yang lebih dapat dijelaskan. 

colbertv2_wiki17_abstracts = dspy.ColBERTv2(url=’http://20.102.90.50:2017/wiki17_abstracts’)
dspy.configure(rm=colbertv2_wiki17_abstracts)

Menguji QA dasar

Sekarang Anda akan membuat deskripsi spesifik yang akan digunakan untuk contoh awal Anda. Deskripsi spesifik adalah kelas yang menetapkan tipe input dan output sebuah modul, yang memastikan kompatibilitas antara modul yang berbeda dalam program DSPy. Deskripsi spesifik menggabungkan beberapa tugas seperti menyerap pertanyaan dan menghasilkan jawaban dan penalaran model. Deskripsi spesifik yang akan Anda gunakan di sini hanya menerima pertanyaan dan memberikan respons:

class BasicQA(dspy.Signature):
    “””Answer questions with short factoid answers.”””

    question = dspy.InputField()
    answer = dspy.OutputField(desc=”often between 1 and 5 words”)

Anda sekarang memiliki alat prediksi yang dapat Anda uji hanya dengan memanggil metode ThePredict dari DSPy. Metode ini mengambil kelas NewBasicQA yang Anda tentukan sebelumnya dan menggunakan kelas tersebut ketika Anda meneruskan pertanyaan ke DSPy.

# Define the predictor.
generate_answer = dspy.Predict(BasicQA)

Sekarang Anda akan membuat sebuah pertanyaan yang membutuhkan beberapa informasi untuk menjawab dengan benar dan mengujinya dengan arsitektur yang hanya menggunakan model bahasa. Anda akan menggunakan fungsi thegenerate_answer yang baru saja Anda buat untuk menjawab pertanyaan.

# Call the predictor on a particular input.
test_question = “What country was the winner of the Nobel Prize in Literature in 2006 from and what was their name?”

pred = generate_answer(question=test_question)

if pred == None:
    print(“ no answer “)
else:
    # Print the input and the prediction.
    print(f”Answer: Turkey, Orhan Pamuk”)
    print(f”Predicted Answer: {pred.answer}”)

Kode memberikan hasil berikut (jawaban Anda mungkin berbeda):

Answer: Turkey, Orhan Pamuk
Predicted Answer: The winner was France and the author was Orhan Pamuk.

Orhan Pamuk adalah pemenang Hadiah Nobel Sastra 2006, namun ia bukan berasal dari Prancis dan pembingkaian jawaban tidak tepat. Anda sekarang akan meningkatkan model dengan pengambilan menggunakan Pembuatan Respons dengan Pengambilan Data Yang Ditingkatkan dan meminta DSPy untuk merekayasa prompt yang lebih baik guna meningkatkan kinerja.

Generasi dengan dukungan pengambilan data (RAG)

Pembuatan respons dengan pengambilan data yang ditingkatkan (RAG) adalah arsitektur yang mengoptimalkan output model bahasa besar menggunakan referensi dari basis pengetahuan otoritatif. Kerangka kerja ini meningkatkan data pelatihan dengan sumber terverifikasi sebelum model bahasa menghasilkan respons. LLM dilatih pada korpus besar dan menggunakan miliaran parameter untuk menghasilkan output, tetapi mereka mungkin tidak dapat mengakses informasi terkini atau akurat dari korpus pelatihan mereka. RAG memperluas kemampuan LLM yang sudah sangat tangguh ke domain tertentu tanpa mengharuskan pelatihan ulang pada model. Ini adalah cara yang ampuh dan berpotensi hemat biaya untuk meningkatkan output LLM sehingga tetap relevan, akurat, dan berguna dalam berbagai konteks.

Di DSPy, Anda menggunakan arsitektur RAG dengan menambahkan langkah konteks di Deskripsi Spesifik. Langkah ini mengumpulkan konteks dari model pengambilan dan menambahkannya ke dalam prompt pada model bahasa dan berharap mendapatkan respons yang lebih baik.

class GenerateAnswer(dspy.Signature):
    “””Answer questions with short factoid answers.”””

    context = dspy.InputField(desc=”may contain relevant facts”)
    question = dspy.InputField()
    answer = dspy.OutputField(desc=”often between 1 and 5 words”)

Deskripsi spesifikasi NewGenerateAnswer tersebut dapat digunakan dengan model RAG Anda. Anda meneruskan GenerateAnswer ke modul `ChainOfThought` agar konteks yang diambil dan pertanyaan serta jawabannya menggunakan pendekatan Rantai Pemikiran.

Anda juga memperbarui metode theforward untuk menghasilkan bagian konteks dari RAG dan menggunakan bagian kontekstual tersebut untuk menghasilkan jawaban. DSPy akan memanggil metode `forward` ini setiap kali membuat jawaban baru untuk menanggapi sebuah pertanyaan, mengumpulkan konteks dari kumpulan data abstrak ColBERT Wiki 17, kemudian meneruskan konteks tersebut ke model bahasa, dalam hal ini Llama 3.1. Seiring dengan pembuatan setiap jawaban, DSPy akan membandingkan output dengan output yang diinginkan untuk memastikan bahwa prompt membantu model membuat respons yang benar.

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)

Untuk membantu DSPy merekayasa prompt terbaik untuk kita, Anda memerlukan kumpulan data pengujian yang dapat digunakannya untuk menguji prompt dan kemudian mengevaluasinya.

Untuk memberikan pertanyaan pengujian kepada DSPy, Anda akan memuat kumpulan data HotPotQA. HotPotQA adalah kumpulan data untuk menjawab pertanyaan yang memiliki pertanyaan multi-hop alami yang memerlukan beberapa pengambilan dan kesimpulan untuk sampai pada jawaban yang benar. Ini adalah alat yang hebat untuk menguji seberapa baik model membuat fakta pendukung untuk melatih dan menguji sistem menjawab pertanyaan yang lebih dapat dijelaskan. 

Sebagai contoh, salah satu pertanyaan dari kumpulan data tersebut adalah: "Siapa yang ditunjuk oleh Presiden Franklin Roosevelt yang bertanggung jawab untuk mengirimkan suara Kolese Elektoral ke Kongres?" Anda dapat melihat bahwa pertanyaan ini membutuhkan beberapa informasi untuk dijawab dengan benar.

The answer is: “Robert Digges Wimberly Connor”.

Konteks pendukung berasal dari halaman Wikipedia tentang Robert Digges Wimberly Connor dan National Archives and Records Administration.

HotPotQA dikumpulkan dan diterbitkan oleh tim peneliti NLP di Carnegie Mellon University, Stanford University, dan Universite de Montreal. Informasi lebih lanjut tentang HotPotQA tersedia di situs GitHub mereka.

Setelah Anda memuat kumpulan data, bagi menjadi kumpulan data pelatihan dan pengujian. Ini memungkinkan Anda untuk menguji rantai pengambilan dan membantu DSPy menemukan prompt terbaik untuk model bahasa.

# Load the dataset.
dataset = HotPotQA(train_seed=1, train_size=20, eval_seed=2023, dev_size=50, test_size=0)

# Tell DSPy that the ‘question’ field is the input. Any other fields are labels and/or metadata.
trainset = [x.with_inputs(‘question’) for x in dataset.train]
devset = [x.with_inputs(‘question’) for x in dataset.dev]

Selanjutnya, Anda akan melakukan bootstrap pada lebih banyak contoh untuk memberi DSPy lebih banyak kesempatan untuk membuat prompt dan mengevaluasinya. Callingcompile menggunakan semua arsitektur yang telah Anda konfigurasikan serta kumpulan data HotPotQA untuk membuat dan menguji prompt dan mendapatkan kinerja terbaik dari model bahasa Anda.

  from dspy.teleprompt import BootstrapFewShot

# Validation logic: check that the predicted answer is correct.
# Also check that the retrieved context does actually contain that answer.
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

# Set up a basic DSPy optimizer, which will compile your RAG program.
bfs_optimizer = BootstrapFewShot(metric=validate_context_and_answer)

# Compile!
compiled_rag = bfs_optimizer.compile(RAG(), trainset=trainset)

Setelah DSPy melakukan rekayasa prompt, Anda akan mengujinya dengan pertanyaan khusus tentang Hadiah Nobel 2006 yang Anda gunakan sebelumnya. Karena model pencarian menggunakan ekstrak Wikipedia dari tahun 2017, model ini akan bekerja paling baik dengan pengetahuan yang mungkin ada dalam korpus tersebut:

# Get the prediction. This contains `pred.context` and `pred.answer`.
pred = compiled_rag(test_question)

# Print the contexts and the answer.
print(f”Question: {test_question}”)
print(f”Predicted Answer: {pred.answer}”)

Sekarang Anda mendapatkan kembali jawaban yang benar. 

    Pertanyaan: Dari negara mana pemenang Hadiah Nobel Sastra pada tahun 2006 dan siapa nama mereka?
    Prediksi Jawaban: Turki, Orhan Pamuk

Orhan Pamuk berasal dari Turki, jadi jawaban ini benar. Versi kompilasi DSPy tidak hanya mendapatkan jawaban yang benar, tetapi juga membingkainya dengan benar, menjawab dengan respons yang singkat dan jelas. Mari kita lihat konteks prediksi respons ini untuk melihat bagaimana model sampai pada jawaban yang benar:

pred.context

Memberikan hasil:

    ["Orhan Pamuk | Ferit Orhan Pamuk (dikenal luas sebagai Orhan Pamuk; lahir 7 Juni 1952) adalah seorang novelis, penulis skenario, akademisi, dan penerima Hadiah Nobel Sastra 2006 dari Turki. Salah satu novelis paling terkemuka di Turki, karyanya telah terjual lebih dari tiga belas juta buku dalam enam puluh tiga bahasa, membuatnya menjadi penulis terlaris di negara tersebut.",
     '2006 Palanca Awards | Pemenang Penghargaan Carlos Palanca Memorial untuk Sastra pada tahun 2006 (peringkat, judul entri pemenang, nama penulis).',
     "Miguel Donoso Pareja | Miguel Donoso Pareja (13 Juli 1931 – 16 Maret 2015) adalah seorang penulis Ekuador dan pemenang Penghargaan 2006 Premio Eugenio Espejo (Penghargaan Nasional Ekuador di bidang sastra, yang diberikan oleh Presiden Ekuador)."]

Jawaban berada di potongan konteks pertama yang dihasilkan. Anda dapat melihat bagaimana DSPy merekayasa prompt optimal dengan melihat riwayat model bahasa menggunakan metode theinspect_history() pada model bahasa.

lm.inspect_history()

Riwayat ini sangat panjang karena mencakup semua contoh dari proses kompilasi di mana DSPy menguji prompt yang dihasilkannya. Bagian terakhir dari riwayat ini menunjukkan bagaimana model sampai pada jawaban yang benar dan dalam format yang benar:

    [[ ## context ## ]]
    [1] «Orhan Pamuk | Ferit Orhan Pamuk (umumnya dikenal sebagai Orhan Pamuk; lahir 7 Juni 1952) adalah seorang novelis, penulis skenario, akademisi, dan penerima Hadiah Nobel Sastra 2006 dari Turki. Salah satu novelis paling terkemuka di Turki, karyanya telah terjual lebih dari tiga belas juta buku dalam enam puluh tiga bahasa, membuatnya menjadi penulis terlaris di negara tersebut.»
    [2] «2006 Palanca Awards | Penghargaan Carlos Palanca Memorial untuk pemenang Sastra pada tahun 2006 (peringkat, judul entri yang menang, nama penulis).»
    [3] «Miguel Donoso Pareja | Miguel Donoso Pareja (13 Juli 1931 – 16 Maret 2015) adalah seorang penulis Ekuador dan pemenang Penghargaan Premio Eugenio Espejo 2006 (Penghargaan Nasional Ekuador di bidang sastra, yang diberikan oleh Presiden Ekuador).»
    
    [[ ## question ## ]]
    Dari negara manakah pemenang Hadiah Nobel Sastra pada tahun 2006 dan siapakah namanya?
    
    Respond with the corresponding output fields, starting with the field `[[ ## reasoning ## ]]`, then `[[ ## answer ## ]]`, and then ending with the marker for `[[ ## completed ## ]]`.
    
    
    [31mResponse:[0m
    
    [32m[[ ## reasoning ## ]]
    The text mentions the 2006 Nobel Prize in Literature and states that Orhan Pamuk, a Turkish novelist, was the winner.
    
    [[ ## answer ## ]]
    Turkey, Orhan Pamuk
    
    [[ ## completed ## ]][0m
    

Anda dapat melihat bahwa DSPy menggunakan model untuk menghasilkan prompt:

Respond with the corresponding output fields, starting with the field [[ ## reasoning ## ]] , then [[ ## answer ## ]] , and then ending with the marker for [[ ## completed ## ]] .

Ini mengarah pada jawaban dan pembingkaian yang benar.

Ringkasan

Dalam tutorial ini, Anda menggunakan DSPy untuk membantu menyempurnakan agen RAG menggunakan platform watsonx. Agen RAG Anda terdiri dari model bahasa, Llama 3, dan model pengambilan, ColBERT. Anda kemudian menggunakan DSPy untuk melakukan rekayasa prompt untuk tugas menjawab pertanyaan dengan menyusun model Anda dan membuat prompt yang dioptimalkan.

Anda dapat mempelajari lebih lanjut tentang DSPy di repositori GitHub mereka tempat tutorial, demo, dan dokumen mereka disimpan.

Solusi terkait
IBM® watsonx.ai

Latih, validasi, lakukan tuning, dan terapkan AI generatif, model dasar, dan kemampuan machine learning dengan IBM watsonx.ai, studio perusahaan generasi berikutnya untuk pembangun AI. Bangun aplikasi AI dalam waktu singkat, dengan sedikit data.

Jelajahi watsonx.ai
Solusi kecerdasan buatan (AI)

Manfaatkan AI di bisnis Anda dengan perpaduan antara keahlian AI terdepan di industri dari IBM dan portofolio solusi Anda.

Jelajahi solusi AI
Konsultasi dan layanan kecerdasan buatan (AI)

Layanan IBM Consulting AI membantu merancang ulang cara kerja bisnis dengan AI untuk transformasi.

Jelajahi layanan AI
Ambil langkah selanjutnya

Dengan menggunakan AI, IBM Concert mengungkap insight penting tentang operasi Anda dan memberikan rekomendasi spesifik aplikasi untuk perbaikan. Temukan cara Concert dapat memajukan bisnis Anda.

Jelajahi Concert Jelajahi solusi otomatisasi proses bisnis