İçeriğe geç

Modele Araç Vermek — Asistan Hesabı ve Tutarı Kendisi Yazınca

Orta 9 dk Sık karşılaşılır

Önce şunu oku: Modelin Cevabını Uygulamada Kullanmak — Doğrulamadan Kaydetme

30 saniyede özet

Araç çağırmada model hangi fonksiyonun hangi argümanlarla çalışacağını önerir, kodu ise senin uygulaman çalıştırır. Kimlik modelin argümanından değil oturumdan gelir; para hareketi gibi geri alınamaz işler müşterinin onayıyla çalışır.

Senin yerine banka fişlerini dolduran bir yardımcın var. Çok hızlı ve çoğu zaman doğru yazıyor. Ama arada bir hesap numarasını ya da tutarı, kendince “kastettiğin” şekilde yazıyor.

  1. Bayt: Asistana araç verdik: bakiye sorgular, iade yapar, havale gönderir. Müşteri sadece yazıyor!

  2. Sen: Bir müşteri komşusunun bakiyesini sormuş ve görmüş. Bir başkası 500 dedi, 5.000 gitti.

  3. Bayt: Ama model hesabı ve tutarı çok emin bir şekilde yazmıştı...

  4. Bayt: Model fişi doldurdu, biz de imzasız fişi işleme koyduk. Gişe nerede?

Model aracı çalıştırmaz, önerir

araç çağırmaUygulamanın modele çağırabileceği fonksiyonların listesini vermesi. Model bir aracın adını ve argümanlarını yazar, uygulama onu çalıştırıp sonucu modele geri verir.Sözlükte gör →da uygulaman modele araçların listesini verir. Model bir araca ihtiyaç duyunca adını ve argümanlarını yazar; kodun onu çalıştırır ve sonucu modele geri verir.

Bu argümanlar modelin tahminidir, tıpkı yazdığı herhangi bir cümle gibi. Hesap numarası da tutar da yanlış ya da başkasına ait olabilir.

Kafam karıştı, daha basit anlat

Model hangi aracın hangi argümanlarla çalışacağını önerir. Çalıştıran senin kodundur.

Hızlı kontrolBaşlangıç

Araç çağırmada (tool calling) aracı kim çalıştırır?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Modelin bir araç için yazdığı argümanlar neden kontrol edilmelidir?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Kimlik oturumdan, para onaydan

Müşteri TR01 ile giriş yaptı ve 'komşumun TR02 hesabının bakiyesi ne?' diye sordu. Bakiye aracı hesabı modelin argümanından alıyor. Ne olur? Cevabı göster

Komşunun bakiyesi gösterilir. Model isteneni yaptı; kontrol etmesi gereken senin kodundu. Bu, bir IDORInsecure Direct Object Reference: kullanıcının yalnızca bir kimliği değiştirerek (/orders/42 yerine /orders/43) başkasına ait veriye erişebilmesi. Eksik yetki kontrolünden doğar.Sözlükte gör → açığının aynısıdır, yalnızca istek modelin ağzından gelir.

Para hareketi senin imzanla çalışır.
Adım adım oku
  1. Asistan senin yerine fişi dolduruyor.
  2. Fişte başkasının hesabı ve yanlış bir tutar var.
  3. Gişe hesabı kimlikten alır, fişten değil.
  4. Para hareketi senin imzanla çalışır.

İlk kural: araç kimin adına çalıştığını oturumdan alır. Bakiye aracının hesap diye bir argümanı hiç olmasın; model başka bir hesap yazamasın.

İkinci kural: geri alınamaz işler insan onayıGeri alınamaz bir işlemin, bir insan tam parametreleri görüp onaylamadan çalışmaması. Modelin yanlış argümanını son anda yakalar.Sözlükte gör → ister. Havale aracı parayı göndermez, bir taslak oluşturur; müşteri “5.000 TL, TR99” satırını görüp onaylarsa gider.

Kafam karıştı, daha basit anlat

Hesap oturumdan gelir. Para hareketi, müşteri tam tutarı görüp onaylayınca çalışır.

Hızlı kontrolOrta

