Hướng dẫn
Người dùng mô phỏng
Một cuộc hội thoại có kịch bản kiểm thử trợ lý của bạn với một người dùng không bao giờ phản ứng. Một người dùng mô phỏng thì phản ứng: một mô hình đóng vai một người mà mỗi trường hợp mô tả, viết mỗi tin nhắn tiếp theo dựa trên những gì trợ lý của bạn vừa nói, và dừng lại khi mục tiêu của nó đạt được hoặc khi nó bỏ cuộc. Oloproof ghi lại những gì đã trao đổi giữa hai bên, đo nó như mọi cuộc hội thoại khác, và chỉ cho một cổng quyết định trên nó khi con người đã nhận thấy người dùng mô phỏng là chân thực. Bài hướng dẫn đi qua một bàn hỗ trợ trò chuyện với các khách hàng mô phỏng.
Nhân vật
Đầu vào của mỗi trường hợp chứa một nhân vật (persona): người dùng là ai, họ muốn gì và họ biết gì.
{"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"}
}}}- description và goal là bắt buộc. Hãy viết một mục tiêu mà người đọc có thể kiểm tra chỉ từ cuộc hội thoại: "làm cho cửa hàng bắt đầu hoàn tiền" có thể được quyết định từ những gì trợ lý nói, còn "nhận được tiền hoàn" thì không, vì tiền đến sau đó.
- facts là những gì người dùng biết và chỉ chia sẻ khi cuộc hội thoại cần đến, chẳng hạn một mã đơn hàng. Trợ lý của bạn không bao giờ thấy nhân vật.
- opening là tin nhắn đầu tiên của người dùng, nguyên văn từng chữ, khi mọi hệ thống phải được chào theo cùng một cách.
- max_turns giới hạn số tin nhắn của người dùng này, ghi đè giá trị của dự án.
Một nhân vật là nội dung tập dữ liệu: nó được bao gồm trong digest của bộ kiểm thử và giống nhau cho mọi hệ thống được đo với nó.
Khai báo người dùng mô phỏng
Mô hình đóng vai mọi nhân vật được khai báo trên hệ thống, giống như một giám khảo:
system:
name: support-desk
callable: desk:talk
simulated_user:
provider: openai_compatible
base_url: http://localhost:11434/v1
model: qwen2.5vl
max_turns: 6Mọi trường đều nằm trong tài liệu tham chiếu cấu hình. Một mô hình cục bộ không tốn gì; một mô hình được lưu trữ tính phí cho mỗi tin nhắn nó viết, và các token của nó được ghi lại bên cạnh cuộc hội thoại và không bao giờ được tính vào chi phí của hệ thống của bạn.
Hệ thống của bạn giữ vòng lặp của nó
Oloproof không điều khiển cuộc hội thoại. Hệ thống của bạn xin tin nhắn đầu tiên của người dùng, trả lời nó theo cách nó vẫn trả lời người dùng, và trao lại mỗi câu trả lời để nhận tin nhắn tiếp theo:
from oloproof import current_case
def talk(case):
user = current_case().simulated_user()
message = user.opening()
while message is not None:
message = user.reply(my_assistant.answer(message))
return {}reply trả về None khi người dùng dừng lại. Hệ thống của bạn có thể tự kết thúc cuộc hội thoại bằng user.end(answer), như một lần chuyển giao cho một người thật; một hệ thống async def thì await aopening(), areply(answer) và aend(answer). Oloproof ghi lại những gì đã đi qua handle dưới dạng conversation/v1 và cách cuộc hội thoại kết thúc dưới dạng simulated_user/v1, và từ chối cả hai nếu chúng đến từ hệ thống của bạn (Tham chiếu SDK).
Một cuộc hội thoại kết thúc thế nào
Sau mỗi câu trả lời của hệ thống của bạn, mô hình của người dùng mô phỏng được hỏi, như một câu hỏi riêng ở nhiệt độ 0 và không có phần đóng vai bao quanh, liệu câu trả lời đó đã hoàn thành mục tiêu hay chưa. Nếu rồi, cuộc hội thoại kết thúc với goal_reached. Nếu chưa, người dùng viết tin nhắn tiếp theo, hoặc rời đi (user_left), cho tới khi nó đã gửi max_turns tin nhắn (turn_limit). Một hệ thống dừng lại mà không trả lời tin nhắn cuối cùng để cuộc hội thoại ở trạng thái unanswered và bị cắt ngắn.
Việc hỏi riêng là điều khiến một mô hình cục bộ nhỏ dùng được: đóng vai một nhân vật và quyết định xem một mục tiêu đã đạt được hay chưa là hai nhiệm vụ khác nhau, và một mô hình được yêu cầu làm cả hai trong một câu trả lời thường tiếp tục trò chuyện sau khi mục tiêu đã đạt được, hoặc nói rằng nó sắp rời đi khi nó đã hài lòng.
Đo các cuộc hội thoại
Cuộc hội thoại là đơn vị: mỗi bộ đánh giá đưa ra một phán quyết cho mỗi cuộc hội thoại, nên mọi khoảng, phép so sánh và cổng đều áp dụng không thay đổi.
| Loại | Đạt khi |
|---|---|
| conversation_completed | hệ thống của bạn đã trả lời mọi tin nhắn |
| goal_reached | kiểm tra mục tiêu thấy mục tiêu đã đạt được |
| turns_to_goal | việc đó xảy ra trong phạm vi max_turns tin nhắn của người dùng |
| every_turn | mọi câu trả lời đều đáp ứng các điều kiện đã khai báo: những từ nó phải chứa hoặc không được chứa, một mẫu, một độ dài |
| conversation_judge | một giám khảo mô hình chấm toàn bộ bản ghi hội thoại cho nó đạt, khi đã được xác thực so với nhãn của con người |
Các lần lặp (replicates:) gặp những người dùng được gieo seed khác nhau, nên một nhân vật là nhiều cuộc hội thoại. Phiên bản của người dùng mô phỏng (mô hình, prompt, nhiệt độ và ngân sách của nó) là một phần của khóa bộ nhớ đệm của mỗi lần thực thi, nên một người dùng mô phỏng khác sẽ đo lại hệ thống của bạn.
Xác thực người dùng mô phỏng
Một kết quả trên người dùng mô phỏng chỉ áp dụng được cho người dùng thật trong chừng mực người dùng mô phỏng giống họ. Vì vậy mọi quy tắc trên một lần chạy có người dùng được mô phỏng đều là INSUFFICIENT_EVIDENCE với simulated_user_not_validated cho tới khi con người nhận thấy các cuộc hội thoại của nó là chân thực:
oloproof labels export RUN_ID --criterion simulated_user_realistic --sample 30 --local --out realism.csv
oloproof labels import realism.csv
oloproof simulated-users RUN_IDBảng tính hiển thị mỗi cuộc hội thoại được lấy mẫu cùng với nhân vật và cách nó kết thúc. Một người đánh dấu passed là có khi một khách hàng thật có thể đã viết phía người dùng và kết thúc nó ở đó, theo cách đó, điều này bao gồm cả kiểm tra mục tiêu: một cuộc hội thoại kết thúc với goal_reached khi mục tiêu chưa đạt được thì không chân thực. Người dùng mô phỏng được xác thực trên bộ kiểm thử khi cận dưới chính xác của tỷ lệ chân thực vượt qua minimum_simulated_user_realism trong release.yaml. Một cuộc hội thoại được lấy mẫu nhưng chưa được gán nhãn được tính là không chân thực, và một cuộc hội thoại chỉ chân thực khi mọi người đã gán nhãn nó đều nói như vậy.
Một lần xác thực bao gồm một phiên bản của một người dùng mô phỏng trên một bộ kiểm thử, bất kể nó đã trò chuyện với hệ thống nào, nên một ứng viên được đo với cùng các nhân vật được quyết định dựa trên nhãn của đường cơ sở. Một mô hình mới, một thiết lập prompt mới hay một tập nhân vật mới cần nhãn mới. Đặt require_validated_evaluators: false sẽ quyết định trên người dùng mô phỏng mà không cần chúng, một cách có chủ ý.
Mô phỏng bên cạnh thật
oloproof simulated-users RUN_ID --real REAL_RUN_ID đặt hình dạng của các cuộc hội thoại mô phỏng bên cạnh một lần chạy với các cuộc hội thoại thật (những cuộc trò chuyện đã ghi log được phát lại dưới dạng conversation/v1): người dùng đã gửi bao nhiêu tin nhắn, chúng dài bao nhiêu, các câu trả lời dài bao nhiêu, một cuộc hội thoại bị cắt ngắn thường xuyên đến đâu, và các cuộc hội thoại mô phỏng đã kết thúc thế nào. Phần này chỉ mang tính mô tả và không bao giờ quyết định: so sánh hai mẫu không ghép cặp cần một phương pháp mà Oloproof chưa chấp nhận. Hãy đọc nó để thấy những gì nhãn chân thực bỏ sót, chẳng hạn những người dùng mô phỏng viết trong một câu gọn gàng điều mà người dùng thật trải ra trên ba tin nhắn.
Không được hỗ trợ
- Quyết định trên người dùng mô phỏng trong một không gian làm việc được lưu trữ: các quyết định của nó vẫn bị giữ lại cho tới khi hàng đợi xem xét của nó có thể tự rút và niêm phong các nhãn chân thực.
- Một cổng dựa trên cách các cuộc hội thoại mô phỏng so với các cuộc hội thoại thật.
- Tỷ lệ cấp lượt bên trong một cuộc hội thoại, và phát lại một cuộc hội thoại từ một lượt.
- Người dùng mô phỏng cho một hệ thống HTTP: chính mã của hệ thống của bạn chạy vòng lặp, nên nó phải là một callable.