[LLM/사회과학] Stuhler et al (2025) 코드북에서 프롬프트북으로 - 생성형 AI로 텍스트에서 정보 추출하기
🧠 코드북에서 프롬프트북으로: 생성형 AI로 텍스트에서 정보 추출하기
요즘 ChatGPT나 Claude 같은 생성형 AI를 연구에 쓰는 사례가 부쩍 많아졌죠. 그런데 이 기술을 논문 분석이나 여론조사 문항 생성이 아니라, "텍스트에서 정보를 뽑아내는 도구"로 써볼 수 있다면 어떨까요?
오늘 소개할 논문은 바로 이런 아이디어를 실험적으로 보여줍니다. Northwestern 대학의 Oscar Stuhler 연구진은 AI에게 부고기사(obituary) 를 보여주고, 그 안에서 나이, 직업, 출신지, 종교 등 다양한 정보를 추출하게 하는 작업을 수행했습니다.
이 과정에서 전통적인 사회과학 방법인 '코드북(codebook)'을 ‘프롬프트북(promptbook)’이라는 개념으로 확장했다는 점이 인상 깊습니다.
🧐 배경: 정보 추출(IE)이란?
텍스트에서 어떤 구조화된 정보를 뽑아내는 작업을 **정보 추출(Information Extraction, IE)**이라고 부릅니다. 예를 들어 신문기사에서 “김철수는 서울대에서 경제학을 전공하고 1995년에 현대자동차에 입사했다”는 문장을 보면:
- 이름: 김철수
- 학교: 서울대
- 전공: 경제학
- 입사연도: 1995
- 회사: 현대자동차
이렇게 텍스트를 표 형식의 데이터로 바꾸는 것이 IE의 핵심입니다.
기존에는 이런 작업을 하려면 복잡한 NLP 모델을 학습하거나, 수작업으로 코딩을 했어야 했어요. 그런데 최근 LLM이 나오면서, "프롬프트만 잘 짜면" 이런 작업을 상당히 자동화할 수 있게 되었습니다.
📄 연구 내용 요약
연구자들은 뉴욕타임스에 1980~2024년 사이에 게재된 약 8만 개의 부고기사를 수집했습니다. 그리고 아래와 같은 12가지 정보를 AI로 추출하도록 설계했어요:
나이 | 87세 |
직업 요약 | "법률가", "배우, 감독" |
군 복무 여부 | yes / not mentioned |
종교 | catholic / not mentioned |
자녀 수 | 3 |
출신지 | "Queens, NY" |
마지막 거주지 | "Paris, France" |
최고 학력 | College / Master / Not inferable |
교육 기관 | "Harvard University" 등 |
성별 | male / female |
사망 원인 | "cancer" |
유족 구성 | "1 wife, 2 sons, 1 daughter" |
이걸 AI에게 “이 부고기사 읽고, 이 사람의 나이, 학력, 종교를 알려줘”라고 프롬프트로 지시해서 뽑는 거죠. 연구자들은 이 프롬프트 묶음을 "프롬프트북(promptbook)"이라고 부릅니다.
🛠 어떻게 프롬프트를 설계했을까?
우리가 보통 연구조사를 할 때, 연구보조원(RA)이나 코더에게 “이런 기준으로 코딩하세요”라고 **코드북(codebook)**을 주잖아요? 예: “직업이 언급되면 직업을 복사해서 적고, 없으면 ‘없음’이라고 써주세요”처럼요.
그런데 이제는 이걸 AI에게 시키는 시대입니다! 하지만 AI도 사람이랑 비슷해서, “알아서 잘 해줘” 하면 잘 못 알아들어요. 정확하고 구체적인 지침을 줘야 잘합니다.
그래서 연구진은 ‘AI 전용 코드북’을 만들었어요. 이걸 **프롬프트북(promptbook)**이라고 부릅니다. 쉽게 말하면 프롬프트의 모음집이자 AI 코딩 매뉴얼이에요.
🎯 어떻게 만들었는가?
- 먼저 300개의 부고기사를 연구자들이 직접 읽고, 12개의 항목(나이, 직업, 학력, 종교 등)을 수작업으로 코딩합니다. 이걸 **개발용 데이터셋(dev set)**이라고 불러요.
- 이 과정을 통해 “아, 이런 표현은 헷갈리네” “이건 어떻게 처리해야 하지?” 같은 애매한 경우들을 발견합니다.
- 그런 문제들을 해결하기 위해 코드북을 점점 다듬고, 이걸 바탕으로 프롬프트를 설계합니다.
📌 예를 들어 볼까요?
▪️ 나이(age) 추출 프롬프트:
- 원래 코드북엔 이렇게 쓰여 있어요:
- “사망 시 나이를 추론해서 숫자로 적는다. 추론 불가능하면 공란.”
- 근데 AI에게는 이렇게 바꿔줘야 해요:
- “이 부고기사를 보고, 사망 당시 나이를 숫자로 알려줘. 추정이 불가능하면 ‘9999’라고 답해. 그리고 나이를 어디서 어떻게 찾았는지도 알려줘.”
📎 AI는 “95세였습니다” 같은 문장을 찾아서 “95”라고 추출하고, 왜 그렇게 판단했는지도 보여줍니다.
▪️ 학력(highest education level) 프롬프트:
이건 좀 까다로웠어요. 예를 들어 부고에
“그는 미시간 대학교에서 수학을 공부했다”
라고 써 있으면, AI는 “공부했으면 석사학위겠지?” 하고 막연히 ‘석사’로 추정해버리기도 해요.
그래서 연구진은 AI에게 아주 정확한 조건을 줍니다:
- "직업을 보고 학력을 추론하지 마라"
- "졸업했는지 명시 안 됐으면 ‘some college’로 간주해라"
- "대학 교수를 했다고 해서 그 대학을 졸업한 건 아니다" 등등...
즉, AI가 과하게 ‘지어내는’ 걸 막기 위해 엄청 꼼꼼하게 룰을 만들었어요. 마치 초보 코더에게 지침서 쓰듯이요.
🔁 프롬프트는 한 번에 완성되지 않음
- 처음에는 모델이 실수도 많고, 동문서답도 하고, 자꾸 엉뚱한 추론도 했어요.
- 그래서 연구자들이 프롬프트를 조금씩 수정해 가면서 성능을 개선합니다. 이걸 **프롬프트 엔지니어링(prompt engineering)**이라고 불러요.
예를 들면, 모델이 “University of Michigan에서 교수로 일했다”는 걸 보고 “저 학교를 다녔겠지?”라고 추정한 걸 막기 위해,
→ “교수로 일한 학교는 쓰지 마!”라고 명시적으로 써야 했습니다.
🔄 그래서 최종적으로는…
모든 항목마다 다음과 같은 구조로 프롬프트를 설계했어요:
- 지시문 (어떤 정보를 뽑아라)
- 예외 조건 (뭘 하지 마라)
- 응답 형식 (예: JSON, 숫자만, 줄글 없이 등)
- 근거 설명 요청 (evidence + reasoning)
이 구조를 12개 항목 모두에 맞게 각각 따로 설계해서 하나의 **프롬프트북(promptbook)**을 만든 겁니다.
🤖 어떤 모델을 썼을까?
이번 연구는 ChatGPT 같은 생성형 AI, 정확히는 **거대 언어모델(Large Language Models, LLMs)**을 활용했어요.
근데 GPT는 안 썼어요! 왜냐면:
- GPT는 API 기반이라 나중에 모델이 바뀔 수도 있고,
- 프라이버시 문제도 있어서
- 연구 재현성이 낮다고 봤기 때문이에요.
그래서 연구진은 Meta(페이스북)에서 만든 LLaMA 3 모델의 오픈소스 버전을 썼습니다.
💻 사용한 두 가지 모델
LLaMA 3 - 8B | 약 8억 | 6GB | 가볍고 Colab에서도 돌릴 수 있음 |
LLaMA 3 - 70B | 약 700억 | 50GB | 매우 성능 좋음, 서버 필요 |
→ 대형 모델(70B)은 고성능 GPU 2개를 써야 했고, 소형 모델(8B)은 비교적 가볍게 사용 가능했어요.
🧪 둘의 성능 차이는?
나이 추출 | 98% | 99% |
군 복무 여부 | 76% | 99% |
자녀 수 | 86% | 98% |
최고 학력 | 58% | 87% |
- 👉 단순한 정보(성별, 나이, 사망 원인 등) 은 8B도 잘했어요.
- 👉 하지만 문맥 추론이 필요한 정보(학력, 종교, 출신지 등) 는 70B가 훨씬 잘했습니다.
🔍 요약하면, 작업 난이도에 따라 필요한 모델 크기도 달라진다는 거예요.
📦 기술적인 구성
- 모델은 GGUF 포맷의 양자화(quantization) 버전을 사용했어요. → 더 가볍게 구동 가능.
- 모델 실행은 llama.cpp 라이브러리와 Python 인터페이스(llama-cpp-python)를 이용.
- 온도값(temperature) 는 0으로 설정해서 가장 확실한 응답만 출력하게 했습니다.
이렇게 설계된 모델과 프롬프트를 통해, 연구자들은 약 19,200번의 모델 실행을 실험하고, 다양한 IE 결과를 분석했어요. 진짜 꼼꼼하게 실험한 셈이죠!
📊 정확도는 어땠을까?
대형 모델(LLaMA 3 70B)은 대부분의 작업에서 95~99%의 정확도를 보였습니다.
성별 | 100% |
나이 | 99% |
군 복무 여부 | 99% |
자녀 수 | 98% |
사망 원인 | 97% |
직업 요약 | 93% |
종교 | 90% |
최고 학력 | 87% |
출신지 | 83% |
👉 종교, 출신지, 학력은 상대적으로 정확도가 낮았는데요, 이들은 해석 능력이 필요한 항목이라서, AI가 지나치게 '문자 그대로 literal하게' 읽거나 추론 오류를 범하기 때문입니다.
⚠️ 생성형 AI를 쓸 때의 주의점
이 연구의 가장 중요한 경고는 바로 **"모델의 오류는 무작위가 아니라 편향적일 수 있다"**는 점이에요.
예를 들어, 종교 추출에서 모델이 출신 국가, 이름, 민족성 등으로 추론해 실제로 텍스트에 없는 종교를 부여하는 경우가 있었어요.
이런 편향은 후속 통계 분석(예: 회귀분석)에서 왜곡을 일으킬 수 있습니다. 따라서 연구자는 오류 양상이 어떤지를 꼭 사전 점검해야 한다고 강조합니다.
💡 왜 중요한가? 연구의 시사점
- 접근성: 이제는 코딩 좀 할 줄 아는 사회과학자라면 복잡한 IE 모델 없이도 정보 추출을 할 수 있게 되었어요.
- 유연성: 연구자가 자신의 코드북에 맞는 프롬프트를 설계할 수 있어서, 기존 NLP 도구의 제한을 넘을 수 있습니다.
- 투명성: 프롬프트북이 공개되면, 다른 연구자도 같은 프롬프트로 동일한 작업을 재현할 수 있어요.
📘 마무리: 코드북에서 프롬프트북으로
이 논문은 사회과학자들이 GPT와 같은 AI를 어떻게 **도구(tool)**로 활용할 수 있는지를 아주 구체적이고 실용적인 방식으로 보여줍니다. 특히 "텍스트를 구조화된 데이터로 바꾸는 작업"은 지금까지 너무 많은 노동력을 들였던 영역이었죠.
앞으로 텍스트 분석을 계획하고 있는 연구자라면, 이 논문은 정말 참고할 만한 가이드입니다. 프롬프트북을 공유함으로써 **'연구 방법의 문서화'**가 한 단계 진화하고 있다는 점도 흥미롭습니다.
필요하시면, 이 논문 내용을 바탕으로 프롬프트북 예시나 코드 예제도 정리해드릴 수 있어요. 원하시면 댓글이나 DM 주세요!