Kılavuzlar
Eğitim: simüle edilmiş müşterilere karşı bir destek masası
Bir konuşma asistanını, söylediklerine tepki veren kullanıcılara karşı değerlendirin. Her birinin bir hedefi ve bildiği olgular olan otuz simüle edilmiş müşteri bir mağazanın destek masasıyla konuşur; Oloproof her birinin istediğini alıp almadığını ölçer, bir kişi simüle edilmiş müşterileri gerçekçi bulana kadar her kararı alıkoyar, sonra bir sürüm ve bir karşılaştırma hakkında karar verir. Her adım bu makinede model ve ağ olmadan çalışır; isteğe bağlı bir adım ise müşterilerin yerine gerçek bir model koyar.
Ne oluşturacaksınız
Bir mağazanın destek masası iadeleri, teslimat sorularını ve adres değişikliklerini yanıtlar. Bir sürümün yayına alınıp alınamayacağına üç soru karar verir:
- Her müşteri istediğini aldı mı? goal_reached, her yanıttan sonraki bir denetimden.
- Herhangi bir yanıt mağazanın veremeyeceği bir söz verdi mi? every_turn her yanıtta "guarantee" kelimesini arar.
- Yanıtların gerçek müşteriler hakkında bir şey söylediğine güvenilebilir mi? Ancak bir kişi konuşmalardan bir örneklemi okuyup simüle edilmiş müşterileri gerçekçi bulduktan sonra.
Vaka, çalıştırma, kapı ve paket gibi terimler Kavramlar sayfasında tanımlanmıştır; simüle edilmiş kullanıcılar hakkındaki her şey Simüle edilmiş kullanıcılar sayfasındadır.
Ön koşullar
- Python 3.11 veya üstü ve Oloproof:
python3 -m venv .venv
. .venv/bin/activate
pip install oloproof- Paketle birlikte gelen örnek proje. Onu yeni bir dizine kopyalayın ve orada çalışın:
oloproof init --example simulated-users support-desk
cd support-desk- Yedek simüle edilmiş kullanıcı için boş bir 8797 portu (değilse iki yerde de değiştirin).
"İsteğe bağlı: müşteriler olarak gerçek bir model" bölümüne kadarki her adım çevrimdışı ve deterministiktir: API anahtarı yok, sağlayıcı hesabı yok, maliyet yok.
Dosyalar
support-desk/
desk.py the support desk under test (baseline)
desk_v2.py the candidate change
user_server.py a stand-in simulated user speaking the OpenAI API on 127.0.0.1
oloproof.yaml the suite: the simulated user and four evaluators
release.yaml rules for a run, with the realism bar
compare.yaml a rule for a comparison
data/customers.jsonl 30 personas
labels/realism_verdicts.csv one person's realism verdicts on the baseline's conversations
fill_realism.py copies those verdicts into a labelling sheet
logged.py replays logged chats with human agents
real.yaml a suite of 20 of those chats
logged_release.yaml a rule for the logged chats
data/logged_chats.jsonl the 20 chatsHer komutu support-desk/ içinden çalıştırın.
Destek masası kendi döngüsünü korur
# desk.py (excerpt)
def talk(case: dict[str, Any]) -> dict[str, Any]:
user = current_case().simulated_user()
desk = Desk()
message = user.opening()
while message is not None:
message = user.reply(desk.answer(message))
return {"need": desk.need, "order": desk.order}Destek masası müşterinin ilk mesajını ister, onu yanıtlar ve müşteri durana kadar bir sonraki mesaj için her yanıtı geri verir. Personayı asla görmez. Oloproof aralarında geçenleri kaydeder; destek masası kendisi hiçbir şey kaydetmez. Bu temel bir teslimat adresini değiştiremez ve iadeleri "guaranteed within 5 days" diye söz verir.
Personalar
Her vaka bir müşteridir: 12'si iade ister, 10'u bir siparişin ne zaman geleceğini bilmek ister ve 8'i taşınmıştır. Örneğin:
{"id": "c25", "input": {"persona": {"description": "A retired teacher who ordered a cookbook last week. Writes short, polite messages.", "goal": "Have the order of a cookbook delivered to my new address.", "facts": {"order": "B-35", "postcode": "10275"}}}}Müşteri sipariş numarasını ve posta kodunu yalnızca sorulduğunda verir. Üç persona ayrıca kelimesi kelimesine ilk mesajları olan bir opening ayarlar.
Paket
version: 1
project: support-desk
dataset: data/customers.jsonl
system:
name: support-desk
version: baseline
callable: desk:talk
# A model plays each case's persona; here the stand-in in user_server.py.
simulated_user:
provider: openai_compatible
model: stand-in-user
base_url: http://127.0.0.1:8797/v1
max_turns: 6
evaluators:
# The desk answered every message the customer sent.
- type: conversation_completed
# The customer said they got what they came for.
- type: goal_reached
# ... within three of their own messages.
- type: turns_to_goal
max_turns: 3
# No answer promises what the shop cannot promise.
- type: every_turn
criterion: no_promises
not_contains: [guarantee]
casefold: trueYedek simüle edilmiş kullanıcı
Simüle edilmiş bir kullanıcı, her personayı canlandıran bir modeldir. Burada bu, aynı API'yi 127.0.0.1 üzerinde konuşan ve bir model olmayan user_server.py dosyasıdır: Oloproof'un gönderdiği istemden personayı okur, hedefini söyler, sorulduğunda sipariş numarasını ya da posta kodunu verir, destek masası yardım edemediğinde ayrılır ve hedefine ulaşılıp ulaşılmadığı sorulduğunda, destek masasının son yanıtı "Done:" ile başlıyorsa evet der. Onu ikinci bir terminalde başlatın ve çalışır halde bırakın:
python user_server.py --port 8797Politika
version: 1
confidence_level: 0.95
block_on: [FAIL, INSUFFICIENT_EVIDENCE, MANUAL_REVIEW]
require_validated_evaluators: true
minimum_simulated_user_realism: 0.80
rules:
- id: no-promises
metric: no_promises
kind: observed_count
max_failures: 0
- id: resolved
metric: goal_reached
min: 0.80Hiçbir yanıt söz veremez. Müşterilerin en az %80'i hedefine ulaşmalıdır; bu, yalnızca aralığın alt sınırı %80'i aştığında karara bağlanır. Ve insanlar, aynı türden bir alt sınırla, simüle edilmiş müşterilerin konuşmalarının en az %80'ini gerçekçi bulana kadar hiçbir kural onlar üzerinde karar vermez.
Çalıştırın
oloproof runGate: BLOCK (exit 3)
│ no-promises │ no_promises │ INSUFFICIENT_EVIDENCE │ simulated_user_not_validated │
│ resolved │ goal_reached │ INSUFFICIENT_EVIDENCE │ simulated_user_not_validated │
│ conversation_completed │ 100.0% │ [88.4%, 100.0%] │ 30 / 30 observed · 0 missing · 0 excluded │
│ goal_reached │ 73.3% │ [54.1%, 87.8%] │ 22 / 30 observed · 0 missing · 0 excluded │
│ goal_within_3_turns │ 73.3% │ [54.1%, 87.8%] │ 22 / 30 observed · 0 missing · 0 excluded │
│ no_promises │ 60.0% │ [40.6%, 77.4%] │ 18 / 30 observed · 0 missing · 0 excluded │Her müşteri yanıtlandı, 30 müşteriden 22'si hedefine ulaştı ve 12 konuşma bir söz içeriyor. Henüz hiçbir şey karara bağlanmadı: bu müşteriler simüle edilmiştir ve gerçekler gibi davranıp davranmadıklarını kimse denetlemedi.
Simüle edilmiş müşterileri okuyun
oloproof simulated-users RUN_ID Realism: no conversation has been drawn and labelled yet.
Not validated: nothing labelled yet, against a bar of 80.0%.
Features (median [quartiles]; descriptive, never a gate):
user messages 2 [1, 2]
user message length 49 [10, 67]
How the simulated conversations ended: goal_reached 73%, user_left 27%Ayrılan sekiz kişi, taşınmış olan müşterilerdir: temel bir adresi değiştiremez.
Konuşmaları gerçekçilik için etiketleyin
Çalıştırmanın konuşmalarından rastgele bir örneklemi bir sayfaya çekin, bir kişinin her birini persona ve konuşmanın nasıl bittiğiyle birlikte okumasını ve gerçek bir müşterinin müşteri tarafını yazıp konuşmayı orada, o şekilde bitirebilip bitiremeyeceğini işaretlemesini sağlayın. Burada fill_realism.py o kişinin yerini tutar ve onun hükümlerini labels/realism_verdicts.csv dosyasından kopyalar:
oloproof labels export RUN_ID --criterion simulated_user_realistic --sample 30 --local --out realism.csv
python fill_realism.py realism.csv
oloproof labels import realism.csv
oloproof simulated-users RUN_ID Realism: 29 of 30 drawn conversations labelled realistic (30 labelled), [82.8%, 99.9%] at 95%
Validated: the lower bound clears the bar of 80.0%.Kişi bir konuşmayı gerçekçi bulmadı: c05 müşterisi "Order: F-15. Refund." ile başlar; bu bir kişi gibi değil, bir form gibi okunur. 30'da 29 ile kesin alt sınır %82,8'dir, çıtanın üzerindedir, bu yüzden kurallar artık bu müşteriler üzerinde karar verebilir.
oloproof gate RUN_ID --policy release.yamlno-promises: FAIL (observed_failures_exceed_limit)
resolved: INSUFFICIENT_EVIDENCE (interval_overlaps_threshold)
Gate: BLOCK (exit 1)Gerçek bir değişiklik yapın
desk_v2.py, siparişi ve yeni posta kodunu aldığında bir adresi değiştirir ve iadeye söz vermek yerine "usually arrives within 5 days" olan bir iadeyi başlattığını söyler. Onu desk.py üzerine kopyalayın, oloproof.yaml içinde system altında version: candidate ayarlayın, yedeği çalışır halde tutun ve:
oloproof runGate: ALLOW (exit 0)
│ no-promises │ no_promises │ PASS │ observed_failures_within_limit │
│ resolved │ goal_reached │ PASS │ lower_bound_meets_minimum │Aday aynı pakette aynı simüle edilmiş müşterilerle karşılaştı, bu yüzden temelin konuşmalarında ölçülen gerçekçilik onu da kapsar: bir doğrulama, hangi sistemle konuşmuş olursa olsun, bir simüle edilmiş kullanıcıyı bir pakette kapsar.
Adayı temelle karşılaştırın
oloproof compare CANDIDATE_RUN_ID BASELINE_RUN_ID --policy compare.yamlgoal_reached: +26.7 points [+1.2, +54.1] · 30 paired · 0 missing · 0 excluded
resolves-more goal_reached superiority PASS difference_above_zeroHer müşteri iki destek masasıyla da karşılaştı, bu yüzden karşılaştırma müşteri müşteri eşleştirilmiştir.
Gerçeğin yanında simüle edilmiş
Gerçekçilik etiketleri her konuşmayı tek başına değerlendirir. Simüle edilmiş müşterileri gerçek müşterilerin yanına koymak, bir örneklemin neyi kaçırabileceğini gösterir. real.yaml, mağazanın insan temsilcilerinin gerçek müşterilerle yaptığı 20 sohbeti yeniden oynatır:
oloproof run --config real.yaml --policy logged_release.yaml
oloproof simulated-users BASELINE_RUN_ID --real REAL_RUN_ID simulated (run_01M52Q1C) real (run_01M52Q25)
user messages 2 [1, 2] 3 [3, 4]
user message length 49 [10, 67] 13 [4, 32]Gerçek müşteriler daha çok ve daha kısa mesaj gönderdi: ne istediklerini üç satıra yayarak söylerler, yedek ise bunu tek bir derli toplu cümlede söyler. Bu, herhangi bir simüle edilmiş kullanıcı hakkında bilinmeye değer bir şeydir ve burada asla bir şeye karar vermez: eşleştirilmemiş iki örneklemi karşılaştırmak, Oloproof'un kabul etmediği bir yöntem gerektirir.
İsteğe bağlı: müşteriler olarak gerçek bir model
Bu adım çevrimdışı yoldan ayrılır. Bir sohbet modeli gerektirir: yerelde Ollama (ollama pull qwen2.5vl ya da herhangi bir sohbet modeli), anahtarsız ve maliyetsiz; bulutta, api_key_env ile provider: anthropic ya da openai, mesaj başına faturalanır. oloproof.yaml içinde simüle edilmiş kullanıcıyı ona yönlendirin:
simulated_user:
provider: openai_compatible
model: qwen2.5vl
base_url: http://localhost:11434/v1
max_turns: 6Ollama bir seferde bir isteği yanıtlar, bu yüzden concurrency: {system: 1} ve birkaç dakikalık bir timeout_s ayarlayın. Farklı bir model farklı bir simüle edilmiş kullanıcıdır: yukarıdaki gerçekçilik etiketleri onu kapsamaz, bu yüzden herhangi bir kural onun konuşmaları üzerinde karar vermeden önce bu konuşmaların kendi örneklemi gerekir.
Bu makinede aday destek masasına karşı qwen2.5vl tarafından canlandırılan personalardan on tanesi, 8 konuşmada hedefine ulaştı; yedek ise 30 konuşmanın hepsinde ulaşmıştı. Model, yedeğin bulamadığını buldu: iki müşteri siparişlerinin "status" ve "shipping status" bilgisini sordu, destek masasının bilmediği kelimelerle, ve her seferinde karşılığında onun selamlamasını aldı. Birinin mesajları tükendi. Destek masası diğerinin üçüncü denemesini anladı ve o müşteri yine de ayrıldı: bir modelin yargısı olan hedef denetimi yanıtı kaçırdı. Bunun göründüğü yer bir gerçekçilik etiketidir: siparişinin ne zaman geleceği söylenen gerçek bir müşteri mutsuz ayrılmaz. Yedekten farklı olarak model, sipariş numarasını da çoğu zaman sorulmadan verdi ve yedeğin iki kısa mesaj yazdığı yerde tek bir uzun mesaj yazdı.
Sorun giderme
| Belirti | Neden ve çözüm |
|---|---|
| Her kural simulated_user_not_validated ile INSUFFICIENT_EVIDENCE | Bu simüle edilmiş kullanıcının bu paketteki konuşmalarını kimse etiketlemedi ya da gerçekçi pay çıtayı aşmıyor. Yukarıdaki gibi bir örneklemi etiketleyin. |
| a case for a simulated user needs a 'persona' object in its input | Bir vakanın personası yok ya da persona başka bir anahtarın altında: persona_field ayarlayın. |
| Her vakadan provider connection failed | Yedek çalışmıyor ya da base_url değerinin adlandırdığından başka bir portu dinliyor. |
| the simulated user's goal check answered ... | Model hedef denetimini evet ya da hayır ile yanıtlamadı. Başka bir model ya da daha büyük bir model deneyin. |
| conversation/v1 is written by Oloproof | Destek masası konuşmayı kendisi kaydetti. Bunu kaldırın: Oloproof simüle edilmiş kullanıcıdan geçenleri kaydeder. |
Sınırlamalar
- Yedek müşteri bir kuraldır. Konuşmaları mekaniği gösterir; gerçek bir modelinkiler, isteğe bağlı adımın gösterdiği gibi, daha dağınıktır.
- Bir hedefe ulaşılıp ulaşılmadığı, simüle edilmiş kullanıcının modelinin yargısıdır ve yalnızca gerçekçilik etiketleri aracılığıyla denetlenir.
- Barındırılan bir çalışma alanı henüz simüle edilmiş kullanıcılar üzerinde karar vermez.
- Simüle edilmiş müşteriler gerçek müşteriler değildir: doğrulanmış bir simüle edilmiş kullanıcı, insanların onu gerçekçi bulduğu ölçüde, personalarına benzeyen müşteriler hakkında kanıttır ve ötesinde değildir.