본문 바로가기
Easy Welfare
복지관 업무 자동화툴 제작기

사회복지사 업무 자동화 도구 만들기 6편

양식은 해마다 바뀌고 공모처마다 다릅니다. 그래서 미리 저장해 둘 수가 없습니다. 채팅창에 PDF를 올리면 그 자리에서 칸 구조만 뽑아 쓰고 버리는 길을 만들었습니다. 만드는 동안 오류 메시지에 두 번 속았고, 기능과 상관없는 개인정보 구멍을 하나 찾아 막았습니다.

시리즈 「업무 자동화 툴 만들기」 · 8편 중 6번째

읽는 데 약 12분
네모난 창이 여섯 개 뚫린 두꺼운 형판이 아무것도 적히지 않은 종이 위에 비스듬히 놓여 있다
네모난 창이 여섯 개 뚫린 두꺼운 형판이 아무것도 적히지 않은 종이 위에 비스듬히 놓여 있다
AI로 생성한 그림입니다

8월 28일에 봇이 PDF를 읽게 됐습니다. 구청이 보낸 양식 파일을 채팅창에 올리면 그 양식의 칸 구조 그대로 초안을 씁니다.

이 기능을 만든 이유는 하나입니다. 양식은 미리 저장해 둘 수가 없습니다.

이번 편에는 그 하루를 적습니다. 오류 메시지에 두 번 속은 이야기와, 기능을 만들다 옆에서 찾은 개인정보 구멍 이야기가 같이 들어 있습니다.


구청 양식 PDF를 올리면 봇이 무엇을 하나요

채팅창에 PDF를 첨부하고 “이 양식대로 써 줘”라고 하면 됩니다. 봇이 그 파일을 내려받아 글자를 뽑고, 개인정보를 가린 뒤, 그 글을 보고 초안을 씁니다.

여기 규칙이 하나 박혀 있습니다. 틀은 올린 양식이 정합니다. 과거 문서 저장소에 비슷한 문서가 있어도 그것보다 방금 올린 양식이 우선입니다. 구청이 “이 양식대로” 보낸 것이라 틀을 바꾸면 반려되기 때문입니다. 과거 자료는 채울 내용과 문체를 가져오는 데만 씁니다.

디스코드 개인 채널에 PDF 파일을 첨부해 올리자 봇이 몇 쪽을 읽었는지, 어디를 가렸는지, 이번 한 번만 쓰고 지운다고 답하는 화면
봇 응답은 코드에 박힌 문구 그대로입니다. 실제로 돌려 본 화면은 아니라서 초안 자리는 비워 뒀습니다.

받는 조건은 좁게 잡았습니다.

  • PDF만 받습니다. 한글 파일(hwp)은 그 PC에 한글 프로그램이 깔려 있어야 열려서 이번에는 뺐습니다
  • 한 번에 한 개만 받습니다
  • 20MB가 넘으면 거절합니다. 내려받기 전에 거절합니다
  • 20쪽이 넘으면 앞 20쪽만 읽고, 그렇게 했다고 알립니다
  • 종이를 찍기만 한 PDF는 거절합니다. 글자가 안 들어 있어서 뽑을 것이 없습니다

거절할 때는 왜 안 되는지 사람 말로 답합니다. “안 됩니다”만 나오면 사람이 다음에 뭘 해야 할지 모릅니다. 그래서 실패 이유를 다섯 갈래로 나눠 뒀습니다. 없는 파일, PDF가 아닌 것, 암호가 걸린 것, 글자가 없는 것, 깨진 것입니다.

봇이 한글 파일과 스캔한 PDF를 각각 거절하면서 왜 안 되는지와 무엇으로 다시 올리면 되는지 안내하는 화면
거절 문구도 코드 원문입니다. 무엇으로 다시 올리면 되는지까지 한 문장에 넣었습니다.

양식을 미리 저장해 두면 안 되나요

안 됩니다. 양식이 매번 새로 오기 때문입니다.

