본문으로 바로가기
TaeyoungKim.dev

AI 보고서 작성: 정보가 부족할 때 먼저 질문하고 초안을 멈추는 방법

AI작성 약 4분 읽기TaeyoungKim
LinkedInX

“업무 진행 보고서 써줘. 로그인 화면은 끝났고 통합 테스트 중이야.” 급할 때는 이 정도만 말하고 싶다. 그런데 AI가 보고 기간을 이번 주로 단정하고, 진행률 80%와 ‘이슈 없음’까지 채우면 어떨까? 읽기에는 매끈해도 확인된 사실은 아니다. 보고서의 빈칸을 눈치로 메우는 순간, 초안이 아니라 추리소설에 가까워진다.

해법은 긴 프롬프트 한 장이 아니다. 어떤 보고서인지 먼저 고르고, 그 양식에 필요한 사실이 모였을 때만 초안을 여는 것이다. 여기서는 업무 지시·진행·결과 중 ‘업무 진행’ 하나를 골라 같은 요청이 질문에서 초안으로 넘어가는 지점을 따라가 본다.

AI 보고서에 정보가 빠졌는데도 바로 쓰면 왜 위험할까?

업무 진행 보고서는 완료한 일만 나열하는 문서가 아니다. 보고 기간, 진행 중인 일, 다음 계획, 이슈가 함께 있어야 지금 상태와 다음 행동을 구분할 수 있다. 예시 요청에는 완료한 일과 진행 중인 일은 있지만, 기간·다음 계획·이슈 유무는 없다.

항목사용자가 말했나?지금 할 일
완료한 일: 로그인 화면 구현예입력값으로 유지
진행 중인 일: 통합 테스트예입력값으로 유지
보고 기간아니요기간 질문
다음 계획아니요다음 작업 질문
이슈 유무아니요‘없음’인지도 확인

특히 말하지 않은 이슈와 “이슈 없음”이라고 답한 것은 다르다. 진행률도 마찬가지다. 양식에 백분율 칸이 있다는 이유만으로 AI가 숫자를 계산하거나 지어내서는 안 된다.

업무 진행 보고서의 입력은 어떻게 나눌까?

첫 질문은 보고서의 종류다. 업무 지시·진행·결과는 목적과 항목이 다르므로 사용자가 고르지 않았다면 양식을 임의로 정하지 않는다. 종류가 ‘업무 진행’으로 확정되면 그 양식의 본문에 필요한 사실을 확인한다.

이 예제의 최소 입력은 period, completed, in_progress, next_plan, issues 다섯 가지다. 이는 진행 보고서 본문 초안을 위한 작은 입력 계약이다. 실제 제출 문서라면 업무 제목·보고자·수신자·문서 번호 등 머리말도 별도로 받아야 한다. 필요한 항목을 모두 한 번에 캐묻기보다, 먼저 없는 것만 짚는 편이 대화도 짧아진다.

‘없음’도 사용자가 직접 확인한 값이어야 한다

이슈가 정말 없다면 issues에 없음을 넣을 수 있다. 빈 문자열은 답이 없다는 뜻이고, 없음은 확인된 답이다. 두 상태를 섞지 않으면 AI가 조용히 낙관적인 보고서를 만드는 일을 줄일 수 있다.

파이썬으로 누락 정보를 확인하고 초안을 열어 보자

프롬프트에 “추측하지 마”라고 쓰는 것만으로 앱의 입력 조건이 강제되지는 않는다. 초안을 요청하기 전에 필요한 값이 있는지 코드로 확인하면, 누락된 상태에서는 아예 생성 단계로 가지 않게 할 수 있다.

python
REQUIRED = {
    "period": "보고 기간",
    "completed": "완료한 일",
    "in_progress": "진행 중인 일",
    "next_plan": "다음 계획",
    "issues": "이슈 유무",
}

def progress_intake(facts):
    missing = [label for key, label in REQUIRED.items()
               if not isinstance(facts.get(key), str) or not facts[key].strip()]
    if missing:
        return {"state": "ask", "missing": missing}
    return {"state": "draft_ready",
            "facts": {key: facts[key].strip() for key in REQUIRED}}

처음 요청을 필드로 옮기면 두 항목만 있다.

python
first = {
    "completed": "로그인 화면 구현",
    "in_progress": "통합 테스트",
}
print(progress_intake(first))
# {'state': 'ask', 'missing': ['보고 기간', '다음 계획', '이슈 유무']}

이때 화면에는 보고서 대신 “보고 기간은 언제인가요? 다음 계획은 무엇인가요? 이슈가 없다면 ‘없음’이라고 알려 주세요”라고 묻는다. 세 답을 받은 뒤 같은 입력을 다시 확인한다.

python
confirmed = {
    **first,
    "period": "2026-09-21 ~ 2026-09-25",
    "next_plan": "오류 메시지 정리",
    "issues": "없음",
}
print(progress_intake(confirmed)["state"])
# draft_ready

여기서야 본문 초안을 만들 수 있다. 예를 들면 다음 정도다. 기간·업무·이슈는 모두 방금 확인한 입력에서만 가져왔다.

업무 진행 요약

  • 기간: 2026-09-21 ~ 2026-09-25
  • 완료: 로그인 화면 구현
  • 진행 중: 통합 테스트
  • 다음 계획: 오류 메시지 정리
  • 이슈: 없음

이 작은 함수는 AI 모델을 호출하거나 보고서를 자동 승인하지 않는다. 질문할지, 초안을 요청할지를 나누는 앞단 검사다. 실제 예제에서는 누락된 세 필드, 모두 채운 뒤의 draft_ready, 공백이나 None이 들어온 경우의 재질문을 실행해 확인했다.

프롬프트와 코드에는 각각 무엇을 맡길까?

코드는 ‘필수 값이 있는가’를 판정하고, 프롬프트는 ‘받은 사실을 어떻게 쓸까’를 안내한다. 초안 요청에는 선택된 양식과 확인된 값만 전달하고, “제공하지 않은 날짜·진행률·담당자·이슈는 만들지 않는다”는 규칙을 붙일 수 있다. 모델이 작성한 뒤에도 출력에 입력하지 않은 수치나 실명이 끼어들었는지 검토해야 한다. 입력 검사가 문장의 진실성까지 보증하지는 않기 때문이다.

운영 단계에서는 세 경계를 더 챙긴다. 보고서 종류마다 필요한 필드를 따로 정의하고, 민감한 이름·계정·내부 주소는 AI에 넘기기 전에 제거한다. 사람이 최종 문장을 확인하기 전에는 전송하거나 결재하지 않는다. 이 글의 예제는 그중 업무 진행 보고서의 본문 초안 입구만 다룬다.

핵심 요약

AI 보고서 작성에서 첫 동작은 문장 생성이 아니라 보고서 종류와 빠진 사실 확인이다. 값이 없으면 질문하고, 사용자가 ‘없음’이라고 확인한 값은 빈칸과 구분한다. 필요한 사실이 모여도 그것은 초안 작성 허가일 뿐 사실 검증이나 최종 승인이 아니다. 매끈한 문장보다 먼저, 어디까지가 사용자가 말한 내용인지 분명해야 한다.

작성자

TaeyoungKim

기초 개념을 구현과 검증, 실제 운영 판단까지 연결해 기록합니다.

#AI 보고서 작성#프롬프트 설계#입력 검증#업무 자동화

함께 읽으면 좋은 글