Communitygithub.com

StephenSook/attest

추측하지 않는 전화 에이전트. 의료 디렉토리 항목당 한 번의 공개된 확인 전화를 걸며, 모든 답변은 그대로 인용된 대본 구간을 인용하고, 조정 결과는 산술을 보여주며, 등각 게이트는 추측 대신 기권합니다. CALL-E 해커톤, 2026년 9월.

attest란 무엇인가요?

이 스킬은 AI 에이전트가 전화를 통해 조직에 대한 저장된 정보의 사실 여부를 확인할 수 있게 해줍니다. `verify-by-phone`은 레코드당 정확히 한 번의 공개된 CALL-E 전화를 걸고, 대본에서 그대로 인용된 구간과 함께 답변을 추출한 후, 투명한 일치 가중치 산술을 통해 저장된 레코드와 비교합니다. 최종 결과는 보정된 신뢰도 또는 명시적인 기권입니다. 이 스킬의 설계 목표는 에이전트가 불확실한 전화 응답을 확신 있는 데이터베이스 기록으로 변환하지 못하도록 하는 것입니다. 의료 제공자 디렉토리 확인, 비즈니스 기록 검증, 데이터 세트 갱신 등에 사용할 수 있으며, '알 수 없음' 결과를 정직하게 기록해야 하는 워크플로우에 적합합니다. 스킬은 스크립트를 통해 보정 임계값 설정, 전화 작업 생성, 결과 폴링, 답변 추출 및 레코드 조정 과정을 안내합니다.

지원 대상~Claude Code~Codex CLI~Cursor
npx skills add StephenSook/attest

즐겨 사용하는 AI에게 물어보기

이 에이전트 스킬이 미리 로드된 새 채팅을 엽니다.

문서

전화로 확인하기

에이전트가 조직에 대한 저장된 정보가 여전히 사실인지 확인해야 하고, 조직의 공개된 전화번호로 전화를 거는 것이 그 방법일 때 이 스킬을 사용하십시오.

verify-by-phone은 확인 워크플로우 스킬입니다. 레코드당 정확히 한 번의 공개된 CALL-E 전화를 걸고, 대본에서 그대로 인용된 구간과 함께 답변을 추출한 후, 투명한 일치 가중치 산술을 통해 저장된 레코드와 비교하고, 보정된 신뢰도 또는 명시적인 기권을 반환합니다. 설계 목표는 에이전트가 불확실한 전화 응답을 확신 있는 데이터베이스 기록으로 변환하지 않도록 하는 것입니다.

사용 시기

이 스킬을 다음 상황에 사용하십시오:

  • 제공자 디렉토리 목록 확인: 이 진료소가 실제로 존재하고, 연락이 가능하며, 신규 환자를 받고, 특정 보험 플랜을 수용하는지 확인
  • 저장된 비즈니스 기록(영업 시간, 서비스, 가용성)이 여전히 현실과 일치하는지 확인
  • 전화가 진실의 원천이고 기록이 오래된 것으로 의심되는 데이터 세트 갱신
  • '알 수 없음' 결과를 추측 대신 정직하게 기록해야 하는 워크플로우
  • 한 번에 하나의 레코드씩, 사람의 승인을 받은 수신자 목록으로 처리

사용하지 말아야 할 경우

이 스킬을 다음 용도로 사용하지 마십시오:

  • 미공개 또는 사칭 전화 걸기; 모든 전화는 자동 어시스턴트임을 밝히고 전화하는 이유를 같은 숨결에 알립니다
  • 무선 또는 개인 번호로 전화 걸기; 확인 대상은 공개된 조직 전화선입니다
  • 마케팅, 판매, 리드 생성 또는 홍보 아웃리치 실행
  • 레코드당 사람 승인 없이 목록에 일괄 다이얼하기
  • 통화 결과에서 직접 저장된 레코드 덮어쓰기; 출력은 증거가 포함된 판정이며, 쓰기 결정은 운영자에게 있습니다
  • 응답자가 제공하지 않은 답변 추측하기; 통화에서 사용 가능한 답변을 얻지 못하면 결과는 기권이며, 이것이 올바른 출력입니다

동의 및 공개 규칙