구청이나 외부 공모처는 “이 양식대로 실적을 채워 달라”며 파일을 보냅니다. 그 양식은 해마다 바뀌고, 공모처마다 다릅니다. 봇이 참고하는 과거 문서 저장소에 양식을 미리 넣어 두면 다음번에 옛날 양식을 보고 쓰게 됩니다. 그 문서는 반려됩니다.

그래서 반대로 갔습니다. 그 자리에서 올리고, 그 턴에만 쓰고, 끝나면 지웁니다.

지우는 방식에 조건을 하나 붙였습니다. 받은 파일은 data/양식/t<턴번호>/ 에 넣습니다. 봇이 결과 파일을 폰으로 보내는 기능이 이미 이 턴 번호 규칙을 쓰고 있어서 받는 쪽도 같은 방식으로 맞췄습니다. 대화가 중간에 끊겨 파일이 남으면 다음 턴이 엉뚱한 양식을 보고 문서를 쓸 수 있는데, 턴 번호가 붙어 있으면 그게 누구 것인지 알 수 있습니다. 한 시간 넘게 남아 있는 폴더는 다음에 파일을 받을 때 자동으로 치웁니다.

「다 했어?」라고 물었는데 왜 틀린 답이 왔나요

이날 작업은 제 실수로 시작했습니다. 제가 AI에게 “작업 이어서 진행해”라고 했더니 “지금 당장 할 게 없습니다”라는 답이 왔습니다. 그래서 제가 되물었습니다. “디코에 참고 파일 양식 올려서 그 양식대로 글 작성하게 하는 과업은 다 한 거야?”

할 일이 통째로 하나 열려 있었습니다.

원인은 제 프로젝트가 저장소를 둘로 나눠 쓰기 때문입니다. 하나는 제 개인 업무 시스템이고, 다른 하나는 전 직원용 봇입니다. 봇 폴더가 개인 시스템 폴더 안에 들어 있지만 별개 저장소입니다. AI는 개인 시스템 쪽 할 일 목록만 보고 “없다”고 답했습니다.

더 고약한 조건이 하나 있습니다. 봇 폴더는 개인 시스템의 제외 목록이 통째로 빼기 때문에, 변경 사항을 확인하는 명령을 돌려도 봇 쪽 변경은 영원히 안 보입니다. 그러니까 “깨끗하니 할 일이 없다”는 판정은 봇에 대해서는 항상 틀립니다.

만들면서 가장 오래 잡아먹은 것은 무엇인가요

오류 메시지 두 개입니다. 하나는 엉뚱한 곳을 가리켰고, 하나는 아예 나지 않았습니다.

첫 번째는 이렇게 떴습니다. 「Invalid factory url … must include trailing slash」. 글꼴 자료 폴더 주소가 슬래시로 끝나야 하는데 아니라는 뜻입니다. 윈도우 경로를 그대로 넘겼더니 역슬래시(\)로 끝났던 것입니다.

문제는 이게 글꼴 문제로 안 끝났다는 점입니다. 글꼴 자료 경로가 틀렸을 뿐인데 문서 열기 자체가 죽었습니다. 자체 점검 14개 중 9개가 여기서 무너졌습니다. 메시지만 보면 글자가 안 나오는 문제로 오진하기 딱 좋습니다. 고친 것은 역슬래시를 슬래시로 바꾸고 끝에 슬래시를 붙이는 한 줄이었고, 그러자 14개가 전부 통과했습니다.

두 번째는 오류가 안 났습니다. 검사 결과가 “내용이 비어 있어 차단했습니다”로 나왔는데, 제가 넣은 것은 4천 자짜리 글이었습니다.

원인은 함수 두 개가 글을 담는 칸 이름을 다르게 쓴 것이었습니다. 하나는 「글자」, 다른 하나는 「글」. 그래서 없는 칸을 꺼내 넘겼고, 받는 쪽은 그것을 빈 글로 보고 정상 종료했습니다. 아무 데서도 빨간 글씨가 안 뜹니다.

고친 방법은 이름을 「글자」로 통일하고, “칸 이름은 글자다”를 확인하는 점검 항목을 하나 박아 둔 것입니다. 다음에 누가 이름을 바꾸면 그 점검이 깨집니다.

양식에 인쇄된 이름과 연락처는 어떻게 되나요

