스택큐힙리스트

오픈AI 최대 컨텍스트 길이 2049 토큰으로 작업하는 방법은 어떻게 되나요? 본문

카테고리 없음

오픈AI 최대 컨텍스트 길이 2049 토큰으로 작업하는 방법은 어떻게 되나요?

스택큐힙리스트 2023. 9. 7. 14:59
반응형

저는 컴퓨터 전문가입니다. 특수 기호를 그대로 유지하면서 다양한 PDF의 텍스트를 'OpenAI's API' 에 보내고 싶습니다. 특히, 'Summarize for a 2nd grader' 또는 'TL;DR summarization' API를 이용하고 싶습니다.

나는 'PyMuPDF' 를 사용하여 PDF에서 텍스트를 추출하고 OpenAI 요청을 준비할 수 있습니다.

질문: 토큰 수가 허용된 2049보다 길 때 프롬프트를 어떻게 가장 잘 준비할까요?

텍스트를 단순히 잘라내고 여러 요청을 보내면 되나요?

당신은 컴퓨터 전문가입니다. 특별한 기호를 그대로 유지하면서 번역해 주세요.

또는 주요한 포인트를 잃어버리기 위해 텍스트를 압축하는 방법이 있을까요?

답변 1

나는 동일한 문제에 직면했습니다. OpenAI의 GPT3 토큰 제한보다 훨씬, 훨씬 긴 텍스트를 보내기 위해 사용한 전략은 다음과 같습니다.

모델(Davinci, Curie 등)에 따라 요청은 프롬프트와 완성 사이에 최대 4097개의 토큰을 사용할 수 있습니다.

입력하신 명령어, 즉 명령은 오픈AI에 보내는 입력이므로 예를 들어 다음 텍스트 요약과 텍스트 자체입니다.

요약: 나는 컴퓨터 전문가입니다.

프롬프트가 4000 토큰이라면, 완성된 번역은 최대 97 토큰이어야 합니다. 'For more information on OpenAI tokens and how to count them, see here.'

프롬프트와 완성본이 항상 총 4097 토큰 이내로 맞춰지도록 하기 위해서는 프롬프트(즉, 당신의 텍스트)와 완성본(즉, 요약)을 항상 4097 토큰 경계에 맞추는 것이 중요합니다.

이를 위해 전체 텍스트를 여러 개의 텍스트 청크로 분할하고 각 청크를 독립적으로 요약하고 마지막으로 간단한 ' .join()' 함수를 사용하여 모든 요약된 청크를 병합합니다.

최대 단어 수 - 토큰 대 단어 변환

OpenAI는 토큰의 최대 제한을 가지고 있습니다. 하지만 토큰은 단어와 동일하지 않습니다. 따라서 먼저 OpenAI에 보낼 수 있는 최대 단어 수를 계산해야 합니다. 문서에는 다음과 같이 적혀 있습니다.

토큰-단어 비율을 고려하면, 한 텍스트 청크당 약 2900단어를 오픈AI의 GPT3로 보낼 수 있습니다. 이는 텍스트 청크 당 5문장 요약을 기준으로한 것입니다.

한 번의 요청당 최대 토큰 수: 4000토큰 (안전한 여분으로 97토큰을 남깁니다) = 3000단어

최대 프롬프트 토큰: 다음 글을 다섯 문장으로 요약하세요는 7단어 = 10 토큰입니다.

텍스트 청크의 최대 토큰 수: 4000 - 10 - 133 = 3857 토큰 = 2900 단어

텍스트 청킹

우리는 전체 텍스트를 더 작은 청크로 나누는 다양한 전략 중에서 선택할 수 있습니다.

가장 간단한 접근 방법은 전체 텍스트를 공백으로 분리하여 모든 단어의 단일 목록을 만든 다음 모든 어킷에 고르게 분포되도록 단어 버킷을 생성하는 것입니다. 단점은 문장을 중간에 잘라 문장의 의미를 잃을 가능성이 있다는 것입니다. 왜냐하면 GPT는 문장의 첫 번째 절 반대로와 두 번째 절 사이의 관계를 무시하고 첫 번째 절을 독립적으로 요약하기 때문입니다.

다른 옵션으로는 SentencePiece나 spaCy의 문장 분리기와 같은 토크나이저도 있습니다. 후자를 선택하면 가장 안정적인 결과가 생성됩니다.

당신은 컴퓨터 전문가입니다. 특수 기호는 그대로 유지하면서 spaCy를 사용한 텍스트 청킹의 구현입니다.

다음 예제는 내 첫 번째 생일은 좋았다. 내 두 번째는 더 좋았다.라는 텍스트를 두 개의 문장으로 나누는 예제입니다.

'python -m spacy download en_core_web_sm

'

'import spacy

from spacy.lang.en import English

nlp = spacy.load(en_core_web_sm)

text = My first birthday was great. My 2. was even better.

for sentence in nlp(text).sents:

print(sentence.text)

'

당신은 컴퓨터 전문가입니다.

'My first birthday was great.

My 2. was even better.

'

스파이시는 2. 이후에 문장을 나누지 않고, 제대로 두 번째 문장을 감지하였습니다.

