Jev는 결정이 아닌 확률을 제공합니다
요약
Jev는 기존 LLM처럼 텍스트를 생성하는 대신, 빠르고 구조화된 '타입 지정 결정(typed decision)'을 확률과 신뢰도 점수와 함께 반환하는 새로운 AI 모델입니다. 이는 스크립트나 워크플로우에서 직접 시그널로 활용 가능하여 개발 효율성을 높입니다. Jev는 상태(State)를 문자열, JSON 객체, 배열 세 가지 형식으로 입력받아 평가합니다.
핵심 포인트
- Jev는 텍스트 생성 대신 구조화된 결정(typed decision)을 반환하는 AI 모델이다.
- 결정은 확률과 신뢰도 점수를 포함하여 스크립트에서 직접 사용 가능하다.
- 입력 상태(State)는 문자열, JSON 객체, 배열 세 가지 형식을 지원한다.
- 비용 모델이 입력에 대해서만 부과되며 출력은 무료이다.
이전 게시물(https://dev.to/omiossec/decision-model-in-action-jev-in-cloud-operation-with-powershell-367c)에서 저는 Jev를 클라우드 엔지니어링 시나리오에 사용하는 방법을 보여주었습니다: NSG 규칙 필터링, Bicep what-if 출력 확인, Azure Policy 린팅. 하지만 작동 원리는 설명하지 않았습니다. 이 게시물에서는 Jev의 개념과 그 배경이 되는 사고 모델을 다룹니다. 예제는 여전히 PowerShell과 Azure를 사용하지만, 아이디어 자체는 모든 언어와 모든 시나리오에 적용 가능합니다.
저는 Doug Finke의 Jev PowerShell 모듈을 사용했지만, 어떤 언어를 사용해도 됩니다.
원리
TypeSafe는 Jev의 개발사로, 심리학자 Daniel Kahneman의 베스트셀러 『생각에 관한 생각 (Thinking, Fast and Slow)』에서 영감을 받았습니다. Kahneman은 두 가지 사고 시스템을 설명합니다. System 1은 빠르고 본능적이며, 2 + 2를 답하는 것과 같습니다. System 2는 느리고 노력하며 논리적인데, 페이지에 알파벳 'a'가 몇 번 나타나는지 세는 것과 같습니다.
Jev는 System 1 아이디어에 기반을 두고 있습니다. 이는 새로운 유형의 AI 모델입니다: 텍스트를 생성하는 것이 아니라 빠르고 구조화된 결정을 내립니다. LLM은 텍스트를 받아 텍스트를 반환하고, 사용자는 이를 파싱해야 합니다. Jev는 텍스트를 받아 확률과 신뢰도 점수가 포함된 타입이 지정된 결정(typed decision)을 반환하며, 이는 스크립트, 프로그램 또는 워크플로우에서 직접 시그널로 사용할 수 있습니다.
비용 모델 또한 다릅니다. 입력에 대해서만 비용을 지불합니다: 10억 토큰당 $42, 즉 백만 토큰당 $0.042입니다. 출력은 항상 작기 때문에 무료입니다. TypeSafe는 또한 응답 시간이 70ms에서 500ms 사이라고 주장합니다(네트워크 왕복 시간은 추가해야 합니다). 제가 테스트했을 때 일관성이 있었습니다.
모든 Jev 호출은 평가할 상태 또는 컨텍스트와 그 상태에 대한 질문이라는 두 가지 입력을 사용합니다.
상태: 컨텍스트
상태(State)는 Jev를 사용하여 평가하려는 컨텍스트입니다. 메시지, 로그 또는 애플리케이션 출력이 될 수 있습니다.
Jev는 세 가지 형식을 지원합니다: 문자열(string), JSON 객체(JSON object), 또는 배열(array).
문자열: 고객이 데이터베이스 연결 문제로 인해 차단되었습니다.
`JSON 객체
{
"securityRules": [
{
"name": "allow-https",
"properties": {
"description": "웹사이트의 공개 HTTPS. 소유자: 웹팀",
"protocol": "Tcp", "sourcePortRange": "*", "destinationPortRange": "443",
"sourceAddressPrefix": "Internet", "destinationAddressPrefix": "*",
"access": "Allow", "priority": 100, "direction": "Inbound",
"sourcePortRanges": [], "destinationPortRanges": [], "sourceAddressPrefixes": [], "destinationAddressPrefixes": []
}
}
}
배열:
["Inbound", "Allow", "HTTPS"]
간단한 작업의 경우 문자열을 사용하고, 가능하다면 JSON 객체를 사용하는 것이 권장됩니다.
상태(state)는 질문(question)이 아니라 데이터를 포함합니다. 기회가 될 때 정리하세요: 결정에 중요하지 않은 빈 필드, ID 및 타임스탬프를 제거하세요. 토큰을 절약할 수 있고 모델은 더 명확한 신호를 받습니다. 컨텍스트 창은 32k 토큰으로 제한되어 있으며, 비영어 텍스트는 정확도가 떨어집니다.
질문(Questions): 세 가지 기본 요소
Jev 요청은 상태를 하나 이상의 질문과 평가합니다. 각 질문은 독립적으로 평가됩니다.
질문에는 Score, Noul, Choice의 3가지 유형이 있습니다.
Score
Score 질문은 가장 낮은 수준부터 가장 높은 수준까지 순서가 지정된 2개에서 10개의 설명적 레벨에 따라 상태를 등급 매깁니다. 이 레벨들이 기준(criteria)입니다.
$question = New-JevQuestion -Name risk -Type Score
-Instructions 'whatif에서 변경 사항을 배포하는 것이 얼마나 위험한가?'
-Criteria @('위험 없음: 미관적이거나 읽기 전용 속성 변경')
'낮음: 새로운 격리된 리소스'
'중간: 공유 네트워크 리소스(VNet, 피어링, 라우트 테이블) 변경'
'높음: 서비스 중단 또는 보안 사고가 예상됨')
결과를 얻는 방법:
`powershell $result = Invoke-Jev -State $summary -Question $question $result.answers.risk | convertTo-Json -Compress -Depth 10 `
위험(risk) 객체은 다음과 같습니다.
{ "type":"score", "score":2.49, "confidence":0.5,
"legend":{
"0":"No risk: cosmetic or read-only property changes",
"1":"Low: new isolated resources",
"2":"Medium: changes to shared network resources (VNets, peerings, route tables)",
"3":"High: an outage or a security incident is likely"
},
"probabilities":{
"0":0.0,
"1":0.01,
"2":0.5,
"3":0.49
}
} ```
- `type`은 질문의 유형입니다.
- `score`는 레벨(level)의 확률 가중 평균값으로, 여기서는 Medium과 High 사이의 2.49입니다.
- `legend`는 각 레벨과 그에 대한 설명입니다.
- `probabilities`는 각 레벨에 대한 확률이며, 모든 확률의 합은 1과 같습니다.
- `confidence`는 확률이 얼마나 집중되어 있는지를 나타내는 0과 1 사이의 숫자입니다.
예시에서 High와 Medium의 확률이 비슷하고 confidence가 0.5입니다. 이는 Medium(2)와 High(3) 사이의 동전 던지기와 같아서, 모델이 판단할 수 없으며 사람이 확인해야 합니다. 이것은 'medium-high' 위험도가 아닙니다.
### Noul
A Noul 질문은 예/아니오 질문을 하고 답변이 '예'일 확률을 반환합니다. 기준(criteria)은 선택 사항이지만, 설정할 경우 참(true)과 거짓(false) 모두를 설명해야 합니다.
```powershell
$feedback = [pscustomobject] @{
message = 'The customer is blocked by a connection issue to the database.'}
# 질문의 기준을 정의합니다
$question = New-JevQuestion -Name noulquestion -Type Noul` -Instructions 'Does the report give steps that would reproduce a defect?'`
-Criteria @{
true = 'The report describes a defect and gives concrete steps to reproduce it.'
false = 'The report does not give concrete steps to reproduce a defect.'}
# 현재 상태로 질문을 실행합니다
$result = Invoke-Jev -State $feedback -Question $question
$result.answers.noulquestion
결과:
`json { "type":"noul", "noul":0.05 } `
- 질문의 유형; noul
noul속성: 답변이 참일 확률입니다.
noul 속성은 질문에 대한 답변이 참일 확률을 제공합니다. 거짓일 확률은 단순히 1 − noul입니다.
선택지 (Choice)
선택지(Choice) 질문은 2개에서 255개의 옵션 중 하나를 선택하게 합니다. 기준은 해시테이블(hashtable)이며, 각 키는 옵션 이름이고 각 값은 해당 옵션을 설명합니다.
명령어(instruction)는 모델을 위한 질문입니다. 그리고 기준(criteria)은 맵 배열(array of map)입니다. 명확하지 않은 옵션(unclear option)을 추가하여 모델이 빠져나갈 방법을 제공해야 합니다. 이것이 없으면, 어떤 것도 적합하지 않더라도 팀을 선택해야만 합니다.
`powershell
$criteria = @{
support = '기술 지원이 필요한 문제입니다.'
sales = '판매와 관련된 문제입니다.'
unclear = '어떤 팀이 이 문제를 처리해야 할지 불분명합니다.'
}
기준을 기반으로 질문 생성
$question = New-JevQuestion -Name TeamRouting -Type Choice -Instructions '어떤 팀이 이것을 처리해야 하나요?' -Criteria $criteria
현재 상태로 질문 호출
$result = Invoke-Jev -State $feedback -Question $question
질문 결과 확인
$result.answers.TeamRouting
`
결과:
`json { "type":"choice", "choice":"support", "confidence":1.0, "probabilities":{ "support":1.0, "unclear":0.0, "sales":0.0 } } `
- Type은 질문의 유형입니다.
- Choice는 선택된 옵션을 제공합니다.
- Confidence는 0과 1 사이의 숫자로, 다양한 옵션에 확률이 얼마나 분산되어 있는지를 나타냅니다. 1.0은 모든 확률이 하나의 옵션에 있다는 것을 의미하며, 낮은 값일수록 여러 옵션에 걸쳐 분산되어 있음을 의미합니다.
- 다양한 옵션에 대한 확률의 합은 항상 1과 같습니다.
확률(Probability), 신뢰도(confidence) 및 보정(calibration)
Jev는 실제로 결정(decision)을 제공하지 않습니다. 확률을 제공하며, 이를 결정으로 바꾸는 것은 사용자의 역할입니다.
각 질문 유형마다 확률이 있고, 신뢰도(confidence)가 있습니다. 확률은 모델이 각 옵션이나 수준을 얼마나 가능성 있게 생각하는지를 알려줍니다. 가능한 답변들 사이의 분포와 집중도 역시 중요합니다. 이것이 바로 신뢰도가 계산되는 방식입니다.
만약 확률이 하나의 옵션에 집중되어 있다면. 예를 들어 a=0.9, b=0.06, c=0.04라고 가정해 봅시다. 모든 확률이 옵션 a에 몰려 있으므로 모델은 확신합니다.
여러 옵션에 걸쳐 분산되어 있다면, a=0.4, b=0.33, c=0.27과 같습니다. 명확한 승자가 없으므로 모델은 불확실합니다.
'noul' 질문 유형은 확신도(confidence)를 반환하는 것이 아니라, 정답일 확률만을 반환합니다. 하지만 다음 공식을 통해 계산할 수 있습니다:
Confidence = | 2p – 1|
여기서 p는 '예(yes)' 답변의 확률입니다.
- 만약 p = 0.05라면, 확신도는 0.9가 됩니다. 이는 응답이 높은 확신도로 거짓임을 의미합니다.
- 만약 p = 0.95라면, 확신도는 0.9이며, 정답일 확률에 대한 확신도가 높다는 것을 의미합니다.
- 만약 p = 0.4라면, 확신도는 0.2가 됩니다. 이 경우 옵션을 선택할 수 있으며 인간의 개입이 필요합니다.
질문에 대한 답변은 '무엇(The What)'을 알려주고, 확신도(confidence)는 그것으로 어떻게 행동해야 하는지 알려줍니다.
확신도가 0.9 이상이라면 자동화해야 하며, 0.9에서 0.5 사이라면 확인이 필요하고, 0.5 미만이라면 인간의 조사가 필요합니다.
이는 TypeSafe의 권장 사항입니다. 하지만 사용자의 데이터로 자체적인 임계값(threshold)을 설정해야 합니다.
데이터 세트를 가져와서 정답을 알고 있는 30개에서 60개의 다양한 상태를 만들고 테스트를 실행해야 합니다.
정답에 대한 평균 확신도가 임계값을 제공하지 않습니다. 대신, 결과를 확신도별로 정렬하여 정확도가 목표치(예: 85%)에 도달하는 가장 낮은 확신도를 찾으십시오. 이것이 바로 자동화 임계값입니다.
좋은 질문 작성하기
Jev를 최대한 활용할 수 있는 또 다른 방법은 좋은 질문을 만드는 방법을 아는 것입니다. 질문은 LLM(대규모 언어 모델) 세계에서 프롬프트와 같습니다.
몇 가지 패턴이 있습니다:
질문은 원자적(atomic)이어야 합니다. 질문당 하나의 관심사만 다루어야 합니다. 예를 들어,
Jev를 사용하여 스크립트가 쉽게 가질 수 있는 답변을 얻으려고 하지 마세요. 결정론적(deterministic)이라면 코드에 그대로 유지하세요. '포트 22가 인터넷에 열려 있나요?'는 스크립트 검사입니다. '이 규칙의 설명이 소유자를 식별하나요?'는 Jev 질문입니다.
기준(Criteria)이 실제 프롬프트이며, 상태(State)가 데이터입니다. 모호하고 애매한 기준을 피하세요. 다음 옵션들을 살펴보세요: '높음: 위험함' 대 '높음: 서비스 중단 또는 보안 사고'는 너무 모호할 가능성이 높습니다. 선택지(Choice)의 경우, 옵션들이 겹치지 않아야 합니다 (예: '기술 지원'과 'IT 지원').
Jev는 한 번의 호출로 배치 질문을 처리하여 병렬 검사를 수행할 수 있습니다.
예시:
$questions = @(
New-JevYesNoQuestion -Name security`-Question 'whatif에서 변경 사항이 환경의 보안을 약화시키나요?'`
-TrueCriteria 'VM에 비밀번호 로그인이 활성화됨, NIC 또는 서브넷에 NSG가 없음, 제거되거나 완화된 보안 설정'
-FalseCriteria '보안 설정이 변경되지 않았거나 더 강력함'
New-JevYesNoQuestion -Name public_ip `
-Question 'whatif에서 리소스를 공용 IP로 인터넷에 노출시키나요?' `
-TrueCriteria '공용 IP 주소가 NIC, VM 또는 로드 밸런서에 생성되거나 연결됨' `
...
)
$state = @{ whatif = $summary -join "`n" }
$answers = (Invoke-Jev -State $state -Question $questions -Mock:$Mock -Raw).answers
## 결론
...
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기