Cara meminta insinyur phi-3-mini: panduan praktis

Prompt pada dasarnya adalah permintaan atau input kami ke model AI. Rekayasa cepat, seperti namanya, adalah tentang pergi sedikit lebih dalam daripada petunjuk dasar dengan membuat input khusus yang (lebih) secara efektif memandu model AI untuk menghasilkan output yang hampir sempurna.

Anda tidak harus menggunakan bahasa pemrograman atau IDE untuk ini, karena kebanyakan orang menyarankan Anda bisa menggunakan ujung depan ChatGPT. Itu secara teknis akurat, tetapi itu tidak benar -benar memberi Anda “kesenangan” yang sebenarnya dari merekayasa model sebagai menggunakan bahasa pemrograman, belum lagi bahwa itu tidak seefektif juga.

Dalam artikel ini, kami akan berjalan melalui cara melakukannya di Python, menggunakan model phi-3-mini-4K-instruct oleh Microsoft. Kami akan menggunakan API Inferensi Huggingface untuk ini, jadi Anda tidak perlu mengunduh model 7GB secara lokal.

Pikirkan ini sebagai memanipulasi Model dari dalam, bukan dari pesan obrolan dasar. Mengacaukannya, menjadi abstrak.

Menyiapkan Lingkungan

  • Buat akun Huggingface dan ambil Kunci API (Profil Anda> Token Akses) dengan akses “tulis”.

    Ini bukan posting yang disponsori. Jika Anda bekerja dengan LLMS, Anda harus membuat akun pelukan di beberapa titik; itu pasti.

  • Pastikan Anda telah menginstal Python 3.10+ di sistem Anda dan telah mengatur IDE. Atau Anda dapat menggunakan buku catatan ini di Google Colab.

  • Instal pustaka `huggingface_hub` menggunakan` pip instal huggingface_hub` atau perintah lain, tergantung pada OS Anda.

Memahami dasar -dasarnya

Sebelum melompat ke kode, mari kita pelajari sedikit tentang rekayasa cepat.

Seperti yang saya sebutkan sebelumnya, Prompt Engineering pada dasarnya membuat input khusus untuk mengontrol output model berdasarkan kebutuhan Anda.

LLM yang berbeda menanggapi teknik rekayasa cepat yang berbeda secara berbeda. Ini berarti bahwa Anda tidak dapat menggunakan template rekayasa cepat yang sama untuk semua dan setiap llm. Dan ini lagi berarti Anda harus membaca dokumentasi LLM untuk mengetahui teknik mana yang terbaik untuk digunakan.

Berikut beberapa yang populer:

  1. Pembelajaran Zero-Shot: Meminta model untuk melakukan tugas tanpa contoh

    Klasifikasi teks berikut sebagai positif atau negatif: “Saya sangat menikmati film ini!”

Ini bekerja dengan model yang terlatih seperti GPT-4, Claude 3 Opus, dan Gemini Ultra.

Dalam pengalaman saya, Mistral-7B, meskipun merupakan LLM kecil, juga memiliki hasil yang mengesankan dalam pembelajaran nol-shot.

  1. Pembelajaran beberapa shot: Memberikan beberapa contoh sebelum meminta model untuk melakukan tugas.

    Teks: “Makanannya mengerikan.” Sentimen: Negatif

    Teks: “Saya bersenang -senang.” Sentimen: Positif

