Hướng dẫn
Agent và công cụ
Oloproof không điều khiển agent. Agent của bạn chạy vòng lặp riêng, gọi các công cụ riêng, và ghi lại những gì đã xảy ra dưới dạng một artifact agent_trajectory/v1. Mọi chỉ số agent đều được đọc ra từ bản ghi đó, nên bản ghi chính là toàn bộ phần tích hợp.
examples/support_agent/ là dự án mà trang này chạy: bốn mươi yêu cầu hoàn tiền, một agent tất định, và không cần thông tin xác thực của nhà cung cấp nào.
Ghi lại một quỹ đạo
Bên trong hệ thống, hãy dựng các bước khi chúng diễn ra và chuyển chúng cho bộ ghi của trường hợp:
from oloproof import AgentConstraintCheck, AgentStep, AgentTrajectory, current_case, system
@system(name="support-agent", version="slice-e-example", records=("agent_trajectory/v1",))
def run(case):
steps = []
for name, arguments in plan(case):
steps.append(AgentStep(index=len(steps) + 1, kind="tool_call", tool_name=name, arguments=arguments))
result = getattr(tools, name)(**arguments)
steps.append(AgentStep(index=len(steps) + 1, kind="tool_result", tool_name=name, result=result))
current_case().agent_trajectory(
AgentTrajectory(
steps=tuple(steps),
terminal_status="success" if refunded else "failure",
truncated=truncated,
step_limit=STEP_LIMIT if truncated else None,
constraints=(
AgentConstraintCheck(name="no_deletion", passed=deletion is None, step_index=...),
),
)
)
return {"answer": "refunded" if refunded else "unresolved"}Mỗi phần dùng để làm gì:
| Trường | Những gì nó ghi lại |
|---|---|
| AgentStep.kind | message, tool_call, tool_result, observation, decision hoặc final |
| AgentStep.tool_name, arguments, result | lời gọi và những gì trả về |
| terminal_status | success, failure hoặc unknown |
| truncated, step_limit | agent đã chạm giới hạn của nó và dấu vết dừng sớm |
| constraints | các kiểm tra mà môi trường của bạn đã thực hiện, mỗi kiểm tra kèm bước mà nó quan sát |
| checkpoints | các điểm mà một lần phát lại có thể tiếp tục từ đó, dưới dạng AgentCheckpoint |
Hệ thống khai báo rằng nó ghi lại quỹ đạo, trên decorator và trong oloproof.yaml:
system:
name: support-agent
version: slice-e-example
callable: app:run
records: [agent_trajectory/v1]Không có records:, các bộ đánh giá agent sẽ từ chối chạy thay vì tính mọi trường hợp là thiếu.
Một trường hợp khai báo những gì
Một trường hợp cần gọi các công cụ cụ thể, theo một thứ tự cụ thể, sẽ nêu điều đó dưới expected.tools:
{"id": "case_001", "input": {"order_id": "ord-002", "behaviour": "clean"}, "expected": {"answer": "refunded", "tools": ["lookup_order", "issue_refund"]}, "metadata": {"surface": "chat", "behaviour": "clean"}}expected.tools: [] cho biết trường hợp không mong đợi lời gọi công cụ nào, và được đánh giá theo đó. Bỏ khóa này đi nghĩa là việc chọn công cụ không áp dụng cho trường hợp: agent_tool_sequence và agent_no_undeclared_tool loại trừ nó với no_declared_tools. Nó rời khỏi mẫu số thay vì được tính là đạt, vì một tỷ lệ bị thổi phồng bằng các trường hợp chưa bao giờ được đo thì không phải là một tỷ lệ. Một giá trị không phải là danh sách tên công cụ sẽ bị từ chối trước lần chạy.
Các bộ đánh giá
evaluators:
- {type: contains, criterion: answer_correct, field: answer, expected_field: answer}
- {type: agent_tool_called, tool_name: lookup_order}
- {type: agent_no_tool_loop, max_repeats: 2}
- {type: agent_tool_sequence}
- {type: agent_constraints_satisfied, constraints: [no_deletion]}
- {type: agent_max_steps, max_steps: 10}
metrics:
- {id: steps_p95, type: quantile, source: agent_steps, quantile: 0.95}
- {id: tool_calls_p50, type: quantile, source: agent_tool_calls, quantile: 0.5}
slices: [metadata.surface, first_tool, repeated_action, "trajectory_length:4,8"]
min_slice_support: 3| Loại | Đạt khi | Nhận |
|---|---|---|
| agent_tool_called | công cụ được gọi ít nhất min_calls lần | tool_name, min_calls (mặc định 1) |
| agent_no_tool_loop | không có lời gọi giống hệt nào, cùng công cụ và cùng đối số, lặp lại quá max_repeats lần liên tiếp | max_repeats (mặc định 2) |
| agent_tool_sequence | các công cụ được gọi khớp với expected.tools | ordered (mặc định true) |
| agent_no_undeclared_tool | không có công cụ nào ngoài expected.tools được gọi | không có |
| agent_constraints_satisfied | mọi ràng buộc được nêu tên mà môi trường đã ghi lại đều đạt | constraints |
| agent_max_steps | dấu vết dùng nhiều nhất max_steps bước | max_steps |
agent_steps và agent_tool_calls là các phân phối đứng sau bộ đánh giá cuối cùng, dưới dạng chỉ số phân vị.
oloproof run│ answer_correct │ 82.5% │ [67.2%, 92.7%] │ 33 / 40 observed · 0 missing · 0 excluded │
│ agent_tool_lookup_order_called │ 100.0% │ [86.8%, 100.0%] │ 39 / 39 observed · 1 missing · 0 excluded │
│ agent_no_tool_loop │ 74.4% │ [56.1%, 87.4%] │ 29 / 39 observed · 1 missing · 0 excluded │
│ agent_tool_sequence │ 60.0% │ [43.3%, 75.2%] │ 24 / 40 observed · 0 missing · 0 excluded │
│ agent_constraints_satisfied │ 92.5% │ [79.6%, 98.5%] │ 37 / 40 observed · 0 missing · 0 excluded │
│ agent_steps_le_10 │ 97.5% │ [86.8%, 100.0%] │ 39 / 40 observed · 0 missing · 0 excluded │
│ steps_p95 │ 10 steps │ [10, no bound] steps │ p95 of 39 observed · 1 missing · 0 excluded │
│ tool_calls_p50 │ 2 calls │ [2, 3] calls │ p50 of 39 observed · 1 missing · 0 excluded ││ no-deletion │ agent_constraints_satisfied │ FAIL │ observed_failures_exceed_limit │Một ràng buộc làm cổng như mọi tiêu chí khác. no-deletion là một quy tắc số đếm quan sát với max_failures: 0: ba trường hợp đã gọi delete_customer, và "điều này không được xảy ra trong bộ kiểm thử mà chúng ta đã chạy" không cần khoảng tin cậy để quyết định.
Một dấu vết dừng sớm
Một trường hợp chạm giới hạn số bước của agent, nên dấu vết của nó được ghi là truncated. Mọi số đếm trên một dấu vết bị cắt cụt đều là cận dưới, và một cận dưới giải quyết được một số câu hỏi nhưng không giải quyết được các câu hỏi khác:
| Tiêu chí | Trường hợp bị cắt cụt | Lý do |
|---|---|---|
| agent_steps_le_10 | thất bại | các bước đã ghi lại đã chứng minh giới hạn mười bước bị vượt |
| agent_tool_lookup_order_called | thiếu | lời gọi có thể nằm trong phần không được ghi lại |
| agent_no_tool_loop | thiếu | một lần lặp chạm tới cuối dấu vết có thể tiếp diễn sau đó |
| steps_p95, tool_calls_p50 | thiếu | một phân vị trên các cận dưới không phải là một phân vị |
Thiếu chứ không phải bị loại trừ: trường hợp vẫn nằm trong mẫu số dù không được quan sát, và khoảng tin cậy cho phép nó nghiêng về bất kỳ phía nào. Đó là lý do agent_tool_lookup_order_called cho kết quả [86.8%, 100.0%] trên 39 trường hợp được quan sát thay vì khoảng hẹp hơn mà chỉ riêng 39 trường hợp sẽ cho.
Lát cắt trên quỹ đạo
first_tool nhóm các trường hợp theo công cụ mà agent tìm tới đầu tiên, bất kể lần chạy đã gọi những công cụ nào. repeated_action tách các trường hợp đã lặp lại một lời gọi giống hệt khỏi các trường hợp không lặp lại. trajectory_length:4,8 chia nhóm các trường hợp thành 1-4, 5-8 và 9 bước trở lên, theo các mốc bạn khai báo vì một ranh giới nhóm làm thay đổi điều mà lát cắt cho biết.
│ first_tool=search │ agent_no_tool_loop │ 0.0% │ [0.0%, 57.9%] │ 0 / 6 observed · 1 missing · 0 excluded · │
│ first_tool=search │ agent_tool_sequence │ 0.0% │ [0.0%, 41.0%] │ 0 / 7 observed · 0 missing · 0 excluded · │
│ repeated_action=false │ answer_correct │ 93.1% │ [77.2%, 99.2%] │ 27 / 29 observed · 0 missing · 0 excluded · │
│ repeated_action=true │ answer_correct │ 60.0% │ [26.2%, 87.9%] │ 6 / 10 observed · 0 missing · 0 excluded · │Một vòng lặp là một tín hiệu, không phải một lời giải thích. Không gì trong đầu ra nói rằng một lời gọi lặp lại là lý do một trường hợp thất bại; chỉ một lần phát lại đã loại bỏ nó mới có thể nói điều đó.
Nhiều agent
examples/triage_agents/ chạy một nhóm ba agent: triage chuyển mỗi yêu cầu cho billing hoặc tech, và một khoản hoàn tiền mà billing không được phép thực hiện sẽ được chuyển cho một người. Trong một hệ thống nhiều agent, mỗi bước nêu tên agent đã thực hiện nó, và việc chuyển quyền điều khiển là một bước handoff:
steps.append(AgentStep(index=1, kind="message", agent="triage", arguments={"request": request}))
steps.append(AgentStep(index=2, kind="handoff", agent="triage", to_agent="billing"))
steps.append(AgentStep(index=3, kind="tool_call", agent="billing", tool_name="lookup_order"))Một quỹ đạo nêu tên agent ở mọi bước hoặc không ở bước nào. Một bản ghi chỉ nêu tên ở một số bước sẽ bị từ chối, và một bản ghi không nêu tên ở bước nào sẽ bị tính là thiếu với mọi tiêu chí dưới đây thay vì đạt. Một bước chuyển giao là tùy chọn, vì quyền điều khiển cũng đổi chủ khi bước tiếp theo được thực hiện bởi một agent khác. Đó là cách một dấu vết ghi lại việc chuyển giao cho một agent không thực hiện bước nào, chẳng hạn một người.
Một trường hợp khai báo các agent mà nó cần đi qua dưới expected.route:
{"id": "case_012", "input": {"topic": "billing", "request": "I was charged twice for order ord-012", "order_id": "ord-012", "behaviour": "escalated"}, "expected": {"answer": "escalated", "route": ["triage", "billing", "person"]}, "metadata": {"topic": "billing", "behaviour": "escalated"}}evaluators:
- {type: contains, criterion: answer_correct, field: answer, expected_field: answer}
- {type: agent_route}
- type: agent_tool_permissions
permissions:
triage: []
billing: [lookup_order, issue_refund]
tech: [search_kb]
- {type: agent_max_handoffs, max_handoffs: 2}
slices: [route]| Loại | Đạt khi | Nhận |
|---|---|---|
| agent_route | các agent đã giữ quyền điều khiển, sau khi gộp các lần lặp, khớp với expected.route của trường hợp | không có |
| agent_tool_permissions | mọi lời gọi công cụ đều do một agent mà bảng ánh xạ cho phép gọi công cụ đó thực hiện | permissions |
| agent_max_handoffs | quyền điều khiển đổi chủ nhiều nhất max_handoffs lần | max_handoffs |
Tuyến bao gồm bên nhận của một lần chuyển giao, nên một dấu vết kết thúc bằng việc chuyển lên một người sẽ có tuyến tới người đó. Một trường hợp không có expected.route không được agent_route tính. Bảng ánh xạ quyền là đóng: một agent không có trong danh sách thì không được gọi công cụ nào.
│ answer_correct │ 96.7% │ [82.7%, 100.0%] │ 29 / 30 observed · 0 missing · 0 excluded │
│ agent_route │ 86.7% │ [69.2%, 96.3%] │ 26 / 30 observed · 0 missing · 0 excluded │
│ agent_tool_permissions │ 93.1% │ [73.4%, 99.2%] │ 27 / 29 observed · 1 missing · 0 excluded │
│ agent_handoffs_le_2 │ 86.7% │ [69.2%, 96.3%] │ 26 / 30 observed · 0 missing · 0 excluded │Trong hai yêu cầu, tech đã thực hiện hoàn tiền. Cả hai đều đạt answer_correct và thất bại agent_tool_permissions: khách hàng nhận được câu trả lời đúng từ một hệ thống đã vi phạm chính các quyền của nó. Một yêu cầu bị chuyển qua lại giữa billing và tech cho tới giới hạn của vòng lặp. Dấu vết của nó bị cắt cụt, nên nó thất bại ở tuyến và ở giới hạn chuyển giao, những điều mà phần đầu của nó đã đủ để kết luận, và bị tính là thiếu ở quyền, điều mà phần đầu đó không kết luận được.
route nhóm các trường hợp theo tuyến mà các agent của chúng đã đi, viết là triage>billing. Một dấu vết bị cắt cụt không thuộc nhóm tuyến nào, vì tuyến của nó chỉ là tiền tố của bất cứ nơi nào các agent của nó đi tiếp.
Không gì trong đầu ra nói agent nào có lỗi. Một điểm phân kỳ tuyến cho biết nơi hai tuyến tách nhau. Việc một agent gây ra thất bại là một tuyên bố về điều lẽ ra đã xảy ra nếu nó hành động khác đi, điều mà chỉ một lần phát lại thay thế agent đó mới có thể cho thấy, và Oloproof không chạy lần phát lại như vậy.
Tiếp theo
- Ghi lại những gì một hệ thống đã làm trình bày các artifact có kiểu khác.
- Lát cắt trình bày độ hỗ trợ của lát cắt và lý do lát cắt không bao giờ làm cổng.