GPT-4o의 추론 학습: 파인튜닝 vs. 예산 강제
파인튜닝과 예산 강제가 GPT-4o의 추론 능력을 개선할 수 있을까요? 다단계 문제 해결을 강화하기 위해 구조화된 데이터셋과 추론 시 기법을 실험합니다. 이 글은 AI 번역 기사입니다. 오역이 있을 수 있으니 댓글로 알려주세요.
Created on September 12|Last edited on September 12
Comment
OpenAI의 GPT-4o 이미 가장 뛰어난 언어 모델 중 하나이지만, 목표 지향적 방법을 통해 더욱 강력한 추론 엔진으로 탈바꿈할 수 있을까요? 파인튜닝바로 그 질문에 이 실험이 답하고자 합니다.
복잡한 다단계 추론을 위해 설계된 데이터셋을 사용하여, 파인튜닝이 GPT-4o의 성능을 다음과 같은 최신 모델들을 넘어설 수 있도록 끌어올릴 수 있는지 평가합니다 OpenAI의 o1-preview이를 측정하기 위해, 우리는 깊은 논리적 추론과 구조화된 문제 해결을 요구하는 도전적인 문제로 유명한 벤치마크인 AIME(American Invitational Mathematics Examination)에 대해 이를 테스트합니다.

목차
목차복잡한 추론을 위해 s1K 데이터셋으로 GPT-4o를 파인튜닝하기GPT-4o 파인튜닝을 위한 s1K 데이터셋 준비s1K 데이터셋 서식화데이터셋 업로드 및 파인튜닝 시작파인튜닝된 모델 평가Budget forcing이란 무엇인가요? Budget forcing 결과결론
복잡한 추론을 위해 s1K 데이터셋으로 GPT-4o를 파인튜닝하기
우리가 사용할 데이터셋인 s1K는 고난도의 추론 문제들만 신중하게 선별해 구성한 컬렉션으로, 원래는 다음과 같은 용도로 사용되었습니다 s1-32B 파인튜닝 (Qwen 2.5 32b 기반)으로, 예산 강제와 같은 테스트 타임 스케일링 기법을 통해 OpenAI의 비공개 모델인 o1-preview 등 일부 모델을 능가하는 성능을 보입니다.
방대한 데이터셋으로 학습하는 대신, s1 접근법은 학습 데이터의 품질과 복잡성을 극대화하는 데 집중하여, 작고 잘 선별된 데이터셋만으로도 모델의 추론 능력을 극적으로 향상시킬 수 있음을 입증했습니다. 이제, 우리는 같은 데이터셋을 GPT-4o 파인튜닝에도 적용하여, 구조화된 추론에서 유사하거나 더 나은 개선을 달성할 수 있는지 확인하고자 합니다.
파인튜닝을 넘어, 우리는 모델이 최종 답에 도달하기 전에 추론 과정을 더 길게 확장하도록 유도하는 디코딩 전략인 budget forcing도 테스트할 것입니다(자세한 내용은 뒤에서 다룹니다). 파인튜닝과 추론 시 최적화를 결합해, GPT-4o가 다단계 추론 과제에서 얼마나 효과적으로 향상될 수 있는지 확인하고자 합니다.
GPT-4o 파인튜닝을 위한 s1K 데이터셋 준비
GPT-4o와 같은 모델을 파인튜닝하려면 추론 성능을 최대화하는 것은 물론 비용을 통제하기 위한 신중한 데이터셋 준비가 필요합니다. GPT-4o의 파인튜닝 가격은 백만 토큰당 $25이므로, 전체 500만 토큰 데이터셋으로 파인튜닝할 경우 학습 한 번에 약 $125가 듭니다. 이를 고려해, 저는 먼저 데이터셋의 10%와 GPT-4o Mini를 사용한 소규모 실험으로 시작하여, 본격적인 파인튜닝에 앞서 빠르게 반복 개선할 수 있도록 했습니다.
초기에 직면했던 주요 과제 중 하나는, 추론 단계를 생성하라고 지시했을 때 모델이 끝없이 생각만 계속하는 상태에 빠지는 경향이 있다는 점이었습니다. 이 문제는 모델이 언제 멈춰야 하는지 인식하지 못해 출력이 통제되지 않고 계속 생성될 때 발생했습니다. 이를 해결하기 위해, 데이터셋 포맷을 수정하여 “thinking” 단계를 최종 답변과 명확히 분리하고, 추론 길이에 대한 엄격한 제한을 도입했습니다.
이 과정 전반에 걸쳐, W&B Weave 디버깅에 매우 큰 도움이 되었습니다 및 모델의 시각화 사고 과정. Weave의 추적 기능 수동으로 원시 로그를 확인하지 않고도 루프 문제, 과도하게 장황한 출력, 잠재적 비효율성을 식별할 수 있게 해주었습니다. 이러한 즉각적인 피드백 덕분에 추론 단계를 더 잘 제어하고 구조화된 출력을 보장하는 최적화된 데이터셋 포맷을 마련할 수 있었으며, 이에 대해서는 다음 섹션에서 자세히 다룹니다.
다음은 Weave에서 캡처한 스크린샷으로, 특정 실행 중 모델의 추론 추적을 보여줍니다. 이 실행에서 모델은 최종 답변을 내지 못했습니다.