Ideal untuk tugas yang mungkin sedikit tidak jelas untuk model atau di mana Anda ingin menunjukkan format tertentu.

  1. Rantai-dipikirkan (COT) mendorong: Mendorong model untuk menjelaskan penalaran langkah demi langkahnya.

    Question: If John has 5 apples and gives 2 to Mary, how many does he have left?
    Let's think through this step by step:
    

    Hal pertama yang mungkin muncul di benak Anda adalah model Deepseek R1. Nah, itu benar; itu mungkin model pertama yang diterbitkan dengan a rantai yang terlihat, Itulah sebabnya itu adalah pengubah permainan.

  2. Dorongan berbasis peran: Meminta model untuk mengambil peran atau kepribadian tertentu.

    You are an expert Python programmer. Please review this code and suggest improvements:
    

    Ini harus menjadi teknik yang paling populer di kalangan non-programmer. Chatgpt, Claude, dan sebagian besar chatbots lainnya unggul dalam memberikan output berbasis peran.

  3. Sistem Prompt: Menyiapkan Konteks & Instruksi Sebelum permintaan pengguna yang sebenarnya

    Ini adalah favorit saya ketika datang untuk “mengacaukan” dengan LLM. Dan Anda hanya dapat melakukan ini di backend dalam banyak kasus, yang sangat menarik.

    Sistem Prompt bertindak sebagai “kepribadian dan instruksi” yang ditetapkan untuk model tertentu. Ini berguna untuk mendefinisikan aturan atau kendala.

    Terlebih lagi, Anda dapat melakukan apa yang tidak dapat Anda lakukan dengan input dasar ketika Anda mendefinisikan pesan sistem. Jika kami mengambil LLM kecil, misalnya, jika Anda menanyakan sesuatu yang berbahaya melalui pesan input dasar, itu akan menyangkal menjawabnya. Namun, jika Anda mengubah prompt sistem, ada probabilitas tinggi itu akan mengabaikan pagar pengamannya dan mencoba menjawabnya – dalam beberapa model.

    (Ini adalah pengawasan yang serius di LLMS, saya setuju.)

Semua teknik di atas dapat dilakukan di ChatGPT atau UI chatbot lainnya, kecuali untuk prosedur prompt dan rantai-rantai sistem (secara teknis, kita dapat melakukannya juga, tetapi tidak terlalu efektif).

Karena itu, kita akan berbicara tentang keduanya di bagian selanjutnya.

Rantai-pemikiran

Di sebagian besar LLM, Anda tidak dapat melihat rantai pikiran di balik alasan mereka, tetapi Anda dapat membuatnya terlihat melalui rekayasa cepat di Python.

Sebelum menulis fungsi, impor perpustakaan dan tentukan klien:

from huggingface_hub import InferenceClient

# Replace with your Hugging Face token
client = InferenceClient(token="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")

Kemudian kita harus menentukan bagaimana kita dapat menerapkan rantai pemikiran.

LLM saat ini tidak memiliki fungsi langsung untuk membuat rantai pemikiran internal mereka terlihat-kecuali untuk Deepseek R1, di mana itu bawaan.

Ini berarti bahwa jika kita ingin mewujudkannya, kita harus menggunakan prompt sistem. Namun, jangan bingung dengan teknik yang kita bahas sebelumnya. Prompt sistem, dalam hal ini, bertindak lebih seperti metode untuk mengimplementasikan cot, bukan teknik yang diminta.

Beginilah cara kita mengatakannya:

Format your response as follows

1. THINKING: First, show all mental steps, considerations, and explorations. Include alternative hypotheses you consider and reject. Think about edge cases.
2. VERIFICATION: Double-check your logic and facts, identifying any potential errors.
3. ANSWER: Only after showing all thinking, provide your final answer.

Inilah cara kami dapat mengintegrasikannya ke dalam fungsi untuk menghasilkan output:

def generate_chain_of_thought_response(user_input):
    # System message defines personality and expectations
    system_prompt = (
        "Format your response as follows:"
"1. THINKING: First, show all mental steps, considerations, and explorations. Include alternative hypotheses you consider and reject. Think about edge cases."
"2. VERIFICATION: Double-check your logic and facts, identifying any potential errors."
"3. ANSWER: Only after showing all thinking, provide your final answer."
    )

    # Alternating user input to encourage visible reasoning
    formatted_user_input = f"{user_input}\nLet's think through this step by step."

    # Phi-style formatting
    prompt = (
        f"system\n{system_prompt}\n"
        f"user\n{formatted_user_input}\n"
        f"assistant\n"
    )

    # Call the model
    response = client.text_generation(
        prompt,
        model="microsoft/Phi-3-mini-4k-instruct",  
        max_new_tokens=500,
        temperature=0.7,
        top_p=0.95,
        repetition_penalty=1.1,
        stop_sequences=[""]
    )

    # Cleanup
    answer = response.strip().split("")[0].strip()

    return answer

