OpenAI API 효율적으로 사용하기

문제 요약

  • 입력 데이터가 방대하면, API 호출 시마다 토큰을 많이 소모합니다.
  • 대화 길이가 제한되므로 복잡한 사고를 진행하기 어렵습니다.
  • 효율적인 데이터 관리 및 요약이 필요합니다.

해결 방안

1. 데이터 요약(Summarization)

방대한 데이터를 매번 입력하는 대신, 데이터를 핵심 정보로 요약하여 입력 토큰을 줄입니다.

예시: 요약 API 호출


# 요약 작업을 위한 프롬프트
prompt = f"다음 회계 데이터를 간단히 요약하세요:\n\n{large_data}"

response = openai.Completion.create(
    engine="text-davinci-003",
    prompt=prompt,
    max_tokens=500
)

summary = response.choices[0].text.strip()
print("요약된 데이터:", summary)

    

목적: 필요한 데이터의 요약본을 생성하여 이후 작업에서 활용.

장점: 입력 데이터의 크기를 줄여 효율적으로 대화 길이를 늘릴 수 있습니다.

2. 데이터의 단계별 로드

한 번에 방대한 데이터를 입력하지 말고, 필요한 부분만 단계적으로 로드합니다.

방법:

  • 데이터를 여러 파일로 나눕니다.
  • 현재 작업과 관련된 부분만 로드하여 사용합니다.

예시:


# 필요한 데이터만 로드
with open("section1_accounting.txt", "r", encoding="utf-8") as file:
    data_part = file.read()

# 선택한 데이터만 API에 전달
response = openai.Completion.create(
    engine="text-davinci-003",
    prompt=f"다음 데이터를 기반으로 질문에 답하세요:\n\n{data_part}\n\n질문: 회계의 기본 개념은 무엇인가요?",
    max_tokens=500
)

    

장점: 작업에 필요한 데이터만 전달하므로 토큰 소모를 줄임.

3. 벡터 데이터베이스 활용 (Embedding 기반 검색)

방대한 데이터셋을 저장하고, AI 모델에 적합한 정보만 검색해 입력으로 제공합니다.

과정:

  1. 데이터를 OpenAI의 Embedding API로 벡터화합니다.
  2. 벡터화된 데이터를 검색 가능한 데이터베이스에 저장합니다(예: Pinecone, Weaviate).
  3. 사용자 질문과 관련된 데이터만 검색하여 입력으로 사용합니다.

예시 (Embedding으로 검색):


# 데이터 임베딩 생성
embedding_response = openai.Embedding.create(
    input="회계 주요 개념",
    engine="text-embedding-ada-002"
)

# 벡터 데이터베이스에서 가장 유사한 데이터를 검색 후 API에 전달
relevant_data = "검색된 요약 데이터"  # 검색된 데이터를 여기에 저장
response = openai.Completion.create(
    engine="text-davinci-003",
    prompt=f"다음 데이터를 기반으로 답하세요:\n\n{relevant_data}\n\n질문: 회계의 기본 개념은 무엇인가요?",
    max_tokens=500
)

    

장점: 방대한 데이터를 모두 읽을 필요 없이, 질문과 관련된 정보만 전달. 입력 토큰을 효율적으로 사용 가능.

4. 컨텍스트 리셋과 메모리

긴 대화를 진행할 경우, 중간 결과물을 요약하여 새로운 컨텍스트로 시작합니다.

방법:

  • 중간 단계에서 AI가 생성한 결과를 요약하거나 저장.
  • 요약된 내용을 다음 호출의 컨텍스트로 사용.

예시:


# 중간 결과를 요약
mid_response = "중간 결과물"
summary_response = openai.Completion.create(
    engine="text-davinci-003",
    prompt=f"다음 내용을 간단히 요약하세요:\n\n{mid_response}",
    max_tokens=200
)

summary = summary_response.choices[0].text.strip()

# 요약된 내용을 새로운 프롬프트에 사용
response = openai.Completion.create(
    engine="text-davinci-003",
    prompt=f"이전 요약을 바탕으로 추가 작업을 진행하세요:\n\n{summary}\n\n질문: 추가로 필요한 작업은 무엇인가요?",
    max_tokens=500
)

    

장점: 대화 길이를 늘리면서 컨텍스트를 유지.

5. API 호출 전략 최적화

  • 모델 선택: 방대한 데이터를 입력해야 한다면, 최대 토큰 수가 큰 모델(예: GPT-4 32k)을 선택.
  • 효율적인 프롬프트 작성: 불필요한 문장이나 설명을 제거해 핵심 정보만 포함.
  • 작업 나누기: 복잡한 작업을 여러 단계로 분리하여 각 호출이 간결해지도록 설계.

추천 워크플로우 (복합적 사고)

  1. 데이터 요약 및 정리: 방대한 데이터를 읽어야 할 경우, 먼저 요약본을 생성. 필요하다면 데이터를 주제별로 나눔.
  2. 정보 검색 및 로드: Embedding API를 활용해 필요한 데이터만 검색하거나 단계적으로 관련 데이터를 불러옴.
  3. 중간 결과 저장: 단계별로 나온 결과물을 저장 및 요약. 새로운 컨텍스트로 시작.
  4. 최종 작업 진행: 중간 요약을 바탕으로 최종 질문 또는 작업을 진행.

결론

방대한 데이터를 다룰 때 토큰 소모를 줄이고 대화를 길게 유지하려면:

  • 요약(Summarization),
  • 검색(Embedding 기반 검색),
  • 컨텍스트 리셋 전략

을 활용하세요. 방대한 데이터를 반복적으로 읽는 대신, 필요한 정보를 효율적으로 검색하거나 요약된 데이터를 사용하는 것이 핵심입니다.

다음 이전