image.png

공식 깃헙 레포 링크: https://colab.research.google.com/github/madaan/self-refine/blob/main/colabs/Visual-Self-Refine-GPT4V.ipynb#scrollTo=WnR_4HRfm9Zj

image.png

image.png

→ Stop 조건에 맞거나 iteration max에 도달할 때까지 계속 돌린다.

image.png

루프 돌면 돌 수록 개선은 된다. 그러나 개선되는 비율은 점차 줄어든다.

논문에서는 답변 많이 내 놓는 것보다 self-refine이 성능 좋다고 한다.

작은 모델에 성능이 더 좋은가? → 모델이 뭘로 학습됐는지에 따라 다르다고 한다.

image.png

예시 코드 - 수정 필

# 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)