s1K 데이터셋 서식화
우리 데이터셋의 각 예시는 구조화된 멀티턴 채팅 형식을 따르며, 모델이 최종 답변을 제시하기 전에 구조화된 추론을 생성하도록 보장합니다. 형식은 다음과 같습니다:
- 시스템 메시지: 모델의 역할을 유용한 AI 어시스턴트로 정의합니다.
- 사용자 메시지: 문제 설명이 제시된 뒤, 고정된 토큰 예산 내에서 단계별로 사고하라는 지시가 포함되어 있습니다.
- 어시스턴트 응답: 사고 과정을 다음에 둘러싸인 형태로 출력합니다 <imstart>think 그리고 <imend> 최종 답변과 구분하기 위한 태그입니다.
- 사용자 메시지: 모델이 무한정 추론을 계속하지 않도록 최종 응답을 제출하도록 유도합니다.
- 어시스턴트 응답: 최종 답변을 다음에 둘러싸인 형태로 제공합니다 <imstart>answer 그리고 <imend>.
이 설정이 반드시 가장 효율적인 해법은 아닙니다. 응답을 이런 방식으로 구조화하기보다 모델 수준에서 길이 제약을 강제하는 접근이 더 나을 수 있습니다. 다만, 이 특정 사용 사례에서는 OpenAI의 채팅 기반 형식에 맞추면서도 모델의 추론을 통제된 범위로 유지할 수 있는 실용적인 방법을 제공합니다.
데이터셋을 준비하는 데 사용한 스크립트는 다음과 같습니다:
import jsonimport randomfrom datasets import load_dataset# Load the Hugging Face datasetdataset = load_dataset("simplescaling/s1K")["train"]# Shuffle the dataset for randomnessrandom.seed(42)dataset = list(dataset) # Convert to list for shufflingrandom.shuffle(dataset)# # Split into 95% training and 5% validationsplit_idx = int(0.95 * len(dataset))train_data, val_data = dataset[:split_idx], dataset[split_idx:]# Function to format each example in the agreed multi-turn OpenAI structuredef format_example(example):question = example["question"].strip()thinking_steps = "\n".join(example["thinking_trajectories"]).strip()final_answer = example["attempt"].strip()# Ensure final answer is correctly formattedfinal_answer = "Answer: " + final_answer if not final_answer.startswith("Answer:") else final_answer# Construct multi-turn formatformatted_messages = [{"role": "system", "content": "You are a helpful AI assistant."},{"role": "user", "content": question + "\n Think for up to 8096 tokens."},{"role": "assistant", "content": "<imstart>think\n" + thinking_steps + "\n<imend>"},{"role": "user", "content": "Now provide the final answer. Respond in under 2048 tokens!!!"},{"role": "assistant", "content": "<imstart>answer\n" + final_answer + "\n<imend>"}]return {"messages": formatted_messages}# Apply formatting to training and validation setsformatted_train_data = [format_example(example) for example in train_data]formatted_val_data = [format_example(example) for example in val_data]# Save as JSONL for OpenAI fine-tuningtrain_output_file = "fullnew_s1K_openai_finetune_train.jsonl"val_output_file = "fullnews1K_openai_finetune_val.jsonl"# Save training datawith open(train_output_file, "w") as f:for entry in formatted_train_data:json.dump(entry, f)f.write("\n")# Save validation datawith open(val_output_file, "w") as f:for entry in formatted_val_data:json.dump(entry, f)f.write("\n")print(f"Training dataset saved as {train_output_file}")print(f"Validation dataset saved as {val_output_file}")
사용자 지침에 명시적인 토큰 제약을 추가하기로 한 결정은 다음의 발견에 영향을 받았습니다 s1 논문, 이는 테스트 시점에서 추론 길이를 제어하는 다양한 방법을 탐구했습니다. 한편, 해당 논문은 모델들이 종종 직접적인 토큰 제한을 무시한다는 사실을 발견했습니다., 이번 실험을 진행하면서 저는… GPT-4o는 명시적인 출력 제약을 잘 따랐습니다, 과도한 생성 없이 구조화된 추론을 보장하는 실용적인 전략이 됩니다.
이 형식을 적용하면 데이터셋은 구조를 유지하면서 비용 효율적이고, 통제 불능의 응답을 방지하도록 최적화됩니다. 데이터셋 준비가 끝났다면, 다음 단계는 파인튜닝 실험을 수행하고 GPT-4o가 구조화된 추론 작업에 얼마나 잘 적응하는지 평가하는 것입니다.
데이터셋이 어떤 형태인지 보여주는 예시는 다음과 같습니다
{"messages": [{"role": "system","content": "You are a helpful AI assistant."},{"role": "user","content": "What is the sum of the first 100 positive integers? Think for up to 2048 tokens."},{"role": "assistant","content": "<imstart>think\n{the reasoning trace}\n<imend>"},{"role": "user","content": "Now provide the final answer. Respond in under 256 tokens."},{"role": "assistant","content": "<imstart>answer\n{the answer}\n<imend>"}]}
데이터셋 업로드 및 파인튜닝 시작
데이터셋 준비를 마친 뒤 OpenAI의 파인튜닝 콘솔을 사용해 학습을 시작했습니다. 학습용과 검증용 JSONL 파일을 업로드하고, 1에폭 학습 런을 실행했습니다. 이는 추가적인 개선 전, GPT-4o가 구조화된 추론에 얼마나 잘 적응하는지 평가하기 위한 기준선 테스트로 활용되었습니다. 토크나이즈와 학습을 OpenAI 시스템이 자동으로 처리하기 때문에 전체 과정은 간단하게 진행되었습니다.

