o1-preview로 o1 API 사용법 파악하기

배경 및 목적

새로나온 o1-preview를 성능 실험도 하고,
서비스에 적용시 고려사항을 파악 설계 요건 파악하기

o1 추론모델이 나오며 기존에 GPT-계열 모델들과 여러가지 차이가 있음 알게 됨

이에 공식 문서를 토대로 살펴보기로 함

이왕이면 ㅇ1이 얼마나 다른지를 지접 체험하면서 o1-preview를 이용해서 내가 필요한 부분을 분석하기로 결정

참고 자료

주의! 벨루가에 실제 기능 구현을 고려한 부분은 그대로 참고하시면 안됩니다.

1. [OpenAI 추론 모델(Reasoning Model) GPT-o1 소개 문서](https://platform.openai.com/docs/guides/reasoning)

2. [OpenAI Chat API 문서](https://platform.openai.com/docs/api-reference/chat)

활용 툴

실행 과정

  1. OpenAI 추론 모델(Reasoning Models) GPT o1 소개 문서 검토 내용

  2. OpenAI Chat API 문서 검토 내용

1. OpenAI 추론모델 공식 소개 문서 검토 내용

### o1 Reasoning Models 적용시 주요 고려사항 ###

1. 모델 특징 및 용도:

- o1 모델은 복잡한 문제 해결을 위한 강화 학습을 통해 훈련된 모델로, 과학적 추론에 뛰어남.

- o1-preview는 폭넓은 일반 지식을 사용하여 복잡한 문제를 해결하며, o1-mini는 더 빠르고 저렴하며 주로 코딩, 수학, 과학에 적합.

- GPT-4o 모델을 대체하는 것이 아니라, 깊은 추론을 요구하는 애플리케이션에 적합.

2. 베타 단계의 제한 사항:

- 현재 베타 버전으로, 텍스트 입력만 지원하며 이미지 입력 및 함수 호출 기능은 제공되지 않음.

- 사용자 및 보조 메시지만 지원하며 시스템 메시지와 스트리밍 기능은 사용 불가.

- 기타 파라미터(temperature, top_p, n 등)가 고정되어 있으며, 향후 확장될 예정.

3. Context Window(문맥 창) 관리:

- o1 모델은 최대 128,000개의 토큰을 지원하는 문맥 창을 제공.

- o1-preview는 최대 32,768개, o1-mini는 최대 65,536개의 출력 토큰을 지원.

- 문제의 복잡도에 따라 수백에서 수만 개의 추론 토큰이 생성될 수 있으며, 이는 보이지 않지만 비용에 포함됨.

- 충분한 문맥 공간을 확보하거나 max_completion_tokens 파라미터를 설정해 추론 토큰을 제어할 필요

4. 비용 관리:

- 추론 토큰도 비용에 포함되므로, max_completion_tokens를 사용해 생성되는 토큰 수를 제한 필요

- 충분한 공간을 확보하지 않으면 출력 토큰 없이도 비용이 청구될 수 있어, 최소 25,000개의 토큰을 추론용으로 남겨두는 것이 권장됨.

5. 프롬프트 설계:

- 간결하고 직접적인 프롬프트가 가장 효과적이며, 복잡한 지시나 "CoT(단계별로 생각하기)"와 같은 프롬프트는 성능을 저하시킬 수 있음.

- 구분자(예: Markdown, XML 태그)를 사용해 입력의 명확성을 높이는 것이 좋음.

- ***RAG에서 가장 유효한 정보만 제공*** - 필요 이상으로 많은 추가 정보를 제공하면 모델이 과도하게 복잡한 응답을 생성할 수 있으므로, 핵심 정보만 제공하는 것이 중요함.

6. 적용 및 활용 방안:

- 추론 기반의 문제 해결, 코딩, 수학, 과학과 관련된 애플리케이션에 효과적.

- 반면, 이미지 입력, 빠른 응답 시간, 함수 호출이 필요한 경우는 GPT-4o 모델 사용 권장.

결론: o1 모델은 깊은 추론이 필요한 애플리케이션에 적합하지만, 현재 베타 단계의 제한 사항을 고려해야 하며, 문맥 창 및 비용 관리에 주의가 필요함. 특히, 프롬프트 설계 및 적용 방식 주의

> [!벨루가 체크 사항]

> * 벨루가 적용시 별도 템플릿으로 개발 필요

> * 전용 프롬프트 필요

> * {document_text} 제공시 유효 정보만 제공하는 모듈 필요

> * 추론 과정 메세징 처리 필요 (API 자체가 ChatGPT 처럼 상태 메세지 및 요약 제공 여부 파악 필요)

2. OpenAI Chat API 문서 검토 내용

프론트엔드에 추론 과정을 알려주기 위해 GPT-o1 모델을 사용할 때, A 추론 과정을 출력에 포함시켜야 함

1. 추론을 포함하도록 프롬프트 조정

- 추론 요청 명시: 모델에게 최종 답변과 함께 상세한 설명이나 추론을 제공하도록 프롬프트를 수정

예시 프롬프트:

```

  다음 문제를 해결하고, 당신의 추론 과정을 상세히 설명해주세요:
  [문제 설명]
  답변에는 최종 답변과 단계별 설명을 포함해야 합니다.

- 구조화된 지시사항: 추론이 어떤 형식으로 제공되길 원하는지 명확히 지정. 이는 모델이 Chain-of-Thought 프롬프트 없이도 요구 사항을 이해하도록 도와줌.

2. 구조화된 출력 형식 사용 (스트리밍 지원 안함)

- JSON 형식: 모델에게 답변과 추론을 JSON과 같은 구조화된 형식으로 출력하도록 요청. 이는 API가 파싱하기 쉽고, 프론트엔드에서 표시하기 용이.

예시 프롬프트:

다음의 JSON 형식으로 응답해야 합니다:

  {

    "answer": "최종 답변",

    "explanation": "단계별 추론 과정"

  }

- 일관된 구조: 프롬프트에 명확한 예시를 제공하여 모델이 지정된 형식을 일관되게 따르도록 JSON ouptut으로 현재 기준으로 JSON type이 아닌 프롬프트로

3. API 파라미터에 추론 제어 기능 추가

- 추론 포함 플래그: API 요청에 include_reasoning과 같은 파라미터를 추가하여 추론 포함 여부를 제어.

API 요청 예시:

  {

    "problem": "여기에 문제 설명을 입력하세요.",

    "include_reasoning": true

  }

- 백엔드 로직: 백엔드에서 include_reasoning 플래그를 확인하고, 이에 따라 프롬프트를 수정하여 모델에게 추론을 요청.

4. 비동기 처리 구현

- 긴 응답 시간 처리: o1 모델의 응답 시간이 길어질 수 있으므로, API에서 비동기 처리를 구현

- 폴링 메커니즘: 프론트엔드에서 결과를 폴링하거나, 처리가 완료되면 콜백/웹훅을 사용하여 알림을 받을 수 있도록.

5. API 구현 예시

API 엔드포인트: /solve_problem

API 요청 예시:

{

  "problem": "매트릭스를 '[1,2],[3,4],[5,6]' 형식의 문자열로 받아서 동일한 형식으로 전치(transpose)를 출력하는 bash 스크립트를 작성하세요.",

  "include_reasoning": true

}

백엔드 프롬프트 구성:

prompt = f"""

다음 문제를 해결해주세요:  

{problem} // 기존의 query 라고 생각 하면 됨

{"당신의 해결 방안을 상세히 설명해주세요." if include_reasoning else ""}

다음의 JSON 형식으로 응답해야 합니다:

{{

  "answer": "해결 방안",

  "explanation": "추론 과정"{"" if include_reasoning else " (선택 사항)"}

}}

"""

API 응답 처리:

- JSON 파싱: 모델의 응답을 받은 후, JSON을 파싱하여 answerexplanation를 분리합니다.

- 에러 처리: JSON 파싱 에러나 예상치 못한 모델 출력에 대비하여 try-except 블록을 사용합니다.

6. 프론트엔드

- 디스플레이 구성 요소: answerexplanation를 별도로 표시할 수 있는 UI 요소를 고려

- 로딩 인디케이터: 긴 처리 시간을 처리하기 위해 진행 표시기를 구현

- 사용자 경험 개선: 복잡한 문제로 인해 응답에 시간이 걸릴 수 있음을 사용자에게 알림 상태

7. 향후 기능에 대한 고려 사항

- 스트리밍 지원: o1 모델이 스트리밍을 지원하게 될 경우를 대비, API가 스트리밍 응답을 수용 가능하게

- 시스템 메시지: 시스템 메시지를 허용하는 업데이트를 주시하여, 프롬프트 관리 및 API 구조 고려.

검토 결과 요약

- 시스템 프롬프트를 현재 지원안함: 별도 프롬프트 필요

- 예상 한 것과는 다르게 API 자체가 크게 바꾸지 않았음 "include_reasoning": true 만 사용하면 됨

- 스트리밍 지원 안하며 > Chat API 의 Chat Completion Obejct 사용 필수

- 각턴에 대하여 중간 결과를 주지 않음 최종만 주고 얼마나 토큰을 사용했는지 받음

전체 추론 과정에서 사용된 추론 토큰 수는 response | usage | completion_tokens_details | reasoning_tokens 를 통해 확인 초종 만 확인 가능.

- 중간 상태나 사용자 경험을 위한 상태 메세지는 GPT-4o 등 병행 처리하여 생성 필요

- max_completion_tokens을 이용하여 전체 토큰을 고정하여 사용 필요

결과 및 인사이트

1

👉 이 게시글도 읽어보세요