본문 바로가기

AI tech

주간회고 작성 좀 해줘! : Notion + LLM을 활용한 회고 자동화 시스템

반응형

프로젝트 Github:

https://github.com/maxseats/notion-retrospect-upload

 

GitHub - maxseats/notion-retrospect-upload: 노션 API를 활용해서 주간회고를 작성하고자 한 노력입니다.

노션 API를 활용해서 주간회고를 작성하고자 한 노력입니다. Contribute to maxseats/notion-retrospect-upload development by creating an account on GitHub.

github.com

1. 개요

개발을 하면서 꾸준한 회고가 중요하다고 생각하지만, 매번 직접 정리하는 것이 쉽지 않았다. 하루하루 쌓이는 작업 로그를 다시 살펴보고 정리하는 과정이 번거로웠기 때문이다. 이에 따라, 자동으로 개발일지를 정리하고 주간 회고를 생성하는 시스템이 있다면 효율적일 것이라는 생각이 들었다. (물론 직접 되돌아보며 생각을 정리하는 시간은 가져야 한다!)

노션(Notion)은 이미 개발 일지를 관리하는 데 사용하고 있었고, 최근 대형 언어 모델(LLM)의 발전으로 자연스러운 글 작성이 가능해졌다. 이 두 가지를 조합해서 별도의 수작업 없이 자동으로 정리된 회고를 받을 수 있을 것이라 기대했다.

2. 문제

  1. 회고 작성의 부담: 매주 개발 과정을 돌아보고 글로 정리하는 것이 시간이 많이 들고 피로도가 높았다.
  2. 기록을 활용하지 못함: Notion에 개발 기록을 남기지만, 이를 돌아보거나 분석하는 일이 드물었다.
  3. 자동화 부족: 개발 기록이 쌓여도 정리하는 과정이 수동이라, 활용도가 낮았다.

3. 해결 과정

이 문제를 해결하기 위해, 아래와 같은 방식으로 프로젝트를 설계했다.

  1. Notion API를 활용한 데이터 수집
    • 개발일지가 쌓이는 Notion 데이터베이스에서 1주일 치 로그를 자동으로 가져온다.
  2. LLM을 활용한 자동 회고 생성
    • OpenAI의 GPT 모델을 이용해, 가져온 개발일지를 바탕으로 의미 있는 회고 문서를 생성한다.
  3. Crontab을 활용한 주기적 실행
    • Crontab을 이용해 1주일에 한 번씩 자동 실행되도록 설정하여, 매주 새로운 회고가 자동으로 작성되도록 했다.
  4. 간편한 실행 및 설정 지원
    • 환경 변수 파일(.env)을 설정하여 API 키 및 데이터베이스 ID를 지정할 수 있도록 했다.
    • 실행을 단순화하기 위해 스크립트를 제공하여, 한 번의 명령어 실행으로 모든 설정이 완료되도록 구성했다.

4. 실행 방식

프로젝트는 다음과 같은 방식으로 동작한다.

  1. 사용자는 Notion API Key와 OpenAI API Key를 발급받아 .env 파일에 설정한다.
  2. 프로젝트를 클론한 후 실행 스크립트를 실행하면, 자동으로 Crontab에 등록되어 주기적으로 실행된다.
  3. 실행 시 지난 1주일간의 Notion 개발일지를 불러와, LLM을 통해 자동으로 정리된 회고를 작성한다.
  4. 정리된 회고는 다시 Notion 데이터베이스에 자동으로 업로드된다.

5. 결론 및 성과

이 프로젝트를 통해 개발 회고 작성이 자동화되면서, 다음과 같은 성과를 얻었다.

  1. 회고 작성 부담 감소: 개발 과정에서 별도로 시간을 들이지 않고도 매주 정리된 회고를 받아볼 수 있게 되었다.
  2. 기록 활용도 향상: Notion에 쌓이는 개발 기록을 더 적극적으로 활용할 수 있게 되었고, 이를 기반으로 주간 성과 분석이 가능해졌다.
  3. 자동화로 인한 지속성 확보: Crontab을 통한 자동 실행 덕분에 꾸준한 회고 작성을 유지할 수 있었다.

6. 작동 화면

여기서부터 반말 모드를 해제합니다!

여기서, 주 단위로 정해진 시간이 되면?(토요일 오후 12시)

→ 주기적으로 회고 자동 생성! (회고를 곱씹어보고 페이지에 이모지를 달면 확인했다는 의미로 활용할 수 있어요!)

생성된 회고

  • 회고 작성 프롬프트를 공유해주신 변성윤님께 감사드립니다 :)

7. 과정

7-1. 코드 실행 흐름

1) 첫 시작

if __name__ == "__main__":
    logger.info(f"{get_current_time()} - upload_notion_weekly_retrospect 시작")
    upload_notion_weekly_retrospect()
    logger.info(f"{get_current_time()} - upload_notion_weekly_retrospect 끝")
  • upload_notion_weekly_retrospect() 함수를 실행하여 전체 프로세스를 시작합니다.
  • 실행 시작과 끝을 로깅하여 추적할 수 있도록 합니다.

2) 최근 6일간의 개발 일지 가져오기

