0Pricing
AI Prompt Engineering · Pelajaran

Mendefinisikan Signature dan Modul

Sintaks signature, ChainOfThought, ReAct, dan modul DSPy kustom.

Mendefinisikan Signature dan Modul adalah pelajaran AI Prompt Engineering gratis di CoddyKit. Ini adalah pelajaran 2 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar AI Prompt Engineering, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus AI Prompt Engineering mencakup 4 pelajaran total.

Signature Adalah Kontrak Bertipe

Sebuah signature DSPy adalah kelas Python yang menyatakan input dan output dari suatu langkah penalaran. Anggaplah signature sebagai kontrak fungsi bertipe untuk pemanggilan LLM Anda.

Docstring menjadi deskripsi tugas. Anotasi kolom memberi tahu DSPy apa yang harus dihasilkan. Anda tidak pernah menulis teks prompt yang sebenarnya — DSPy menurunkannya dari deklarasi ini.

Mendefinisikan Signature Dasar

Signature minimal merupakan turunan dari dspy.Signature dan memberi anotasi pada kolom sebagai InputField atau OutputField. Docstring kelas menyediakan instruksi tugas.

import dspy

class QASignature(dspy.Signature):
    """Answer the question based on the given context."""
    context: str = dspy.InputField(desc='Relevant background text')
    question: str = dspy.InputField(desc='The question to answer')
    answer: str = dspy.OutputField(desc='A concise answer')

# Inspect what DSPy sees
print(QASignature.instructions)  # The docstring
print(list(QASignature.input_fields.keys()))   # ['context', 'question']
print(list(QASignature.output_fields.keys()))  # ['answer']

Beberapa Kolom Output

Signature dapat memiliki beberapa kolom output. DSPy akan meminta model menghasilkan semuanya dalam satu pemanggilan. Hal ini berguna untuk mengekstrak informasi terstruktur.

import dspy

class EntityExtraction(dspy.Signature):
    """Extract named entities from the text."""
    text: str = dspy.InputField()
    people: list[str] = dspy.OutputField(desc='List of person names mentioned')
    organizations: list[str] = dspy.OutputField(desc='List of organization names')
    locations: list[str] = dspy.OutputField(desc='List of place names')

extractor = dspy.Predict(EntityExtraction)
result = extractor(text='Elon Musk founded SpaceX in Hawthorne, California.')
print(result.people, result.organizations, result.locations)

Modul Predict

dspy.Predict adalah modul yang paling sederhana. Modul ini menerima signature dan secara langsung meminta LM menghasilkan output. Tidak ada kerangka penalaran yang ditambahkan — hanya prompt terstruktur yang sesuai dengan signature.

Gunakan Predict jika tugasnya sederhana dan tidak memerlukan langkah penalaran eksplisit.

import dspy

class Classify(dspy.Signature):
    """Classify the sentiment of the review."""
    review: str = dspy.InputField()
    sentiment: str = dspy.OutputField(desc='positive, negative, or neutral')

# Predict wraps the signature with a direct prompt
classifier = dspy.Predict(Classify)
result = classifier(review='The food was amazing and the service was excellent!')
print(result.sentiment)  # positive

Modul ChainOfThought

dspy.ChainOfThought melengkapi signature dengan kolom perantara reasoning. Model terlebih dahulu menuliskan penalarannya, lalu menghasilkan jawaban akhir.

Modul ini secara konsisten meningkatkan akurasi pada masalah bertahap tanpa Anda perlu menulis instruksi prompt chain-of-thought apa pun.

import dspy

class MathSolver(dspy.Signature):
    """Solve the math problem."""
    problem: str = dspy.InputField()
    answer: str = dspy.OutputField(desc='The numerical answer')

# ChainOfThought adds a 'reasoning' step automatically
solver = dspy.ChainOfThought(MathSolver)
result = solver(problem='If a train travels 60 mph for 2.5 hours, how far does it go?')
print(result.reasoning)  # Step-by-step reasoning
print(result.answer)     # 150 miles

Modul ReAct

dspy.ReAct menerapkan loop Reason + Act. Model bergantian antara langkah penalaran dan pemanggilan alat, sehingga modul ini ideal untuk agen yang perlu mencari, menghitung, atau mengambil data.

Anda menyediakan daftar alat (fungsi Python dengan docstring), lalu DSPy secara otomatis menangani penyisipan keduanya secara bergantian.

import dspy

def search_web(query: str) -> str:
    """Search the web and return relevant results."""
    # In production, call a real search API
    return f'Search results for: {query}'

def calculate(expression: str) -> str:
    """Evaluate a mathematical expression."""
    return str(eval(expression))

class ResearchQA(dspy.Signature):
    """Answer the question using web search and calculation as needed."""
    question: str = dspy.InputField()
    answer: str = dspy.OutputField()

agent = dspy.ReAct(ResearchQA, tools=[search_web, calculate])
result = agent(question='What is 15% of 847?')
print(result.answer)

Merangkai Modul Menjadi Program

Kekuatan sebenarnya muncul saat modul dirangkai menjadi program bertahap. Buat subkelas dspy.Module, definisikan submodul di dalam __init__, lalu implementasikan forward() untuk menghubungkan semuanya.

import dspy

