본문으로 건너뛰기

정성 코딩에 LLM을 사용하고 보고하는 방법

LLM으로 코드를 제안하거나, 신뢰도 표본을 이중 코딩하거나, 사람의 검토에 앞서 먼저 코딩하게 한 다음, 모델의 일치도를 보고하고 전사문을 보호합니다.

대규모 언어 모델은 정성 코딩에서 세 가지 역할을 맡을 수 있습니다. 사람 코더에게 코드를 제안하는 역할, 사람 코더 옆에서 신뢰도 표본을 코딩하는 역할, 사람이 검토하도록 말뭉치를 먼저 코딩하는 역할입니다. 어떤 역할이든 코더들 사이에서 쓰는 계수로 모델과 사람 코더의 일치도를 보고하고, 모델의 코드를 사람의 코드와 분리해 두며, 프롬프트와 모델 버전을 기록하고, 동의서가 인터뷰 텍스트가 간 곳을 포괄하는지 확인하세요.

정성 코딩은 인터뷰, 포커스 그룹, 현장 노트, 개방형 응답의 발췌문에 코드북의 코드를 부여합니다. 연역적 코딩은 코딩이 시작되기 전에 작성한 코드북을 적용하고, 귀납적 코딩은 데이터로부터 코드를 만들어 냅니다. 대규모 언어 모델(LLM)은 프롬프트로부터 텍스트를 생성합니다. 코드북과 발췌문 하나가 담긴 프롬프트를 주면 모델은 그 발췌문에 대한 코드를 반환합니다. 코더 간 신뢰도는 같은 자료를 독립적으로 코딩하는 코더 사이의 일치도이며, 보통 Cohen의 카파나 Krippendorff의 알파로 보고합니다.

여기에 인용한 코딩 연구는 모두 연구자가 작성한 코드북에 대한 연역적 코딩을 시험했으며, 조언도 같은 설계를 전제합니다. Wheeler (2025)는 성찰적 주제 분석이 AI 보조 분석과 쉽게 어울리지 않는다고 지적합니다. 성찰적 주제 분석은 연구자의 해석이 모든 단계를 형성한다고 가정합니다. 별도의 가이드들이 코더 간 신뢰도를 보고할 시점, 코드북 구축, 모델 사전 어노테이션의 작동 방식, 라벨링 작업을 자동화할 시점, 각 QDA 프로그램이 텍스트를 보내는 곳을 다룹니다.

모델의 세 가지 역할

역할은 코드에 대한 최종 결정을 누가 내리는지, 그리고 모델이 도움이 되었는지를 보이기 위해 무엇을 보고하는지에서 서로 다릅니다.

역할모델이 하는 일사람이 하는 일보고할 것
코드 제안자코더가 열어 둔 발췌문에 코드나 힌트를 제시모든 코드를 결정코더가 제안을 유지한 빈도, 제안 없이 코딩한 발췌문의 일치도
두 번째 코더신뢰도 표본을 독립적으로 코딩모델의 코드를 보지 않은 채 같은 표본을 코딩코드별로, 사람 간 일치도 옆에 모델과 사람 간 일치도
1차 연역 코더사람이 발췌문을 열기 전에 모든 발췌문을 코딩각 코드를 확인하거나 수정검토자가 바꾼 코드의 수, 블라인드로 코딩한 표본의 일치도

LLM 정성 코딩에 관한 발표된 연구

아래 연구에서 모델과 사람 코더 사이의 일치도는 코드마다, 그리고 프롬프트에 따라 달라졌습니다. 따라서 다른 코드북에서 발표된 수치는 내 코드북에서의 일치도를 알려 주는 약한 지표일 뿐입니다. 대신 내 신뢰도 표본으로 모델을 측정하세요.