파인튜닝된 모델 평가
모델 학습을 마친 뒤 다음 단계는 평가. 평가는 다음과 같은 방식으로 진행되었습니다 Weave 평가이는 파인튜닝이 추론 성능에 미치는 영향을 측정하기 위해 파인튜닝된 GPT-4o를 기본 GPT-4o와 비교 평가한 것입니다. 추가로, 예산 강제 기법을 검증하기 위해 파인튜닝된 모델을 활용해 별도의 모델도 생성했습니다.
이전에 동일한 평가를 o1-preview로 수행했으며, Weave의 기능을 통해 이러한 평가를 저장해 두어 새로운 모델을 테스트할 때 향후 비교에 활용할 수 있었습니다.
평가 과정은 다음과 같은 간단한 설정을 따랐습니다:
- AIME24 데이터셋을 불러와 추론용으로 준비하기
- GPT-4o(베이스 모델)을 실행해 기준 성능을 확립하기
- 동일한 데이터셋에서 파인튜닝된 GPT-4o와 Budget Forced GPT-4o 실행하기
평가에 사용할 코드는 다음과 같습니다:
import osimport asyncioimport jsonfrom datasets import load_datasetfrom openai import OpenAIimport weave; weave.init("aime_evaluation")# Initialize OpenAI clientopenai_client = OpenAI(api_key="your api key")# Model constantsMODEL_BASE = "gpt-4o-2024-08-06" # Stock modelMODEL_FINETUNED = "ft: my fine tuned model id" # Fine-tuned modelJUDGE_MODEL = "gpt-4o-2024-08-06"class BaseGPTModel(weave.Model):@weave.opasync def predict(self, text: str) -> str:"""Run inference using stock GPT-4o model"""try:response = openai_client.chat.completions.create(model=MODEL_BASE,messages=[{"role": "system", "content": "You are a helpful assistant."},{"role": "user", "content": f"{text}\nThink for up to 8096 tokens."}],temperature=0.0)return response.choices[0].message.contentexcept Exception as e:print(f"Failed to get base model response: {e}")return Noneclass FineTunedGPTModel(weave.Model):@weave.opasync def predict(self, text: str) -> str:"""Run inference using fine-tuned GPT-4o model"""try:# First, get thinking stepsthink_response = openai_client.chat.completions.create(model=MODEL_FINETUNED,messages=[{"role": "system", "content": "You are a helpful assistant."},{"role": "user", "content": f"{text}\nThink for up to 8096 tokens."}],temperature=1.0)thinking_steps = think_response.choices[0].message.content# Then, get final answerfinal_response = openai_client.chat.completions.create(model=MODEL_FINETUNED,messages=[{"role": "system", "content": "You are a helpful assistant."},{"role": "user", "content": text},{"role": "assistant", "content": f"<imstart>think\n{thinking_steps}\n<imend>"},{"role": "user", "content": "Now provide the final answer. Respond in under 2048 tokens!!!"}],temperature=1.0)final_answer = final_response.choices[0].message.content# Combine thinking and answerfull_response = f"""Thinking Steps:{thinking_steps}Final Answer:{final_answer}"""return full_responseexcept Exception as e:print(f"Failed to get fine-tuned model response: {e}")return Noneclass BudgetForcingGPTModel(weave.Model):@weave.opasync def predict(self, text: str) -> str:"""Run inference using budget forcing approach with fine-tuned GPT-4o"""try:# Constant for number of thinking iterationsNUM_IGNORE = 6# Initialize messagesmessages = [{"role": "system", "content": "You are a helpful assistant."},{"role": "user", "content": f"{text}\nThink for up to 8096 tokens."}]# Thinking phase with budget forcingthinking_trace = ""for i in range(NUM_IGNORE):try:response = openai_client.chat.completions.create(model=MODEL_FINETUNED,messages=messages,max_tokens=8096,temperature=1.0)thinking_text = response.choices[0].message.contentthinking_trace += thinking_text + "\nContinuing...\n"messages.append({"role": "assistant", "content": thinking_text + "\nWait? Did I make a mistake? "})messages.append({"role": "user", "content": "Continue your thinking where you left off, correcting any mistakes if there is any. Think for up to 8096 tokens."})await asyncio.sleep(1)except Exception as e:print(f"Error during reasoning step {i}: {e}")break# Final answer phasemessages.append({"role": "user", "content": "Now provide the final answer. Respond in under 2048 tokens!!!"})final_response = openai_client.chat.completions.create(model=MODEL_FINETUNED,messages=messages,max_tokens=2048,temperature=1.0)final_answer = final_response.choices[0].message.content# Combine thinking and answerfull_response = f"""Thinking Steps:{thinking_trace}Final Answer:{final_answer}"""return full_responseexcept Exception as e:print(f"Failed to get budget forcing model response: {e}")return None@weave.opasync def gpt4o_scorer(label: str, model_output: str) -> dict:"""Score the model's output by comparing it with the ground truth."""try:# Extract the final answer sectionfinal_answer = (model_output.split("Final Answer:")[-1].strip() if "Final Answer:" in model_output else model_output)[-100:]query = f"""YOU ARE A LLM JUDGE DETERMINING IF THE FOLLOWING MODEL GENERATED ANSWER IS THE SAME AS THE CORRECT ANSWERModel's Answer: {final_answer}Correct Answer: {label}Your task:1. State the model's predicted answer (answer only).2. State the ground truth (answer only).3. Determine if the model's final answer is correct (ignore formatting differences, etc.). RESPOND with the predicted and ground truth answer, followed with a JSON object containing the correctness encapsulated within the following delimiters:```json{{ "correctness": true/false }}```"""response = openai_client.chat.completions.create(model=JUDGE_MODEL,messages=[{"role": "user", "content": query}])response_text = response.choices[0].message.contentjson_start = response_text.index("```json") + 7json_end = response_text.index("```", json_start)correctness = json.loads(response_text[json_start:json_end].strip()).get("correctness", False)return {"correctness": correctness, "reasoning": response_text}except Exception as e:print(f"Scoring failed: {e}")return {"correctness": False, "reasoning": str(e)}def load_ds():print("Loading AIME dataset...")dataset = load_dataset("Maxwell-Jia/AIME_2024")["train"]return [{"text": row["Problem"], "label": row["Answer"]} for row in dataset]async def run_evaluations():print("Loading dataset...")dataset = load_ds()print("Preparing dataset for evaluation...")dataset_prepared = [{"text": row["text"], "label": row["label"]} for row in dataset]scorers = [gpt4o_scorer]# Evaluate fine-tuned GPT-4oprint("\nEvaluating fine-tuned GPT-4o...")finetuned_evaluation = weave.Evaluation(dataset=dataset_prepared,scorers=scorers,name="finetuned-gpt4o Evaluation")finetuned_results = await finetuned_evaluation.evaluate(FineTunedGPTModel())print(f"Results for fine-tuned GPT-4o: {finetuned_results}")# Evaluate budget forcing GPT-4oprint("\nEvaluating budget forcing GPT-4o...")budget_evaluation = weave.Evaluation(dataset=dataset_prepared,scorers=scorers,name="budget-forcing-gpt4o Evaluation")budget_results = await budget_evaluation.evaluate(BudgetForcingGPTModel())print(f"Results for budget forcing GPT-4o: {budget_results}")# # Evaluate base GPT-4oprint("\nEvaluating base GPT-4o...")base_evaluation = weave.Evaluation(dataset=dataset_prepared,scorers=scorers,name="base-gpt4o Evaluation")base_results = await base_evaluation.evaluate(BaseGPTModel())print(f"Results for base GPT-4o: {base_results}")# Return all resultsreturn {"base": base_results,"finetuned": finetuned_results,"budget_forcing": budget_results}if __name__ == "__main__":asyncio.run(run_evaluations())
파인튜닝으로 GPT-4o의 구조적 추론 능력이 향상되었지만, 여전히 일부 경우에는 이 모델은 다단계 추론에 어려움을 겪었습니다. 추가 학습 없이 성능을 더 향상시킬 수 있을까요? 이는 budget forcing을 탐색하게 되는 계기로 이어졌습니다, 최종 답에 도달하기 전에 논리적 깊이를 확장하도록 설계된 추론 시간 기법입니다.
Budget forcing이란 무엇인가요?
Budget forcing은 최종 답을 내기 전에 모델이 얼마나 오래 사고할지 동적으로 제어하여 추론을 강화하도록 설계된 추론 시간 기법입니다. 모델이 스스로 추론 종료 시점을 결정하도록 두는 대신, budget forcing은 문제를 충분히 탐색할 때까지 처리를 계속하도록 보장합니다.
모델이 너무 일찍 멈추려 하면 “Wait”와 같은 신호를 추가해 계속 진행하도록 강제합니다. 그러면 모델은 자신의 추론을 다듬고 확장하게 됩니다. 이 과정은 여러 번 반복할 수 있어, 모델이 최종 응답을 확정하기 전에 오류를 스스로 교정하고 논리 전개를 더욱 심화할 수 있습니다.
budget forcing의 핵심 장점은 추론 시간의 연산을 늘릴수록 정확도가 직접적으로 향상되는 테스트 타임 스케일링을 가능하게 한다는 점입니다. 추가 학습이나 추가 학습 데이터에만 의존하지 않고, 이 방법은 모델이 보유한 지식을 더 효과적으로 활용하도록 유도합니다. 실험에 따르면, 모델이 강제된 추론을 여러 차례 수행하도록 허용하면 복잡한 문제에서의 성능이 크게 향상됩니다. 다만 균형을 유지하는 것이 중요합니다. 반복을 지나치게 강제하면 체감효과가 줄어들 수 있고, 너무 일찍 멈추면 최적 해법에 도달하지 못할 수 있습니다.
이번 실험에서는 추가 학습 없이도 구조화된 다단계 추론을 향상시킬 수 있는지 검증하기 위해, 미세 조정된 GPT-4o에 budget forcing을 적용했습니다. 그 결과, 이 접근법이 테스트한 모든 모델 중에서 가장 높은 정답률을 기록했으며, budget forcing을 적용하지 않은 미세 조정 GPT-4o도 능가함이 확인되었습니다. 이는 추론 시간 기법이 미세 조정만큼이나 큰 효과를 발휘할 수 있음을 시사하며, 추가 데이터셋이나 학습 중 연산 자원 없이도 모델의 추론 능력을 강력하게 향상시키는 방법이 될 수 있음을 보여줍니다.
Budget forcing 결과
budget forcing은 모델이 너무 일찍 추론을 멈추지 않도록 보장하는 방식으로 작동합니다. 즉, 멈출 시점을 모델에 맡기지 않고, 어시스턴트의 답변 끝에 이어지는 프롬프트를 덧붙여 계속 사고하도록 강제합니다. 각 추론 단계가 끝날 때마다 모델의 응답은 다음을 포함하도록 수정됩니다:
"Wait? Did I make a mistake?"
이 프롬프트는 모델이 자신의 응답을 최종 답으로 간주하지 않도록 막고, 대신 스스로의 추론을 점검하도록 유도합니다. 이어지는 사용자 메시지는 모델이 마지막에 멈춘 지점부터 계속 진행하고, 오류가 있으면 수정하라고 지시함으로써 이를 더욱 강화합니다:
"Continue your thinking where you left off, correcting any mistakes if there is any. Think for up to 8096 tokens."
이 과정은 여러 번 반복되며, 각 단계에서 추론 기록을 다듬고 확장합니다. 모델이 자신의 사고 과정을 반복적으로 검토하고 그 위에 쌓아 올리도록 강제함으로써, budget forcing은 더 깊은 논리적 추론을 효과적으로 모사합니다.
모델이 여러 차례의 반복적 사고 사이클을 마치면, 다음 프롬프트와 함께 최종 답변 단계로 전환합니다:
"Now provide the final answer. Respond in under 2048 tokens!!!"
이는 모델이 무한히 추론을 계속하지 않도록 막고, 다듬어진 논리를 최종 응답으로 종합하도록 보장합니다. 이러한 방식으로 추론을 구조화하면, budget forcing은 모델이 복잡한 문제에 끝까지 몰입하도록 유도하여 자기 교정과 확장된 추론을 통해 정확도를 높입니다. 다만, 반복을 지나치게 강제하면 불필요한 복잡성이 늘어나고, 너무 일찍 멈추면 추론이 미완에 그칠 수 있으므로, 최적의 균형점을 찾기 위한 세심한 튜닝이 필요합니다.
전반적으로 노력한 보람이 있었고, 베이스 모델과 비교했을 때 AIME에서 일부 개선을 확인했습니다:

