For the complete documentation index, see llms.txt. Markdown versions of documentation pages are available by appending .md to the page URL.
기본 탐색 메뉴
Theme

대화 상태

모델과 대화할 때 대화 상태를 관리하는 방법을 알아보세요.

대화에서 여러 차례 메시지를 주고받는 동안 정보를 유지하려면 대화 상태를 관리해야 합니다. OpenAI는 이를 위한 몇 가지 방법을 제공합니다.

GPT-5.5가 중간 진행 상황을 최종 답변으로 처리한다면, API 연동 코드에서 어시스턴트 메시지의 phase 필드를 올바르게 보존하는지 확인하세요. 자세한 내용은 phase 매개변수를 참고하세요.

대화 상태를 직접 관리하기

텍스트 생성 요청은 각각 독립적이며 상태를 유지하지 않습니다. 그래도 요청 매개변수에 이전 메시지를 함께 전달하면 여러 턴에 걸친 대화를 구현할 수 있습니다. 문을 두드리는 소리로 시작해 서로 말을 주고받는 농담을 예로 들어 보겠습니다.

이전 대화 직접 구성하기
from openai import OpenAI

client = OpenAI()

response = client.responses.create(
    model="gpt-6-astra",
    input=[
        {"role": "user", "content": "knock knock."},
        {"role": "assistant", "content": "Who's there?"},
        {"role": "user", "content": "Orange."},
    ],
)

print(response.output_text)

user 메시지와 assistant 메시지를 번갈아 배치하면 모델에 보내는 요청 하나에 이전 대화 상태를 담을 수 있습니다.

모델이 응답을 생성할 때마다 컨텍스트를 직접 전달하려면 이전 응답의 출력을 다음 요청의 입력에 추가하세요.

상태를 유지하지 않는 방식으로 추론 모델을 호출할 때는 응답의 output 배열에 있는 모든 항목을 보존하세요. Responses API는 기본적으로 암호화된 추론 항목을 반환합니다. 전체 출력을 다음 요청에 그대로 전달하면 추론 항목과 어시스턴트 메시지의 phase 값이 유지됩니다. 추론 내용 저장을 지원하는 모델에서는 reasoning.context: "all_turns"를 사용해 다음 샘플을 생성할 때 이전 턴의 추론 내용 중 사용 가능한 부분을 포함할 수 있습니다. API 호출 간 추론 내용 보존하기를 참고하세요.

추론 항목을 다음 요청에 다시 전달할 때는 모델이 해당 항목을 생성하는 데 사용한 대화 기록도 그대로 유지하세요. 대화 기록을 수정하면 추론에 어떤 영향을 미치는지는 접두부를 그대로 유지하기에서 확인하세요.

다음 예제에서는 모델에 농담을 하나 해 달라고 한 뒤 다른 농담을 하나 더 요청합니다. 이렇게 새 요청에 이전 응답을 추가하면 앞선 대화의 컨텍스트가 유지되어 대화가 자연스럽게 이어집니다.

Responses API로 대화 상태 직접 관리하기
from openai import OpenAI

client = OpenAI()

history = [{"role": "user", "content": "tell me a joke"}]

response = client.responses.create(
    model="gpt-6-astra",
    input=history,
    store=False,
)

print(response.output_text)

# Add all response output items, including encrypted reasoning items, to the conversation
history += response.output

history.append({"role": "user", "content": "tell me another"})

second_response = client.responses.create(
    model="gpt-6-astra",
    input=history,
    store=False,
)

print(second_response.output_text)

대화 상태를 관리하는 OpenAI API

OpenAI API를 사용하면 대화 상태를 자동으로 관리할 수 있어 매 턴마다 이전 입력을 직접 전달할 필요가 없습니다.

Conversations API 사용하기

Conversations API는 Responses API와 함께 대화 상태를 장기간 유지되는 객체에 저장합니다. 이 객체에는 계속 사용할 수 있는 고유 식별자가 있습니다. 대화 객체를 한 번 만들면 세션, 기기 또는 작업이 바뀌어도 같은 객체를 사용할 수 있습니다.

대화 객체에는 메시지, 도구 호출, 도구 출력 및 기타 데이터가 개별 항목으로 저장됩니다.

대화 만들기
conversation = openai.conversations.create()

여러 턴에 걸쳐 대화할 때는 후속 응답을 생성하는 요청에 conversation을 전달하세요. 여러 응답 항목을 일일이 연결할 필요 없이 대화 상태를 유지하고 후속 응답 간에 컨텍스트를 공유할 수 있습니다.

Conversations API와 Responses API로 대화 상태 관리하기
response = openai.responses.create(
    model="gpt-6-astra",
    input=[{"role": "user", "content": "What are the 5 Ds of dodgeball?"}],
    conversation=conversation.id,
)

이전 응답의 컨텍스트 전달하기

