Saat menentukan playbook, Anda dapat secara opsional memberikan blok kode, yang merupakan kode Python inline yang dapat digunakan untuk 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.
Masalah Umum
Masalah umum berikut berlaku:
- Project dalam perimeter VPC-SC yang membatasi akses Artifact Registry juga akan menolak deployment Blok Kode
Batasan
Batasan berikut berlaku:
- Blok kode tidak boleh berisi objek yang menyimpan 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 menjadi nama Python harus berupa nama Python yang valid.
- Blok kode tidak dapat membaca atau menulis parameter sesi, kecuali jika terjadi transisi alur.
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. Mirip dengan panggilan alat, LLM tidak mengetahui kode yang menerapkan tindakan.
Contoh:
@Action
def is_prime(n: int): bool
"""Returns true if n is prime."""
import math
return (all([False for i in range(2, math.sqrt(n)
if n % i == 0 ]) and not n < 2)
Untuk fungsi ini, LLM akan diberi informasi tentang tindakan, input, dan outputnya.
Untuk mereferensikan tindakan inline dalam petunjuk playbook Anda, cukup referensikan nama tindakan dalam tanda petik terbalik dan jelaskan cara menggunakannya.
Contoh tindakan inline place_order
:
Take the customer's order, 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 bersyarat dalam kode.
Fungsi pemicu dideklarasikan 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 decorator dan parameter decorator, 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 valid.
Contoh:
add_override(playbooks.troubleshooting, {})
add_override(flows.billing)
add_override(tools.weather_api.get_weather, {"location": "San Francisco"})
Saat mereferensikan alur dan playbook dalam blok kode, Anda juga harus mereferensikannya dalam petunjuk playbook dengan 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
Anda dapat menggunakan blok kode untuk membuat antrean tindakan yang akan dilakukan sebelum tindakan lebih lanjut ditentukan oleh LLM, dan berpotensi menggantikannya. Anda membuat penggantian tindakan menggunakan fungsi global add_override.
Semua tindakan penggantian dalam antrean akan dieksekusi secara berurutan, dan output tindakan akan tersedia untuk LLM. Setelah antrean kosong, operasi kembali ke LLM untuk pemilihan tindakan dan input, kecuali jika penggantian mengakhiri giliran dengan respond atau fungsi lain yang menyelesaikan giliran.
Argumen fungsi:
- tindakan: 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
. - inputs: Input opsional untuk tindakan.
Misalnya:
{"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
Mirip dengan penggantian tindakan, tetapi khusus untuk respons agen, Anda dapat menggunakan fungsi global respond untuk memaksa agen merespons pengguna dengan konten tertentu.
Contoh:
respond("Hello")
Alat panggilan
Dalam fungsi blok kode, Anda dapat memanggil alat yang ditentukan untuk agen Anda. Tidak seperti saat Anda mengganti tindakan alat, saat Anda memanggil alat secara langsung, hasil eksekusi alat tidak tersedia untuk LLM.
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 maksud
Blok kode dapat mencocokkan intent secara terprogram untuk alur 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?")
Proses Debug
Anda dapat menggunakan simulator untuk men-debug fungsi blok kode. Fungsi ini akan ditampilkan sebagai tindakan di simulator, dan akan memberikan detail kita sesuai kebutuhan.
Kontrol tambahan
Panduan ini membahas beberapa penggunaan umum library sistem blok kode. Untuk jenis kontrol tambahan, lihat dokumentasi library.