스택큐힙리스트

OpenAI 모델 맞춤 설정(미세 조정) : 맞춤 설정(미세 조정) 데이터셋에서 답변이 올바르게 출력되는지 확인하는 방법은 무엇인가요? 본문

카테고리 없음

OpenAI 모델 맞춤 설정(미세 조정) : 맞춤 설정(미세 조정) 데이터셋에서 답변이 올바르게 출력되는지 확인하는 방법은 무엇인가요?

스택큐힙리스트 2023. 3. 28. 02:29
반응형

나는 새로운 모델을 훈련시키기 위해 '프롬프트'와 '완성'을 사용하는 맞춤형 텍스트를 사용하고 있습니다.

내 데이터로 맞춤형 모델을 만드는 데 사용한 튜토리얼입니다.

beta.openai.com/docs/guides/fine-tuning/advanced-usage

하지만 모델을 학습시키고 모델에 질문을 보내도 여전히 일반적인 결과를 얻고 그 결과가 항상 내게 적합하지 않습니다.

내가 모델에 사용한 텍스트에서만 완료 결과가 나올 수 있게 어떻게 확인할 수 있나요? 일반적인 OpenAI 모델에서는 아니라는 것입니다.

일부 국기를 사용하여 제네릭 모델 결과에서 결과를 제거할 수 있나요?

답변 1

잘못된 목표: OpenAI API는 프롬프트가 fine-tuning 데이터셋과 유사한 경우 fine-tuning 데이터셋에서 답변해야 합니다.

이건 전혀 잘못된 논리야. 세밀 조정을 잊어버려. # $ @ $ & $ @ ^ $ & 공식적으로 말했듯이:

파인튜닝은 API를 통해 제공되는 모델을 더욱 효과적으로 활용할 수 있도록 합니다.

프롬프트 디자인보다 더 높은 품질 결과

프롬프트에 넣을 수 있는 예제보다 더 많은 예제로 훈련할 수 있는 능력

짧은 프롬프트로 인한 토큰 절약

지연 시간이 적은 요청들

미세조정은 미세조정 데이터셋에서 구체적인 답변을 찾는 것이 아닙니다.

세밀조정은 모델이 더 많은 지식을 얻는 데 도움이 되지만 모델이 답하는 방식과는 무관합니다. 왜냐하면, 세밀조정된 모델에서 얻는 답은 모든 지식에 기반합니다 (즉, fine-tuned model knowledge = default knowledge + fine-tuning knowledge).

GPT-3 모델에는 많은 일반 지식이 있지만 때로는 모델이 특정한 답변 (즉, 사실)으로 대답하도록 원합니다.

올바른 목표: 사실에 대해 묻는 경우 사실로 대답하고, 그렇지 않으면 OpenAI API로 대답하십시오.

참고 : 시각적 이해를 높이기 위해, 다음 코드는 Jupyter에서 실행되고 테스트되었습니다.

단계 1: 사실이라고 적힌 .csv 파일을 만드십시오.

간단히 하는 방법으로 ABC와 XYZ 두 회사를 추가하고 그 내용을 넣어봅시다. 여기에서는 회사의 1문장 설명이 내용입니다.

기업들.csv

데이터프레임을 출력하려면 print_dataframe.ipynb 실행하세요.

print_dataframe.ipynb

import pandas as pd

df = pd.read_csv('companies.csv')

df

우리는 다음과 같은 결과를 얻어야합니다.

2단계: 사실마다 embedding 벡터를 계산하십시오.

임베딩은 텍스트 간 의미론적 유사성 또는 차이점을 이해하는 데 도움이 되는 숫자 벡터입니다. 서로 가까운 두 임베딩은 컨텐츠가 더 유사합니다. ( source ).

먼저 Embeddings endpoint 를 시험해 보겠습니다. 입력값 This is a test 로 get_embedding.ipynb 를 실행합니다.

참고: Embeddings 엔드포인트의 경우, 매개변수 prompt 는 input 로 불립니다.

get_embedding.ipynb

import openai

import os

openai.api_key = os.getenv('OPENAI_API_KEY')

def get_embedding(model: str, text: str) -> list[float]:

result = openai.Embedding.create(

model = model,

input = text

)

return result['data'][0]['embedding']

print(get_embedding('text-embedding-ada-002', 'This is a test'))

다음 출력값을 얻어야 합니다:

우리가 위의 스크린샷에서 본 것은 This is a test를 임베딩 벡터로 본 것입니다. 보다 정확하게 말하면, 우리는 1536 차원의 임베딩 벡터를 얻습니다 (즉, 내부에 1536 개의 숫자가 있습니다). 아마도 3 차원 공간 (즉, X, Y, Z)에 익숙하실 것입니다. 이것은 상상하기 매우 어려운 1536 차원 공간입니다.

이 시점에서 우리가 이해해야 할 것은 두 가지가 있습니다.

