Saat menentukan playbook, Anda dapat memberikan blok kode, yang merupakan kode Python inline yang memungkinkan Anda mengontrol perilaku agen dengan lebih baik. Kode ini terdiri dari fungsi dengan dekorator khusus dan fungsi utilitas apa pun yang Anda perlukan.
Saat menulis kode, Anda dapat menggunakan library sistem blok kode untuk mengontrol perilaku agen.
Batasan
Batasan berikut berlaku:
- Blok kode tidak boleh berisi objek apa pun yang mempertahankan data. Namun, Anda dapat menggunakan alat untuk mempertahankan data dan mempertahankan status.
- Blok kode tidak dapat melakukan panggilan jarak jauh secara langsung. Misalnya, Anda tidak dapat menggunakan library permintaan Python. Namun, Anda dapat menggunakan alat untuk melakukan panggilan jarak jauh secara tidak langsung.
- Nama resource yang dikonversi ke nama Python harus berupa nama Python yang sah.
- Blok kode tidak dapat menulis parameter sesi, kecuali jika transisi alur terjadi.
Tindakan inline
Tindakan inline berperilaku mirip dengan tindakan alat. Fungsi ini memiliki skema input dan output yang ditentukan, yang ditentukan oleh tanda tangan fungsi Python, termasuk anotasi jenis dan docstring. Seperti panggilan alat, LLM tidak mengetahui kode yang mengimplementasikan tindakan tersebut.
Contoh:
@Action
def is_prime(n: int) -> bool:
"""Returns true if n is prime."""
if not isinstance(n, int) or n < 2:
return False
for i in range(2, int(n ** 0.5) + 1):
if n % i == 0:
return False
return True
Untuk fungsi ini, LLM menerima informasi tentang tindakan, input, dan output-nya.
Untuk mereferensikan tindakan inline dalam petunjuk playbook, referensikan nama tindakan dalam tanda kutip terbalik dan jelaskan cara menggunakannya.
Berikut contoh tindakan inline place_order:
Take the customer's order, and then call the `place_order` action when the
order is ready.
Untuk membuat contoh yang menggunakan tindakan inline, gunakan jenis alat inline-action di bagian Input & Output.
Untuk mengetahui informasi selengkapnya, lihat dokumentasi referensi @Action.
Memicu fungsi
Fungsi pemicu digunakan untuk menentukan tindakan kondisional dalam kode.
Anda mendeklarasikan fungsi pemicu menggunakan dekorator.
Anda dapat menggunakan dekorator fungsi pemicu berikut:
| Dekorator | Parameter Dekorator | Deskripsi |
|---|---|---|
| @EventTrigger | event: str, condition: str, dengan kondisi bersifat opsional |
Dipicu oleh peristiwa |
| @BeforeModelTrigger | condition: str, dengan kondisi bersifat opsional |
Dipicu setiap kali sebelum LLM memprediksi tindakan berikutnya. |
| @BeforeActionTrigger | condition: str, dengan kondisi bersifat opsional |
Dipicu setiap kali sebelum LLM menjalankan tindakan. |
| @BeforePlaybookTrigger | condition: str, dengan kondisi bersifat opsional |
Dipicu saat playbook dimulai untuk pertama kalinya. |
Misalnya, fungsi ini menunjukkan cara menggunakan dekorator dan parameter dekorator ini, serta cara menggunakan fungsi library sistem blok kode respond.
# No decorator parameter
@PlaybookStartTrigger
def my_playbook_conditional_action():
respond("How can I help?")
# With a condition decorator parameter
@BeforeActionTrigger('$next-action.name = "search"')
def my_before_action_conditional_action():
respond("One moment please")
# Event
@EventTrigger(event="welcome")
def my_welcome_event():
respond("hi")
# Event with a condition:
@EventTrigger(event="welcome",
condition="$sys.func.NOW().hours < 10")
def my_good_morning_event():
respond("Good morning ☕")
Mereferensikan alur, playbook, dan alat
Dalam blok kode, Anda dapat mereferensikan alur, playbook, dan alat tertentu menggunakan variabel global flows, playbooks, dan tools.
Setiap objek ini memiliki anggota yang cocok dengan nama resource yang sesuai. Nama ini harus berupa nama Python yang sah.
Contoh:
add_override(playbooks.troubleshooting, {})
add_override(flows.billing)
add_override(tools.weather_api.get_weather, {"location": "San Francisco"})
Saat mereferensikan flow dan playbook dalam blok kode, Anda juga harus mereferensikannya dalam petunjuk playbook menggunakan sintaksis berikut:
${RESOURCE_TYPE: my_resource_name}
Misalnya, jika blok kode Anda berisi flows.myflow dan
playbooks.myplaybook, petunjuk playbook Anda harus menyertakan:
${FLOW: myflow}
${PLAYBOOK: myplaybook}
Penggantian tindakan
Gunakan blok kode untuk membuat antrean tindakan yang akan dilakukan sebelum tindakan lebih lanjut yang ditentukan oleh LLM, dan berpotensi menggantikannya. Buat penggantian tindakan menggunakan fungsi global add_override.
Semua tindakan penggantian yang diantrekan dijalankan secara berurutan, dan output tindakan tersedia untuk LLM. Setelah antrean kosong, operasi akan kembali ke LLM untuk pemilihan tindakan dan input, kecuali jika penggantian menyelesaikan giliran dengan respond atau fungsi lain yang menyelesaikan giliran.
Argumen fungsi:
- Tindakan: Tentukan tindakan yang akan dilakukan. Untuk tindakan inline, gunakan
my_function_name. Untuk tindakan alat, gunakantools.my_tool_name.my_tool_action. Untuk tindakan alur, gunakanflows.my_flow_name. - Input: Tentukan input opsional untuk tindakan, seperti
{"location": "Omaha"}.
Contoh:
# Assuming remote tool named "dmv" with operationId "search_offices"
# remote tool with only requestBody
add_override(tools.dmv.search_offices,{"address": "95030"})
# remote tool with only parameters
add_override(tools.pets.get_pet, {"id": "123"})
# remote tool with requestBody + parameters:
add_override(tools.pets.create_pet, {"requestBody": {"arg1":"foo"}, "param1": "bar"})
# datastore. Assumes existing datastore tool named "Menu".
add_override(tools.menu.Menu, {"query": "what is the menu"})
# code block action. Assumes another code block @Action my_action.
add_override(my_action)
Penggantian respons
Anda dapat menggunakan fungsi global respond untuk memaksa agen merespons pengguna dengan konten tertentu, mirip dengan penggantian tindakan, tetapi khusus untuk respons agen.
Contoh:
respond("Hello")
Alat panggilan
Anda dapat memanggil alat yang ditentukan untuk agen Anda dalam fungsi blok kode. Tidak seperti saat Anda mengganti tindakan alat, saat Anda memanggil alat secara langsung, LLM tidak dapat mengakses hasil eksekusi alat.
Contoh:
# Assumes existing tool named "DMV" with operationId "search_offices"
# remote tool with only request body.
offices = tools.dmv.search_offices({"address": "95030"})
# remote tool with parameters and request body
offices = tools.dmv.search_offices({"requestBody": {"address":"95030"}, "param1":"foo"})
# datastore actions. Assumes existing datastore tool named "Menu".
data = tools.menu.Menu({"query": "get the menu"})["snippets"]
Mencocokkan niat
Blok kode dapat mencocokkan intent secara terprogram untuk flow tertentu menggunakan fungsi Flow.match_intent.
Contoh:
matches = flows.flow1.match_intent(history.last_user_utterance).matches
if matches and matches[0].intent == "some_intent":
to_country = matches[0].parameters.get("to_country")
if to_country:
respond(f"To confirm, you're going to {to_country}, right?")
Membaca parameter sesi
Blok kode dapat membaca parameter yang tersedia pada saat eksekusi.
Contoh:
state["$session.params.my-param"]
state["$request.session-id"]
Proses Debug
Gunakan simulator untuk men-debug fungsi blok kode Anda. Fungsi ini muncul sebagai tindakan di simulator dan memberikan detail proses debug sesuai kebutuhan.
Kontrol tambahan
Dokumen ini membahas beberapa penggunaan umum library sistem blok kode. Untuk jenis kontrol tambahan, lihat dokumentasi library.