미세 조정된 GPT-4o는 베이스 모델 대비 추론 성능이 소폭 향상되어 20%에서 23%로 증가했습니다. 그러나 “budget forcing”을 적용한 모델이 가장 뛰어난 성능을 보여 정확도 30%에 도달했습니다이는 미세 조정이 추론을 개선하긴 하지만, budget forcing과 같은 추론 시간 기법이 더 큰 향상을 제공하며 GPT-4o 같은 모델로도 확장 가능함을 시사합니다.
처음에는 이 소박한 결과가 다소 실망스러웠습니다 10%라는 수치는 베이스 모델 대비 성능이 약 50% 향상된 것입니다.
💡
이러한 결과는 고품질 추론 데이터셋으로 GPT-4o를 미세 조정하면 구조적 추론이 강화되지만, 추가적인 향상을 위해서는 미세 조정과 디코딩 최적화를 병행할 필요가 있음을 시사합니다. 향후 실험에서는 하이브리드 접근을 탐색하여 GPT-4o의 추론 능력을 한층 더 끌어올릴 수 있을 것입니다.
또한 Budget Forced 모델과 o1-preview 모델의 비교 결과도 공유하겠습니다:

Weave Evaluations를 사용하면 각 응답도 비교할 수 있습니다 비교 보기의 모든 모델에 대해. 추론 모델에는 특히 유용합니다 모델의 사고 과정을 시각화할 수 있고, 모델 간 응답이 어떻게 다른지 정확히 확인할 수 있기 때문입니다.
비교 보기의 스크린샷은 다음과 같습니다:

결론
미세 조정과 budget forcing 같은 추론 시점 기법은 GPT-4o의 추론 능력을 분명히 향상시킵니다. 향후 실험에서는 오류 감지와 반복적 사고 정교화를 위해 o3-mini를 활용하는 등 하이브리드 접근법을 탐색할 수 있습니다. 차트 해석과 같은 멀티모달 과제로 이 방법을 확장하면, 복잡한 분석 애플리케이션에서 GPT-4o의 잠재력을 더욱 발휘할 수 있을 것입니다.
직접 모델을 사용해 보고 싶으시다면 언제든지 연락해 주세요. 아래에 댓글을 남기셔도 됩니다. 추가 실험을 위해 액세스를 기꺼이 제공해 드리겠습니다.
Add a comment