WEBBOOK CHAPTER

AI 에이전트가 사고 치기 전에: 16장. 선택 실습: OpenAI Responses API를 안전하게 연결한다

16장. 선택 실습: OpenAI Responses API를 안전하게 연결한다

API는 판정기가 아니라 구조화 어댑터다

이 장은 선택 실습이다. API 키가 없어도 앞 장의 모든 평가와 사고 재생을 완주했다. 이제 고객의 자유 문장을 구조화하는 단계만 모델로 바꾼다. 금액 비교, 정책 적용과 환불 권한은 기존 코드에 남긴다.

OpenAI Responses API는 텍스트·이미지·파일 입력과 도구 호출, 구조화된 출력을 한 응답 흐름에서 다룰 수 있다. 실제 요청 스키마와 지원 모델은 변할 수 있으므로 출간 시점에 공식 API 문서를 다시 확인한다. 기본 모델은 환경 변수로 선택한다.


export OPENAI_API_KEY="..."
export OPENAI_MODEL="gpt-5.6-sol"

키를 .env 파일이나 Git에 넣지 않는다. 팀 환경에서는 비밀 저장소와 짧은 권한을 사용한다.

최소 요청의 형태

다음 코드는 개념 예시다. 실제 제공 SDK 버전의 공식 예제를 우선한다.


const response = await fetch('https://api.openai.com/v1/responses', {
  method: 'POST',
  headers: {
    'content-type': 'application/json',
    authorization: `Bearer ${process.env.OPENAI_API_KEY}`
  },
  body: JSON.stringify({
    model: process.env.OPENAI_MODEL,
    store: false,
    instructions: '고객 설명을 reason과 evidence 후보로만 구조화한다.',
    input: customerText
  })
});

store:false는 공급자 저장과 조직의 전체 개인정보 의무를 동일시한다는 뜻이 아니다. 입력 최소화, 계약·보존 정책, 접근 통제와 지역 요구를 별도로 검토한다.

공급자 응답을 신뢰 경계 안으로 들이기

모델 출력은 곧바로 정책 엔진에 넣지 않는다. JSON 파싱, 허용 enum, 문자열 길이, 증거 ID 형식과 미지 값 처리를 검증한다. 모델이 만든 금액은 버리고 원 시스템 금액을 사용한다. 파싱 실패는 자동 승인으로 폴백하지 않고 manual_review 또는 재시도 예산 안의 한 번 재요청으로 보낸다.

모델 교체 실험

  1. 현재 모델·현재 프롬프트로 기준 평가를 저장한다.
  2. 모델만 바꾸고 같은 reasoning과 프롬프트로 평가한다.
  3. 품질이 유지되면 한 단계 낮은 reasoning을 별도 실험한다.
  4. 측정된 실패를 고치는 최소 프롬프트 수정만 적용한다.
  5. 구조 유효성, 도구 선택, 비용, 지연, 위험 승인을 함께 비교한다.

새 기능이나 더 높은 reasoning을 “최신이니까” 모든 요청에 켜지 않는다. 평가가 이득을 증명한 역할에만 적용한다.

완료 기준

  • 공급자 모델이 맡는 구조화 역할을 업무 판정과 분리했다.
  • 모델 출력 검증과 안전한 폴백을 정의했다.
  • 모델·프롬프트 변경을 한 축씩 평가하는 순서를 만들었다.