공식 깃헙 레포 링크: https://colab.research.google.com/github/madaan/self-refine/blob/main/colabs/Visual-Self-Refine-GPT4V.ipynb#scrollTo=WnR_4HRfm9Zj
→ Stop 조건에 맞거나 iteration max에 도달할 때까지 계속 돌린다.
루프 돌면 돌 수록 개선은 된다. 그러나 개선되는 비율은 점차 줄어든다.
논문에서는 답변 많이 내 놓는 것보다 self-refine이 성능 좋다고 한다.
작은 모델에 성능이 더 좋은가? → 모델이 뭘로 학습됐는지에 따라 다르다고 한다.
# self-refine 함수
def self_refine(input_text, model, gen_prompt, feedback_prompt, refine_prompt, max_iterations=3):
"""
Self-Refine 과정을 통해 텍스트를 반복적으로 개선하는 함수
"""
output = model.generate(input_text, prompt=gen_prompt)
for _ in range(max_iterations):
feedback = model.generate(output, prompt=feedback_prompt)
if "STOP" in feedback:
break
output = model.generate(output + feedback, prompt=refine_prompt)
return output
# 개별 메일 요약
def summarize_emails(emails, model):
"""
이메일 데이터를 요약하는 함수
"""
summaries = []
for email in emails:
summary = self_refine(
input_text=email['content'],
model=model,
gen_prompt="이메일 내용을 간단하고 명확하게 요약해주세요.",
feedback_prompt="요약문의 간결성, 정보 전달력, 논리적인 흐름에 대해 구체적이고 실행 가능한 피드백을 제공해주세요.",
refine_prompt="이 피드백을 반영해 요약문을 수정하고 더 나은 버전을 만들어주세요."
)
summaries.append({'email_id': email['id'], 'summary': summary})
return summaries
# 데일리 레포트 생성
def compile_daily_report(summaries, model):
"""
요약문을 취합해 데일리 레포트를 생성하는 함수
"""
initial_report = "\\n".join([summary['summary'] for summary in summaries])
refined_report = self_refine(
input_text=initial_report,
model=model,
gen_prompt=(
"다음 요약문들을 바탕으로 하루 동안의 이메일 내용을 정리한 데일리 레포트를 작성해주세요. "
"각 요약문을 연결하여 논리적이고 읽기 쉽게 구성해주세요."
),
feedback_prompt=(
"작성된 데일리 레포트의 가독성, 논리적 흐름, 정보의 충실성을 평가하고, 개선이 필요한 부분에 대해 구체적이고 실행 가능한 피드백을 작성해주세요."
),
refine_prompt=(
"제공된 피드백을 바탕으로 데일리 레포트를 수정하고, 더 논리적이고 완성도 높은 레포트를 작성해주세요."
)
)
return refined_report
if __name__ == "__main__":
# 샘플 이메일 데이터
emails = [
{"id": 1, "content": "내일 오전 10시에 프로젝트 회의가 있습니다. 논의할 주요 주제는 프로젝트 일정과 역할 분담입니다."},
{"id": 2, "content": "분기 보고서를 금요일까지 제출해야 합니다. 관련 자료를 검토한 후, 팀원들과 의견을 나눠주세요."}
]
# 모델 초기화
model = None # 실제 모델 인스턴스를 여기에 초기화하세요.
# Step 2: Generate refined summaries
summaries = summarize_emails(emails, model)
# Step 3: Generate the daily report
daily_report = compile_daily_report(summaries, model)
print("데일리 레포트:\\n", daily_report)