이는 단순한 형식이 아니라 핵심 규칙입니다:

  1. 통화는 AI 신원과 목적을 다른 어떤 것보다 먼저 함께 밝히며 시작하고, 통화가 녹음될 수 있음을 알립니다.
  2. 응답자가 자동 발신자와 대화하는 것을 거부하면, 통화는 감사 인사를 하고 즉시 종료됩니다. 결과는 거부를 확인 불가능한 결과로 기록합니다.
  3. 대기 시간이 제한됩니다. 응답자가 발신자에게 기다리라고 요청하면 잠시 기다렸다가 무기한 기다리지 않고 보고합니다.
  4. 에이전트는 통화 중이나 결과에서 제공받지 않은 정보를 절대 만들어내지 않습니다. 구체적으로: 진료소는 종종 발신자에게 이름, 생년월일, 보험 회원 또는 카드 번호, 방문 사유를 묻습니다. 에이전트는 해당 정보가 없다고 명확히 말합니다. 이것은 디렉토리 확인 통화이지 예약 요청이 아니기 때문이며, 그런 다음 전화로 하려고 했던 질문을 반복합니다. 자리 표시자는 발명입니다.
  5. 음성사서함은 답변이 아닙니다. 음성사서함이나 자동 응답기에 연결되면 통화는 메시지를 남기지 않고 즉시 종료됩니다. 녹음된 메시지로는 디렉토리 사실을 확인할 수 없으며, 아무도 자신의 전화선에서 로봇 메시지를 발견해서는 안 됩니다.
  6. 통화는 정보 확인 목적이며 홍보가 아닙니다. 모든 통화가 모든 당사자 동의 요구 사항에 따라 녹음된 것으로 취급하십시오.

확인 워크플로우

  1. 먼저 레이블이 지정된 시나리오 데이터로 scripts/calibrate.py를 사용하여 기권 임계값을 보정하십시오. '확신'이 측정 가능한 의미를 갖도록 합니다. 기본 수준에서 실제 답변은 예측 세트에 보류 데이터에서 적어도 90% 확률로 속합니다. 6단계에서 사용할 qhat을 출력합니다. 이 단계는 자격 증명 없이 통화 없이 실행되므로 다이얼링 전에 한 번 수행할 수 있습니다.
  2. 확인할 레코드를 수집합니다: 조직 이름, E.164 형식의 공개 전화번호, 그리고 확인할 주장(예: 신규 환자 수용 여부, 특정 플랜 수용 여부).
  3. 운영자가 이 특정 번호로의 이 특정 통화를 승인했는지 확인합니다.
  4. scripts/place_verify_call.py로 통화 작업을 만듭니다. 스크립트는 기본적으로 다이얼링 없이 정확한 작업과 수신자를 출력하는 드라이 런을 수행합니다. 드라이 런이 정상으로 보인 후에만 --live를 전달하십시오.
  5. scripts/poll_result.py로 최종 결과를 폴링합니다. 이 스크립트는 전체 페이로드를 로컬 파일에 저장합니다.
  6. 1단계의 scripts/extract_answer.py --qhat로 답변을 추출합니다. 추출된 모든 필드는 이를 뒷받침하는 그대로의 대본 구간과 문자 오프셋을 전달합니다. 애매한 답변('그런 것 같아요')은 감쇠된 신뢰 점수로 극성을 유지합니다. 응답이 없는 턴(잘못된 번호, 거부, '나중에 다시 전화하세요')은 절대 답변으로 간주되지 않습니다. 답변은 보정된 예측 세트가 단일 값이고 그 값이 'unknown'이 아닌 경우에만 제공됩니다. 그렇지 않으면 결과는 기권입니다. --qhat을 생략하면 모든 항목이 기권되고 출력에 uncalibrated 레이블이 지정됩니다. 그 이유는 보정이 없는 임계값은 아무것도 보장하지 않기 때문입니다.
  7. scripts/reconcile_record.py로 저장된 레코드와 조정합니다. 각 일치하는 필드는 문서화된 증거 비트를 추가하고, 각 일치하지 않는 필드는 이를 차감하며, 판정은 확인됨, 모순됨, 또는 확인 불가능입니다.

유지 관리 참고 사항

이 스킬의 스크립트는 Attest 백엔드(소스 저장소의 backend/app)에 있는 참조 구현의 독립적인 복사본입니다. 스킬이 해당 저장소에 대한 종속성 없이 설치될 수 있도록 의도적으로 작게 유지됩니다.

