如何在质性编码中使用 LLM 并加以报告
用 LLM 推荐代码、对信度样本做双重编码,或先行编码再交人工审核,然后报告模型的一致性并保护访谈转录稿。
大语言模型在质性编码中可以承担三种角色:向人类编码者推荐代码、与人类编码者一起为信度样本编码,或先为整个语料编码再交由人工审核。无论哪种角色,都要用编码者之间所用的同一系数报告模型与人类编码者的一致性,把模型的代码与人的代码分开保存,记录提示词和模型版本,并确认知情同意书涵盖访谈文本的去向。
质性编码把码本中的代码分配给访谈、焦点小组、田野笔记或开放式回答中的摘录。演绎编码使用编码开始前写好的码本,归纳编码则从数据中提炼代码。大语言模型(LLM)根据提示词生成文本。给定一个包含码本和一段摘录的提示词,模型会返回这段摘录的代码。编码者间信度是各自独立编码同一材料的编码者之间的一致性,通常以 Cohen's kappa 或 Krippendorff's alpha 报告。
本文引用的编码研究检验的都是依据研究者自己编写的码本进行的演绎编码,本文的建议也以同样的设计为前提。Wheeler(2025)指出,反身性主题分析与 AI 辅助分析难以相容。反身性主题分析认为研究者的诠释贯穿每一个阶段。另有几篇指南分别介绍何时报告编码者间信度、编制码本、模型预标注的具体做法、何时把标注工作自动化,以及各个 QDA 程序把文本发往何处。
模型的三种角色
三种角色的区别在于由谁对代码做最终决定,以及为了说明模型是否有帮助需要报告什么。
| 角色 | 模型做什么 | 人做什么 | 报告什么 |
|---|---|---|---|
| 代码推荐者 | 在编码者打开的摘录上给出代码或提示 | 决定每一个代码 | 编码者采纳推荐的频率,以及在不显示推荐时编码的摘录上的一致性 |
| 第二编码者 | 独立地为信度样本编码 | 在看不到模型代码的情况下为同一样本编码 | 逐个代码列出模型与人的一致性,并与人与人的一致性并列 |
| 先行演绎编码者 | 在人打开摘录之前为每段摘录编码 | 确认或修改每个代码 | 审核者改动了多少代码,以及在盲编码样本上的一致性 |
已发表的 LLM 质性编码研究
在下面的研究中,模型与人类编码者之间的一致性随代码而变,也随提示词而变。因此,来自另一份码本的已发表数值难以说明你的码本上的一致性。请改为在你自己的信度样本上衡量模型。
Xiao 等(2023)用温度为 0 的 GPT-3,依据心理学家编写的码本为 668 个儿童提问编码。与专家编码的一致性在问题复杂度上达到 κ = 0.61,在句法结构上为 κ = 0.38,而专家之间分别为 κ = 0.88 和 κ = 0.90。效果最好的提示词按码本的样式编排,为每个代码给出描述和示例。
Chew 等(2023)在一篇预印本中用 GPT-3.5 为来自四个公开数据集、每份 100 篇文档的样本编码,并用 Gwet's 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 等(2024)用同一个码本提示词,让 ChatGPT 3.5 对三段访谈摘录各运行 160 次。代码在各次运行之间都有变化。对其中一段摘录,模型在 59.4% 的运行中给出了 Persistence 这个代码。
Schroeder、Roy 和 Kabbara(2025)在主观性任务上用 350 名标注者检验了推荐者角色。看到推荐时,标注者的速度没有提高,标签的分布却发生了偏移。以有推荐时给出的标签为基准评估的模型,看起来显著优于以无推荐时给出的标签为基准评估的模型。
信度样本上的模型与人一致性
如果你的方法部分报告编码者之间的 Krippendorff's alpha,就在同一信度样本上逐个代码计算模型与每名编码者之间的 alpha,并把这些数值与人与人的数值并列给出。人与人的数值中不要包含模型。在混合了模型和人的矩阵上算出的单一系数,既描述不了模型,也描述不了人。看过模型代码的编码者不再独立于模型,因此人类编码者要在看不到模型代码的情况下为信度样本编码。把温度设为 0,或者对每段摘录运行模型多次,并报告各次运行的一致频率。
一致性高本身并不能说明模型可以替代一名编码者。Calderon、Reichart 和 Dror(2025)提出的替代标注者检验每次留出一名人类编码者。检验随后判断模型与其余编码者的吻合程度是否至少与被留出的编码者相当,允许一定的容差。Potato 可以对单选和评分类方案运行这项检验。
在数据中标记模型代码
保存在某个人名下的模型代码看起来就像这个人的工作,用这份文件算出的任何编码者间数值都会把模型当成一个人。为模型分配单独的编码者 ID,并添加一列,标明每一行来自人还是模型。对于先行编码,把模型的原始代码与审核后的代码并列保存。两种代码都保存下来后,你就可以统计审核者改动了多少代码。
提示词和模型的记录
没有提示词,读者就无法评判或重现模型编码。请在补充材料中记录以下内容:
- 模型名称和确切版本,例如带日期的 API 快照,或
ollama list输出的 ID。 - 运行模型的服务提供方或服务器,以及各次运行的日期。
- 包含码本文本的完整提示词,每次修订都注明日期。
- 温度,以及每段摘录的运行次数。
- 模型没有返回有效代码时如何处理。
托管模型与本地模型,以及知情同意
托管 API 在服务提供方的服务器上、按服务提供方的保留条款处理参与者文本,本地模型则把文本留在团队控制的机器上。在使用托管服务运行之前,对照知情同意书和伦理审批,检查服务提供方关于数据保留和模型训练的条款。Wheeler(2025)建议先对数据去标识化,提醒只更改姓名并不总是足够,并建议在知情同意书中加入关于生成式 AI 处理的说明。罗格斯大学 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 时,每段摘录都会发送给相应的服务提供方。
对于先行编码,pre_annotation 从单独的 predictions_file 中预填模型的代码。预填的代码只有在编码者保存后才成为编码者的答案,Potato 会把预填值记录在这段摘录的行为数据中。你可以比较预填值和保存的代码,统计未被改动的代码。ai_support.holdout.fraction 对随机抽取的一部分编码者与摘录配对不显示推荐和预填代码。管理仪表板的 AI influence 标签页会比较这两组在与模型的一致性上的差异,以及各组内部的 alpha。下面的配置用本地模型同时设置推荐、预填代码和留出组:
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预测文件把每个摘录 ID 映射到模型在每个方案上的代码,例如 {"p01-03": {"codes": ["access barriers"]}}。没有 include.all: true 时,不会出现任何助手按钮。在整个研究期间保持 salt 和 fraction 不变,因为改动其中任何一个值都会重新打乱分组。
要把模型用作第二编码者,请在 machine_annotators 下声明模型的编码者 ID,并写明模型和运行日期。如果服务商提供带日期的快照,或者 ollama list 为该模型打印了 ID,请把这个值作为 version 写在 model 旁边。把下面这段添加到上面的配置中:
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 导出会把一段摘录上的所有编码者合并计算。要计算模型与人的 alpha,请按 annotator_origin 筛选 csv 导出,再把这些行载入一致性计算器。对于单选和评分类方案,当三名或更多人类编码者各自编码了至少 30 段模型也编码过的摘录后,GET /admin/api/alt-test 会运行替代标注者检验。
要把模型的代码记录在这个 ID 下,请编写一个脚本,把你记录在案的提示词发送给模型,以 llm_coder 身份登录,并通过 /updateinstance 保存(API 参考)。模拟器的 --strategy llm 不能替代这样的脚本。模拟器使用通用提示词,只发送每段摘录的前 500 个字符,并在回复与任何代码都不匹配时记录一个随机代码。Solo Mode报告一名编码者与模型之间的原始百分比一致率,ICL 标注则对每段摘录和每个方案只返回一个代码。在方法部分报告这两项功能的结果之前,请先在导出的代码上计算 alpha。
常见问题
可以用 ChatGPT 做质性编码吗?
可以用 ChatGPT 或其他 LLM 依据成文的码本做演绎编码,前提是在你自己的数据上衡量模型与人类编码者的一致性并报告结果。已发表的一致性因代码而异,在 Xiao 等(2023)的一份码本上从 κ = 0.61 到 κ = 0.38 不等。对于访谈数据,在使用托管服务之前请检查知情同意书和伦理审批。
如何计算 LLM 与人类编码者之间的编码者间信度?
把模型当作信度样本上的又一名编码者,在模型与每名人类编码者之间计算你的团队所用的系数。这个系数通常是 Krippendorff's alpha 或 Cohen's kappa。逐个代码报告模型与人的数值,并与不含模型计算的人与人数值并列。一致性计算器可以根据代码的 CSV 计算 alpha 和 kappa。
在方法部分应该如何报告 LLM 辅助编码?
报告模型的角色、名称和版本、服务提供方或服务器、运行日期、温度,以及逐个代码的模型与人一致性,并与人与人一致性并列。说明编码者是否看过模型的代码,以及分歧是如何解决的。把包含码本文本的完整提示词放进补充材料。
可以把访谈转录稿上传到 ChatGPT 吗?
只有当知情同意书和伦理审批涵盖把参与者文本发送给该服务提供方时,才能把转录稿上传到托管服务。先对转录稿去标识化,并记住只更改姓名并不总是足够。在团队自己的服务器上用 Ollama 或 vLLM 运行的模型,可以让转录稿不经过外部服务器。
延伸阅读
- Potato 中的质性研究:Potato 的质性研究功能集中在一处
- 质性数据分析软件对比
- 编写 LLM 能遵循的码本
- 如何衡量 LLM 评审与人类标注者之间的一致性
- 如何区分预标注数据中的认真审核与橡皮图章
- 为质性编码准备访谈转录稿
参考文献
- 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
- 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
- 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
- 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
- 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
- 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
- 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