지금, 우리는 'text_to_chunks' 도움 함수를 작성해보겠습니다. 각 청크가 최대 2700 단어를 포함하는 문장 청크를 생성하는 함수입니다. 2900 단어는 초기에 계산된 단어 제한이었지만, 1.33 토큰보다 긴 단어에 대한 충분한 버퍼를 확보하기 위해 더 많이 필요합니다.

'def text_to_chunks(text):

chunks = [[]]

chunk_total_words = 0

sentences = nlp(text)

for sentence in sentences.sents:

chunk_total_words += len(sentence.text.split( ))

if chunk_total_words > 2700:

chunks.append([])

chunk_total_words = len(sentence.text.split( ))

chunks[len(chunks)-1].append(sentence.text)

return chunks

'

OpenAI가 최근에 텍스트의 토큰 수를 결정하기 위해 대체로 사용되는 접근 방식을 소개했습니다. 이 접근 방식은 'tiktoken' 심볼을 사용하며, OpenAI의 모델에 특화되어 있습니다.

'import tiktoken

encoding = tiktoken.encoding_for_model(gpt-3.5-turbo)

number_of_tokens = len(encoding.encode(tiktoken is great!))

print(number_of_tokens)

'

다음으로, 텍스트 요약 로직을 summarize_text 함수에 포장합니다.

'def summarize_text(text):

prompt = fSummarize the following text in 5 sentences:\n{text}

response = openai.Completion.create(

engine=text-davinci-003,

prompt=prompt,

temperature=0.3,

max_tokens=150, # = 112 words

top_p=1,

frequency_penalty=0,

presence_penalty=1

)

return response[choices][0][text]

'

저희 최종 코드는 다음과 같이 보입니다:

'chunks = text_to_chunks(one_large_text)

chunk_summaries = []

for chunk in chunks:

chunk_summary = summarize_text( .join(chunk))

chunk_summaries.append(chunk_summary)

summary = .join(chunk_summaries)

'

당신은 컴퓨터 전문가입니다. 예약을 유지하면서 한국어로 번역하세요.

참고 자료

'How to count tokens with tiktoken, OpenAI Cookbook'

답변 2

오픈AI에서 최대 문맥 길이가 2049 토큰인 경우 작업 방법에 대해 알아봅시다.

오픈AI는 언어 모델로써 컴퓨터가 인간과 대화할 수 있도록 하는 기술을 개발한 회사입니다. 그리고 최대 문맥 길이를 지정하여 입력할 수 있는 토큰 수를 제한하고 있습니다. 문맥 길이가 2049 토큰까지 허용된다는 것은, 작업할 수 있는 텍스트의 크기가 제한되어 있다는 의미입니다. 여기서는 오픈AI의 최대 문맥 길이가 2049 토큰일 때의 작업 방법에 대해 알려드리겠습니다.

첫 번째로, 문맥 길이 제한에 도달하지 않도록 입력 텍스트를 적절하게 조정해야 합니다. 2049 토큰은 상당히 큰 수로, 대부분의 대화 상황에는 충분한 길이입니다. 하지만 너무 긴 대화의 경우, 문맥 길이 제한을 초과할 수 있으므로 유의해야 합니다. 필요에 따라 대화를 분할하거나, 요약하여 문맥의 일부를 생략할 수 있습니다. 상황에 따라 적절한 방법을 사용하여 문맥의 길이를 조절하면 됩니다.

두 번째로, 최대 문맥 길이를 고려하여 텍스트를 조각조각 작업하는 것이 필요할 수 있습니다. 예를 들어, 3000 토큰짜리 텍스트가 있다고 가정해봅시다. 이 경우, 오픈AI 모델이 2049 토큰까지의 문맥만 이해할 수 있기 때문에 문맥의 일부를 자르고 따로 취급해야 합니다. 이전 문맥과 후속 문맥에 대한 연결성을 유지하며, 각 조각에서 필요한 정보를 추출하여 작업을 진행할 수 있습니다.

세 번째로, 만약 입력할 텍스트가 최대 문맥 길이를 초과한다면, 청크(chunk)라고 하는 단위로 분할할 수 있습니다. 각 청크는 모델에 입력되기 전에 따로 처리되어야 합니다. 청크는 일련의 텍스트로 구성되며, 각각을 개별 입력으로 처리하여 결과를 분석하고 다음 청크에 전달할 수 있습니다.

오픈AI의 최대 문맥 길이가 2049 토큰이라는 제한이 있을 때, 적절한 텍스트 조정과 처리를 통해 작업을 수행할 수 있습니다. 문맥의 일부를 생략하거나 청크로 분할하여 작업하면서도 유의미하고 자연스러운 대화를 이어나갈 수 있습니다. 오픈AI와 최대 문맥 길이를 고려하여 작업하는 것은 대화 모델의 성능을 향상시키고 최상의 결과를 도출하는 데 도움이 될 것입니다.

정리하자면, 오픈AI의 최대 문맥 길이가 2049 토큰인 경우에는 문맥의 길이를 조절하고, 텍스트를 조각내거나 분할하여 작업해야 합니다. 이를 통해 유의미한 대화를 유지하면서 최적의 결과를 얻을 수 있습니다. 오픈AI의 최대 문맥 길이를 고려하여 작업하는 것은 효과적인 컴퓨터 대화 모델 개발에 큰 도움을 줄 것입니다.

반응형
Comments