특정 엔지니어링 시나리오
고객 서비스 에이전트를 개발 중이며 인텐트, 엔터티 및 응답 텍스트가 포함된 구조화된 JSON 응답을 출력하는 모델이 필요합니다. POST /v1/chat/completions을(를) 호출했지만 반환된 데이터는 항상 줄 바꿈, 들여쓰기 및 중복 키와 혼합되어 있습니다. 그것을 청소하려면 많은 규칙적인 규칙을 작성해야 합니다. 더 나쁜 것은 사용자의 진행 중인 대화에 외부 검색 도구를 추가하려는 경우 모델 출력과 도구에서 반환된 데이터가 함께 뭉쳐서 어떤 부분이 모델에 의해 생성되고 어떤 부분이 도구에 의해 반환되는지 알 수 없다는 것입니다.
문제의 본질은 다음과 같습니다. AI 모델의 출력에 표준화된 기계 판독 가능 컨테이너가 없습니다. 그리고 이 문제를 해결하기 위해 Responses API가 등장했습니다.
Responses API 정확히 무슨 뜻인가요?
Responses API은 일련의 규칙입니다. 이는 모델 출력이 명확한 메타데이터(예: 토큰 사용, 완료 이유, 도구 호출 기록)와 유형별로 구별되는 콘텐츠 블록(예: 텍스트 블록, 도구 호출 블록, 이미지 블록)을 포함하는 구조화된 응답 객체로 패키징되어야 함을 정의합니다. 이는 특정 HTTP 엔드포인트가 아니라 현재 Assistants API 및 Chat Completions API의 진화된 버전에서 OpenAI에 의해 주로 구동되고 부분적으로 Anthropic 호환 메시지 API 및 Cohere의 Chat API가 따르는 디자인 패턴입니다.
코드 수준에서 일반적인 Responses API 반환 구조는 다음과 같습니다.

{
"id": "resp_abc123",
"object": "response",
"created": 1712345678,
"model": "gpt-4-turbo",
"choices": [
{
"index": 0,
"finish_reason": "stop",
"message": {
"role": "assistant",
"content": [
{"type": "text", "text": "您好,请问有什么可以帮您?"},
{"type": "function_call", "name": "search_knowledge_base", "arguments": "{\"query\": \"退款流程\"}"}
]
}
}
],
"usage": {
"prompt_tokens": 100,
"completion_tokens": 50,
"total_tokens": 150
}
}
注意这里的 content 是一个数组,每种类型(文本、工具调用、图片等)都独立成块。这种设计使得你不再需要猜测模型输出里哪部分是自然语言、哪部分是工具触发器。
为什么 Responses API 突然成为热词
有三个推动力:
- 多模态输出的需求爆发。单一文本输出已经不够用了。模型同时返回文本和图片、文本和表格、文本和函数调用变得越来越常见。Responses API 通过 content 数组自然容纳了多种输出类型。
- Agent 工作流的标准化压力。当模型需要调用外部工具时,如何区分“模型自己的思考过程”和“工具返回的结果”成了痛点。Responses API 明确分离了模型消息和工具消息,使得 agent 循环更容易实现(例如 OpenAI 的
submit_tool_outputs)。 - 成本透明度要求。企业用户对 token 用量的精确核算需求强烈。Responses API 在每个响应里都包含准确的
usage데이터, 추가 계산이 필요하지 않습니다.
2023년에 Chat Completions API를 사용하여 간단한 챗봇을 작성했다면 아마도 출력 구조의 변화를 눈치채지 못했을 것입니다. 그 당시에는 모델이 텍스트만 반환했기 때문입니다. 그러나 오늘날 거의 모든 프로덕션급 AI 애플리케이션은 여러 콘텐츠 블록으로 응답하고 있습니다.

