Rumah >pembangunan bahagian belakang >Tutorial Python >Membina bot sembang dengan Semantic Kernel - Part Plugins
Pada bab kami sebelum ini, kami telah melalui beberapa konsep asas Inti Semantik, diakhiri dengan Ejen yang berfungsi yang mampu menjawab soalan generik, tetapi dengan nada dan tujuan yang telah ditetapkan menggunakan arahan.
Pada bab kedua ini, kami akan menambah kemahiran khusus kepada Pustakawan kami menggunakan Pemalam.
Pemalam ialah satu set fungsi yang terdedah kepada perkhidmatan AI. Pemalam merangkum fungsi, membolehkan pembantu melakukan tindakan yang bukan sebahagian daripada tingkah laku asalnya.
Sebagai contoh, dengan Pemalam kami boleh mendayakan pembantu untuk mengambil beberapa data daripada API atau Pangkalan Data. Selain itu, pembantu boleh melakukan beberapa tindakan bagi pihak pengguna, biasanya melalui API. Tambahan pula, pembantu akan membolehkan untuk mengemas kini beberapa bahagian UI menggunakan Pemalam.
Seperti yang saya nyatakan sebelum ini, Plugin adalah terdiri daripada fungsi yang berbeza. Setiap fungsi ditakrifkan terutamanya oleh:
Inti Semantik menyokong pelbagai jenis Pemalam. Dalam siaran ini, kami akan menumpukan pada dua daripadanya: Pemalam Segera dan Pemalam Asli.
Pemalam Segera pada asasnya ialah gesaan khusus untuk digunakan dalam keadaan konkrit. Dalam senario biasa, kami mungkin mempunyai System Prompt yang kompleks, di mana kami mentakrifkan nada, tujuan dan gelagat umum ejen kami. Walau bagaimanapun, ada kemungkinan kami mahu ejen melakukan beberapa tindakan konkrit di mana kami perlu menentukan beberapa sekatan dan peraturan khusus. Untuk kes itu, kami akan cuba mengelakkan System Prompt berkembang ke tahap yang tidak terhingga untuk mengurangkan halusinasi dan memastikan tindak balas model relevan dan terkawal. Itulah kes yang sesuai untuk Pemalam Segera:
Satu Pemalam Segera ditakrifkan oleh dua fail:
{ "schema": 1, "description": "Plugin description", "execution_settings": { "default": { "max_tokens": 200, "temperature": 1, "top_p": 0.0, "presence_penalty": 0.0, "frequency_penalty": 0.0 } }, "input_variables": [ { "name": "parameter_1", "description": "Parameter description", "default": "" } ] }
Untuk menambah Prompt Plugin ke dalam Kernel kita hanya perlu menentukan folder. Contohnya, jika kita mempunyai struktur folder /plugins/plugin_name/skprompt.txt, pemalam itu didaftarkan seperti berikut:
{ "schema": 1, "description": "Plugin description", "execution_settings": { "default": { "max_tokens": 200, "temperature": 1, "top_p": 0.0, "presence_penalty": 0.0, "frequency_penalty": 0.0 } }, "input_variables": [ { "name": "parameter_1", "description": "Parameter description", "default": "" } ] }
Satu Pemalam Asli membenarkan model menggunakan kod asli (python, C# atau Java). Pemalam diwakili sebagai kelas, di mana mana-mana fungsi boleh ditakrifkan sebagai boleh diucapkan daripada Ejen menggunakan anotasi. Pembangun mesti memberikan beberapa maklumat kepada model dengan anotasi: nama, perihalan dan hujah.
Untuk menentukan Pemalam Asli kita hanya perlu mencipta kelas dan menambah anotasi yang sepadan:
self.kernel.add_plugin(parent_directory="./plugins", plugin_name="plugin_name")
Untuk menambah Pemalam Asli ke dalam Kernel kita perlu mencipta contoh baharu kelas:
from datetime import datetime from typing import Annotated from semantic_kernel.functions.kernel_function_decorator import kernel_function class MyFormatterPlugin(): @kernel_function(name='format_current_date', description='Call to format current date to specific strftime format') # Define the function as invokable def formate_current_date( self, strftime_format: Annotated[str, 'Format, must follow strftime syntax'] # Describe the arguments ) -> Annotated[str, 'Current date on the specified format']: # Describe the return value return datetime.today().strftime(strftime_format)
Panggilan fungsi, atau perancangan, dalam Semantic Kernel ialah cara untuk model menggunakan fungsi yang didaftarkan dalam Kernel.
Untuk setiap mesej pengguna, model membuat rancangan untuk memutuskan cara membalas. Pertama, ia menggunakan sejarah sembang dan maklumat fungsi untuk memutuskan fungsi mana, jika ada, mesti dipanggil. Sebaik sahaja ia telah digunakan, ia menambahkan hasil fungsi pada sejarah, dan memutuskan sama ada ia telah menyelesaikan tugas daripada mesej pengguna atau memerlukan lebih banyak langkah. Sekiranya ia tidak selesai, ia bermula semula dari langkah pertama sehingga ia menyelesaikan tugas, atau ia memerlukan bantuan daripada pengguna.
Terima kasih kepada gelung ini, model ini boleh menggabungkan panggilan ke fungsi yang berbeza. Sebagai contoh, kami mungkin mempunyai fungsi yang mengembalikan sesi_pengguna (termasuk id pengguna) dan satu lagi yang memerlukan id_pengguna semasa sebagai hujah. Model akan membuat rancangan di mana ia memanggil fungsi pertama untuk mendapatkan semula sesi pengguna, menghuraikan respons dan menggunakan user_id sebagai hujah untuk fungsi kedua.
Dalam Semantic Kernel, kita mesti memberitahu ejen untuk menggunakan panggilan fungsi. Ini dilakukan dengan mentakrifkan tetapan pelaksanaan dengan gelagat pilihan fungsi sebagai automatik:
self.kernel.add_plugin(MyFormatterPlugin(), plugin_name="my_formatter_plugin")
Adalah penting untuk ditekankan bahawa lebih terperinci huraian, lebih banyak token digunakan, jadi ia lebih mahal. Adalah penting untuk mencari keseimbangan antara penerangan terperinci yang baik dan token yang digunakan.
Sekarang sudah jelas apa fungsi dan tujuannya, mari lihat bagaimana kita boleh memanfaatkannya sepenuhnya untuk ejen Pustakawan kami.
Untuk tujuan pembelajaran, kami akan menentukan satu Pemalam Asli dan satu Pemalam Prompt:
Pemalam repositori buku: ia ialah Pemalam Asli untuk mendapatkan semula buku daripada repositori.
Pemalam pencipta puisi: ia ialah Pemalam Gesaan untuk mencipta puisi daripada ayat pertama buku.
Kami menggunakan Open library API untuk mendapatkan semula maklumat buku. Pemalam mengembalikan 5 hasil carian teratas, termasuk tajuk, pengarang dan ayat pertama buku itu.
Secara khusus, kami menggunakan titik akhir berikut untuk mendapatkan maklumat: https://openlibrary.org/search.json?q={user-query}&fields=key,title,author_name,first_sentence&limit=5.
Pertama, kami mentakrifkan BookModel yang mewakili buku dalam sistem kami:
{ "schema": 1, "description": "Plugin description", "execution_settings": { "default": { "max_tokens": 200, "temperature": 1, "top_p": 0.0, "presence_penalty": 0.0, "frequency_penalty": 0.0 } }, "input_variables": [ { "name": "parameter_1", "description": "Parameter description", "default": "" } ] }
Dan kini, tiba masanya untuk majlis itu. Kami menggunakan penerangan yang jelas tentang kedua-dua fungsi dan hujah. Dalam kes ini, kami menggunakan objek kompleks sebagai respons, tetapi model itu boleh menggunakannya kemudian pada respons selanjutnya.
self.kernel.add_plugin(parent_directory="./plugins", plugin_name="plugin_name")
Akhir sekali, kami boleh menambah pemalam ini pada Kernel:
from datetime import datetime from typing import Annotated from semantic_kernel.functions.kernel_function_decorator import kernel_function class MyFormatterPlugin(): @kernel_function(name='format_current_date', description='Call to format current date to specific strftime format') # Define the function as invokable def formate_current_date( self, strftime_format: Annotated[str, 'Format, must follow strftime syntax'] # Describe the arguments ) -> Annotated[str, 'Current date on the specified format']: # Describe the return value return datetime.today().strftime(strftime_format)
Kami akan mentakrifkan pemalam ini sebagai Pemalam Prompt dengan beberapa sekatan khusus. Beginilah rupa gesaan dan konfigurasinya:
/plugins/poem-plugin/poem-creator/config.json:
self.kernel.add_plugin(MyFormatterPlugin(), plugin_name="my_formatter_plugin")
/plugins/poem-plugin/poem-creator/skprompt.txt:
# Create the settings settings = AzureChatPromptExecutionSettings() # Set the behavior as automatic settings.function_choice_behavior = FunctionChoiceBehavior.Auto() # Pass the settings to the agent self.agent = ChatCompletionAgent( service_id='chat_completion', kernel=self.kernel, name='Assistant', instructions="The prompt", execution_settings=settings )
Menambah pemalam pada Kernel adalah mudah:
class BookModel(TypedDict): author: str title: str first_sentence: str
Beberapa cadangan berdasarkan kesusasteraan sedia ada dan pengalaman saya sendiri:
Dalam bab ini, kami telah meningkatkan ejen pustakawan kami dengan beberapa kemahiran khusus menggunakan Pemalam dan Perancangan Inti Semantik.
Ingat bahawa semua kod sudah tersedia pada repositori GitHub saya? PyChatbot untuk Kernel Semantik.
Dalam bab seterusnya, kami akan memasukkan beberapa keupayaan dalam sembang untuk memeriksa dalam masa nyata cara model kami memanggil dan berinteraksi dengan pemalam kami dengan mencipta Inspektor.
Atas ialah kandungan terperinci Membina bot sembang dengan Semantic Kernel - Part Plugins. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!