기술/AI 인사이트 & 칼럼

AI 회의록, '요약'은 끝! '액션 아이템' 자동 추출 시스템 설계 (Python + JSON)

S.E.E 2025. 11. 5.
반응형
AI 회의록, '요약'을 넘어 '액션 아이템(JSON)' 자동 추출 시스템 설계

AI 회의록, '요약'을 넘어 🚀
'액션 아이템' 자동 추출 시스템 설계하기

안녕하세요! '넥스트 엔지니어링'입니다. 3시간짜리 마라톤 회의가 끝나고, AI가 뽑아준 10페이지 분량의 스크립트와 '매우 유익한 논의였음'이라는 한 줄 요약을 받아본 경험, 다들 있으시죠.

그리고... 아무 일도 일어나지 않았습니다.

'요약'은 회의의 '이해'를 도울 뿐, '실행'을 보장하지 않습니다. 진짜 문제는 "그래서 누가, 무엇을, 언제까지 해야 하는가?"라는 질문에 답이 없다는 것입니다.

오늘은 AI 회의록의 '진짜 가치'를 뽑아내는, 단순 요약을 넘어 '실행 가능한 데이터(JSON)'를 추출하고, 이를 'Notion'이나 'Google Tasks' 같은 업무 시스템에 자동으로 꽂아 넣는 '자동화 시스템 설계'를 A to Z까지 다룹니다.

1. 목표: '요약'이 아닌 '실행 가능한 문장' 만들기

우리는 AI 회의록 시스템의 최종 목표를 '이해'에서 '실행'으로 재정의해야 합니다.

  • 요약 (이해의 영역): "마케팅 전환율 하락 원인으로 트래픽 질 저하가 논의됨."
  • 액션 (실행의 영역): "담당자: 동완, 업무: 신규 랜딩페이지 디자인 수정, 마감: 2025-11-08"

'요약'은 단순 텍스트지만, '액션'은 '데이터'입니다. 이 '실행 가능한 데이터'를 뽑아내는 것이 우리 시스템의 유일한 목표입니다.

AI에게 "요약해 줘"가 아니라, "이 회의록을 분석해서 '작업 지시서' 포맷으로 재구성해 줘"라고 요청해야 합니다.

2. [설계] 3단계 자동화 워크플로 (음성 ➡️ JSON ➡️ Notion)

'액션 아이템'을 추출하는 자동화 시스템은 크게 3단계로 구성됩니다.

[자동화 3단계 워크플로]

  1. [1] 음성 → 텍스트 변환 (Transcribe)
    회의 음성 파일을 텍스트로 변환합니다. (예: Whisper API, 클로바노트, Google Speech-to-Text)
  2. [2] 텍스트 → 구조적 데이터 (Structure)
    AI(GPT)가 '마법의 프롬프트'를 기반으로, 긴 텍스트를 요약/결정/액션 아이템이 담긴 'JSON' 데이터로 변환합니다. (오늘의 핵심)
  3. [3] 데이터 → 실행 시스템 (Execute)
    추출된 JSON 데이터를 'Zapier'나 'Notion API' 등에 연결해, 실제 업무 툴(Notion, Google Tasks, Slack)에 '할 일'을 자동으로 등록합니다.

이 중 가장 중요한 것은 2단계, AI가 '텍스트'를 '데이터'로 바꾸는 과정입니다.

3. [핵심] AI의 '계약서': 마법의 프롬프트와 JSON 스키마

AI가 '액션 아이템'만 쏙 뽑아내게 하려면, AI에게 '역할'을 부여하고 '출력 양식(스키마)'을 강제해야 합니다. 이것이 AI와의 '계약서'입니다.

이 프롬프트를 `meeting_prompt.md` 같은 파일로 저장해두고 AI에게 '시스템 메시지'로 전달합니다.

[AI 'PM' 명령서 (meeting_prompt.md)]

역할: 당신은 회의록 분석 전문가입니다.
입력으로 받은 회의록을 분석하여 아래 [JSON 포맷]으로 반환하세요. 다른 설명 없이 JSON 객체만 반환해야 합니다.

[JSON 포맷]
{ "summary": [ { "type": "summary", "content": "논의된 핵심 요약 (실행X)" }, { "type": "decision", "content": "회의 중 최종 결정/확정/승인된 사항" } ], "actions": [ { "type": "action", "owner": "담당자 이름 (불명확하면 '미정')", "task": "실행해야 할 구체적인 과제", "due_date": "YYYY-MM-DD (마감일이 없으면 'null')" } ] }

# 규칙:
1. '~하기로 했다', '~해야 한다', '~담당한다', '~마감' 등 명확한 실행 지시는 `actions` 배열에 추가하세요.
2. '결정했다', '확정했다', '승인했다'는 `summary` 안의 `decision` 타입으로 분류하세요.
3. 그 외 단순 논의는 `summary` 안의 `summary` 타입으로 분류하세요.
4. 모든 항목은 중복 없이, 핵심만 남기세요.
5. `owner`와 `due_date`를 문맥에서 정확히 추출하세요.