today = get_current_time()
START_DATE = (today - timedelta(days=6)).strftime("%Y-%m-%d")
END_DATE = today.strftime("%Y-%m-%d")
searched_pages_ids = get_page_ids_by_date(START_DATE, END_DATE)
  • get_current_time()을 사용해 오늘 날짜를 가져옵니다.
    • 직접 작성한 함수로, pytz 모듈을 통해 "Asia/Seoul”의 시간대를 가져옵니다.
  • 6일 전부터 오늘까지의 날짜 범위를 설정합니다.
  • get_page_ids_by_date() 함수를 이용해 해당 기간의 Notion 페이지 ID 목록을 가져옵니다.
    • Notion API를 활용하고자 requests를 보내서 오늘로부터 6일 전 까지의 노션 페이지들을 검색 후, page id들을 가져옵니다.

3) 개발 일지 내용을 마크다운으로 변환

total_page_content = get_total_page_content_md(searched_pages_ids)
  • get_total_page_content_md() 함수를 통해 가져온 페이지 ID들을 순회하며 각 페이지 내용을 마크다운 형식으로 변환합니다.
    • 추후에 LLM에 입력으로 주기 위해, 모든 페이지 내용을 하나의 문자열로 합칩니다.
    • Notion 블록을 markdown 형식으로 변환하는 과정에서, 직접 제작한 convert_block_to_markdown 함수를 사용합니다.(마크다운 직접 파싱)

4) GPT를 이용해 주간 회고 생성

gpt_retrospect = make_weekly_retrospect_by_gpt(total_page_content)
  • OpenAI API를 호출하여 GPT 모델이 주간 회고를 자동 생성하도록 합니다.
  • make_weekly_retrospect_by_gpt() 함수가 이를 수행합니다.

5) GPT를 이용해 회고 제목 생성

retrospect_title = make_title_of_retrospect_by_gpt(gpt_retrospect)
  • 생성된 주간 회고 내용을 바탕으로 적절한 제목을 생성합니다.
  • make_title_of_retrospect_by_gpt() 함수가 이를 담당합니다.

6) Notion에 업로드

create_daily_page(retrospect_title, gpt_retrospect)
  • create_daily_page() 함수를 사용해 주간 회고를 Notion에 업로드합니다.
  • 생성한 마크다운 형식의 주간 회고를, Notion 블럭 형태로 변환하기 위해 md2notionpage의 parse_md함수를 사용합니다.
 

GitHub - markomanninen/md2notion

Contribute to markomanninen/md2notion development by creating an account on GitHub.

github.com

 

7-2. 크론탭을 위한 스크립트 작성

자동으로 주간 회고를 생성하고자, 크론탭(Crontab)을 활용하여 스케줄링을 설정했습니다. 하지만 크론탭에 직접 경로를 등록하는 과정에서 모든 경로가 절대 경로여야 하는 이슈가 발생했어요. 이를 해결하기 위해 스크립트 파일을 직접 만들지 않고, 파이썬 코드로 생성한 후 실행하는 방식을 적용했습니다.

 

이 방식은 다음의 장점을 가져요.

  • which 명령어를 사용하여 실행 파일의 절대 경로를 자동으로 탐색 및 설정
  • 크론탭 등록 시 환경 변수 및 실행 경로 문제 최소화
  • 자동으로 실행 권한을 부여하여, 별도의 수동 작업 없이 실행

 

아래 과정을 통해 완성되었어요:

1) 실행 스크립트(run-project.sh) 생성

  • 주간 회고를 실행하는 Bash 스크립트(run-project.sh)를 자동으로 생성
  • 프로젝트 가상환경을 설정하고, Notion에서 데이터를 수집하여 주간 회고를 생성
  • 실행 파일의 절대 경로를 자동으로 탐색하여 스크립트를 생성하고, 실행 권한을 부여

2) 크론탭 등록 스크립트(crontab-register.sh) 생성

  • 크론탭을 등록하는 Bash 스크립트(crontab-register.sh) 생성
  • 매주 토요일 정오(12:00)에 run-project.sh를 실행하도록 설정
  • 크론탭을 등록하는 스크립트를 자동으로 생성하고 실행 권한 부여

3) 실행 코드(run-this-for-everything.sh)

  • 스크립트 실행 위치 설정
  • 위의 두 파일 생성(run-project.sh, crontab-register.sh)
  • crontab-register.sh 실행

4) 최종 결과

이제, 크론탭이 설정되었기 때문에 매주 토요일 정오에 자동으로 회고가 생성됩니다!

  • Notion API를 이용해 개발 로그를 가져옴
  • LLM을 이용해 자동으로 회고를 생성
  • 크론탭을 활용해 매주 자동 실행되도록 설정
  • 모든 경로를 절대 경로로 처리하여 크론탭 실행 문제 해결

이제, 1주일마다 자동으로 정리된 회고를 받아볼 수 있습니다!

 

자동화된 개발 회고 시스템을 구축하면서 반복적인 수작업을 줄이는 자동화의 가치를 경험했어요. Notion API와 LLM을 활용하여 개발 일지를 기반으로 의미 있는 회고를 작성했으며, 프롬프트 엔지니어링을 활용하면 더 좋은 품질의 회고가 될 수도 있다는 가능성을 보았습니다. 크론탭을 활용한 자동 실행 과정에서는 절대 경로 문제를 해결하며 사용자 편의성을 고려하는 것이 중요하다는 점을 깨달았습니다. 재미있는 경험이었고, 앞으로도 일상에 도움을 주는 LLM 활용 프로젝트나 서비스를 종종 기획하고 개발해보고자 합니다. 읽어주셔서 감사합니다~

반응형