LLM Fine-tuning 실습 프로젝트 - Part 4
Contents
- Evolving이란?
- Evolving 방법론들
- Evolving 하기
- 제거하기
1. Evolving이란?
WizardLM을 사용하여, 데이터셋 (질문)을 증강
- 깊이, 너비 등을 확장하여 질문지를 더 만들기!
2. Evolving 방법론들
(1) add_constraints
- 제약 초건 추가하기
def add_constraints(instruction,corpus,openai):
evolving= f"저는 당신이 질문 재작성자로 활동하기를 원합니다. 당신의 목표는 주어진 질문 제공된 문장을 참고하여 재작성해, AI가 처리하기 더 어렵게 만드는 것입니다. 하지만 재작성된 질문은 합리적이어야 하고 인간이 이해하고 응답할 수 있어야 합니다.\n\
다음 방법을 사용하여 주어진 질문을 더 복잡하게 하나만 만들어야 합니다:\n\
- 주어진 질문에 제약 조건, 요구 사항을 하나 더 추가하십시오.\n\
최대한 재작성된 질문이 장황해지지 않도록 노력해야 하며, 재작성된 질문은 주어진 질문에 단어를 10~20개만 추가할 수 있으며, 답변없이 질문 하나만 무조건 한국어로 재작성해주세요.\n\
제공된 문장: {corpus}\n\n\
주어진 질문: {instruction}\n\n\
재작성된 질문: "
chat_completion = openai.chat.completions.create(
#model="mistralai/Mixtral-8x22B-Instruct-v0.1",
model='microsoft/WizardLM-2-8x22B',
messages=[{"role:":"user", "content" : evolving}],
temperature=0.7,
max_tokens=8192)
return chat_completion.choices[0].message.content
(2) deepening
- 깊이있는 질문 생성
def deepening(instruction,corpus,openai):
evolving= f"저는 당신이 질문 재작성자로 활동하기를 원합니다. 당신의 목표는 주어진 질문을 제공된 문장을 참고하여 재작성해, AI가 처리하기 더 어렵게 만드는 것입니다. 하지만 재작성된 질문은 합리적이어야 하고 인간이 이해하고 응답할 수 있어야 합니다.\n\
다음 방법을 사용하여 주어진 질문을 더 복잡하게 하나만 만들어야 합니다:\n\
- 주어진 프롬프트에 특정 문제에 대해 깊이와 폭을 추가하십시오.\n\
최대한 재작성된 질문이 장황해지지 않도록 노력해야 하며, 재작성된 질문은 주어진 질문에 단어를 10~20개만 추가할 수 있으며, 답변없이 질문 하나만 무조건 한국어로 재작성해주세요.\n\
제공된 문장: {corpus}\n\n\
주어진 질문: {instruction}\n\n\
재작성된 질문: "
chat_completion = openai.chat.completions.create(
#model="mistralai/Mixtral-8x22B-Instruct-v0.1",
model='microsoft/WizardLM-2-8x22B',
messages=[{"role:":"user", "content" : evolving}],
temperature=0.7,
max_tokens=8192)
return chat_completion.choices[0].message.content
(3) increase_reasoning
- 사고 과정이 더 요구되는 질문 생성
def increase_reasoning(instruction,corpus,openai):
evolving= f"저는 당신이 질문 재작성자로 활동하기를 원합니다. 당신의 목표는 주어진 질문을 제공된 문장을 참고하여 재작성해, AI가 처리하기 더 어렵게 만드는 것입니다. 하지만 재작성된 질문은 합리적이어야 하고 인간이 이해하고 응답할 수 있어야 합니다.\n\
다음 방법을 사용하여 주어진 질문을 더 복잡하게 하나만 만들어야 합니다:\n\
- 간단한 사고 과정만으로 해결할 수 있는 문제라면 여러 단계의 추론을 명시적으로 요구하도록 재작성하십시오.\n\
최대한 재작성된 질문이 장황해지지 않도록 노력해야 하며, 재작성된 질문은 주어진 질문에 단어를 10~20개만 추가할 수 있으며, 답변없이 질문 하나만 무조건 한국어로 재작성해주세요.\n\
제공된 문장: {corpus}\n\n\
주어진 질문: {instruction}\n\n\
재작성된 질문: "
chat_completion = openai.chat.completions.create(
#model="mistralai/Mixtral-8x22B-Instruct-v0.1",
model='microsoft/WizardLM-2-8x22B',
messages=[{"role:":"user", "content" : evolving}],
temperature=0.7,
max_tokens=8192)
return chat_completion.choices[0].message.content
(4) concretizing
- 코드, 표 등을 더 구체적으로!
def concretizing(instruction,corpus,openai):
evolving= f"저는 당신이 질문 재작성자로 활동하기를 원합니다. 당신의 목표는 주어진 질문을 제공된 문장을 참고하여 재작성해, AI가 처리하기 더 어렵게 만드는 것입니다. 하지만 재작성된 질문은 합리적이어야 하고 인간이 이해하고 응답할 수 있어야 합니다.\n\
재작성할 때, 비텍스트 부분(표, 코드 등)을 생략해서는 안 됩니다. 또한 주어진 질문의 입력 부분을 생략하지 마십시오.\n\
다음 방법을 사용하여 주어진 질문을 더 복잡하게 하나만 만들어야 합니다:\n\
- 일반 개념을 더 구체적인 개념으로 바꾸십시오.\n\
최대한 재작성된 질문이 장황해지지 않도록 노력해야 하며, 재작성된 질문은 주어진 질문에 단어를 10~20개만 추가할 수 있으며, 답변없이 질문 하나만 무조건 한국어로 재작성해주세요.\n\
제공된 문장: {corpus}\n\n\
주어진 질문: {instruction}\n\n\
재작성된 질문: "
chat_completion = openai.chat.completions.create(
#model="mistralai/Mixtral-8x22B-Instruct-v0.1",
model='microsoft/WizardLM-2-8x22B',
messages=[{"role:":"user", "content" : evolving}],
temperature=0.7,
max_tokens=8192)
return chat_completion.choices[0].message.content
(5) complicated_input
- 더 복잡하게 만들기
def complicated_input(instruction,corpus,openai):
evolving= f"저는 당신이 질문 재작성자로 활동하기를 원합니다. 당신의 목표는 주어진 질문을 제공된 문장을 참고하여 재작성해, AI가 처리하기 더 어렵게 만드는 것입니다. 하지만 재작성된 질문은 합리적이어야 하고 인간이 이해하고 응답할 수 있어야 합니다.\n\
다음 방법을 사용하여 주어진 질문을 더 복잡하게 하나만 만들어야 합니다:\n\
- 질문의 형식을 수식, 표나 코드등으로 등 복잡한 형태의 데이터로 변환하세요.\n\
최대한 재작성된 질문이 장황해지지 않도록 노력해야 하며, 재작성된 질문은 주어진 질문에 단어를 10~20개만 추가할 수 있으며, 답변없이 질문 하나만 무조건 한국어로 재작성해주세요.\n\
제공된 문장: {corpus}\n\n\
주어진 질문: {instruction}\n\n\
재작성된 질문: "
chat_completion = openai.chat.completions.create(
#model="mistralai/Mixtral-8x22B-Instruct-v0.1",
model='microsoft/WizardLM-2-8x22B',
messages=[{"role:":"user", "content" : evolving}],
temperature=0.7,
max_tokens=8192)
return chat_completion.choices[0].message.content
(6) in_breadth_evolving
def in_breadth_evolving(instruction,corpus,openai):
evolving= f"당신은 새로운 질문을 창작하는 창작자 입니다.\
당신의 목표는 주어진 질문에서 영감을 받아 제공된 문장을 참고하여 완전히 새로운 질문을 만드는 것입니다.\n\
이 새로운 질문은 주어진 질문과 동일한 도메인에 속해야 하지만 더 드문 주제를 다루어야 합니다.\
새로 만든 질문의 길이와 난이도는 주어진 질문과 비슷해야 합니다.\
새로 만든 질문 합리적이어야 하고 인간이 이해하고 응답할 수 있어야 합니다.\
새로 만든 질문을 답변없이 질문 하나만 무조건 한국어로 재작성해주세요. 기존의 질문은 답변에 포함되지 않아야 합니다.\n\
제공된 문장: {corpus}\n\n\
주어진 질문: {instruction}\n\n\
새로 만든 질문: "
chat_completion = openai.chat.completions.create(
#model="mistralai/Mixtral-8x22B-Instruct-v0.1",
model='microsoft/WizardLM-2-8x22B',
messages=[{"role:":"user", "content" : evolving}],
temperature=0.7,
max_tokens=8192)
return chat_completion.choices[0].message.content
3. Evovling 하기
( 현재 코딩 task 데이터 없으므로, 총 4개의 evolving 방법론 후보군 )
4개의 evolving 방법론 후보 중, 랜덤하게 2개를 사용
단, 너무 짧은 답변은 pass!
def main():
# Create an OpenAI client with your deepinfra token and endpoint
openai = OpenAI(
api_key="your_api",
base_url="https://api.deepinfra.com/v1/openai",)
df= pd.read_excel('final_evolving_insurance.xlsx')
query=[]
corpus_lst=[]
origin_lst=[]
i=0
while i< len(df):
flag_a=False
flag_b=False
flag_c=False
picked=random.sample([1,2,3,4],2)
add_lst=[]
corpus=df['corpus'][i]
origin=df['question'][i]
if 1 in picked:
query_a = add_constraints(df['question'][i],corpus,openai).lstrip()
add_lst.append(query_a)
if 2 in picked:
query_a = deepening(df['question'][i],corpus,openai).lstrip()
add_lst.append(query_a)
if 3 in picked:
query_a = increase_reasoning(df['question'][i],corpus,openai).lstrip()
add_lst.append(query_a)
if 4 in picked:
query_a = concretizing(df['question'][i],corpus,openai).lstrip()
add_lst.append(query_a)
query_b=in_breadth_evolving(df['question'][i],corpus,openai).lstrip()
add_lst.append(query_b)
if (len(add_lst)==3) and len(add_lst[0])>5 and len(add_lst[1])>5:
flag_a=True
flag_b=True
flag_c=True
if flag_a==flag_b==flag_c==True:
query+=add_lst
corpus_lst+=[corpus,corpus,corpus]
origin_lst+=[origin,origin,origin]
print(f'{i+1}/{len(df)} data was saved')
i+=1
maded_df= pd.DataFrame({'instruction': query,'corpus':corpus_lst,'orgin':origin_lst})
maded_df.to_excel('insurance_evol2.xlsx',index=False)
print('================================================================================================================\n\n')
print(f'{"Evolving was finished":^50}') print('================================================================================================================')
4. 제거하기
불필요한 질문들은 제거하기!
def eliminating(openai,orgin,inst,corpus,response):
evolving= f'당신의 임무는 진화된 질문이 원본 질문과 비교했을 때 정보적 이득을 제공하지 않거나, 주어진 문장을 기반으로 적절한 답변이 생성이 되지 않았거나, LLM이 응답을 생성하기 어렵게 만드는지를 평가하는 것입니다. 또한, 생성된 답변, 또는 진화 질문이 원본 질문을 매우 유사하게 복사했는지 확인하십시오. 다음 평가 기준을 사용하십시오:\n\
- 평가 기준:\n\
1. 진화된 질문이 LLM이 답변을 생성하기 어렵게 만들거나, 잘못된 단어가 포함된 경우.\n\
2. 생성된 답변과 진화된 질문이, 한국어의 문법적 결함이 있는 경우.\n\
3. 진화된 질문에 대해서 생성된 답변이 부적절한 답변인 경우.\n\
4. 주어진 문장을 기반으로 유추하였을 때, 적절하지 않은 답변이 생성된 경우.\n\
이 기준 중 하나라도 충족되면 True로 답변하고, 아닌경우는 False로 답변하세요. 어떤 설명이나 다른단어로 답변하지말고 True 와 False로만 답변을 해야 합니다.\n\
- 주어진 문장: {corpus}\n\
- 원본 질문: {orgin}\n\
- 진화된 질문: {inst}\n\
- 생성된 답변: {response}\n\
답변: '
chat_completion = openai.chat.completions.create(
#model="mistralai/Mixtral-8x22B-Instruct-v0.1",
model= 'microsoft/WizardLM-2-8x22B',
messages=[{"role:":"user", "content" : evolving}],
temperature=0.7,
max_tokens=8192)
return chat_completion.choices[0].message.content
def main():
# Create an OpenAI client with your deepinfra token and endpoint
openai = OpenAI(
api_key="your api key",
base_url="https://api.deepinfra.com/v1/openai",)
df= pd.read_excel('insurance-QA-set_SEED1.xlsx')
df= df.reset_index(drop=True)
lst=[]
i=0
while i < len(df):
res = eliminating(openai,df['orgin'][i],df['instruction'][i],df['response'][i],df['corpus'][i])
res=res.lstrip()
if 'True' in res and 'False' in res:
pass
elif 'True' in res:
lst.append(True)
i+=1
print(f'{i}/{len(df)} was completed...')
elif 'False' in res:
lst.append(False)
i+=1
print(f'{i}/{len(df)} was completed...')
else:
pass
df['result']=lst
df.to_excel('insurance-Q-A-E_SEED1.xlsx',index=False)
print('================================================================================================================\n\n')
print(f'{"Eliminating was finished":^50}') print('================================================================================================================')
Reference
https://fastcampus.co.kr/data_online_gpu