회의록에서 할 일 목록을 자동으로 추출하는 방법
거의 모든 팀 회의가 끝나면 똑같은 일이 벌어집니다. 누군가 회의록을 작성하고, 다른 누군가가 그 메모를 해야 할 일 목록(to-do list)으로 정리해야 합니다. 하지만 종종 아무도 이 작업을 하지 않고, 2주 후에야 팀원들이 "누가 수정된 견적서를 보내기로 했었지?"라고 물어보는 상황이 발생합니다.
문제점: 결정 사항은 사라지고, 할 일은 남는다
일주일에 몇 번씩 회의를 하는 소규모 에이전시나 컨설팅 팀을 가정해 봅시다. 각 회의는 여러 가지 약속을 만들어냅니다. "Priya가 금요일까지 수정된 견적서를 보낼 것이다", "Marcus가 장소를 예약할 것이다", "누군가가 서명된 계약서 추적을 할 것이다"와 같은 것들입니다. 만약 이러한 약속들이 메모 속의 단락에 묻혀버린다면, 세 가지 문제가 발생합니다.
- 업무 누락: 아무도 메모 문서의 특정 문장에 대한 소유권을 갖지 않기 때문에, 아무도 후속 조치를 취하지 않습니다.
- 회의 반복: 다음 회의는 "저번에 그 부분은 결론이 어디였죠?"라는 질문으로 10분을 시작합니다.
- 정리 작업의 부담: 메모에서 수동으로 할 일을 추출하는 데 회의당 10분에서 20분이 걸립니다. 이것이 바로 이 작업이 건너뛰어지는 이유입니다.
이 문제를 해결하기 위해 프로젝트 관리 도구(project management suite)가 필요하지 않습니다. 필요한 것은 세 개의 열(task, owner, due)을 가진 단 하나의 시트이며, 이 시트는 메모에서 스스로 정보를 채워 넣어야 합니다.
변화된 점: 작업별 한 행, 담당자와 날짜 포함
이것은 제가 n8n으로 구축한 워크플로우의 결과입니다. 이 워크플로우는 Google Sheet에서 회의록을 읽어와 OpenAI에게 모든 실행 항목(action item)을 나열하도록 요청하고, 그 결과를 '실행 항목 시트(Action Items sheet)'에 작업별로 한 행씩 추가합니다. 제가 테스트한 결과, 두 번의 회의를 통해 담당자와 마감일이 지정된 총 7개의 작업이 생성되었습니다. 또한 예상치 못했지만 매우 유용했던 기능도 수행했습니다. 바로 '상태 확인 회의(status meeting)'를 건너뛰기로 한 결정 사항은 아무도 행동할 필요가 없었기 때문에 목록에서 제외한 것입니다. 결정 사항은 할 일이 아니며, 좋은 프롬프트는 이 둘을 분리해 줍니다.
워크플로우 작동 방식 (5개의 노드)
- **수동 트리거(Manual trigger)**는 테스트하는 동안 실행을 시작합니다. 나중에 이를 양식(form), 스케줄(schedule) 또는 새 행 트리거로 교체할 수 있습니다.
- **Google Sheets, 시트에서 행 가져오기(Get row(s) in sheet)**가 '회의록(Meeting Notes)' 시트를 읽습니다. 회의당 하나의 항목을 얻게 되며, 필드는 Meeting, Date, Notes입니다. 긴 내용은 통째로 전달됩니다.
- **OpenAI, 모델에 메시지 보내기(Message a model)**는 각 회의의 내용을 모델에 전송하고 JSON 형식으로 실행 항목을 요청합니다.
- **분리하기(Split Out)**는 각 항목 안에 있는 작업 목록을 작업당 하나의 항목으로 변환합니다.
- **Google Sheets, 시트에 행 추가하기(Append row in sheet)**는 각 작업을 '실행 항목(Action Items)' 시트에 추가합니다.
가져가야 할 패턴: JSON을 요청하고 분리하라
이 내용 중 단 하나의 아이디어만 가져간다면 이것을 가져가세요. AI 답변은 문단 형태입니다. 스프레드시트는 행(row)이 필요합니다. 이 간극을 메우는 방법은 고정된 JSON 구조를 요청한 다음, 그 목록을 분리하는 것입니다.
프롬프트는 오직 JSON만을 요청하며, 다음과 같은 구조여야 합니다: tasks라는 이름의 리스트가 있고, 각 task는 task, owner, due 값을 가져야 합니다. 또한 규칙도 제시합니다: owner는 사람의 이름을 첫 이름으로 사용하고, due 값은 회의록에 언급된 날짜나 일자를 사용하거나, 아무것도 주어지지 않았다면 'No date'를 작성하도록 합니다. 회의 이름과 내용은 n8n의 이중 중괄호 표현식(double curly brace expressions)을 사용하여 프롬프트로 가져옵니다.
이것을 신뢰성 있게 만드는 두 가지 설정이 있습니다:
- 프롬프트 상자를 '표현식(Expression)'으로 전환합니다. 상자 위에 마우스를 올리고 'Expression'을 클릭하세요. 이것을 건너뛰면 AI가 사용자의 메모를 아닌 일반 텍스트로 받게 됩니다.
- 출력 형식(Output Format)을 JSON Object로 설정합니다. 옵션(Options) 아래의 추가 옵션(Add option), 출력 형식(Output Format)에서 유형(Type)을 JSON Object로 설정하세요. 그러면 n8n이 답변을 자동으로 열어주므로, 작업들이 긴 텍스트 블록이 아닌 실제 리스트 형태로 도착하게 됩니다.
그 후, Split Out은 목록의 경로(output[0].content[0].text.tasks)를 가져와 작업당 하나의 항목으로 반환합니다. 두 개의 회의가 들어가면 일곱 개의 항목이 나옵니다. 최종 Append 단계는 매핑 열 모드(Mapping Column Mode)가 '자동 매핑(Map Automatically)'으로 설정되어 있어, 필드 이름을 열 헤더에 일치시킵니다. 이것이 바로 실행 항목 시트가 1행에서 task, owner, due라는 소문자 헤더를 필요로 하는 이유입니다.
설정 시 주의사항 및 함정
이것들은 저에게 시간을 낭비하게 만들었던 것들입니다:
- 자격 증명(Credentials). 스프레드시트를 소유한 Google 계정과 작동하는 키를 가진 OpenAI 자격 증명을 선택하세요. n8n은 때때로 더 이상 작동하지 않는 키가 포함된 자격 증명을 미리 채우는데, 그러면 모델 목록이 401 Authorization failed 오류와 함께 실패합니다.
- 모델 선택. GPT-4.1-mini는 빠르고 저렴하며 텍스트에서 사실을 추출하는 데 능숙하여 이 작업에 필요한 모든 것입니다.
- '추가(Append)'를 선택하고 '추가 또는 업데이트(Append or update)'를 피하세요. 시트에 행을 추가하는 '추가(Append row)'는 매번 새로운 행을 만듭니다. '업데이트(update)' 변형은 일치시킬 열이 필요합니다.
- 같은 회의록에 대해 두 번 실행하지 마세요. '추가(Append)'는 실행할 때마다 행을 추가하며, AI가 작업을 매번 약간 다르게 작성할 수 있으므로 거의 중복된 항목들이 생길 것입니다. 회의록 세트당 한 번만 실행하세요.
결과에 의존하기 전에 검토하세요
AI는 작업을 놓치거나 누가 무엇을 소유했는지 잘못 읽을 수 있습니다. 이것은 시간을 절약해 주는 것이지, 빠르게 확인하는 것을 대체하는 것은 아닙니다. 각 회의 후 '실행 항목(Action Items)' 시트를 훑어보고, 누가 무엇을 하기로 합의했는지 명확하게 기록하세요. 명확한 기록이 들어가면, 명확한 작업 목록이 나옵니다. 2분간 훑어보는 것이 여전히 20분 동안 타이핑하는 것보다 훨씬 저렴합니다.
예상되는 사항
- 구축 시간: 약 15분, 50개의 작은 단계, 코딩 불필요.
- 실행 비용: 회의당 짧은 AI 호출 한 번.
- 다음 단계 업그레이드: 수동 트리거를 양식(form) 또는 새 행 트리거로 대체하여 누군가 버튼을 클릭하지 않아도 작업이 나타나게 합니다.
먼저 연습해 보세요
저는 이 워크플로우를 무료 대화형 강좌로 만들었습니다. 가상의 데이터로 n8n 에디터의 실습 복사본에서 실행되므로 실제 계정에는 아무것도 영향을 주지 않습니다. 모든 클릭을 직접 수행하며 각 단계를 확인합니다.
만약 팀원들이 '멋진 회의'와 '누가 그걸 할 건데?' 사이에서 여전히 업무를 놓치고 있다면, 이것은 큰 효과를 가져올 작은 빌드입니다. 여기 무료 강의를 시도해 보세요: n8n: Meeting Notes to Action Items in Google Sheets.