Arda 개발 보고서
2026. 09. 29. github.com/Seuk-Team/Arda

팀 구성 및 역할 › 에이전트

에이전트 · 담당 박소연

버튼으로 안 되는 작업을 에이전트로 — 최종 합불은 항상 사람 · 2026. 09. 04. 인계 · 최종 갱신 2026. 09. 29.

담당 박소연 소연 D
소유 폴더 backend/app/agent/
스택 Claude APIPython SDK · 로컬 임베딩
기능 5축
확정 주체 사람최종 합불

1. 미션

버튼으로 안 되는 작업을 에이전트로 처리한다. 착수 시점에는 세 축 (이력서 추출 · 도구 호출 · RAG 보조)이었고, 그 뒤 결정 문서로 두 축이 더해져 지금은 다섯이다 — ① 이력서 비정형 → 정형 추출 ② 요약 → 평가 → 추천 3단 체인 기반 자동 서류 심사 ③ 도구 호출 에이전트 ④ RAG 시맨틱 검색 ⑤ AI 면접의 표정 · 음성 진위 판별과 서류 ↔ 발언 대조.

최종 합격 · 불합격 확정은 항상 사람이다. 2026. 09. 10. ADR-0034가 "확정은 사람"의 범위를 그 한 자리로 좁혔다 — 서류 점수와 그에 따른 단계 이동, 면접 점수는 아르가 판정하고, 사람이 손으로 바꾸면 그쪽이 항상 이긴다(단계를 사람이 바꾼 지원자는 이후 자동 판정에서 빠진다). 화면에서는 AI 제안이 앰버 점선, 사람이 확정한 것이 실선으로 계속 구분된다. 이것은 구현 편의가 아니라 채용이라는 도메인에서 되돌릴 수 없는 마지막 판단은 자동화하지 않겠다는 결정이다.

2. 범위

포함

  • 이력서 구조화 추출 — PDF · DOCX · HWP 텍스트 추출(텍스트 PDF만, 스캔본 제외 · HWP 실패 시 수동 폴백) → 경력 · 기술 · 학력 구조화 필드 + 담당자용 요약문
  • 접수 시 1회 생성 · 저장. 재생성은 명시적 버튼으로만
  • 자동 서류 심사 — 요약 → 평가 → 추천 3단 체인이 100점 만점 점수와 근거를 내고, 공고별 임계로 단계를 옮긴다. 자동을 끄는 공고 스위치와 사람의 수동 변경이 항상 우선한다
  • 도구 호출 에이전트 — 자연어 한 문장 → 검색 · 조회(읽기) / 단계 변경 · 면접관 배정 · 메일(쓰기) 순차 호출. 도구 13종 — 읽기 7 · 쓰기 6
  • 에이전트 API 라우터와 그 UI 스펙 (UI 구현은 프론트와 협업)
  • 음성 입력 — STT → 엔티티 해석 레이어 → 기존 텍스트 에이전트. POST /agent/stt 로 붙어 있다
  • RAG 시맨틱 검색 — 자기소개서 · 기술 임베딩 기반 의미 검색. "여유 시 보조"에서 정식 기능으로 올라왔다
  • AI 면접의 표정 · 음성 진위 판별 — 프레임 · 개별 판정은 저장하지 않고 세션 집계값만 남긴다. 함께 돌리는 서류 ↔ 발언 대조는 일치 / 불일치 / 확인필요 세 갈래로만 내고 양쪽 원문을 인용한다 — 점수를 만들지 않는다

제외

  • 최종 합격 · 불합격 자동 확정 — 영구 제외
  • 음성 대 음성 응답 · TTS
  • SNS 크롤링 · 3인 이상 다자 화상면접
  • 표정 분석 · 1:1 실시간 화상면접 — 착수 때는 제외였으나 2026. 09. 07. ADR-0029로 표정 · 음성 진위 판별을 도입하고, 09. 08.에 1:1은 한다로 뒤집었다. 지금은 둘 다 한다 — 진위 판별은 이 도메인, 1:1 화면은 프론트 · 앱 몫이다