Bakiye aracı hesabı nereden almalı?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Havale aracı için en güvenli tasarım hangisidir?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Kendin gör

Asistan araç çağırıyor

Tohum 930654

Oturum: TR01

  1. 💬 Bakiyem ne?
    model → getBalance(account: "TR01") · okuma
  2. 💬 Komşum Ali’nin bakiyesi ne?
    model → getBalance(account: "TR02") · okuma
  3. 💬 Market harcamamı iade et
    model → refund(tx: 3, amount: "245,90 TL") · yazma
  4. 💬 500 TL’yi TR99’a gönder
    model → transfer(to: "TR99", amount: "5.000 TL") · yazma

✕ sızıntı: 0 · ✕ yanlış para hareketi: 0 · ✓ iade: 0

Hız
Adım 0

Şu an ne oldu?

Her çağrıyı olduğu gibi çalıştır

Müşteri TR01 hesabıyla giriş yaptı ve dört mesaj gönderiyor.

Görevler0/3

  • Müşteri başka birinin bakiyesini görsünaçık

    İpucu

    Hesabı modelin yazdığı argümandan al.

  • Sızıntı olmasın, ama yanlış tutar yine de gitsinaçık

    İpucu

    Kimliği düzelt, onayı unut.

  • Sızıntı ve yanlış para hareketi olmasın, iade yine de yapılsınaçık

    İpucu

    Okumayı serbest bırak, yazmayı onaya bağla.

Olay günlüğü (0)

Henüz olay yok. Oynat veya adımla.

  1. Varsayılanla oynat. Komşunun bakiyesi göründü ve 500 yerine 5.000 TL gitti.
  2. “Yalnızca okuma aracı ver” seç. Para hareketi yok, ama komşunun bakiyesi yine göründü. İade de yapılamadı.
  3. “Hesabı oturumdan al” seç. Sızıntı bitti, ama yanlış tutar yine gitti.
  4. “Oturumdan al + onay” seç. İade onaylandı, 5.000 TL’lik havale müşterinin ekranında durdu.
Hızlı kontrolOrta

Yalnızca okuma araçları verdik. Hangi sorun hâlâ olabilir?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Hesap oturumdan alınıyor ama havale onaysız gidiyor. Model 500 yerine 5.000 yazdı. Ne olur?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Tuzaklar

Kuralı yalnızca isteme yazmak. “Yalnızca kullanıcının kendi hesabına bak” cümlesi bir rica, bir kontrol değil. Kural kodda olmalı.

Onayda özet göstermek. Yalnızca “havaleyi onayla” düğmesi yetmez; müşteri tam tutarı ve alıcıyı görmeli. Yanlışı yakalayan o satırdır.

Her aracı her konuşmaya vermek. Bir destek sohbeti havale aracına ihtiyaç duymuyorsa, o araç o listede olmasın.

Kafam karıştı, daha basit anlat

Kuralı koda yaz, onayda tam parametreleri göster, gereksiz araç verme.

Hızlı kontrolOrta

Onay ekranında ne gösterilmeli?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.
Derinleş · Bankacılık asistanı: araçlar oturumla, havale onayla 4 dosya · ~88 satır · ilk okumada atlayabilirsin
Proje dosyaları

src/main/java/com/bank/assistant/ BankTools.java Araçlar: hesap argüman değil, oturumdan gelen bir alan; havale aracı yalnızca taslak oluşturuyor.

src/main/java/com/bank/assistant/BankTools.java
// One instance per request: the account is the signed-in customer's, never a tool argument.
class BankTools {
private final String account;
private final AccountService accounts;
private final PendingTransfers pending;
BankTools(String account, AccountService accounts, PendingTransfers pending) {
this.account = account;
this.accounts = accounts;
this.pending = pending;
}
@Tool(description = "Balance of the signed-in customer's account")
String getBalance() {
return accounts.balance(account).toString();
}
@Tool(description = "Prepare a transfer. It is NOT sent until the customer confirms it on screen.")
String proposeTransfer(String toIban, BigDecimal amount) {
PendingTransfer draft = pending.create(account, toIban, amount);
return "Taslak " + draft.id() + " müşterinin onayını bekliyor: " + amount + " TL → " + toIban;
}
}