이 프롬프트의 핵심은 AI가 창의성을 발휘해 '요약'하는 것을 막고, 정해진 '틀(JSON)'에 '정보'를 채워 넣는 '데이터 입력' 작업을 시키는 것입니다.

4. [실전 코드] Python으로 회의록 텍스트 ➡️ JSON 변환하기

이제 위 '명령서'와 '회의록 텍스트'를 AI에게 보내는 Python 코드를 작성합니다. `openai` 라이브러리 버전 1.0 이상이 필요합니다.


from openai import OpenAI
import json

# 0. API 키 설정 (환경 변수에서 가져오는 것을 권장)
# client = OpenAI(api_key="sk-...")
client = OpenAI() # 환경변수(OPENAI_API_KEY) 자동 로드

# 1. 재료 준비 (회의록 텍스트)
# (실제로는 클로바노트 등에서 텍스트를 가져와야 함)
meeting_text = """
[김 부장]: 좋습니다. 그럼 신규 랜딩페이지 배포는 다음 주로 결정하죠.
[이 대리]: 알겠습니다.
[김 부장]: 그 전에 [동완]님이 신규 랜딩페이지 디자인 수정을 맡아주세요.
[동완]: 네. 언제까지 드리면 될까요?
[김 부장]: 금요일(2025년 11월 7일)까지 부탁합니다.
[박 과장]: 마케팅 전환율 하락 원인도 논의가 필요합니다.
[김 부장]: 그건 다음 회의로 넘기죠.
"""

# 2. '명령서' 파일 읽기
try:
    with open("meeting_prompt.md", "r", encoding="utf-8") as f:
        prompt_system = f.read()
except FileNotFoundError:
    print("오류: 'meeting_prompt.md' 파일이 없습니다.")
    exit()

print("AI에게 회의록 분석 요청 중...")

# 3. AI 호출 (핵심!)
# 'response_format'을 JSON으로 강제합니다.
response = client.chat.completions.create(
    model="gpt-4o-mini", # 또는 gpt-4-turbo
    messages=[
        {"role": "system", "content": prompt_system},
        {"role": "user", "content": meeting_text}
    ],
    response_format={"type": "json_object"} # JSON 출력 강제
)

# 4. 결과(텍스트)를 JSON 데이터로 변환
try:
    result_text = response.choices[0].message.content
    result_json = json.loads(result_text)

    # 5. 결과 출력
    print("--- AI 분석 완료 (JSON 결과) ---")
    print(json.dumps(result_json, indent=2, ensure_ascii=False))

except json.JSONDecodeError:
    print("오류: AI가 유효한 JSON을 반환하지 않았습니다.")
    print(result_text)
except Exception as e:
    print(f"오류 발생: {e}")

            

[위 코드의 예상 실행 결과]


AI에게 회의록 분석 요청 중...
--- AI 분석 완료 (JSON 결과) ---
{
  "summary": [
    {
      "type": "decision",
      "content": "신규 랜딩페이지 배포는 다음 주로 결정"
    },
    {
      "type": "summary",
      "content": "마케팅 전환율 하락 원인 논의는 다음 회의로 연기"
    }
  ],
  "actions": [
    {
      "type": "action",
      "owner": "동완",
      "task": "신규 랜딩페이지 디자인 수정",
      "due_date": "2025-11-07"
    }
  ]
}
            

5. [확장] 자동화의 완성: 피드백 루프와 외부 연동

이제 '데이터(JSON)'가 생겼으니, 진짜 자동화를 시작할 수 있습니다.

A. 외부 시스템 연동 (Notion, Google Tasks 등)

4번의 파이썬 코드 마지막에 'Notion API'나 'Google Tasks API' 호출 코드를 추가합니다.


# (4번 코드 이어서...)
actions = result_json.get("actions", [])

if not actions:
    print("추출된 액션 아이템이 없습니다.")
else:
    print(f"{len(actions)}개의 액션 아이템을 Notion에 등록합니다...")
    
    for item in actions:
        # (여기에 Notion API 또는 Google Tasks API 호출 로직 추가)
        # 예: notion_client.create_task(
        #       title=item['task'],
        #       owner=item['owner'],
        #       due_date=item['due_date']
        #     )
        print(f"  - [등록] {item['task']} (담당: {item['owner']})")
            

코딩이 어렵다면, Make.com이나 Zapier를 이용해 "1. 챗GPT(프롬프트 적용) ➡️ 2. JSON 파싱 ➡️ 3. Notion 항목 생성" 시나리오를 만들면 됩니다.

B. 피드백 루프 (AI가 AI를 개선)