왜 텍스트를 임베딩 벡터(숫자)로 변환해야 하는가? 그 이유는 나중에 임베딩 벡터를 비교하여 두 텍스트가 얼마나 유사한지 파악할 수 있기 때문입니다. 우리는 단순히 텍스트를 비교할 수 없습니다.

왜 임베딩 벡터 안에 정확히 1536개의 숫자가 있는가? text-embedding-ada-002 모델의 출력 차원이 1536 이기 때문입니다. 이것은 미리 정의되어 있습니다.

이제 우리는 각 사실에 대한 임베딩 벡터를 생성할 수 있습니다. get_all_embeddings.ipynb를 실행하세요.

get_all_embeddings.ipynb

import openai

from openai.embeddings_utils import get_embedding

import pandas as pd

import os

openai.api_key = os.getenv('OPENAI_API_KEY')

df = pd.read_csv('companies.csv')

df['embedding'] = df['content'].apply(lambda x: get_embedding(x, engine = 'text-embedding-ada-002'))

df.to_csv('companies_embeddings.csv')

위의 코드는 첫 번째 회사 (지명 : x)를 선택하여 그 회사의 fact (즉, 'content')를 가져와 함수 get_embedding을 사용하여 text-embedding-ada-002 모델을 적용합니다. 그 결과, 첫 번째 회사의 임베딩 벡터를 새로운 'embedding' 열에 저장합니다. 그 다음, 두 번째 회사, 세 번째 회사, 네 번째 회사 등을 선택하여 동일한 작업을 수행합니다. 마지막에는 코드가 자동으로 새로운 .csv 파일 (지명 : companies_embeddings.csv)을 생성합니다.

로컬로 임베딩 벡터를 저장하면 (즉, .csv 파일에) 필요할 때마다 OpenAI API를 호출하지 않아도 됩니다. 한 번 사실에 대한 임베딩 벡터를 계산하면 그만입니다.

새 열 이름이 'embedding' 인 데이터프레임을 출력하려면 print_dataframe_embeddings.ipynb 을(를) 실행하세요.

print_dataframe_embeddings.ipynb를 출력합니다.

import pandas as pd

import numpy as np

df = pd.read_csv('companies_embeddings.csv')

df['embedding'] = df['embedding'].apply(eval).apply(np.array)

df

우리는 다음과 같은 출력을 얻어야 합니다:

STEP 3: 입력에 대한 임베딩 벡터를 계산하고 cosine similarity을 사용하여 임베딩 벡터와 비교합니다.

우리는 입력에 대한 임베딩 벡터를 계산하여 입력과 주어진 사실을 비교하고 이 두 텍스트가 얼마나 유사한지를 확인해야 합니다. 사실, 우리는 입력의 임베딩 벡터를 사실의 임베딩 벡터와 비교합니다. 그리고 우리는 입력을 두 번째 사실, 세 번째 사실, 네 번째 사실 등과 비교합니다. get_cosine_similarity.ipynb를 실행하세요.

get_cosine_similarity.ipynb

import openai

from openai.embeddings_utils import cosine_similarity

import pandas as pd

import os

openai.api_key = os.getenv('OPENAI_API_KEY')

my_model = 'text-embedding-ada-002'

my_input = ''

def get_embedding(model: str, text: str) -> list[float]:

result = openai.Embedding.create(

model = my_model,

input = my_input

)

return result['data'][0]['embedding']

input_embedding_vector = get_embedding(my_model, my_input)

df = pd.read_csv('companies_embeddings.csv')

df['embedding'] = df['embedding'].apply(eval).apply(np.array)

df['similarity'] = df['embedding'].apply(lambda x: cosine_similarity(x, input_embedding_vector))

df

위의 코드는 입력을 가져와 첫 번째 사실과 비교합니다. 두 가지의 계산된 유사성을 새로운 열인 'similarity' 에 저장합니다. 그 다음, 두 번째 사실, 세 번째 사실, 네 번째 사실 등을 처리합니다.

만약 my_input = 'Tell me something about company ABC' 이라면:

만약 my_input = 'Tell me something about company XYZ'이라면:

만약 my_input = 'Tell me something about company Apple' 이라면:

우리는 입력값으로 Tell me something about company ABC을 줄 때, 첫 번째 사실과 가장 유사하다는 것을 볼 수 있습니다. 반면에 입력값으로 Tell me something about company XYZ을 줄 때는, 두 번째 사실과 가장 유사하다는 것을 볼 수 있습니다. 그리고 입력값으로 Tell me something about company Apple을 줄 때는, 이 두 사실 중 어느 것과도 가장 유사하지 않습니다.

5단계: 유사도가 우리의 기준치보다 높으면 가장 유사한 사실로 대답하고, 그렇지 않으면 OpenAI API로 대답합니다.

우리 유사성 임계치를 >= 0.9 로 설정해 봅시다. 아래의 코드는 유사성이 >= 0.9 라면 가장 유사한 fact로 응답해야 하고, 그렇지 않은 경우 OpenAI API로 응답해야 합니다. get_answer.ipynb 를 실행해보세요.