부수효과가 있는 도구는 반드시 확인 단계를 거친다. "김도현을 불합격으로 옮길까요?"를 사람이 승인해야 실행된다. 게이트를 타는 것은 단계 변경 · 면접관 배정 · 일정 제안 · 메일 발송 · 지원서 접수 5종이고, 메일 초안만 빠진다 — 초안은 텍스트만 돌려주고 아무것도 바꾸지 않아서, 그것까지 확인 카드를 물리면 승인 한 번의 의미가 흐려진다. 되돌릴 수 없는 것은 발송이고 그쪽이 게이트를 지난다. 발송에서는 수신자가 지원자 본인으로 고정된다 — 도구가 주소를 인자로 받지 않는다.

3. 확정된 설계 결정

착수 전에 결정이 필요했던 3건. 모두 2026. 08. 25.에 확정됐다.

결정확정 내용
에이전트 UI 위치 혼합안 — 단축키 콘솔을 기본으로 두고, 확인 카드는 콘솔 안에, 요약은 지원자 상세 패널의 별도 블록에 둔다. 시안 3안을 만들 계획이었으나 결정이 먼저 나와 시안 작업이 불필요해졌다.
모델 · 비용 당시 확정은 도구 호출 claude-opus-5 · 요약 claude-haiku-4-5였다 — 도구 호출 정확도가 데모 품질을 좌우하므로 그쪽에만 상위 모델을 쓴다는 판단이었다(ADR-0011). 실제 운영은 채팅 · 요약 둘 다 claude-haiku-4-5다 — 코드 기본값이 그렇고(backends/anthropic_backend.py), ADR-0032도 "실제로 도는 것은 claude-haiku-4-5"라고 적는다. 도구 호출을 opus로 올린 기록은 문서에 없다. ADR-0011은 이 실제값에 맞춰 개정할 항목으로 남아 있다. 사용 모델명은 레코드(ai_summary_model)에 기록해 발표 때 근거로 제시한다.
음성 입력 위치 콘솔 전용 마이크. UI 위치 결정에 묶어 함께 확정했다.

비용 가드 — 더미 10만 건에 LLM 호출 금지

요약 1건이 haiku 단가로 약 $0.006이다(처음 계산 근거였던 opus 기준으로는 약 $0.03). 성능 검증용 더미 10만 건에 그대로 호출을 걸면 haiku로도 $550, opus였다면 $2,750짜리 사고가 된다 — 어느 모델이든 사고라서 가드가 모델 선택보다 중요하다. 더미의 요약 필드는 비워두거나 문장 은행에서 채운다. 여기에 더해 호출마다 토큰 사용량을 로깅하고, API 키는 환경변수로만 두어 코드와 로그에 남기지 않는다.

4. 인터페이스 계약

의존 — 도구가 호출할 대상인 백엔드 코어 API(검색 · 지원자 조회 · 단계 변경 · 평가)와 이력서 원문 접근 경로. 제공 — 지원서 접수 흐름이 호출할 요약 생성 함수, 그리고 에이전트 API.

에이전트 도구는 기존 REST를 서비스 레이어로 재사용한다 — 권한 검사를 우회하는 별도 경로를 만들지 않는다. 에이전트가 뒷문이 되면 역할 기반 접근 제어 전체가 무의미해지기 때문이다.

5. 주간 계획

에이전트는 초기 버전(09. 04.) 범위 밖이다. 아래 W1 · W2는 당시 오너 진수택의 기록이고 — 그 시점까지의 기여는 전환기 백엔드 분담과 UI · 모델 결정(ADR-0009 · 0011)이다 — 박소연은 W2 마지막 날인 09. 04.에 인계받았으므로 W3부터가 이 담당의 몫이다.