AI가 추출한 '액션 아이템'이 만족스럽지 않을 수 있습니다. 이때 '수정'한 내용을 AI가 다시 학습하게 만들어야 합니다.

  1. AI가 추출한 JSON(A)과 내가 수정한 JSON(B)을 DB에 기록합니다.
  2. 주 1회, AI에게 "A를 B처럼 완벽하게 추출하려면, 너의 '명령서(프롬프트)'를 어떻게 수정해야 할까?"라고 '메타 프롬프팅'을 시킵니다.
  3. AI가 제안한 수정안을 검토하여 `meeting_prompt.md` 파일을 업데이트합니다.

⚡️ 잠깐! 복습 퀴즈!

오늘 설계한 시스템, 잘 이해하셨나요? (정답은 맨 아래에!)

Q1. AI 회의록 시스템의 최종 목표이자, 후속 자동화(Notion 연동)의 '연료'가 되는 산출물은?

(1) 완벽한 회의록 스크립트 (텍스트)
(2) 간결한 3줄 요약 (텍스트)
(3) '구조화된 데이터' (JSON)

Q2. 파이썬 코드에서 AI가 텍스트 대신 'JSON' 형식으로만 답하게 '강제'하는 핵심 파라미터는?

(1) `model="gpt-4o-mini"`
(2) `response_format={"type": "json_object"}`
(3) `role="system"`

🔑 '액션 아이템' 추출 시스템 6가지 핵심

1. 목표: '실행'

'이해'를 위한 요약이 아닌, '실행'을 위한 액션 아이템 추출이 목표다.

2. 재료: '화자 분리'

'누가' 했는지 알려면 `[김 부장]`처럼 화자가 분리된 스크립트가 필수다.

3. 핵심: '역할' 부여

AI에게 '요약가'가 아닌 '프로젝트 매니저(PM)'라는 역할을 부여한다.

4. 계약서: 'JSON 스키마'

AI가 딴짓 못하게 'JSON 포맷'이라는 계약서로 출력 양식을 '강제'한다.

5. 치트키: 'JSON 모드'

`response_format={"type": "json_object"}` 파라미터는 AI가 JSON만 뱉게 만든다.

6. 자동화: 'API 연동'

추출된 JSON 데이터는 Notion, Slack, Google Tasks API의 '연료'가 된다.

❓ 'AI 액션 아이템' FAQ

Q1. 음성 녹음을 텍스트로 바꾸는 건 어떤 툴이 가장 좋은가요?

A. '화자 분리'가 핵심입니다. 한국어 회의라면 '클로바노트'가 현재 가장 뛰어난 화자 분리 및 정확도를 보여줍니다. 글로벌 회의라면 'Zoom'이나 'Google Meet'의 내장 스크립트 기능도 훌륭합니다.

Q2. AI가 자꾸 'JSON' 형식을 무시하고 '요약'을 섞어서 답해요.

A. 두 가지를 확인하세요. (1) 프롬프트에 "다른 설명 없이 JSON 객체만 반환해"라고 '강하게' 지시했는지 확인하세요. (2) Python 코드에서 `response_format={"type": "json_object"}` 파라미터를 사용했는지 확인하세요. 이 'JSON 모드'가 AI의 딴짓을 막아줍니다.

Q3. AI가 '담당자'나 '마감일'을 잘못 추출하면 어떡하죠?

A. 그래서 '피드백 루프'가 필요합니다. 하지만 더 쉬운 방법은 회의 문화를 바꾸는 것입니다. 회의 마지막 1분에 "자, 액션 아이템 정리합니다. [동완]님이 [디자인 수정]을 [금요일]까지 해주세요."라고 '명확하게' 말하는 습관을 들이면, AI의 인식률은 99%에 가까워집니다.

Q4. 코딩이 너무 어려워요. Make.com/Zapier로도 가능한가요?

A. 네, 완벽하게 가능합니다! [1. Google Drive (파일 감시)] ➡️ [2. OpenAI (챗GPT 모듈에 3번 프롬프트 입력)] ➡️ [3. JSON 파서 (Parse JSON 모듈)] ➡️ [4. Notion (Create Database Item 모듈)] 순서로 '레고 블록'을 조립하면 코드 한 줄 없이 동일한 시스템을 만들 수 있습니다.

'요약'은 이해의 영역, '액션 추출'은 실행의 영역입니다

'회의록 지옥'은 '기록'이 많아서가 아니라 '실행'이 없어서 발생합니다.

오늘 우리는 AI를 단순 '요약기'가 아닌, 회의의 '결과'를 '데이터'로 추출하여 '실행'으로 연결하는 '시스템'으로 설계했습니다.

이제 회의록을 '읽지' 마세요.
AI가 추출한 '액션 아이템'을 '실행'하세요!

여러분의 '실행하는 회의'를 '넥스트 엔지니어링'이 응원합니다!

(퀴즈 정답: Q1 - (3) / Q2 - (2))

반응형

댓글