해당 복사본은 약속이 아닌 강제 사항입니다. 소스 저장소의 tests/test_skill_parity.py는 동일한 대본에 대해 이 스킬의 추출기와 백엔드의 추출기를 실행하고, 답변, 인용된 구간의 문자 오프셋 또는 신호 어휘 자체에서 불일치가 발생하면 실패합니다. 이 노트의 이전 버전에서는 사람이 수동으로 다시 동기화하도록 요청했지만, 복사본은 어쨌든 표류했습니다. 백엔드는 턴의 마지막 신호를 신뢰하고 'no problem'을 동의로 읽는 법을 배운 반면, 이 스크립트는 여전히 첫 번째 신호를 신뢰했기 때문에, 여기서는 'No, we are not'이라는 평범한 문장이 기권되었지만 백엔드에서는 답변되었습니다.

빠른 시작

pip install calle-ai

# 1. 먼저 게이트를 보정합니다. 5단계에 필요한 qhat을 출력합니다.
python3 scripts/calibrate.py --data references/sample-scenarios.jsonl --alpha 0.1

# 2. 드라이 런: 작업과 마스킹된 수신자를 출력하고, 다이얼링하지 않습니다.
python3 scripts/place_verify_call.py \
  --org "Example 상담 센터" \
  --phone "+15550101234" \
  --claim-accepting-new-patients yes \
  --claim-plan "Example Health PPO"

# 3. 실제로 전화를 겁니다(CALLE_API_KEY 필요).
python3 scripts/place_verify_call.py ... --live

# 4. 최종 페이로드를 기다립니다.
python3 scripts/poll_result.py --call-id call_abc123 --out result.json

# 5. 보정된 임계값으로 게이트된 구간 기반 답변을 추출합니다.
python3 scripts/extract_answer.py --payload result.json --qhat 0.750

# 6. 저장된 레코드와 조정합니다.
python3 scripts/reconcile_record.py --payload result.json \
  --claim-accepting-new-patients yes --claim-plan-accepted yes

이 스킬의 모든 샘플 번호는 예약된 가상 번호입니다. 드라이 런 경로와 번들 시나리오 데이터는 3단계를 제외한 모든 단계가 자격 증명 없이 실제 통화 없이 실행됨을 의미합니다.

출력 예시

extract_answer.py는 주장당 하나의 JSON 객체를 출력합니다:

{
  "claim": "accepting_new_patients",
  "answer": "yes",
  "trust_score": 0.9,
  "hedged": false,
  "span": {"turn": 6, "text": "Yep.", "char_start": 0, "char_end": 3},
  "abstain": false,
  "gate": "conformal(qhat=0.750)"
}

기권은 동일한 형태를 유지하며 "abstain": true를 갖습니다. 이는 보정된 예측 세트에 둘 이상의 레이블이 있거나 추출기가 전혀 답변을 찾지 못한 경우("answer": "unknown")입니다. gate 필드는 결정을 내린 임계값의 이름을 지정하며, --qhat이 제공되지 않은 경우 uncalibrated로 읽히는데, 이는 어떤 말이 오갔든 모든 주장이 기권되는 유일한 경우입니다. reconcile_record.py는 일치 가중치 산술과 판정을 추가합니다. 지원 구간 또는 명시적 기권 없이 어떤 필드도 나타나지 않습니다.

부작용 및 취소

  • 부작용: 운영자가 제공한 번호로 --live 호출당 정확히 한 번의 발신 전화가 있습니다. 재귀는 없으며 이 스킬에는 스케줄러가 없습니다.
  • 비용: 라이브 실행당 한 번의 과금 가능한 CALL-E 통화가 있습니다. 드라이 런은 무료입니다.
  • 취소: CALL-E는 통화 취소 기능을 제공하지 않으므로 중단할 시점은 --live 이전입니다. 이러한 이유로 드라이 런 기본값이 존재합니다.
  • 데이터: 페이로드는 운영자가 이름을 지정한 로컬 파일에 기록됩니다. 전화번호는 콘솔 출력에서 마스킹됩니다. 이 스킬에서 결과를 CALL-E API 자체 외부로 전송하는 것은 없습니다.

참고 자료

  • references/api-notes.md: 이 스킬이 의존하는 경험적으로 관찰된 CALL-E 페이로드 형태 및 API 동작. 여기에는 문서보다 테스트를 통해 발견된 사실이 포함됩니다.
  • references/verification-protocol.md: 전체 공개 스크립트, 발신 확인 전화에 대한 법적 입장, 그리고 기권이 핵심 설계 결정인 이유.
  • references/sample-scenarios.jsonl: scripts/calibrate.py에서 사용하는 레이블이 지정된 가상 시나리오 데이터로, 보정이 자격 증명 없이 통화 없이 실행될 수 있도록 합니다.

관련 스킬