주차 마일스톤 내용 완료 기준
W108. 24. ~ 28. M1–M4 조기 완료 목업 · 추출 PoC · 에이전트 본체 · 설계 결정 4건 확정 · 확정안 목업 재작업 착수 · 프론트 지원 달성 M1부터 M4까지 코드가 W1 안에 끝났다. 목업 착수
W208. 31. ~ 09. 04. 목업 · 테스트 · 데모 확정안 목업 완성(확인 카드 · 동명이인 · 마이크) → 프론트 전달 · 테스트 정식 배치 · 전 구간 데모 시나리오 실행 목업 전달 완료, 테스트가 CI에서 통과, 4단계 시나리오 성공
W309. 07. ~ 11. 프롬프트 튜닝 · 폴리시 실호출 기반 프롬프트 개선 · 엣지 케이스 처리 · 토큰 비용 실측 갱신 프롬프트 2차 버전, 비용 실측치 기록
W409. 14. ~ 18. 음성 입력 STT + 엔티티 해석 레이어 — 이름 유사도 매칭 · 기술 용어 음차 정규화 · 한글 수사 → 숫자 음성 → 에이전트 연결 데모
W509. 21. ~ 25. 데모 동결 · 발표 데모 시나리오 최종 확인 · 발표 스토리 정리 —
버퍼09. 28. ~ 30. 동결 남은 이슈 처리. RAG는 여유 항목에서 빠졌다 — 시맨틱 검색으로 먼저 들어갔다 09. 30. 1차 완성. 음성이 들어가면 파괴적 명령은 음성에서도 확인 단계를 거친다

6. 품질 기준

전 마일스톤 공통으로 적용한다.

환각 가드 — 응답은 도구 결과만 인용한다

존재하지 않는 지원자나 수치를 만들어내면 그 시점에서 실패로 취급하고 프롬프트를 수정한다. 그럴듯한 답변을 성공으로 세지 않는다.

확정은 사람 — 점선에서 실선으로

화면에서 "AI 제안"(앰버 점선)과 "사람 확정"(실선)이 색과 선으로 구분되어 보이게 설계했고, AI 점수 박스에는 "확정은 담당자가 합니다"를 상시 표기한다. ADR-0034 이후 되돌릴 수 없는 최종 합격 · 불합격만 사람의 명시적 액션으로 확정되고, 그 앞 단계의 아르 판정은 사람이 언제든 덮어쓸 수 있다.

재현성 — 프롬프트는 코드다

프롬프트를 소스 트리 안에서 버전 관리하고, 호출마다 모델명과 토큰 사용량을 로깅한다. "그때는 됐는데"를 없애기 위한 조건이다.

7. 리스크 및 대응

리스크대응
코어 API가 늦으면 도구를 붙일 데가 없다 M1을 API와 무관한 작업(추출 PoC · UI 시안 · 프롬프트 설계)으로 구성했고, 전환기에 당시 에이전트 오너였던 진수택이 평가 API(E2)와 면접관 배정(E3)을 직접 만들어 선행을 스스로 풀었다. 이 도메인은 2026. 09. 04.에 박소연이 인계받았다.
표정 · 음성 진위 판별이 누군가에게 불리하게 작동할 수 있다 ADR-0029는 도입을 확정하면서 미결 세 가지를 문서에 남겨 뒀다 — ① 정확도 · 공정성 ② 지원자의 반박 경로 ③ 법 · 제도 대응. 분류기는 법정 영상 121 표본에 교차검증 76%라 "판정"이 아니라 일관성 신호다. 그래서 면접 점수에서 진위 몫을 30% 상한으로 묶고(ADR-0034), 화면 문구는 "진실 쪽에 가까움"까지만 쓴다. 미결이 풀리지 않으면 결과를 담당자에게 보이지 않고 면접 진행에만 쓰는 대안으로 돌아간다 — 그 자리는 이미 있다.
HWP 추출 불안정 처음부터 "실패 시 수동 입력 폴백"을 설계에 포함했다. 나중에 대응하는 예외가 아니라 정상 경로의 일부다.
비용 폭주 비용 가드 3종 — 더미 데이터 호출 금지 · 토큰 사용량 로깅 · 키의 환경변수 격리.

8. 발표 포인트

  • 도구 호출 에이전트 설계 — 한 문장이 검색 → 필터 → 상태 변경 → 문서 생성으로 분해되는 과정, 그리고 왜 쓰기 도구에만 확인 단계를 강제했는가.
  • 음성 인식 오류가 도구 호출로 전파되는 것을 어떻게 막았는가 — 엔티티 해석 레이어.
  • 왜 "버튼으로 되는 일"에 에이전트를 쓰지 않았는가 — 그리고 ADR-0034로 확정 지점을 최종 합불 한 자리로 좁힌 뒤에도 그 원칙이 어디에 남았는가를 자기 언어로.
← 팀 구성 및 역할