Rumah >pembangunan bahagian belakang >Tutorial Python >Membina bot sembang dengan Semantic Kernel - Part Plugins

Membina bot sembang dengan Semantic Kernel - Part Plugins

Linda Hamilton
Linda Hamiltonasal
2024-12-06 07:33:15626semak imbas

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.

Apakah itu Plugin?

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:

  • Penerangan: tujuan fungsi dan bila ia perlu digunakan. Ia akan membantu model menentukan masa untuk memanggilnya seperti yang akan kita lihat dalam bahagian panggilan fungsi.
  • Pembolehubah input: digunakan untuk meparameterkan fungsi supaya ia boleh digunakan semula.

Inti Semantik menyokong pelbagai jenis Pemalam. Dalam siaran ini, kami akan menumpukan pada dua daripadanya: Pemalam Segera dan Pemalam Asli.

Pemalam segera

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:

  1. Gesaan Sistem: nada, tujuan dan tingkah laku umum.
  2. Gesaan Rumusan: termasuk peraturan dan sekatan tentang cara membuat ringkasan. Contohnya, ia tidak boleh lebih daripada dua perenggan.

Satu Pemalam Segera ditakrifkan oleh dua fail:

  • config.json: fail konfigurasi termasuk penerangan, pembolehubah dan tetapan pelaksanaan:
{
    "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": ""
        }
    ]
}
  • skprompt.txt: kandungan segera dalam teks biasa. Pembolehubah daripada fail konfigurasi boleh diakses menggunakan sintaks {{$parameter_1}}.

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": ""
        }
    ]
}

Pemalam asli

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

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.

Building a chatbot with Semantic Kernel - Part Plugins

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.

Pemalam untuk Pustakawan kami

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.

Pemalam repositori 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)

Pemalam pencipta puisi

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

Amalan yang baik

Beberapa cadangan berdasarkan kesusasteraan sedia ada dan pengalaman saya sendiri:

  • Gunakan sintaks python untuk menerangkan fungsi anda walaupun dalam .NET atau Java. Model biasanya lebih mahir menggunakan python kerana data terlatih ?
  • Pastikan fungsi fokus, terutamanya penerangan. Satu fungsi, satu tujuan. Jangan cuba mencipta satu fungsi yang membuat terlalu banyak perkara, ia akan menjadi tidak produktif ?
  • Hujah yang mudah dan bilangannya yang rendah. Lebih ringkas dan kurang, lebih dipercayai panggilan daripada model kepada fungsi ?
  • Jika anda mempunyai banyak fungsi, semak huraian dengan teliti untuk memastikan tiada potensi konflik yang mungkin membuatkan model menjadi keliru ?
  • Tanya maklum balas model (melalui chatgpt atau serupa) tentang perihalan fungsi. Mereka biasanya agak baik untuk mencari penambahbaikan. Ngomong-ngomong, ini juga terpakai pada pembangunan gesaan secara umum ❓
  • Uji, uji dan uji. Khusus pada kes perisian perniagaan, kebolehpercayaan adalah kunci. Pastikan model dapat memanggil fungsi yang dijangkakan dengan maklumat yang telah anda berikan kepada mereka melalui anotasi ?

Ringkasan

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn