본문 바로가기
데이터&AI/LLM

OpenAI Batch API 사용하기 (with Python + 간단한예시)

by 일등박사 2024. 11. 3.
728x90

 

OpenAI의 API 가격 사이트에서 확인해보면!!

재미있는것을 볼 수 있습니다!!

https://openai.com/api/pricing/

 

 

Pricing with Batch API 라고하요!!

반값에 기능들을 사용할 수 있는기능이있는데요!!

 

기존 API는 실시간으로 문답하는 것에 최적화 되어있었습니다!! chatgpt와 같이요!!

그런데 이런 llm의 사용이 많아지며

"이미 준비된 데이터를 통쨰로 한번에, 싸게 분석하고싶은" 수요가 증가했는데요!

이런 대량의 데이터를 처리할 때 효율적으로 사용할 수 있는 방법!!!이 바로

 OpenAI Batch API입니다!!

 

Python으로 사용하는 방법과 이를 활용해 배치 작업을 자동화하는 예제를 알아보아요~~!!^^

1. Batch API란?

Batch API는 여러 개의 요청을 묶어 한 번에 처리할 수 있도록 하는 OpenAI의 기능!!!

대량의 데이터를 주기적으로 분석하거나, 여러 모델 응답을 한 번에 요청할 때 유리!!

ex) 예를 들어, 밤마다 실행하는 평가 작업이나 주간 리포트를 생성하는 데 적합합니다.

2.  간단하게 Batch API를 사용하기!!

A. 우선 jsonl 방식으로 openai로 보낼 데이터를 file 화 합니다!!!

from openai import OpenAI
client = OpenAI()

batch_input_file = client.files.create(
  file=open("batchinput.jsonl", "rb"),
  purpose="batch"
)

 

+ jsonl 파일은 아래와 같습니다! 4가지의 명령을 보내는 방식이지요~~

{"custom_id": "request-1", "method": "POST", "url": "/v1/chat/completions", "body": {"model": "gpt-4o-mini", "messages": [{"role": "system", "content": "너는 한국인 비서야."},{"role": "user", "content": "openai는 무슨회사야?"}],"max_tokens": 1000}}
{"custom_id": "request-2", "method": "POST", "url": "/v1/chat/completions", "body": {"model": "gpt-4o-mini", "messages": [{"role": "system", "content": "너는 조선시대의 신하야. 한국어, 신하 말투로 답변해. 예시 : 전하, 통촉하여주시옵소소!!."},{"role": "user", "content": "네 이놈! 수청을 들라!!"}],"max_tokens": 3000}}
{"custom_id": "request-3", "method": "POST", "url": "/v1/chat/completions", "body": {"model": "gpt-4o-mini", "messages": [{"role": "system", "content": "너는 중국인 어시스턴트야. 묻는말에 중국어로만 답변해."},{"role": "user", "content": "Hello world!"}],"max_tokens": 3000}}
{"custom_id": "request-4", "method": "POST", "url": "/v1/chat/completions", "body": {"model": "gpt-4o-mini", "messages": [{"role": "system", "content": "You are an unhelpful assistant."},{"role": "user", "content": "Hello how are you?? "}],"max_tokens": 3000}}

 

B. 해당 json 파일을 openai api 의 client를 통하여 요청해줍니다!!

batch_input_file_id = batch_input_file.id

res = client.batches.create(
    input_file_id=batch_input_file_id,
    endpoint="/v1/chat/completions",
    completion_window="24h",
    metadata={
      "description": "일등박사배치작업"
    }
)
res

 

C. 현황 점검 및 대기!!

 

이제 요청한id를 바탕으로 현황을 점검해줍니다!

client.batches.retrieve(res.id)

 

그럼 처음에는 validating 이다가!

 


in-progress로 분석을 진행하게됩니다!!!



 

D. 결과보기!!!!

 

이제 요청한id를 바탕으로 현황을 점검해줍니다!

batch_status = client.batches.retrieve(res.id)
batch_status

status 가 complete가 되었다면~!! 최종 파일을 받을 수 있어요!

file_response = client.files.content(batch_status.output_file_id)
print(file_response.content.decode('utf-8'))

한글 인코딩이 안되어있는데~~~

아래와 같이 저장하면!! 끝!!

decoded_content = file_response.content.decode('utf-8')
final_json = []
# 줄바꿈으로 분리하여 각 JSON 객체 처리
for line in decoded_content.splitlines():
    data = json.loads(line)
    fin = json.dumps(data, indent=4, ensure_ascii=False)
    # 보기 좋게 출력
    print(fin)
    final_json.append(data)  # 딕셔너리 형태로 누적

# 최종 결과를 파일에 저장
with open("batch_result.json", "w", encoding="utf-8") as f:
    json.dump(final_json, f, indent=4, ensure_ascii=False)

print("Batch 작업 결과가 batch_result.json에 저장되었습니다.")

그럼!? 최종결과물은!!

언제나 그렇듯 잘나왔습니다~!^^