가장 흔히 오해를 받거나 잘못을 저지르는 곳
오해 1: Responses API = 스트리밍 API
이것이 가장 흔한 혼란입니다. 스트리밍 API(예: SSE)는 전송 방법이고 Responses API은 데이터 형식 정의입니다. 스트리밍은 Responses API 위에 구현될 수 있습니다. 예를 들어 콘텐츠 블록을 블록 단위로 반환합니다. 그러나 많은 개발자는 스트리밍을 활성화한 후 응답 개체를 수동으로 연결하려고 시도하며 그 결과 토큰 통계 또는 도구 호출 ID가 손실됩니다. 올바른 접근 방식: SDK에 내장된 스트리밍 구문 분석을 사용하고 청크 경계를 직접 처리하지 마세요.
오해 2: 모든 모델 제조사의 Responses API이 호환됩니다.
사실은 다양한 공급업체마다 콘텐츠 블록의 유형 이름 지정 및 메타데이터 필드에 차이가 있다는 것입니다. 예를 들어 OpenAI은 function_call을 사용하고, Anthropic은 tool_use를 사용하고, Cohere는 tool_calls를 사용합니다. 마이그레이션 중에는 적응 계층이 필요합니다. 일반적인 실패 시나리오는 OpenAI의 응답이 Anthropic의 에이전트 프레임워크로 직접 전달되어 도구 호출 구문 분석이 실패하는 것입니다.
오해 3: Responses API는 모든 출력 구문 분석 문제를 해결할 수 있습니다.
그렇지 않습니다. Responses API는 데이터 구조의 일치만을 보장할 뿐, 모델 출력이 스키마와 완전히 일치함을 보장하지는 않습니다. 예를 들어 JSON 형식을 요청하면 모델이 여전히 잘못된 문자를 반환할 수 있습니다. 이 시점에서는 여전히 추가 유효성 검사 계층(예: Pydantic 또는 Zod 구문 분석 + 오류 수정)이 필요합니다.
실제 함정 사례
팀이 Responses API으로 마이그레이션한 후 함수의 arguments 필드가 항상 잘리는 것을 발견했습니다. 조사 결과, HTTP 클라이언트의 JSON 크기 제한은 기본적으로 2MB로, 모델에서 반환된 도구 호출 매개변수(이미지 base64 포함)가 이 임계값을 초과한 것으로 나타났습니다. 해결 방법은 클라이언트의 max_payload_size 구성을 조정하고 응답 압축을 활성화하는 것입니다.
지금부터 연습을 시작하려면 가장 먼저 해야 할 일은 무엇인가요?
- 사용 중인 모델 버전이 Responses API을 지원하는지 확인하세요. OpenAI의 gpt-4-turbo-preview 이상, Anthropic의 claude-3 시리즈, Cohere의 command-r 시리즈는 모두 유사한 구조를 지원합니다. 최신 SDK 버전을 사용하세요.
- 실험 플래그를 활성화합니다(필요한 경우). Azure OpenAI와 같은 일부 플랫폼에서는 콘텐츠 블록을 활성화하려면
api-version매개 변수를 전달해야 합니다. - 파싱 로직을 다시 작성하세요. 이전에
choices[0].message.content문자열을 직접 가져왔다면 이제content배열을 순회하여type분기에 따라 처리해야 합니다. - 콘텐츠 블록 유형 확인을 추가합니다. 코드에서 열거형 유형(TextBlock, ToolCallBlock 등)을 정의하고 반환 유형을 가정하지 마세요.
- 단위 테스트를 추가하세요. 파서가 엣지 케이스(예: 빈 배열, 알 수 없는 유형)를 올바르게 처리하는지 확인하기 위해 다양한 유형에 대한 응답을 시뮬레이션합니다.
기본을 익힌 후 다음에는 어떤 엔지니어링 경로로 가야 할까요?
이제 Responses API이 모델 출력을 정규화하는 방법을 이해했으므로 다음 자연스러운 질문은 이를 기반으로 완전한 에이전트 워크플로를 구축하는 방법입니다. 구체적으로 다음을 포함합니다:
- 도구 오케스트레이션: 기능 정의를 모델이 인식할 수 있는 기능/도구 설명으로 변환하고 여러 도구 호출의 루프를 올바르게 처리하는 방법입니다.
- 컨텍스트 관리 및 메모리: 토큰 오버플로를 방지하기 위해 Responses API의
messages배열을 영구 세션으로 확장하는 방법입니다. - 평가 및 테스트: 도구 호출이 예상대로 실행되는지 확인하기 위해 다중 콘텐츠 블록 응답에 대한 어설션을 작성하는 방법.
- 비용 추적:
usage데이터를 기반으로 측정 시스템을 구축하여 사용자 또는 세션 수준에서 청구를 지원합니다.
이러한 지침이 작업의 병목 현상이라고 판단되면 "API 호출"에서 "AI 시스템 설계"로 전환할 준비가 된 것입니다.

아직 댓글이 없습니다