대화 상태를 관리하는 또 다른 방법은 previous_response_id 매개변수로 응답 간에 컨텍스트를 공유하는 것입니다. 이 매개변수를 사용하면 응답을 차례로 연결해 하나의 대화 스레드를 구성할 수 있습니다.

이전 응답 ID를 전달해 여러 턴의 응답 연결하기
from openai import OpenAI

client = OpenAI()

response = client.responses.create(
    model="gpt-6-astra",
    input="tell me a joke",
)
print(response.output_text)

second_response = client.responses.create(
    model="gpt-6-astra",
    previous_response_id=response.id,
    input=[{"role": "user", "content": "explain why this is funny."}],
)
print(second_response.output_text)

WebSocket 모드의 previous_response_id

Responses API의 WebSocket 모드에서 대화를 이어갈 때 previous_response_id는 HTTP 모드와 같은 방식으로 동작합니다. WebSocket 모드에서는 소켓 연결을 유지한 채 response.create 이벤트를 반복해서 보냅니다.

각 연결의 캐시는 최근 응답을 메모리에 보관해 다음 턴의 지연 시간을 줄입니다. stream_id를 사용하면 각 레인에서 해당 레인의 최신 응답을 유지할 수 있습니다. 어떤 응답에서 대화를 이어갈지는 여전히 previous_response_id로 지정하므로, 다른 레인의 응답을 아직 사용할 수 있다면 그 응답에서 새 레인을 분기할 수 있습니다. 캐시에 없는 ID로 이전 응답을 찾을 수 없다면 previous_response_id를 null로 설정하고 전체 입력 컨텍스트를 담아 새 턴을 보내세요.

previous_response_id를 사용하더라도 API에서는 연결된 응답의 이전 입력 토큰 전체에 입력 토큰 요금을 부과합니다.

컨텍스트 윈도우 관리하기

컨텍스트 윈도우를 이해하면 대화 스레드를 구성하고 모델을 여러 번 호출하는 동안 대화 상태를 관리하는 데 도움이 됩니다.

컨텍스트 윈도우는 요청 한 번에 사용할 수 있는 최대 토큰 수입니다. 이 한도에는 입력 토큰, 출력 토큰, 추론 토큰이 모두 포함됩니다. 사용하는 모델의 컨텍스트 윈도우 크기는 모델 세부 정보에서 확인하세요.

텍스트 생성에 사용할 컨텍스트 관리하기

입력이 복잡해지거나 대화에 포함하는 턴이 늘어나면 출력 토큰 한도와 컨텍스트 윈도우 한도를 모두 고려해야 합니다. 모델의 입력량과 출력량은 토큰 단위로 측정합니다. 모델은 입력을 토큰으로 나누어 내용과 의도를 분석하고, 토큰을 조합해 일관된 출력을 생성합니다. 텍스트 생성 요청을 처리하는 동안 사용할 수 있는 토큰 수에는 모델별로 한도가 있습니다.

  • 출력 토큰은 모델이 프롬프트에 응답해 생성하는 토큰입니다. 출력 토큰 한도는 모델마다 다릅니다. 예를 들어 gpt-4o-2024-08-06은 출력 토큰을 최대 16,384개까지 생성할 수 있습니다.
  • 컨텍스트 윈도우는 입력과 출력에 사용할 수 있는 전체 토큰 수를 나타냅니다. 일부 모델에서는 추론 토큰도 여기에 포함됩니다. 모델별 컨텍스트 윈도우 한도를 비교해 보세요. 예를 들어 gpt-4o-2024-08-06의 전체 컨텍스트 윈도우는 128k 토큰입니다.

모델에 제공할 컨텍스트, 데이터 또는 예제를 추가하다 보면 프롬프트가 길어질 수 있습니다. 이때 모델의 컨텍스트 윈도우 한도를 초과하면 출력이 잘릴 수 있습니다.

특정 문자열의 토큰 수는 토크나이저 도구로 확인할 수 있습니다. 이 도구는 tiktoken 라이브러리로 만들었습니다.

예를 들어 Responses API에 o1 모델처럼 추론 기능이 활성화된 모델을 사용하는 요청을 보내면 다음 토큰이 모두 컨텍스트 윈도우 사용량에 포함됩니다.

  • 입력 토큰(input 배열에 담아 Responses API에 전달하는 입력)
  • 출력 토큰(모델이 프롬프트에 응답해 생성하는 토큰)
  • 추론 토큰(모델이 응답을 계획하는 데 사용하는 토큰)

컨텍스트 윈도우 한도를 초과해 생성된 토큰은 API 응답에서 잘릴 수 있습니다.

컨텍스트 윈도우 시각화

토크나이저 도구로 메시지에 사용할 토큰 수를 추정할 수 있습니다.

컨텍스트 압축

자세한 사용 방법은 이제 컨텍스트 압축 가이드에서 확인할 수 있습니다.

다음 단계

더 구체적인 예제와 활용 사례는 OpenAI Cookbook에서 확인하세요. API로 모델의 기능을 확장하는 방법은 다음 가이드에서 알아볼 수 있습니다.