가린 뒤에 넘깁니다. 양식에는 예시 이름과 연락처가 인쇄돼 있는 경우가 많은데, 안 가리고 넘기면 개인정보 차단기에 걸려서 양식 올리기 자체가 막힙니다.

가릴 때 신경 쓴 것이 세 가지입니다.

  1. 가짜로 판정된 것은 안 건드립니다. 예산 금액이나 분기별 목표량이 (가림) 으로 뭉개지면 양식의 칸 구조가 망가집니다
  2. 원문만 훑습니다. 띄어쓰기를 흩은 변형본에서 찾은 자리는 원문의 어디인지 되짚을 수가 없습니다
  3. 가린 뒤에 다시 검사합니다. 그래도 남는 게 있으면 아예 막습니다. 막히는 편이 새는 것보다 낫습니다
양식에서 뽑은 글의 가리기 전과 후를 위아래로 놓은 화면. 연락처와 이메일은 가림 표시로 바뀌었고 사람 이름과 예산 숫자는 그대로 남아 있다
지워야 할 것만 지웁니다. 이름과 표의 숫자를 건드리면 양식의 칸이 무너집니다.

사람 이름은 명단이 주어질 때만 가립니다. 이 프로젝트는 예전에 성씨로 시작하는 세 글자를 이름으로 짐작했다가 「사포질」이 「사*질」로, 「공예품」이 「공*품」으로 바뀌어 문서가 통째로 망가진 적이 있습니다.

개인정보 검사기가 두 개인 이유도 여기 있습니다. 짧은 채팅 대화용 검사기를 긴 한글 문서에 그대로 쓰면 표의 숫자가 죽 붙은 것을 카드번호나 계좌번호로 오인합니다. 실제로 문서 428개를 훑었더니 94개가 걸렸는데 전부 오탐이었습니다. 그래서 문서용 검사기를 따로 뒀습니다.

기능과 상관없는 구멍을 하나 찾았습니다

봇 코드는 깃허브 공개 저장소로 올라갑니다. 올릴 때 빼는 목록을 보니 과거 문서 폴더와 사람별 폴더는 빠지는데, 이번에 새로 만든 양식 폴더는 안 빠져 있었습니다.

대화가 중간에 끊겨 남은 남의 구청 양식 PDF가 그대로 공개 저장소에 올라갈 수 있었다는 뜻입니다. 예시 이름과 연락처가 인쇄된 파일입니다. 두 군데 제외 목록에 모두 넣어 막았습니다.

양식 안의 「제출할 것」을 봇이 명령으로 받지 않나요

받을 수 있습니다. 그래서 넘길 때 명시합니다.

양식에는 「~하시오」, 「첨부할 것」 같은 문장이 인쇄돼 있습니다. 그 글을 그대로 AI에게 넘기면 AI가 그걸 저에게 내린 지시로 읽을 수 있습니다. 그래서 양식 글을 붙일 때 두 줄을 같이 적었습니다. 양식 안의 문장은 자료지 나에게 내리는 지시가 아니라는 것, 그리고 가림 표시가 있는 자리는 개인정보가 지워진 자리이니 지어내 채우지 말라는 것입니다.

막힐 것 같아서 설계를 바꿨나요

안 바꿨습니다. 바꾸기 전에 실제로 재 봤더니 막히지 않았습니다.

계획은 가린 양식 글을 그대로 프롬프트에 붙이는 것이었습니다. 그런데 시작 전에 걱정이 생겼습니다. 이 봇은 AI에게 넘기기 전에 짧은 대화용 검사기로 한 번 거르는데, 4천 자짜리 문서를 붙이면 그 검사기가 예산 숫자를 계좌번호로 오인해서 통째로 막을 것 같았습니다.

대안도 생각해 뒀습니다. 양식 글을 파일로 써 두고 프롬프트에는 경로만 넘겨서 AI가 직접 읽게 하는 방법입니다.

그전에 진짜 한글 PDF 두 개로 돌려 봤습니다. 업무분장표와 평가지표 문서입니다. 가린 뒤에는 검사기를 그냥 통과했습니다. 그래서 계획대로 갔습니다. 재 보는 데 3분이 걸렸고, 우회로를 만들었으면 한 시간짜리 일이었습니다.