Dalam kode ini, kami telah menandai batas LLM. Izinkan saya menjelaskannya satu per satu.

  • max_new_tokens=500: Parameter ini menentukan jumlah maksimum token yang diizinkan untuk menghasilkan sebagai respons terhadap prompt input. Satu token dapat mewakili kata atau bagian dari sebuah kata (tergantung pada jenis model), dan tujuannya adalah untuk memastikan bahwa responsnya tidak terlalu lama.

  • temperature=0.7: Parameter ini menangani keserampangan dari output model. Jika lebih rendah, seperti 0,2, respons model lebih fokus dan relevan; Mungkin juga menghasilkan pengulangan dan kurangnya kreativitas.

    Ketika lebih tinggi, di sisi lain, model menghasilkan output yang lebih beragam dan kreatif, tetapi dapat menghasilkan info yang tidak relevan (kadang -kadang, kadang -kadang). 0,7, bagaimanapun, menyerang di tengah dan tampaknya cocok untuk model ini.

  • top_p=0.95: Top_p Parameter menggunakan pengambilan sampel nukleus untuk memilih set token terkecil yang probabilitas kumulatifnya setidaknya 95%. Tidak seperti Top_K, yang membatasi pilihan ke nomor tetap, Top_p secara dinamis menyesuaikan kumpulan token berdasarkan probabilitas. Pendekatan yang lebih bijak dalam kasus ini.

  • repetition_penalty=1.1: Ini berlaku “penalti” untuk token yang diulangi sebelumnya, membuat mereka lebih kecil kemungkinannya untuk muncul dalam teks yang dihasilkan lagi dan lagi. Nilai yang lebih besar dari 1,0 mengurangi probabilitas pengulangan banyak.

Perhatikan juga bagaimana kami memformat prompt di sini:

 f"system\n{system_prompt}\n"
        f"user\n{formatted_user_input}\n"
        f"assistant\n"

Format ini, mengintegrasikan “ dan “, tergantung pada jenis LLM. Cara terbaik untuk menentukan ini adalah dengan meminta chatgpt untuk membaca dokumentasi model.

Akhirnya, untuk pengalaman obrolan interaktif, terapkan loop ini:

print("Chain-of-Thought Phi (type 'exit' to quit)")
while True:
    user_input = input("\nYou: ")
    if user_input.lower().strip() in {"exit", "quit"}:
        break
    output = generate_chain_of_thought_response(user_input)
    print("\nAssistant:\n", output)

Waktu untuk tes cepat. Jalankan skrip, dan ajukan pertanyaan seperti “Apa 7 x 9 + 100?” Anda dapat mengharapkan output seperti di bawah ini:

Firstly, let us break down the expression into two parts according to the order of operations (PEMDAS/BODMAS): parentheses first then exponents or powers, followed by multiplication and division from left to right, and finally addition and subtraction from left to right. There are no parentheses or exponents in our case; so we move on to multiplication before dealing with addition. Here’s how it breaks down:

Step 1 – Multiplication part: We need to multiply 7 times 9 which gives us \(7 \times 9 = 63\).

Next Step - Addition part: Now take that result and add 100 to it (\(63 + 100\)).

Adding these together yields \(63 + 100 = 163\).

So, when calculating \(7 \times 9 + 100\), following the correct arithmetic sequence will give us a total of 163.

Itu mungkin tidak terlihat seperti masalah besar, tetapi jika Anda hanya menggunakan phi-3-mini-4K-instruct tanpa rekayasa cepat, output akan jauh lebih sederhana.

Output mentah (sebelum rekayasa cepat)Output mentah (sebelum rekayasa cepat)

Dan itu tentang COT; Mari kita pergi ke permintaan pesan sistem.