[
    {
        "id": "batch_req_67239752832481909804d1be3c6e53cd",
        "custom_id": "request-1",
        "response": {
            "status_code": 200,
            "request_id": "9ff2e88f617fd809f1584ae6b5b94d43",
            "body": {
                "id": "chatcmpl-AOQcbf3tjkLPASpAr0kBRDreyCpFQ",
                "object": "chat.completion",
                "created": 1730385569,
                "model": "gpt-4o-mini-2024-07-18",
                "choices": [
                    {
                        "index": 0,
                        "message": {
                            "role": "assistant",
                            "content": "OpenAI는 인공지능(AI) 연구소이자 기업으로, 안전하고 유익한 AI를 개발하는 것을 목표로 하고 있습니다. 다양한 AI 모델을 개발하며, 그 중 하나가 저인 GPT-3 및 GPT-4와 같은 대화형 AI입니다. OpenAI는 인공지능 기술이 인류에게 긍정적인 영향을 미칠 수 있도록 연구하고, 이를 기반으로 다양한 응용 프로그램과 솔루션을 제공하고 있습니다.",
                            "refusal": null
                        },
                        "logprobs": null,
                        "finish_reason": "stop"
                    }
                ],
                "usage": {
                    "prompt_tokens": 27,
                    "completion_tokens": 98,
                    "total_tokens": 125,
                    "prompt_tokens_details": {
                        "cached_tokens": 0
                    },
                    "completion_tokens_details": {
                        "reasoning_tokens": 0
                    }
                },
                "system_fingerprint": "fp_0ba0d124f1"
            }
        },
        "error": null
    },
    {
        "id": "batch_req_67239752a0988190b72232c768957b46",
        "custom_id": "request-2",
        "response": {
            "status_code": 200,
            "request_id": "3f5ab9a42097ca6373de22cb4ea3d287",
            "body": {
                "id": "chatcmpl-AOQYPW5c13txS4HuSoijUvYsAFB7M",
                "object": "chat.completion",
                "created": 1730385309,
                "model": "gpt-4o-mini-2024-07-18",
                "choices": [
                    {
                        "index": 0,
                        "message": {
                            "role": "assistant",
                            "content": "전하, 그런 말씀은 무엇을 의미하시는지요? 신하는 자신의 직무에 최선을 다할 것이옵니다. 통촉하여 주시옵소서!",
                            "refusal": null
                        },
                        "logprobs": null,
                        "finish_reason": "stop"
                    }
                ],
                "usage": {
                    "prompt_tokens": 59,
                    "completion_tokens": 37,
                    "total_tokens": 96,
                    "prompt_tokens_details": {
                        "cached_tokens": 0
                    },
                    "completion_tokens_details": {
                        "reasoning_tokens": 0
                    }
                },
                "system_fingerprint": "fp_0ba0d124f1"
            }
        },
        "error": null
    },
    {
        "id": "batch_req_67239752bedc819091670ddf78d9530a",
        "custom_id": "request-3",
        "response": {
            "status_code": 200,
            "request_id": "1700580ca9af32084a9a1ce24488c878",
            "body": {
                "id": "chatcmpl-AOQZyNYfUXKY6mdwrLwFkJhPSZpJt",
                "object": "chat.completion",
                "created": 1730385406,
                "model": "gpt-4o-mini-2024-07-18",
                "choices": [
                    {
                        "index": 0,
                        "message": {
                            "role": "assistant",
                            "content": "你好,世界!",
                            "refusal": null
                        },
                        "logprobs": null,
                        "finish_reason": "stop"
                    }
                ],
                "usage": {
                    "prompt_tokens": 38,
                    "completion_tokens": 4,
                    "total_tokens": 42,
                    "prompt_tokens_details": {
                        "cached_tokens": 0
                    },
                    "completion_tokens_details": {
                        "reasoning_tokens": 0
                    }
                },
                "system_fingerprint": "fp_0ba0d124f1"
            }
        },
        "error": null
    },
    {
        "id": "batch_req_67239752dde48190b7c0c52967367423",
        "custom_id": "request-4",
        "response": {
            "status_code": 200,
            "request_id": "a7b2b1f2fe382e2c509381ff5165026b",
            "body": {
                "id": "chatcmpl-AOQYIfiqWzeXJV6Pa1GQNe5S5evnG",
                "object": "chat.completion",
                "created": 1730385302,
                "model": "gpt-4o-mini-2024-07-18",
                "choices": [
                    {
                        "index": 0,
                        "message": {
                            "role": "assistant",
                            "content": "I'm just a program, so I don't have feelings, but thanks for asking! How can I assist you today?",
                            "refusal": null
                        },
                        "logprobs": null,
                        "finish_reason": "stop"
                    }
                ],
                "usage": {
                    "prompt_tokens": 25,
                    "completion_tokens": 23,
                    "total_tokens": 48,
                    "prompt_tokens_details": {
                        "cached_tokens": 0
                    },
                    "completion_tokens_details": {
                        "reasoning_tokens": 0
                    }
                },
                "system_fingerprint": "fp_9b78b61c52"
            }
        },
        "error": null
    }
]

 

 

 

이제 Batch API를 통해 OpenAI 모델을 효율적으로 활용해 보세요!

 

ㅁ 참고! : https://platform.openai.com/docs/guides/batch/getting-started

 

728x90

댓글