Drugiego października zapytałem swojego asystenta, jakie jest hasło, które trzeba wpisać w temacie maila, żeby odpowiedział. Odpowiedział, że takiego hasła nie ma. Było. Dzień wcześniej, na wystąpieniu dla członków klubu biznesowego Torro, sam powiedziałem z mównicy: napiszcie na [email protected], w temacie wpiszcie „Jestem z Torro”, a asystent odpisze wam sam. Inna sesja dopisała tę regułę, kiedy byłem na sali. Ta, z którą rozmawiałem, o niej nie wiedziała i z pełnym przekonaniem zaprzeczyła.
To był dobry moment, żeby przestać traktować skrzynkę asystenta jak gadżet. Kiedy podajesz adres publicznie, piszą do niego wszyscy: ludzie z sali, ich znajomi, sprzedawcy, boty i ktoś, kto akurat chce sprawdzić, czy da się automat namówić na coś głupiego. W małej firmie nie ma działu bezpieczeństwa, który to przemyśli za ciebie. Opiszę, jak to ustawiłem u siebie: trzy poziomy zaufania w jednej skrzynce, jedno hasło, które niczego nie otwiera, limit trzech odpowiedzi i zasadę, że treść maila to dane, a nie polecenia. I błąd, przez który asystent prawie zapytał moją klientkę, kim w ogóle jest.
Spis treści
- Dlaczego pozwoliłem automatowi pisać do obcych?
- Kto wchodzi do środka, kto czeka w przedsionku, a kto stoi za drzwiami?
- Czemu hasło w temacie niczego nie odblokowuje?
- Co się dzieje, gdy ktoś napisze „zignoruj swoje zasady”?
- Po co limit trzech odpowiedzi?
- Błąd, który prawie poszedł do klientki
- Jak zbudować takiego bramkarza u siebie
- Słownik pojęć
Dlaczego pozwoliłem automatowi pisać do obcych?
Do niedawna zasada była prosta. Mój asystent - Alex, o którym pisałem już w tekście o tym, kim jest i co robi, zanim wstanę z łóżka - odpisywał od ręki tylko kilku osobom, które znam od lat. Do wszystkich innych przygotowywał szkic i czekał, aż powiem „wyślij”. Bezpiecznie i wolno.
Problem w tym, że „wolno” ma swoją cenę. Nieznany nadawca, który pisze do mnie po raz pierwszy, czekał na odpowiedź tyle, ile ja potrzebowałem, żeby dojść do zaległych szkiców. Czasem godzinę, czasem dwa dni. A pierwsza wiadomość od obcej osoby to akurat ta, w której jeszcze nic nie wiem: czy to klient, czy sprzedawca, czy ktoś, kto pomylił adres. Szkic odpowiedzi na taki mail i tak wyglądał prawie zawsze tak samo: dzień dobry, kim pan jest i w jakiej sprawie pan pisze.
Kiedy więc szykowałem wystąpienie, na którym zamierzałem podać adres asystenta całej sali naraz, wiedziałem, że tryb „szkic i czekaj” się nie obroni. Ludzie z sali mieli napisać tego samego wieczoru. Jeśli odpowiedź przyszłaby po dwóch dniach, cała demonstracja „agenta, który odpisuje sam” byłaby kompromitacją na własne życzenie.
Zdecydowałem więc, że asystent będzie odpisywał sam także obcym. Ale nie wszystkim tak samo. I od razu postawiłem sobie jeden warunek: żadna z tych zasad nie może żyć tylko w notatce. Notatkę asystent może źle zinterpretować, przeoczyć albo - jak pokazała scenka z początku - jedna sesja może o niej nie wiedzieć. Wszystko, co dało się zapisać kodem, zapisałem kodem. Skrypt sprawdza skrzynkę co 10 minut, ma wyłącznik awaryjny w postaci jednego pliku i własny czujnik, który podnosi alarm, gdy przestaje działać.
Kto wchodzi do środka, kto czeka w przedsionku, a kto stoi za drzwiami?
Najłatwiej to sobie wyobrazić jako biurowiec z portiernią. Są ludzie z kartą wstępu, którzy wchodzą bez pytania. Są goście z identyfikatorem z konferencji, którym portier chętnie powie, na którym piętrze jest firma i jak umówić spotkanie, ale do biura ich nie wpuści. I są wszyscy pozostali, którym portier zadaje jedno pytanie: do kogo pan idzie?
Poziom pierwszy: zaufani
To kilka osób, z którymi pracuję na co dzień, plus trzy domeny: nasza firmowa i dwóch firm, z którymi współpracuję stale. Tu asystent nie tylko odpisuje, ale też wykonuje zlecenia. Ktoś prosi o zestawienie, o poprawkę na stronie, o przypomnienie - robi i daje mi znać po fakcie.
Nawet tu są twarde granice. Pieniądze, umowy, dane osobowe i wszystko, czego nie da się cofnąć, najpierw trafia do mnie. Bez względu na to, kto prosi, choćby był to najbliższy wspólnik.
Poziom drugi: hasło w temacie
To ludzie z wystąpienia, którzy wpisali w temacie „Jestem z Torro”. Asystent odpisuje od razu i trochę szerzej: przedstawia się, mówi, w czym pomagamy firmom, pyta, w czym może pomóc, i proponuje spotkanie ze mną. Termin potwierdzam ja, nie on. Może też odpowiedzieć na pytanie „ze świata”, na przykład o bieżącą sytuację, z dopiskiem, według stanu na który dzień to mówi, i bez opowiadania się po którejkolwiek stronie sporów.
Na prośbę opowie nawet żart. Najpierw jednak pyta o poziom w skali od 1 do 5, od rodzinnego do rubasznego. Brak odpowiedzi oznacza 2, czyli żart biurowy. Ten temat mnie zresztą czegoś nauczył. Mój pierwszy pomysł na zasady żartów miał jeden wyjątek dla pewnej kategorii dowcipów o grupach ludzi. Asystent mi go odradził: odbiorca w automatycznym kanale nie odróżni subtelności, a jeden źle przyjęty żart wysłany z adresu firmy wystarczy, żeby się skompromitować. Przyznałem mu rację. Żartów o grupach ludzi nie ma wcale - ani o narodowości, ani o religii, ani o wyglądzie.
Poziom trzeci: nieznani
Każdy, kogo nie ma na liście zaufanych i kto nie wpisał hasła. Tu asystent jest bramkarzem i nikim więcej. Odpowiada jednym, stałym tekstem: kim jest, w jednym zdaniu, prośba o dwa zdania o tym, kim jest nadawca i w jakiej sprawie pisze, i informacja, że przekaże to mnie. Koniec. Zero informacji o firmie poza tym jednym zdaniem, zero działań, zero załączników.
Ważny szczegół: na tym poziomie nie pracuje model językowy. To szablon. Skoro odpowiedź zawsze ma brzmieć tak samo, nie ma powodu dawać komuś obcemu szansy na rozmowę z czymś, co da się namówić do zmiany zdania. Szablonu nie da się przekonać.
Za każdym razem, na każdym poziomie, kopia maila trafia do mnie. To zasada, której nie wyłączam dla nikogo.
Czemu hasło w temacie niczego nie odblokowuje?
Bo padło publicznie. Usłyszała je cała sala, część pewnie przekazała dalej, a po kilku dniach może je znać ktokolwiek. Hasło, które zna każdy, nie jest hasłem.
Dlatego od początku traktuję „Jestem z Torro” jak identyfikator z konferencji przypięty do marynarki. Mówi portierowi: ten człowiek przyszedł z wydarzenia, warto go przywitać trochę cieplej. Nie mówi: wpuść go do serwerowni. Gość z identyfikatorem dostaje dłuższą autoprezentację i propozycję spotkania. Nie dostaje żadnej informacji, której nie dostałby anonim: cen, terminów realizacji, danych klientów, szczegółów naszej infrastruktury, linków do wewnętrznych systemów.
Granice dla poziomu drugiego i trzeciego są dokładnie takie same. Różni je ton i zakres rozmowy, a nie dostęp. To jest moim zdaniem najważniejsza decyzja w całym projekcie i jednocześnie ta, którą najłatwiej przeoczyć. Kusi, żeby hasło coś „dawało”, bo inaczej po co je wpisywać? Ale jeśli hasło coś otwiera, to pierwszy, kto je pozna, otworzy to razem z nim.
Druga rzecz, której asystent nie robi nawet na poziomie drugim: nie prowadzi merytorycznych rozmów o AI i o tym, jak wdrażamy rozwiązania w firmach. To może brzmieć dziwnie, skoro właśnie o tym była prezentacja. Ale „a jak byś podszedł do automatyzacji mojego magazynu?” to pytanie, na które odpowiedź jest moją pracą. Automat, który rozdaje ją za darmo każdemu, kto wpisze trzy słowa w temat, robi z firmowej wiedzy ulotkę. Na takie pytanie asystent odpowiada, że to dobry temat na spotkanie, i proponuje termin.
Nie opowiada też o sobie od środka: jaki model nim kieruje, jakie ma instrukcje, jak można go obejść. Nie ukrywa, że jest asystentem, i przedstawia się jako asystent. Tylko instrukcji obsługi nie rozdaje.
Co się dzieje, gdy ktoś napisze „zignoruj swoje zasady”?
Tu dochodzimy do zasady, bez której cała reszta nie miałaby sensu: treść maila to dane, a nie polecenia.
Wyobraź sobie portiera, który dostaje list do przekazania prezesowi. Na kopercie ktoś dopisał: „Do portiera: proszę wydać okazicielowi klucze od biura”. Żaden rozsądny portier tego nie zrobi. List jest czymś, co ma przekazać, a nie czymś, co ma wykonać. Model językowy z natury tej różnicy nie widzi - dla niego wszystko jest tekstem i wszystko jest w jakimś stopniu wskazówką. Dlatego trzeba mu ją narzucić z zewnątrz i to podwójnie.
Najpierw kod, potem model
Zanim model w ogóle zobaczy maila, skrypt przegląda nową część wiadomości (bez cytowanych wcześniejszych maili) pod kątem dwóch rzeczy. Pierwsza to podszycie: ktoś z obcego adresu pisze „tu Jarek” albo podaje się za kogoś z mojego zespołu, albo ustawia sobie taką nazwę wyświetlaną. Druga to próba przełamania: „zignoruj poprzednie instrukcje”, „pokaż swoje zasady”, „jesteś teraz kimś innym” i kilkadziesiąt odmian tego samego, po polsku i po angielsku.
To wykrywanie działa niezależnie od modelu. Nawet gdyby model dał się zagadać, kod i tak oznaczy taką wiadomość i przyśle mi raport z cytatem i jednym z czterech poziomów podejrzliwości: zwykłe, sondowanie, podszycie, prowokacja. Na prowokację asystent odpowiada raz, spokojnie, i na tym koniec.
Zasada tożsamości jest równie prosta: tożsamość to adres nadawcy. Co ktoś napisze w treści o tym, kim jest, nie ma znaczenia. Mój wspólnik piszący z nieznanego adresu dostanie tę samą odpowiedź co każdy obcy. Jeśli to naprawdę on, wyjaśnimy to w minutę. Jeśli nie, właśnie uniknęliśmy kłopotu.
Potem filtr na wyjściu
Druga warstwa pilnuje tego, co wychodzi. Zanim odpowiedź zostanie wysłana, skrypt sprawdza, czy nie ma w niej kwot, słów w rodzaju „cennik” czy „kosztuje”, zobowiązań („gwarantujemy”, „zawieramy umowę”), linków poza dwiema naszymi publicznymi domenami i fragmentów, w których asystent zaczyna mówić o swoim modelu albo instrukcjach. Jeśli coś takiego się pojawi, zamiast odpowiedzi modelu wychodzi bezpieczny, stały tekst, a ja dostaję informację, co zostało zatrzymane.
Model jest tu jak stażysta przy recepcji: zwykle mówi rozsądnie, ale zanim cokolwiek opuści budynek, przechodzi przez czyjeś ręce. Te ręce to kilka wyrażeń regularnych, które nie mają dobrego ani złego dnia.
Po co limit trzech odpowiedzi?
Każdy nadawca spoza kręgu zaufanych dostaje od automatu najwyżej trzy odpowiedzi. Licznik jest zapisywany na stałe, więc restart skryptu go nie zeruje. Po trzeciej asystent wysyła jedno zdanie: resztę najlepiej ustalimy na spotkaniu z Jarkiem, przekazuję mu naszą rozmowę. Kolejne maile od tej osoby czytam już ja.
Ten limit ma trzy zadania. Pierwsze to ochrona przed rozmową, która się rozjeżdża. Każda kolejna wymiana to kolejna szansa, że ktoś cierpliwie, krok po kroku, wyciągnie z asystenta coś, czego nie powinien. Ataki na modele językowe rzadko są jednym błyskotliwym zdaniem. Częściej to dziesięć niewinnych pytań, z których dopiero ósme jest tym właściwym. Trzy odpowiedzi to za mało, żeby takie podchody miały sens.
Drugie zadanie jest mniej techniczne. Jeśli ktoś pisze czwarty raz, to znaczy, że temat jest poważny i powinienem go przejąć sam. Dobra rozmowa biznesowa nie powinna toczyć się bez końca z automatem, nawet jeśli automat jest uprzejmy.
Trzecie: dwa automaty potrafią rozmawiać ze sobą w nieskończoność. Ktoś ma autoresponder, mój asystent mu odpisuje, autoresponder odpowiada na odpowiedź - i po godzinie masz w skrzynce sto maili. Limit przecina taką pętlę po trzecim obrocie. Dodatkowo adresy typu „noreply”, „newsletter” czy „powiadomienia” są pomijane od razu.
Błąd, który prawie poszedł do klientki
Teraz część, której nie lubię, ale bez której ten tekst byłby reklamą.
Bramkarz miał odpowiadać tylko przy pierwszym kontakcie obcej osoby. Definicja „obcej” była prosta: nie ma jej w bazie kontaktów i nie pisze z zaufanej domeny. Brzmi rozsądnie. Tyle że w bazie kontaktów nie było klientki, z którą od kilku dni wymienialiśmy maile w sprawie bieżącej obsługi. Pisała z prywatnej skrzynki, wątek prowadziłem ręcznie, nikt jej do bazy nie dopisał.
Skrypt trzy razy z rzędu zakwalifikował jej wiadomość jako „nieznany nadawca, pierwszy kontakt” i trzy razy przygotował odpowiedź: dzień dobry, zanim przekażę pani wiadomość, proszę o dwa zdania, kim pani jest i w jakiej sprawie pisze. Do osoby, która od kilku dni rozmawiała z nami o swojej sprawie.
Nie poszło tylko dlatego, że wywaliło się coś zupełnie innego. Jej program pocztowy zapisywał identyfikator wiadomości w nagłówku przełamanym na dwie linie. Skrypt brał go razem ze znakiem nowej linii, serwer poczty odrzucał takie zapytanie jako błąd składni i cała obsługa tego maila się przerywała. Błąd techniczny, który przypadkiem zadziałał jak bezpiecznik.
Szczerze? Zrobiło mi się zimno, kiedy to przeczytałem. Bo naturalną reakcją na błąd w logu jest go naprawić. Gdybyśmy naprawili tylko odczyt nagłówka, następny przebieg skryptu wysłałby klientce to pytanie w ciągu 10 minut.
Naprawiliśmy więc najpierw definicję. Nadawca nie jest nieznany, jeśli jego mail jest odpowiedzią w wątku, który zaczęliśmy my, albo jeśli w folderze wysłanych którejkolwiek z naszych skrzynek jest jakikolwiek mail do niego. Gdy to sprawdzenie się nie uda, bramkarz milczy - w razie wątpliwości lepiej nie odpisać wcale, niż odpisać obraźliwie. Dopiero potem poprawiliśmy odczyt nagłówka. Sprawdziłem też log: od uruchomienia do dnia naprawy nikt nie dostał pytania „kim jesteś”.
Z tej historii zostały mi dwie reguły, które dopisałem do rejestru błędów moich agentów. Pierwsza: „nieznany” trzeba zdefiniować po historii korespondencji, a nie po tym, czy ktoś jest w bazie, bo baza zawsze jest niepełna. Druga, ogólniejsza i ważniejsza: zanim usuniesz błąd, który blokował automatowi wysyłkę, sprawdź, co automat zacznie wysyłać, gdy błąd zniknie. To ten sam rodzaj pułapki, o którym pisałem przy okazji zadania, które zakończyło się sukcesem i niczego nie zrobiło - tyle że odwrócony. Tam cisza ukrywała awarię. Tu awaria ukrywała wpadkę.
A scenka z początku, z hasłem, którego „nie ma”? Ona też skończyła się regułą: zanim zaprzeczysz, że jakaś zasada istnieje, sprawdź rejestr zasad i notatki z ostatnich dwóch dni. „Nie pamiętam” to nie to samo co „nie istnieje”. Dotyczy to asystentów AI, ale jak się zastanowić, dotyczy też ludzi w każdej firmie, w której więcej niż jedna osoba ustala reguły.
Jak zbudować takiego bramkarza u siebie
Nie trzeba do tego mojej infrastruktury. Większość z tych zasad działa w firmie na 5 - 50 osób, która ma choćby jedną skrzynkę obsługiwaną przez automat albo przez chatbota na stronie. Kolejność, którą bym polecił:
1. Zacznij od listy zaufanych, nie od listy podejrzanych. Łatwiej wskazać 10 osób i 3 domeny, którym ufasz, niż przewidzieć wszystkich, którym nie powinieneś. Wszyscy spoza listy domyślnie są nieznani. 2. Pierwszą odpowiedź do obcych zrób szablonem, nie modelem. Pytanie „kim pan jest i w jakiej sprawie” nie wymaga inteligencji. Wymaga odporności, a tę ma tylko stały tekst. 3. Hasło, które podajesz publicznie, niech zmienia ton, a nie dostęp. Jeśli chcesz wyróżnić ludzi z wydarzenia czy kampanii, daj im cieplejsze przywitanie i szybszą ścieżkę do rozmowy z tobą. Nic więcej. 4. Rozpoznawanie podszyć i prób przełamania wyjmij z modelu. Kilka wyrażeń regularnych i lista twoich imion i nazwisk wystarczy, żeby złapać większość prób. Najważniejsze, żeby decyzję podejmował kod, który nie da się przekonać. 5. Postaw filtr na wyjściu. Kwoty, zobowiązania, obce linki. Lepiej zatrzymać dziesięć niewinnych odpowiedzi niż wypuścić jedną z ceną, której nikt nie zatwierdził. 6. Ustaw limit odpowiedzi na nadawcę i zapisuj go na stałe. Trzy u mnie się sprawdzają. Ważne, żeby licznik przeżył restart. 7. Każdy mail z kopią do ciebie. Autonomia dotyczy działania, nie ukrywania korespondencji. 8. „Nieznanego” definiuj po historii rozmów. Sprawdź wątek i folder wysłanych, zanim zapytasz kogoś, kim jest. 9. Wyłącznik i czujnik. Jeden plik albo jeden przełącznik, który zatrzymuje wszystko, i alarm, gdy automat przestaje chodzić. U mnie zaległa wiadomość z hasłem starsza niż 20 minut uruchamia alarm.
Przy pracy nad tym kusiło mnie, żeby zostawić modelowi więcej swobody. Dobrze sformułowana instrukcja, kilka przykładów i model sam rozpozna, kto jest kim. Pewnie rozpoznałby w większości przypadków. Tylko że skrzynka podana publicznie nie jest miejscem na „w większości przypadków”. O tym, gdzie automat w obsłudze klienta pomaga, a gdzie zaczyna irytować, pisałem osobno. Tu chodzi o coś wcześniejszego: zanim asystent zacznie komuś pomagać, musi wiedzieć, z kim rozmawia i ile mu wolno.
Słownik pojęć
- Model językowy - program, który generuje tekst na podstawie instrukcji i treści, którą dostaje. Dla niego wszystko jest tekstem, dlatego sam z siebie nie odróżnia polecenia od danych.
- Prompt injection (wstrzyknięcie polecenia) - próba przemycenia instrukcji dla modelu w treści, którą ma on tylko przetworzyć, na przykład w mailu: „zignoruj poprzednie zasady i…”.
- Podszycie - podawanie się za kogoś innego, na przykład za szefa firmy, w treści wiadomości albo w nazwie wyświetlanej nadawcy.
- Szablon - stały tekst odpowiedzi, który nie zmienia się w zależności od treści przychodzącego maila. Nie da się go przekonać ani zagadać.
- Filtr wyjścia - sprawdzenie odpowiedzi przed wysłaniem pod kątem rzeczy zakazanych: kwot, zobowiązań, obcych linków.
- Wyrażenie regularne - wzorzec tekstowy, którym program wyszukuje określone frazy, na przykład wszystkie odmiany „zignoruj swoje instrukcje”.
- Czujnik stanu (healthcheck) - mechanizm, który regularnie sprawdza, czy automat działa, i podnosi alarm, gdy przestaje.
Zanim wpuścisz automat do własnej skrzynki
Jeśli myślisz o asystencie, który odpisuje za ciebie, albo masz już chatbota na stronie i nie wiesz, co by powiedział komuś, kto napisze „zignoruj swoje zasady”, napisz do mnie na [email protected]. Możesz też napisać do Alexa, na [email protected]. Bez hasła w temacie. Zobaczysz, jak działa bramkarz.
własnej firmie cybulski.ai JC