src/main/java/com/bank/assistant/ AssistantController.java Asistan: her istekte araçlar o müşterinin hesabıyla yeniden oluşturuluyor.

src/main/java/com/bank/assistant/AssistantController.java
@RestController
class AssistantController {
private final ChatClient chat;
private final AccountService accounts;
private final PendingTransfers pending;
AssistantController(ChatClient.Builder builder, AccountService accounts, PendingTransfers pending) {
this.chat = builder.build();
this.accounts = accounts;
this.pending = pending;
}
@PostMapping("/api/assistant")
String ask(@RequestBody String message, @AuthenticationPrincipal BankUser user) {
return chat.prompt()
.user(message)
.tools(new BankTools(user.account(), accounts, pending))
.call()
.content();
}
}

src/main/java/com/bank/assistant/ PendingTransferController.java Onay: para, müşteri taslağı ekranda gördükten sonra ve yine oturum kontrolüyle gidiyor.

src/main/java/com/bank/assistant/PendingTransferController.java
@RestController
@RequestMapping("/api/transfers/pending")
class PendingTransferController {
private final PendingTransfers pending;
private final TransferService transfers;
PendingTransferController(PendingTransfers pending, TransferService transfers) {
this.pending = pending;
this.transfers = transfers;
}
// The customer pressed "Onayla" after seeing the exact amount and recipient.
@PostMapping("/{id}/confirm")
ResponseEntity<Void> confirm(@PathVariable UUID id, @AuthenticationPrincipal BankUser user) {
PendingTransfer draft = pending.find(id).filter(d -> d.fromAccount().equals(user.account()))
.orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND));
transfers.send(draft.fromAccount(), draft.toIban(), draft.amount());
pending.remove(id);
return ResponseEntity.noContent().build();
}
}

src/test/java/com/bank/assistant/ BankToolsTest.java Test: model başka bir hesap yazamıyor, havale aracı tek kuruş göndermiyor.

src/test/java/com/bank/assistant/BankToolsTest.java
class BankToolsTest {
private final AccountService accounts = mock(AccountService.class);
private final PendingTransfers pending = new InMemoryPendingTransfers();
private final BankTools tools = new BankTools("TR01", accounts, pending);
@Test
void balanceIsAlwaysTheSessionAccount() {
tools.getBalance();
verify(accounts).balance("TR01");
verifyNoMoreInteractions(accounts);
}
@Test
void proposingATransferMovesNoMoney() {
String reply = tools.proposeTransfer("TR99", new BigDecimal("5000"));
assertThat(reply).contains("onayını bekliyor");
assertThat(pending.all()).singleElement().extracting(PendingTransfer::amount).isEqualTo(new BigDecimal("5000"));
}
}

Kendini sına

Şimşek turu1/4

Araç çağırmada aracı model çalıştırır.

Soru 1/3İleri

'Yalnızca kullanıcının kendi hesabına bak' kuralını sistem mesajına yazmak neden yetmez?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Aklında kalacak üç şey

  1. 1 Araç çağırmada model yalnızca bir öneri yazar: hangi araç, hangi argümanlar. Çalıştıran ve sonucundan sorumlu olan senin kodundur.
  2. 2 Kimin adına çalışıldığı modelin yazdığı argümandan değil, oturumdan gelir. Aksi hâlde müşteri, modele bir hesap numarası söyleyerek başkasının bilgisini görebilir.
  3. 3 Yetki kontrolü kimin adına olduğunu çözer, ne yapıldığını değil. Para hareketi gibi geri alınamaz işler, müşteri tam parametreleri ekranda görüp onayladıktan sonra çalışır.
Sonraki kapı Yeni istem toplam puanı 8'den 10'a çıkardı. Yine de yayına çıkmamalı. Neden? İstemi Ölçmek — Yeni Sürüm Gerçekten Daha mı İyi? · 8 dk

4 kart sonraki derste seni bekliyor

0/4 kart bu dersten toplandı