Xiao et al. (2023)은 어린이의 질문 668건을 심리학자의 코드북에 맞춰 온도 0의 GPT-3로 코딩했습니다. 전문가 코딩과의 일치도는 질문 복잡도에서 κ = 0.61, 통사 구조에서 κ = 0.38에 이르렀으며, 전문가들 사이의 κ = 0.88과 κ = 0.90에 못 미쳤습니다. 가장 좋은 프롬프트는 코드마다 설명과 예시가 있는 코드북 형태로 구성한 것이었습니다.

프리프린트에서 Chew et al. (2023)은 네 개의 공개 데이터셋에서 문서 100건씩의 표본을 GPT-3.5로 코딩하고 Gwet의 AC1로 일치도를 평가했습니다. 모델과 사람 간 일치도는 대부분의 코드에서 사람 간 일치도에 가까웠으나, 해시태그, @ 멘션, 대문자에 관한 코드에서는 크게 못 미쳤습니다. 해시태그에서 모델과 사람 간 일치도는 0.18이었고 사람들 사이에서는 0.96이었습니다.

프리프린트에서 Dunivin (2024)은 W.E.B. Du Bois를 언급한 뉴욕 타임스 기사의 구절을 코딩했습니다. 골드 스탠더드 구절 111건에서 GPT-4는 9개 코드 중 8개에서 κ ≥ 0.6에 이르렀고, GPT-3.5의 평균은 κ = 0.34였습니다. 각 코드와 함께 근거를 요청하자 평균 κ가 0.59에서 0.68로 올랐습니다.

Tai et al. (2024)은 ChatGPT 3.5로 세 개의 인터뷰 발췌문 각각에 대해 하나의 코드북 프롬프트를 160번 실행했습니다. 코드는 실행마다 달라졌습니다. 한 발췌문에서 모델은 실행의 59.4%에서 Persistence 코드를 부여했습니다.

Schroeder, Roy, and Kabbara (2025)는 350명의 어노테이터와 함께 주관적 작업에서 제안자 역할을 시험했습니다. 제안이 있을 때 어노테이터는 더 빨리 작업하지 않았고 어노테이터의 라벨 분포가 바뀌었습니다. 보조를 받은 라벨로 평가한 모델은 제안 없이 준 라벨로 평가한 모델보다 유의하게 더 좋아 보였습니다.

신뢰도 표본에서의 모델과 사람 간 일치도

방법 절에서 코더들 사이의 Krippendorff의 알파를 보고한다면, 같은 신뢰도 표본에서 모델과 각 코더 사이의 알파를 코드별로 계산하고 사람 간 수치 옆에 인쇄하세요. 모델은 사람 간 수치에서 제외하세요. 모델과 사람을 섞은 행렬에 대한 하나의 계수는 어느 쪽 집단도 설명하지 못합니다. 모델의 코드를 본 코더는 더 이상 모델로부터 독립적이지 않으므로, 사람 코더는 모델의 코드를 보지 않은 채 신뢰도 표본을 코딩합니다. 온도는 0으로 설정하거나, 발췌문마다 모델을 여러 번 실행해 실행들이 일치하는 빈도를 보고하세요.

높은 일치도만으로는 모델이 코더를 대체할 수 있음을 보여 주지 못합니다. Calderon, Reichart, Dror (2025)의 대체 어노테이터 검정은 사람 코더를 한 번에 한 명씩 제외합니다. 그런 다음 모델이 남은 코더들과 일치하는 정도가 제외된 코더가 일치하는 정도보다 허용 오차 안에서 적어도 같은 수준인지 검사합니다. Potato는 단일 선택 및 평점 스킴에 대해 이 검정을 실행합니다.

데이터에서 모델 코드에 표시하기

사람의 이름으로 저장된 모델의 코드는 그 사람의 작업처럼 보이며, 그 파일에서 계산한 코더 간 수치는 모델을 사람으로 센 것이 됩니다. 모델에 별도의 코더 ID를 주고, 각 행이 사람의 것인지 모델의 것인지 표시하는 열을 추가하세요. 1차 코딩에서는 모델의 원래 코드를 검토된 코드 옆에 보관하세요. 두 코드를 모두 저장해 두면 검토자가 바꾼 코드가 몇 개인지 셀 수 있습니다.