Permintaan sistem

Salah satu cara untuk mendeklarasikan pesan semacam sistem tanpa kode adalah dengan meminta mereka di awal setiap obrolan dalam model AI. Tetapi ketika percakapan terus berlanjut, sebagian besar model cenderung melupakan instruksi awal karena jendela konteks.

Namun, ketika Anda mendeklarasikan prompt sistem di backend LLM, model akan menempel di seluruh percakapan. Mengapa? Sebelum menghasilkan respons apa pun, model membaca pesan sistem terlebih dahulu untuk seluruh percakapan, tidak peduli jendela konteksnya.

Mengenai kode, mulailah dengan otorisasi, seperti yang kami lakukan sebelumnya:

from huggingface_hub import InferenceClient

# Replace 'YOUR_HF_API_TOKEN' with your actual Hugging Face API token
client = InferenceClient(token="YOUR_HF_API_TOKEN")

Dalam hal ini, saya akan menulis pesan sistem untuk membuat modelnya tenang dan damai, seperti dalam Buddhisme Zen. Perhatikan bahwa model PHI memiliki moderasi konten yang diaktifkan (pekerjaan yang baik, Microsoft), dan Anda tidak akan dapat mengubah prompt menjadi apa pun yang dianggap berbahaya.

Inilah kode yang dapat kita gunakan:

def generate_response(user_input):
    system_message = (
       "Use words often used in Zen buddhism"
       "Act like you are a monk, staying calm and peaceful"
       "Encourage the user to be calm and follow Zen practices too"
    )

    prompt = (
        f"system\n{system_message}\n"
        f"user\n{user_input}\n"
        f"assistant\n"

    )

Untuk beberapa alasan, output dari model ini berakhir dengan. Itu tidak mempengaruhi kinerja model, tetapi kita tetap bisa memformatnya.

    # Clean up the result
    answer = response.strip()

    if answer.endswith(""):
        answer = answer.replace("", "").strip()

    formatted_answer = '\n'.join(answer[i:i + 190] for i in range(0, len(answer), 100))
    return formatted_answer

Dan itu saja. Lengkapi kode dengan loop input pengguna sebagai berikut:

print("Zen AI (type 'quit' to exit)")
while True:
    user_input = input("\nYou: ")
    if user_input.lower() in ["quit", "exit"]:
        break
    response = generate_response(user_input)
    print("Assistant:", response)

Jalankan uji coba cepat, dan lihat bagaimana output model menempel pada pesan sistem dengan indah.

Anda: Halo

Asisten: Namaste. Semoga hari Anda terungkap dengan ketenangan dan perhatian sebagai prinsip panduan.

Jangan ragu untuk mengubah max_new_tokens atau nilai lain untuk kebutuhan Anda.

Dan voila! Kami berhasil mendorong model phi-3-mini untuk menunjukkan rantai pikiran dan kemudian menjadi biksu Zen.

Menyimpulkan

Teknik yang cepat, meskipun terdengar seperti masalah besar, tidak banyak kesepakatan. Yang penting adalah cara Anda meminta model untuk melakukan apa yang Anda inginkan; Dan ingat, Anda tidak dapat memaksa model untuk melakukan apa yang harus dilakukan. Anda harus memintanya melalui coaxing lembut – seperti seorang ibu yang meminta balita untuk mengenakan jaket mereka, tanpa menyebabkan amukan.

Misalnya, jika kita memberi tahu model phi-3-mini untuk “Anda adalah seorang biarawan Zen Freakin! Bertindak seperti itu! Jangan biarkan saya mengulangi“, itu akan mencoba melakukan apa yang Anda minta tetapi tidak secara efektif. Dan lebih buruk lagi, Anda akan selalu mendapatkan tanggapan seperti “Harap ingat bahwa sebagai AI yang dikembangkan oleh Microsoft, bernama Phi (atau GPT) …”.

Dan itu saja untuk hari ini. Terima kasih telah membaca sejauh ini. Sampai jumpa … dua minggu?