-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtest_judges.py
More file actions
145 lines (118 loc) · 4.72 KB
/
test_judges.py
File metadata and controls
145 lines (118 loc) · 4.72 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
"""
LLM Judge Configurations for Testing
Three different judge perspectives:
1. Conservative Judge - Prevents false positives (lower risk tolerance)
2. Balanced Judge - Balanced approach (moderate risk tolerance)
3. Aggressive Judge - Prevents false negatives (higher risk tolerance)
"""
from models import LLMJudge
def create_conservative_judge(db_session):
"""Create a risk-focused judge - evaluates risk assessment correctness."""
# Check if already exists
existing = db_session.query(LLMJudge).filter(
LLMJudge.node == "fraud_detection_risk_focused"
).first()
if existing:
return existing
judge = LLMJudge(
node="fraud_detection_risk_focused",
model="gpt-4o-mini",
temperature=0.0,
system_prompt="""You are a risk assessment expert evaluating fraud detection decisions.
Focus ONLY on: Does the decision correctly assess the risk factors?
Evaluate:
- Are high-risk factors (VPN, suspicious location, new user, etc.) properly weighted?
- Does the decision match the risk level implied by the transaction details?
- Would a risk analyst make the same decision?
Ignore: User experience, business rules, policy decisions.
Focus on: Technical risk assessment accuracy.""",
evaluation_criteria=[
"Do the risk factors support this decision?",
"Are suspicious patterns appropriately flagged?",
"Is the risk level correctly assessed?"
],
domain="fraud detection - risk assessment",
is_active=True
)
db_session.add(judge)
db_session.commit()
return judge
def create_balanced_judge(db_session):
"""Create a pattern-focused judge - evaluates pattern matching correctness."""
# Check if already exists
existing = db_session.query(LLMJudge).filter(
LLMJudge.node == "fraud_detection_pattern_focused"
).first()
if existing:
return existing
judge = LLMJudge(
node="fraud_detection_pattern_focused",
model="gpt-4o-mini",
temperature=0.1,
system_prompt="""You are a fraud pattern expert evaluating fraud detection decisions.
Focus ONLY on: Does the decision match known fraud patterns?
Evaluate:
- Does this transaction show patterns of known fraud schemes?
- Are legitimate transaction patterns being recognized?
- Does the decision match what fraud detection patterns suggest?
Ignore: Risk assessment, business rules, user experience.
Focus on: Pattern matching accuracy.""",
evaluation_criteria=[
"Does this match known fraud patterns?",
"Does this match legitimate transaction patterns?",
"Are pattern indicators correctly interpreted?"
],
domain="fraud detection - pattern matching",
is_active=True
)
db_session.add(judge)
db_session.commit()
return judge
def create_aggressive_judge(db_session):
"""Create a context-focused judge - evaluates contextual correctness."""
# Check if already exists
existing = db_session.query(LLMJudge).filter(
LLMJudge.node == "fraud_detection_context_focused"
).first()
if existing:
return existing
judge = LLMJudge(
node="fraud_detection_context_focused",
model="gpt-4o-mini",
temperature=0.2,
system_prompt="""You are a fraud context expert evaluating fraud detection decisions.
Focus ONLY on: Does the decision consider the full transaction context?
Evaluate:
- Does the decision account for user history and behavior?
- Is the transaction context (time, location, merchant) properly considered?
- Would this decision make sense given the complete picture?
Ignore: Risk factors in isolation, pattern matching alone.
Focus on: Contextual appropriateness.""",
evaluation_criteria=[
"Is user history properly considered?",
"Is transaction context appropriately used?",
"Does the decision fit the complete picture?"
],
domain="fraud detection - contextual analysis",
is_active=True
)
db_session.add(judge)
db_session.commit()
return judge
def create_all_judges(db_session):
"""Create all three judges for testing."""
return {
'risk_focused': create_conservative_judge(db_session),
'pattern_focused': create_balanced_judge(db_session),
'context_focused': create_aggressive_judge(db_session)
}
def get_judge_for_mode(mode: str, judges: dict):
"""Get the appropriate judge for a test mode."""
if mode == 'vanilla':
return judges['pattern_focused']
elif mode == 'offline_online':
return judges['risk_focused']
elif mode == 'online_only':
return judges['context_focused']
else:
return judges['pattern_focused']