프롬프트와 모델의 기록

독자는 프롬프트 없이는 모델 코딩을 판단하거나 다시 실행할 수 없습니다. 부록에 다음 세부 사항을 기록하세요.

  • 날짜가 붙은 API 스냅숏이나 ollama list가 출력하는 ID 같은 모델 이름과 정확한 버전.
  • 모델을 실행한 제공자 또는 서버, 그리고 실행 날짜.
  • 코드북 텍스트를 포함한 전체 프롬프트와 날짜가 붙은 각 수정본.
  • 온도와 발췌문당 실행 횟수.
  • 모델이 유효한 코드를 반환하지 않았을 때 일어난 일.

호스팅 모델 대 로컬 모델과 동의

호스팅 API는 제공자의 보관 조건에 따라 참가자 텍스트를 제공자의 서버에서 처리하며, 로컬 모델은 텍스트를 팀이 통제하는 머신에 둡니다. 호스팅 실행 전에 보관과 학습에 대한 제공자의 조건을 동의서 및 윤리 승인과 대조해 확인하세요. Wheeler (2025)는 먼저 데이터를 비식별화할 것을 권장하고, 이름만 바꾸는 것으로는 항상 충분하지는 않다고 경고하며, 동의서에 생성형 AI 처리에 관한 문구를 넣을 것을 권장합니다. Rutgers AI 동의 가이드는 도구의 이름, 대학 라이선스 도구인지 외부 도구인지, 업체가 데이터로 모델을 학습시킬 수 있는지, 업체가 데이터를 얼마나 오래 보관하는지를 명시하라고 제안합니다.

상용 QDA 프로그램은 텍스트를 서로 다른 곳으로 보냅니다. ATLAS.ti의 AI Coding은 텍스트를 OpenAI로 보내고, MAXQDA의 AI Assist Premium은 자신의 컴퓨터나 서버에서 호스팅하는 모델을 사용할 수 있으며, NVivo의 어시스턴트 AURA는 NVivo AI Cloud에서 실행됩니다. 에어갭 어노테이션은 외부로 나가는 경로가 전혀 없는 작업을 다룹니다.

Potato 2.13.1의 LLM 보조 코딩

ai_support를 사용하면 모델이 코더가 열어 둔 발췌문에 대해 힌트, 키워드 강조, 각 코드의 근거, 제안 코드를 제공하고 결정은 코더가 내립니다. 보조 기능은 codebook: true로 표시된 스킴과 QDA 모드 프로젝트에서 작동합니다. 프롬프트에는 코드북에 저장된 정의는 빠진 채 현재 코드 이름과 스킴의 description이 나열됩니다. 판단 기준은 description에 넣으세요. endpoint_type을 ollama나 vllm으로 설정하고 자체 서버의 base_url을 지정하면 발췌문이 그 서버에 머물며, openai, anthropic, gemini는 각 발췌문을 지정한 제공자에게 보냅니다.

1차 코딩에서는 pre_annotation이 별도의 predictions_file에서 모델의 코드를 미리 채웁니다. 미리 채워진 코드는 코더가 저장할 때만 코더의 응답이 되며, Potato는 시드된 값을 발췌문의 행동 데이터에 기록합니다. 시드된 값과 저장된 코드를 비교하면 바뀌지 않은 코드의 수를 셀 수 있습니다. ai_support.holdout.fraction은 코더와 발췌문 쌍의 무작위 비율에서 제안과 미리 채워진 코드를 보류합니다. 관리자 대시보드의 AI influence 탭은 두 그룹을 모델과의 일치도와 각 그룹 내 알파로 비교합니다. 아래 구성은 로컬 모델로 제안, 미리 채워진 코드, 보류를 설정합니다.

yaml
annotation_task_name: Clinic access interviews
task_dir: .
output_annotation_dir: annotation_output/
data_files:
  - data/excerpts.json