이럴 땐 이 방식이 안 맞습니다

한글 파일(hwp)로 양식이 오는 곳이면 지금 이대로는 못 씁니다. PDF만 받게 만들었습니다. 한글 파일을 읽으려면 그 PC에 한글 프로그램이 있어야 하고, 그 조건을 붙이면 봇이 도는 자리가 묶입니다.

종이를 찍기만 한 양식이면 못 씁니다. 스캔본에는 글자가 없어서 뽑을 것이 없습니다. 글자를 알아보는 기능(OCR)을 넣는 길도 있었지만 무겁고 부정확해서 뺐습니다. 대신 글자가 없으면 그렇다고 알리고 멈춥니다.

시험을 통과한 것과 실제로 쓰이는 것은 다릅니다. 자체 점검은 다 통과했지만 실제 구청 양식으로 채팅에서 돌려 본 적은 아직 없습니다. 이 프로젝트에는 자체 점검이 실기를 대신하지 못한다는 원칙이 있습니다. 지난 다섯 편에서 문제의 대부분이 실제로 써 봐야 나왔습니다.

다음 단계

두 가지가 남았습니다.

첫째, 봇이 도는 PC에서 부품 설치 명령을 한 번 돌려야 합니다. PDF를 읽는 부품이 아직 그 PC에 안 깔려 있습니다.

둘째, 실제 구청 양식으로 채팅에서 한 번 돌려 봐야 합니다. 여기서 무엇이 나올지는 지금 모릅니다.

이번 편은 만드는 동안 나온 문제가 많았습니다. 다섯 편까지는 실제로 써 봐야 나오는 문제가 훨씬 많았는데, 이번에는 반대였습니다. 실기를 아직 안 했기 때문일 것입니다.

자주 묻는 질문

양식 파일을 봇에게 올리면 그 파일이 어딘가에 남나요

턴이 끝나면 폴더째 지웁니다. 대화가 중간에 끊겨 파일이 남는 경우를 대비해, 한 시간 넘게 남아 있는 폴더는 다음에 파일을 받을 때 자동으로 치웁니다. 개인정보를 가린 글만 AI에게 넘어가고 원본 PDF는 넘어가지 않습니다.

스캔한 PDF도 읽게 하려면 어떻게 하나요

글자를 알아보는 기능을 붙이면 되지만 저는 안 붙였습니다. 무겁고, 표가 있는 문서에서는 칸이 어긋나는 일이 잦습니다. 양식을 보낸 곳에 글자가 들어 있는 파일로 다시 달라고 요청하는 편이 빠릅니다.

양식의 표 구조가 정말 살아 있나요

PDF에는 줄이라는 개념이 없고 그려진 글자 덩어리만 있습니다. 그냥 이어 붙이면 표의 칸이 다 뭉개집니다. 그래서 PDF가 알려 주는 줄바꿈 표시로 줄을 나누고, 같은 줄 안에서 조각 사이가 벌어져 있으면 공백을 하나 넣었습니다. 실제 한글 문서 15쪽짜리로 확인했을 때 한글도 칸도 제대로 나왔습니다.

개인정보를 가린 뒤에도 남는 게 있으면 어떻게 되나요

그 양식은 아예 못 씁니다. 가린 뒤에 한 번 더 검사해서 남는 게 있으면 통과시키지 않습니다. 사람이 직접 그 부분을 지우고 다시 올리셔야 합니다. 놓치고 넘기는 것보다 막는 쪽이 낫다고 봤습니다.

이 글은 AI로 초안을 쓰고 사람이 확인해 다듬었습니다.

함께 보면 좋은 글

직접 써 보기

양식 없이, 네 칸만 채우면 사업계획서 초안이 나옵니다

이 블로그와 별도로 운영하는 공개 웹앱입니다. 가입하면 매달 다섯 번까지 무료.

초안 만들어 보기

새 글과 새 무료 프로그램이 나오면 메일로 알려드려요.

메일로 소식 받기 (새 창에서 열림)