Rekayasa prompt di .NET
Dalam artikel ini, Anda mengeksplorasi konsep rekayasa prompt penting. Banyak model AI berbasis perintah, yang berarti mereka merespons teks input pengguna ( perintah) dengan respons yang dihasilkan oleh algoritma prediktif ( penyelesaian). Model yang lebih baru juga sering mendukung penyelesaian dalam bentuk obrolan, dengan pesan berdasarkan peran (sistem, pengguna, asisten) dan riwayat obrolan untuk mempertahankan percakapan.
Bekerja dengan perintah
Pertimbangkan contoh pembuatan teks ini di mana perintah adalah input dan penyelesaian pengguna adalah output model:
Prompt: "Presiden yang menjabat jangka pendek adalah "
Penyelesaian: "Pedro Lascurain."
Penyelesaiannya tampak benar, tetapi bagaimana jika aplikasi Anda seharusnya membantu siswa sejarah AS? Jangka waktu 45 menit Pedro Lascurain adalah jangka waktu terpendek bagi presiden mana pun, tetapi ia menjabat sebagai presiden Meksiko. Siswa sejarah AS mungkin mencari "William Henry Harrison". Jelas, aplikasi ini bisa lebih membantu pengguna yang dimaksudkan jika Anda memberinya beberapa konteks.
Rekayasa prompt menambahkan konteks ke perintah dengan memberikan instruksi, contoh, dan iseng untuk membantu model menghasilkan penyelesaian yang lebih baik.
Model yang mendukung pembuatan teks sering kali tidak memerlukan format tertentu, tetapi Anda harus mengatur perintah Anda sehingga jelas apa itu instruksi dan apa contohnya. Model yang mendukung aplikasi berbasis obrolan menggunakan tiga peran untuk mengatur penyelesaian: peran sistem yang mengontrol obrolan, peran pengguna untuk mewakili input pengguna, dan peran asisten untuk merespons pengguna. Bagi permintaan Anda menjadi pesan untuk setiap peran:
- Pesan sistem memberikan instruksi model tentang asisten. Perintah hanya dapat memiliki satu pesan sistem, dan itu harus menjadi pesan pertama.
- Pesan pengguna menyertakan perintah dari pengguna dan menampilkan contoh, perintah historis, atau berisi instruksi untuk asisten. Contoh penyelesaian obrolan harus memiliki setidaknya satu pesan pengguna.
- Pesan asisten memperlihatkan contoh atau penyelesaian historis, dan harus berisi respons terhadap pesan pengguna sebelumnya. Pesan asisten tidak diperlukan, tetapi jika Anda menyertakannya, pesan harus dipasangkan dengan pesan pengguna untuk membentuk contoh.
Gunakan instruksi untuk meningkatkan penyelesaian
Instruksi adalah teks yang memberi tahu model cara merespons. Instruksi dapat berupa direktif atau imperatif:
- Arahan memberi tahu model cara berperilaku, tetapi bukan perintah sederhana—pikirkan penyiapan karakter untuk aktor yang lebih baik: "Anda membantu siswa belajar tentang sejarah AS, jadi bicarakan tentang AS kecuali mereka secara khusus bertanya tentang negara lain."
- Imperatif adalah perintah yang tidak ambigu untuk diikuti model. "Terjemahkan ke Tagalog:"
Arahan lebih terbuka dan fleksibel daripada imperatif:
- Anda dapat menggabungkan beberapa arahan dalam satu instruksi.
- Instruksi biasanya berfungsi lebih baik ketika Anda menggunakannya dengan contoh. Namun, karena imperatif adalah perintah yang tidak ambigu, model tidak memerlukan contoh untuk memahaminya (meskipun Anda mungkin menggunakan contoh untuk menunjukkan model cara memformat respons). Karena arahan tidak memberi tahu model apa yang harus dilakukan, setiap contoh dapat membantu model bekerja dengan lebih baik.
- Biasanya lebih baik untuk memecah instruksi yang sulit menjadi serangkaian langkah, yang dapat Anda lakukan dengan urutan arahan. Anda juga harus memberi tahu model untuk menghasilkan hasil dari setiap langkah, sehingga Anda dapat dengan mudah melakukan penyesuaian terperinci. Meskipun Anda dapat memecah instruksi menjadi langkah-langkah sendiri, lebih mudah untuk hanya memberi tahu model untuk melakukannya, dan untuk menghasilkan hasil dari setiap langkah. Pendekatan ini disebut rantai pemikiran yang mendorong.
Konteks penambahan konten primer dan pendukung
Anda dapat menyediakan konten untuk menambahkan lebih banyak konteks ke instruksi.
Konten utama adalah teks yang Anda inginkan agar model diproses dengan instruksi. Apa pun tindakan yang diperlukan instruksi, model akan melakukannya pada konten utama untuk menghasilkan penyelesaian.
Konten pendukung adalah teks yang Anda rujuk dalam instruksi, tetapi yang bukan target instruksi. Model ini menggunakan konten pendukung untuk menyelesaikan instruksi, yang berarti bahwa konten pendukung juga muncul dalam penyelesaian, biasanya sebagai semacam struktur (seperti dalam judul atau label kolom).
Gunakan label dengan konten instruksi anda untuk membantu model mencari tahu cara menggunakannya dengan instruksi. Jangan terlalu khawatir tentang presisi—label tidak perlu mencocokkan instruksi dengan tepat karena model akan menangani hal-hal seperti bentuk kata dan kapitalisasi.
Misalkan Anda menggunakan instruksi "Ringkas pencapaian Presiden AS" untuk menghasilkan daftar. Model mungkin mengatur dan memesannya dalam sejumlah cara. Tetapi bagaimana jika Anda ingin daftar mengelompokkan pencapaian dengan serangkaian kategori tertentu? Gunakan konten pendukung untuk menambahkan informasi tersebut ke instruksi.
Sesuaikan instruksi Anda sehingga model dikelompokkan menurut kategori, dan tambahkan konten pendukung yang menentukan kategori tersebut:
prompt = """
Instructions: Summarize US Presidential accomplishments, grouped by category.
Categories: Domestic Policy, US Economy, Foreign Affairs, Space Exploration.
Accomplishments: 'George Washington
- First president of the United States.
- First president to have been a military veteran.
- First president to be elected to a second term in office.
- Received votes from every presidential elector in an election.
- Filled the entire body of the United States federal judges; including the Supreme Court.
- First president to be declared an honorary citizen of a foreign country, and an honorary citizen of France.
John Adams ...' ///Text truncated
""";
Menggunakan contoh untuk memandu model
Contohnya adalah teks yang menunjukkan model cara merespons dengan memberikan contoh input pengguna dan output model. Model ini menggunakan contoh untuk menyimpulkan apa yang harus disertakan dalam penyelesaian. Contoh dapat datang baik sebelum atau sesudah instruksi dalam perintah yang direkayasa, tetapi keduanya tidak boleh diselingi.
Contoh dimulai dengan perintah dan dapat secara opsional menyertakan penyelesaian. Penyelesaian dalam contoh tidak perlu menyertakan respons verbatim—mungkin hanya berisi kata yang diformat, poin pertama dalam daftar yang tidak diurutkan, atau sesuatu yang mirip dengan menunjukkan bagaimana setiap penyelesaian harus dimulai.
Contoh diklasifikasikan sebagai pembelajaran tanpa bidikan atau pembelajaran beberapa bidikan berdasarkan apakah berisi penyelesaian verbatim.
- Contoh pembelajaran zero-shot menyertakan perintah tanpa penyelesaian verbatim. Pendekatan ini menguji respons model tanpa memberinya contoh output data. Perintah nol-shot dapat memiliki penyelesaian yang mencakup iseng, seperti menunjukkan model harus menghasilkan daftar yang diurutkan dengan menyertakan "1." sebagai penyelesaian.
- Contoh pembelajaran beberapa bidikan mencakup beberapa pasang perintah dengan penyelesaian verbatim. Pembelajaran beberapa bidikan dapat mengubah perilaku model dengan menambahkan ke pengetahuan yang ada.
Memahami isti
Isensi adalah teks yang menyampaikan struktur atau format output yang diinginkan. Seperti instruksi, isensi tidak diproses oleh model seolah-olah itu adalah input pengguna. Seperti contoh, isis menunjukkan model apa yang Anda inginkan alih-alih memberi tahu apa yang harus dilakukan. Anda dapat menambahkan iseng sebanyak yang Anda inginkan, sehingga Anda dapat melakukan iterasi untuk mendapatkan hasil yang Anda inginkan. Iseng digunakan dengan instruksi atau contoh dan harus berada di akhir perintah.
Misalkan Anda menggunakan instruksi untuk memberi tahu model untuk menghasilkan daftar pencapaian presiden berdasarkan kategori, bersama dengan konten pendukung yang memberi tahu model kategori apa yang akan digunakan. Anda memutuskan bahwa Anda ingin model menghasilkan daftar berlapis dengan semua batas untuk kategori, dengan pencapaian setiap presiden di setiap kategori yang tercantum pada satu baris yang dimulai dengan namanya, dengan presiden tercantum secara kronologis. Setelah instruksi dan konten pendukung, Anda dapat menambahkan tiga isti untuk menunjukkan model cara menyusun dan memformat daftar:
prompt = """
Instructions: Summarize US Presidential accomplishments, grouped by category.
Categories: Domestic Policy, US Economy, Foreign Affairs, Space Exploration.
Accomplishments: George Washington
First president of the United States.
First president to have been a military veteran.
First president to be elected to a second term in office.
First president to receive votes from every presidential elector in an election.
First president to fill the entire body of the United States federal judges; including the Supreme Court.
First president to be declared an honorary citizen of a foreign country, and an honorary citizen of France.
John Adams ... /// Text truncated
DOMESTIC POLICY
- George Washington:
- John Adams:
""";
- KEBIJAKAN DOMESTIK menunjukkan model yang Anda inginkan untuk memulai setiap grup dengan kategori di semua batas.
- - George Washington: menunjukkan model untuk memulai setiap bagian dengan pencapaian George Washington terdaftar pada satu baris.
- - John Adams: menunjukkan model bahwa ia harus mencantumkan presiden yang tersisa dalam urutan kronologis.
Contoh perintah menggunakan .NET
.NET menyediakan berbagai alat untuk meminta dan mengobrol dengan model AI yang berbeda. Gunakan Semantic Kernel untuk terhubung ke berbagai model dan layanan AI, serta SDK lainnya seperti pustaka OpenAI .NET resmi. Kernel Semantik mencakup alat untuk membuat perintah dengan peran yang berbeda dan mempertahankan riwayat obrolan, serta banyak fitur lainnya.
Perhatikan contoh kode berikut:
using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.ChatCompletion;
// Create a kernel with OpenAI chat completion
#pragma warning disable SKEXP0010
Kernel kernel = Kernel.CreateBuilder()
.AddOpenAIChatCompletion(
modelId: "phi3:mini",
endpoint: new Uri("http://localhost:11434"),
apiKey: "")
.Build();
var aiChatService = kernel.GetRequiredService<IChatCompletionService>();
var chatHistory = new ChatHistory();
chatHistory.Add(
new ChatMessageContent(AuthorRole.System, "You are a helpful AI Assistant."));
while (true)
{
// Get user prompt and add to chat history
Console.WriteLine("Your prompt:");
chatHistory.Add(new ChatMessageContent(AuthorRole.User, Console.ReadLine()));
// Stream the AI response and add to chat history
Console.WriteLine("AI Response:");
var response = "";
await foreach (var item in
aiChatService.GetStreamingChatMessageContentsAsync(chatHistory))
{
Console.Write(item.Content);
response += item.Content;
}
chatHistory.Add(new ChatMessageContent(AuthorRole.Assistant, response));
Console.WriteLine();
}
Kode sebelumnya menyediakan contoh konsep berikut:
- Membuat layanan riwayat obrolan untuk meminta model AI untuk penyelesaian berdasarkan peran penulis.
- Mengonfigurasi AI dengan pesan
AuthorRole.System
. - Menerima input pengguna untuk memungkinkan berbagai jenis perintah dalam konteks
AuthorRole.User
. - Secara asinkron mengalirkan penyelesaian dari AI untuk memberikan pengalaman obrolan dinamis.
Memperluas teknik rekayasa prompt Anda
Anda juga dapat meningkatkan kekuatan prompt Anda dengan teknik rekayasa prompt yang lebih canggih yang dibahas secara mendalam dalam artikel mereka sendiri.
- LLM memiliki batas input token yang membatasi jumlah teks yang dapat Anda paskan dalam perintah. Gunakan penyematan dan solusi database vektor untuk mengurangi jumlah token yang Anda butuhkan untuk mewakili teks tertentu.
- LLM tidak dilatih pada data Anda kecuali Anda melatihnya sendiri, yang bisa mahal dan memakan waktu. Gunakan retrieval augmented generation (RAG) untuk membuat data Anda tersedia untuk LLM tanpa melatihnya.