class RetrieveAndAnswer(dspy.Module):
    def __init__(self):
        super().__init__()
        self.retrieve = dspy.Retrieve(k=3)  # Retrieves top-3 passages
        self.generate = dspy.ChainOfThought('context, question -> answer')

    def forward(self, question):
        passages = self.retrieve(question).passages
        context = '\n'.join(passages)
        return self.generate(context=context, question=question)

# This is a complete RAG pipeline in ~10 lines
rag = RetrieveAndAnswer()
result = rag(question='What are the main causes of climate change?')
print(result.answer)

Singkatan Signature Sebaris

Untuk kasus sederhana, DSPy menerima signature string sebaris: 'input1, input2 -> output1, output2'. Ini praktis untuk pembuatan prototipe cepat tanpa mendefinisikan kelas lengkap.

import dspy

# Full class signature
class Translate(dspy.Signature):
    """Translate text to French."""
    text: str = dspy.InputField()
    translation: str = dspy.OutputField()

# Equivalent inline shorthand
translator_v1 = dspy.Predict(Translate)
translator_v2 = dspy.Predict('text -> translation')  # Less metadata

# Both work the same way
result = translator_v1(text='Hello world')
print(result.translation)

Deskripsi Kolom Itu Penting

Parameter desc dalam InputField dan OutputField disertakan dalam prompt yang dihasilkan. Deskripsi yang baik memandu model secara tepat.

Anggaplah desc sebagai dokumentasi tingkat kolom yang muncul dalam prompt di samping nama kolom.

import dspy

class Summarize(dspy.Signature):
    """Summarize the article for a busy executive."""
    article: str = dspy.InputField(
        desc='The full article text to summarize'
    )
    summary: str = dspy.OutputField(
        desc='3-5 bullet points highlighting key decisions and numbers'
    )
    confidence: float = dspy.OutputField(
        desc='Your confidence in the summary accuracy from 0.0 to 1.0'
    )

summarizer = dspy.Predict(Summarize)
# DSPy constructs a prompt using all the desc values automatically

Menyimpan dan Memuat Program

Setelah pengoptimalan, simpan program yang telah dikompilasi agar Anda tidak perlu menjalankan pengoptimalan ulang setiap kali. DSPy membuat serialisasi status yang telah dioptimalkan ke file JSON.

import dspy

class QA(dspy.Signature):
    """Answer questions accurately."""
    question: str = dspy.InputField()
    answer: str = dspy.OutputField()

program = dspy.ChainOfThought(QA)

# After optimization, save the compiled state
program.save('optimized_qa.json')

# Load it later without re-running optimization
loaded_program = dspy.ChainOfThought(QA)
loaded_program.load('optimized_qa.json')

result = loaded_program(question='What is the speed of light?')
print(result.answer)

Assertion untuk Batasan Output

Assertion DSPy memungkinkan Anda menyatakan batasan pada output. Jika model melanggar batasan tersebut, DSPy secara otomatis mencoba kembali dengan umpan balik perbaikan — Anda tidak perlu menulis logika percobaan ulang secara manual.

import dspy

class ShortAnswer(dspy.Signature):
    """Answer in at most 10 words."""
    question: str = dspy.InputField()
    answer: str = dspy.OutputField()

class ConstrainedQA(dspy.Module):
    def __init__(self):
        super().__init__()
        self.predict = dspy.Predict(ShortAnswer)

    def forward(self, question):
        result = self.predict(question=question)
        # Assert: answer must be at most 10 words
        dspy.Assert(
            len(result.answer.split()) <= 10,
            'The answer must be 10 words or fewer.'
        )
        return result

Pemeriksaan Pemahaman: ChainOfThought

Apa yang ditambahkan dspy.ChainOfThought dibandingkan dengan dspy.Predict saat menggunakan signature yang sama?

Ringkasan: Signature dan Modul

Signature DSPy adalah deklarasi kelas bertipe yang menjelaskan apa yang harus dilakukan oleh suatu langkah LLM — input, output, dan instruksi docstring. Modul seperti Predict, ChainOfThought, dan ReAct menerapkan strategi penalaran yang berbeda di sekitar sebuah signature. Anda merangkai beberapa modul di dalam subkelas dspy.Module untuk membangun pipeline bertahap. Nilai desc pada kolom memandu model dalam prompt yang dibuat otomatis, sedangkan Assertion menegakkan batasan output dengan percobaan ulang otomatis.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Mendefinisikan Signature dan Modul” gratis?

Ya — teks lengkap “Mendefinisikan Signature dan Modul” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus AI Prompt Engineering, upgrade ke CoddyKit PRO. Kursus AI Prompt Engineering mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Mendefinisikan Signature dan Modul”?

Sintaks signature, ChainOfThought, ReAct, dan modul DSPy kustom. Kamu berlatih AI Prompt Engineering dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai AI Prompt Engineering?

Tidak diperlukan pengalaman sebelumnya. AI Prompt Engineering di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 2 dari 4.

Berapa lama pelajaran “Mendefinisikan Signature dan Modul” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran AI Prompt Engineering ini?

Ya. Setiap pelajaran AI Prompt Engineering menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Pengantar Framework DSPy
  2. Mendefinisikan Signature dan Modul
  3. Mengompilasi dan Mengoptimalkan Prompt
  4. Mengevaluasi Pipeline DSPy
← Kembali ke AI Prompt Engineering