get_answer.ipynb

# Imports

import openai

from openai.embeddings_utils import cosine_similarity

import pandas as pd

import numpy as np

import os

# Use your API key

openai.api_key = os.getenv('OPENAI_API_KEY')

# Insert OpenAI text embedding model and input

my_model = 'text-embedding-ada-002'

my_input = ''

# Calculate embedding vector for the input using OpenAI Embeddings endpoint

def get_embedding(model: str, text: str) -> list[float]:

result = openai.Embedding.create(

model = my_model,

input = my_input

)

return result['data'][0]['embedding']

# Save embedding vector of the input

input_embedding_vector = get_embedding(my_model, my_input)

# Calculate similarity between the input and facts from companies_embeddings.csv file which we created before

df = pd.read_csv('companies_embeddings.csv')

df['embedding'] = df['embedding'].apply(eval).apply(np.array)

df['similarity'] = df['embedding'].apply(lambda x: cosine_similarity(x, input_embedding_vector))

# Find the highest similarity value in the dataframe column 'similarity'

highest_similarity = df['similarity'].max()

# If the highest similarity value is equal or higher than 0.9 then print the 'content' with the highest similarity

if highest_similarity >= 0.9:

fact_with_highest_similarity = df.loc[df['similarity'] == highest_similarity, 'content']

print(fact_with_highest_similarity)

# Else pass input to the OpenAI Completions endpoint

else:

response = openai.Completion.create(

model = 'text-davinci-003',

prompt = my_input,

max_tokens = 30,

temperature = 0

)

content = response['choices'][0]['text'].replace('\n', '')

print(content)

만약 my_input = 'Tell me something about company ABC' 이고 임계값이 >= 0.9 이라면 companies_embeddings.csv 로부터 다음 답변을 받아야 합니다.

만약 my_input = 'Tell me something about company XYZ'이고 임계치가 >= 0.9이라면 우리는 다음 답을 companies_embeddings.csv 로부터 얻어야 합니다.

만약 my_input = 'Tell me something about company Apple' 이고 임계값이 >= 0.9 이면 OpenAI API에서는 다음과 같은 답변을 얻을 수 있습니다.

답변 2

OpenAI 모델 개인 설정: 어떻게 답변이 개인 설정된 데이터셋에서 오는지 보장할까요?

OpenAI 모델은 인공 지능을 기반으로 한 언어 모델링 도구입니다. 이 모델은 자연어 처리에서 매우 유용하며 학습할 수 있는 대규모 데이터셋을 사용합니다. 그러나 종종 일반적인 데이터셋을 기반으로 학습된 기본 모델은 특정한 작업을 수행하는데는 충분하지 않을 수 있습니다. 그래서 개인 설정된 데이터셋을 사용하여 모델 성능을 개선하는 기능을 제공합니다.

개인 설정된 데이터셋은 특정한 작업에 맞게 만들어진 데이터셋으로, 보통 일반적인 데이터셋보다 훨씬 작을 수 있습니다. 이러한 데이터셋은 예를 들어 특정한 주제에 대한 질문과 답변, 특정한 유형의 문서 분류 등과 같은 작업에 사용될 수 있습니다.

개인 설정된 데이터셋에 대한 학습은 기본 모델을 미세 조정하여 새 데이터셋에 대한 예측을 개선합니다. 이를 위해 미세 조정은 개인 설정된 데이터셋에 대한 손실 함수를 계산하고, 모델이 새 데이터에 적응하도록 하여 수행됩니다.

하지만 개인 설정된 모델에서 답변이 개인 설정된 데이터셋에서 온 것임을 보장하기 위해서는 몇 가지 주의사항을 지켜야 합니다. 첫째, 개인 설정된 데이터셋을 만들 때, 정확한 질문과 정확한 답변이 포함되어 있어야 합니다. 둘째, 개인 설정된 데이터셋과 기본 모델의 데이터셋이 충분한 크기로 비교 가능해야 합니다. 마지막으로, 개인 설정된 데이터셋은 가능한 한 다양한 예시를 담고 있어야 합니다. 이것이 올바른 개인 설정된 모델을 만드는 것입니다.

OpenAI 모델 개인 설정은 기술적인 문제에 대한 해결책 중 하나입니다. 이것이 발전하면서, 더욱 정확하고 안정적인 모델을 만들 수 있을 것입니다. 따라서 이러한 기술을 잘 이용한다면 더 나은 모델링을 구현할 수 있을 것입니다.

결론적으로, OpenAI 모델을 개인 설정하는 것은 그것이 답변이 개인 설정된 데이터셋에서 온 것임을 보장하는 것이 중요합니다. 이것은 올바른 데이터셋을 사용하고, 미세 조정을 정확하게 수행하는 것과 같은 방법으로 보장될 수 있습니다. 이러한 조건이 충족될 때, 개인 설정된 모델은 향상된 예측과 다양한 자연어 처리 작업을 수행할 것입니다.

반응형
Comments