item_properties:
  id_key: id
  text_key: text
user_config:
  allow_all_users: true
  users: []
 
# Coders apply the agreed codes and cannot add new ones
codebook_mode: fixed
 
annotation_schemes:
  - annotation_type: multiselect
    name: codes
    description: Which codes from the codebook apply to this excerpt?
    codebook: true
    labels: [access barriers, cost concerns, provider trust, administrative burden]
 
# A model on the team's own machine offers hints and suggested codes
ai_support:
  enabled: true
  endpoint_type: ollama
  ai_config:
    model: llama3.1:8b
    base_url: http://localhost:11434
    temperature: 0
    include:
      all: true
  holdout:
    fraction: 0.2
    salt: clinic-access-2026
 
# The model's first-pass codes, kept in their own file
pre_annotation:
  enabled: true
  predictions_file: data/model_codes.json
  allow_modification: true

예측 파일은 {"p01-03": {"codes": ["access barriers"]}}처럼 각 발췌문 ID를 스킴별 모델의 코드에 매핑합니다. include.all: true가 없으면 보조 버튼이 나타나지 않습니다. 값을 바꾸면 그룹이 다시 섞이므로 salt와 fraction은 연구 동안 고정하세요.

모델을 두 번째 코더로 쓰려면 machine_annotators 아래에 모델과 실행 날짜와 함께 모델의 코더 ID를 선언하세요. 제공자가 날짜가 붙은 스냅숏을 노출하거나 ollama list가 모델의 ID를 출력한다면, 그 값을 model 옆에 version으로 추가하세요. 위 구성에 다음 블록을 추가하세요.

yaml
machine_annotators:
  enabled: true
  annotators:
    - id: llm_coder
      kind: llm
      endpoint_type: ollama
      model: llama3.1:8b
      run_date: "2026-11-02"

그러면 /admin/iaa는 대표 수치를 사람만으로 유지하고 모델을 별도 이름의 파티션에서 보고합니다. csv, tsv, parquet 내보내기는 annotator_origin 열(human 또는 llm)을 추가하고, jsonl 내보내기는 전체 선언을 포함합니다. reliability 내보내기는 발췌문의 모든 코더를 합칩니다. 모델과 사람 간 알파를 계산하려면 csv 내보내기를 annotator_origin으로 필터링하고 행을 일치도 계산기에 불러오세요. 단일 선택 및 평점 스킴에 대해 GET /admin/api/alt-test는 사람 코더 세 명 이상이 모델도 코딩한 발췌문을 각각 30건 이상 코딩하면 대체 어노테이터 검정을 실행합니다.

해당 ID로 모델의 코드를 기록하려면 문서화된 프롬프트를 모델에 보내고, llm_coder로 로그인하며, /updateinstance를 통해 저장하는 스크립트를 작성하세요(API 레퍼런스). 시뮬레이터의 --strategy llm은 대용이 되지 못합니다. 시뮬레이터는 범용 프롬프트를 사용하고, 각 발췌문의 처음 500자를 보내며, 응답이 어떤 코드와도 맞지 않으면 무작위 코드를 기록합니다. 솔로 모드는 한 코더와 모델 사이의 원시 퍼센트 일치도를 보고하고, ICL 라벨링은 발췌문과 스킴당 하나의 코드를 반환합니다. 방법 절에 두 기능 중 어느 쪽의 결과든 보고하기 전에 내보낸 코드에서 알파를 계산하세요.

자주 묻는 질문

정성 코딩에 ChatGPT를 사용할 수 있나요?

내 데이터에서 모델과 사람 코더의 일치도를 측정하고 그 결과를 보고한다면 문서화된 코드북에 대한 연역적 코딩에 ChatGPT나 다른 LLM을 사용할 수 있습니다. 발표된 일치도는 코드마다 달랐으며, Xiao et al. (2023)의 한 코드북에서는 κ = 0.61에서 κ = 0.38까지였습니다. 인터뷰 데이터라면 호스팅 서비스를 사용하기 전에 동의서와 윤리 승인을 확인하세요.

