왜 지금 우리가 이해해야 하는지는 Responses API
Responses API는 2025년에 OpenAI가 홍보될 새로운 인터페이스 형태로, 이전에 분산되어 있던 채팅 완료, 기능 호출, 도구 사용을 통합하여 하나의 요청-응답 프로토콜로 통합합니다. 즉, 여전히 구형 API를 사용해 대화 기록을 조합하고 도구 호출 상태를 수동으로 관리한다면, 올해 하반기에 유지보수가 점점 어려워질 것입니다—새 SDK와 에이전트 SDK는 기본적으로 Responses API만 지원하고, 이전 버전은 이미 카운트다운 중입니다.
하지만 단순히 엔드포인트 URL만 교체하면 되는 것은 아닙니다. 마이그레이션 후 "대화 맥락 손실", "도구 호출 순서 장애", "타임아웃 응답 흡수" 같은 문제를 겪는 팀들을 너무 많이 봤습니다. 본질적으로 Responses API는 개발자들로부터 "명시적 상태 관리"의 일부를 빼앗아 갔습니다. 데이터 흐름을 이해하지 못하면 쉽게 함정에 빠질 수 있습니다.
진짜 사용자 여정: 질문에서 완전한 답변까지의 여정
더 잘 설명하기 위해, 전체 과정을 이해하기 위해 실제 상황을 사용해 봅시다: 한 사용자가 "어제 서버 로그를 확인해 주고 오류 유형을 요약해 주세요."라고 요청합니다.
1단계: 요청을 구성하고 사용자 컨텍스트를 전송합니다
"입력" 문자열과 사용 가능한 도구 목록(가능하다면)만 제공하면 됩니다. Responses API는 이 입력을 자동으로 내부 상태 컨텍스트에 배치하므로, 여러 라운드의 메시지 배열을 수동으로 연결할 필요가 없습니다. 예를 들어:
''json POST /v1/responses { "model": "gpt-4o", "input": "帮我查一下昨天的服务器日志,然后汇总错误类型", "tools": [{ "type": "function", "name": "query_logs", "description": "查询指定日期的服务器日志", "parameters": { ... } }] } '`
这里的关键区别:旧 API 需要你把“我”的历史消息都放在 messages 数组里,而 Responses API 只关心当前轮的输入,以及你是否开启 ]previous_response_id[ 来延续上下文。
第二步:模型决定调用工具
模型会返回一个 ]response[ 对象,其中 ]output[ 字段不再是简单的“assistant 消息”,而是一个数组,可能包含多个 ]function_call[ 和 ]content[ 块。例如:
'json
{
"id": "resp_abc123",
"output": [
{ "type": "function_call", "name": "query_logs", "arguments": "{"date":"2025-02-10"}" },
{ "type": "function_call", "name": "query_logs", "arguments": "{"date":"2025-02-11"}" }
]
}
'
请注意,这里一口气发起了两个工具调用(因为“昨天”可能跨日)。你需要并行执行这两个调用,然后把结果作为下一次请求的一部分返回。容易出错的地方是:很多开发者会像旧 API 那样只处理第一个 function_call,导致日志查询不完整。
第三步:把工具结果送回上下文
这是最容易失败的一步。你需要把工具的结果拼接成 상태: 완료됨[ 的 tool_call,然后通过 ]previous_response_id[ 关联到上一个响应,再次发出请求:
'json
POST /v1/responses
{
"model": "gpt-4o",
"previous_response_id": "resp_abc123",
"input": [
{ "type": "function_call_output", "call_id": "call_001", "output": "[...日志行...]" },
{ "type": "function_call_output", "call_id": "call_002", "output": "[...日志行...]" }
]
}
`'''
previous_response_id]를 설정하는 것을 잊으면 모델은 완전히 새로운 대화라고 생각하고 앞으로의 상황을 전혀 알지 못합니다. 이것이 반환 "문맥 손실" 오류의 근본 원인입니다.
4단계: 모델이 최종 답변을 생성하다
도구 결과를 얻은 후, 모델은 모든 정보를 종합하여 합산 오류 유형인 type: "message"]의 출력을 반환합니다.

실패와 오해가 가장 쉬운 영역
오해 1: 생각하는 Responses API은 맥락을 관리할 필요가 없다
이것이 가장 큰 오해입니다. API는 내부적으로 컨텍스트 상태를 유지하지만, 명시적으로 previous_response_id]를 전달해야 합니다. 다중 턴 대화 중에 이 ID를 유지하지 않으면, 모델은 항상 "첫 만남"이 됩니다.
오해 2: 병렬 도구를 호출할 때 첫 번째 도구만 처리됩니다
2단계에서 보았듯이, output 배열은 여러 function_call을 포함할 수 있습니다. 모든 호출에 응답해야 합니다; 그렇지 않으면 모델이 정체되거나 불완전한 답변을 반환하게 됩니다.
실패 시나리오: 타임아웃이 응답 손실을 유발함
Responses API의 기본 타임아웃은 30초입니다. 도구가 30초 이상 실행되면 API가 타임아웃 오류를 반환하고, 호출된 도구의 결과는 유지되지 않습니다. 이 시점에서는 전체 요청을 다시 시도하고 모델에 "이전 단계가 시간 초과됨"을 알려야 합니다.
백업 플랜: 채팅 완료 + 수동 상태 관리 후퇴
만약 도구의 호출 논리가 특히 복잡하거나(다중 턴 중첩) 지연 시간이 매우 높다면(<500ms), 채팅 완성 API를 이용해 메시지 배열을 수동으로 관리하는 것이 더 안정적인 선택일 수 있습니다. Responses API는 주로 일반 에이전트 시나리오를 단순화하기 위해 설계되었으며, 모든 시나리오에 적합하지는 않습니다.
지금 착륙하고 싶다면, 먼저 무엇을 해야 할까요?
- 공식 Responses API OpenAI 문서(2025년 2월판)를 읽어보세요.
previous_response_id및output구조에 중점을 두었습니다. - 개발 환경에서 가장 일반적으로 사용되는 단일 휠 툴 호출(예: "Check Weather")을 Chat Completions에서 Responses API로 이전하여 전체 과정을 완료하세요.
- 마이그레이션 전후의 지연 시간과 토큰 소비를 기록합니다. Responses API 입력에 더 이상 과거 메시지가 포함되지 않기 때문에 토큰 사용을 예측하기가 더 쉽습니다(하지만 토큰은 맥락 내에서 소비됩니다).
- 다중 도구 병렬 시나리오의 경우, 모든 function_call이 수집되고 반환되도록 간단한 루프를 작성합니다.
- 오류 재시도 로직 설정: 타임아웃이나 "컨텍스트 손실" 오류가 발생하면 최대 2회까지 재시도하고 롤백 계획을 고려하세요.
다음 행보: 체계적인 학습 지속
위 내용은 Responses API의 기본 사용법일 뿐입니다. 이 체인을 긴 대화 메모리, 다중 도구 오케스트레이션, 조건부 분기, 오류 복구와 같은 프로덕션 수준의 에이전트 서비스로 전환하고 싶다면, 보다 체계적인 방법론과 실제 사례가 필요합니다.

아직 댓글이 없습니다