LLM과 사람 코더 사이의 코더 간 신뢰도는 어떻게 계산하나요?

모델을 신뢰도 표본의 코더 한 명으로 취급하고, 모델과 각 사람 코더 사이에서 팀이 쓰는 계수를 계산하세요. 계수는 보통 Krippendorff의 알파나 Cohen의 카파입니다. 모델을 뺀 채 계산한 사람 간 수치 옆에 코드별 모델과 사람 간 수치를 보고하세요. 일치도 계산기는 코드 CSV에서 알파와 카파를 계산합니다.

방법 절에서 LLM 보조 코딩을 어떻게 보고해야 하나요?

모델의 역할, 이름과 버전, 제공자 또는 서버, 실행 날짜, 온도, 그리고 코드별 모델과 사람 간 일치도를 사람 간 일치도 옆에 보고하세요. 코더가 모델의 코드를 보았는지, 불일치를 어떻게 해소했는지 밝히세요. 코드북 텍스트를 포함한 전체 프롬프트는 부록에 넣으세요.

인터뷰 전사문을 ChatGPT에 업로드해도 되나요?

동의서와 윤리 승인이 해당 제공자에게 참가자 텍스트를 보내는 것을 포괄할 때만 전사문을 호스팅 서비스에 업로드하세요. 먼저 전사문을 비식별화하고, 이름만 바꾸는 것으로는 항상 충분하지는 않다는 점을 기억하세요. 팀의 자체 서버에서 Ollama나 vLLM으로 실행하는 모델은 전사문을 외부 서버에 두지 않습니다.

더 읽을거리

참고문헌

  1. Calderon, N., Reichart, R., & Dror, R. (2025). The Alternative Annotator Test for LLM-as-a-Judge: How to Statistically Justify Replacing Human Annotators with LLMs. Proceedings of the 63rd Annual Meeting of the Association for Computational Linguistics (Volume 1: Long Papers), 16051-16081. https://doi.org/10.18653/v1/2025.acl-long.782
  2. Chew, R., Bollenbacher, J., Wenger, M., Speer, J., & Kim, A. (2023). LLM-Assisted Content Analysis: Using Large Language Models to Support Deductive Coding. arXiv preprint 2306.14924. https://arxiv.org/abs/2306.14924
  3. Dunivin, Z. O. (2024). Scalable Qualitative Coding with LLMs: Chain-of-Thought Reasoning Matches Human Performance in Some Hermeneutic Tasks. arXiv preprint 2401.15170. https://arxiv.org/abs/2401.15170
  4. Schroeder, H., Roy, D., & Kabbara, J. (2025). Just Put a Human in the Loop? Investigating LLM-Assisted Annotation for Subjective Tasks. Findings of the Association for Computational Linguistics: ACL 2025, 25771-25795. https://doi.org/10.18653/v1/2025.findings-acl.1323
  5. Tai, R. H., Bentley, L. R., Xia, X., Sitt, J. M., Fankhauser, S. C., Chicas-Mosier, A. M., & Monteith, B. G. (2024). An Examination of the Use of Large Language Models to Aid Analysis of Textual Data. International Journal of Qualitative Methods, 23. https://doi.org/10.1177/16094069241231168
  6. Wheeler, K. (2025). How to Use Generative AI to Assist the Analysis of Qualitative Data. Sage Research Methods: Data and Research Literacy. https://doi.org/10.4135/9781036217471
  7. Xiao, Z., Yuan, X., Liao, Q. V., Abdelghani, R., & Oudeyer, P.-Y. (2023). Supporting Qualitative Analysis with Large Language Models: Combining Codebook with GPT-3 for Deductive Coding. Companion Proceedings of the 28th International Conference on Intelligent User Interfaces, 75-78. https://doi.org/10.1145/3581754.3584136