Skip to content

博客

Agent 是什么?

Agent (智能体) 的定义与业界共识

Section titled “Agent (智能体) 的定义与业界共识”

在人工智能(特别是目前的大模型应用)领域,关于 Agent(智能体) 业界最广泛接受、且对开发者最具有指导意义的定义,可以用一句话概括:

Agent 是一个能够感知环境、进行推理(Reasoning)、自主决策并采取行动(Action)以实现特定目标的智能系统。

如果把大模型(LLM)比作“大脑”,那么 Agent 就是一个拥有大脑、双手(工具)和任务清单的完整“数字员工”。


目前在 LLM 应用开发领域(如 LangChain, AutoGPT, Dify 社区),大家普遍引用 OpenAI 应用研究主管 Lilian Weng 的定义: Agent=LLM(大脑)+Planning(规划)+Memory(记忆)+Tools(工具使用) 这个公式之所以经典,是因为它指出了 Agent 区别于普通 ChatGPT 对话框的核心:它不再只是单纯的“生成文本”,而是具备了“解决问题”的能力。


2. Agent 与传统程序/普通 AI 的区别

Section titled “2. Agent 与传统程序/普通 AI 的区别”

为了区分你的程序是只是一个“工作流(Workflow)”还是一个真正的“智能体(Agent)”,可以看它是否具备以下 3 个核心特征

  • 普通 Chatbot: 用户问一句,它答一句。它是被动的。
  • 工作流 (Workflow): 按照你写死的代码 if A then B 执行。路径是固定的。
  • Agent: 你给它一个模糊的目标(例如:“帮我整理这周所有的数学错题”),它会自己决定先去哪里查数据、怎么分类、如果数据缺失该怎么办。
    • 判据: 遇到意料之外的错误,它能自我修正重试吗?如果能,它就是 Agent。

B. 感知-行动循环 (Perception-Action Loop)

Section titled “B. 感知-行动循环 (Perception-Action Loop)”

这是计算机科学中 Agent 的经典定义(源自 Russell & Norvig 的《人工智能:一种现代方法》)。Agent 不是线性的(Input -> Output),而是循环的

  1. 感知 (Perceive): 看看现在情况咋样?
  2. 思考 (Think): 决定下一步做什么。
  3. 行动 (Act): 调用工具(搜索、代码解释器)。
  4. 观察 (Observe): 看看行动的结果(比如报错了,或者拿到数据了)。
  5. 再思考 (Think Again): 基于观察结果,决定下一步…(循环直到目标达成)。

C. 工具使用能力 (Tool Use / Function Calling)

Section titled “C. 工具使用能力 (Tool Use / Function Calling)”
  • 大模型本身是封闭的“缸中之脑”。
  • Agent 的标志性能力是打破第四面墙,它能根据意图,自主选择调用外部 API(比如你的试题库 API)、操作数据库或浏览网页。

3. 举个通俗的例子:出数学卷子

Section titled “3. 举个通俗的例子:出数学卷子”

假设场景:你要给学生出一套数学卷子。

类型行为模式典型表现
LLM (ChatGPT)纯文本生成你问:“给我出5道初一数学题。”
它答:凭记忆生成文本。可能会算错,可能题目数据不严谨。
(它是百科全书)
Workflow自动化脚本代码逻辑:第一步去数据库随机取5题 -> 第二步拼成 Word -> 第三步发邮件。
(它是流水线机器,如果数据库挂了,它就报错停止)
Agent自主决策你指令:“帮我出一套涵盖‘一元一次方程’难点的卷子。”
它的内心戏
1. “先去检索‘易错点’。” (规划)
2. “查到了,现在去题库搜对应标签。” (工具)
3. “搜到10道,我自己做一遍,挑出最难的5道。” (反思 & 循环)
4. “调用 Python 排版并输出。” (行动)
(它是专业的教务助理)

在开发者的语境下:

Agent 的本质 = 循环执行的大模型逻辑 (Looping LLM)

它不再是一次性的文本生成,而是一个运行环境,在这个环境中,大模型作为控制器,不断地与外部世界交互,直到解决问题。

  • Workflow (工作流): 适合确定性高、流程固定的任务(如:输入题目 -> 翻译 -> 存库)。
  • Agent (智能体): 适合模糊性高、需要动态决策的任务(如:分析这道题,如果算不出来就去搜索,搜索不到就尝试自己推导)。
  • Lilian Weng (OpenAI) 的博文 “LLM Powered Autonomous Agents” (2023)
  • 《人工智能:一种现代方法》(Artificial Intelligence: A Modern Approach)

Prompt技巧:Few-shot

在编写智能体(Agent)或大模型(LLM)的提示词(Prompt)时,Few-shot(少样本提示/少样本学习) 是一个非常核心且高效的概念。

简单来说,Few-shot 就是在给 AI 下达任务指令时,不只给“规则”,还给它看几个“正确答案的例子”。

我们可以把它理解为一种 “类比教学”


1. 直观理解:从 Zero-shot 到 Few-shot

Section titled “1. 直观理解:从 Zero-shot 到 Few-shot”

为了理解 Few-shot,我们需要先看看它的“兄弟”们:

  • Zero-shot(零样本):

    你直接命令 AI 做事,不给任何例子。

    指令: 请将下面这句话翻译成英文:“今天天气真不错。”

    AI: The weather is really nice today.

  • One-shot(单样本):

    你给 AI 一个 例子,让它照猫画虎。

    指令: 请模仿下面的风格将句子翻译成英文。

    示例: “你好吗?” -> “How do you do?” (正式风格)

    任务: “今天天气真不错。”

    AI: The weather is quite pleasant today. (试图模仿正式感)

  • Few-shot(少样本):

    你给 AI 两个或更多(通常 3-5 个) 例子。

    这能帮 AI 锁定非常具体的模式、格式或逻辑。


大语言模型本质上是“文字接龙”的高手,它们非常擅长模式识别(Pattern Matching)。通过提供几个例子,你可以达到以下目的:

  1. 固定格式(关键): 假如你需要 AI 输出 JSON 或特定的代码格式,给例子比写一堆“请不要输出额外文字”的文字说明要有效得多。

  2. 规范风格: 比如你需要“鲁迅风格”或“小红书风格”,给几个样板段落,AI 就能瞬间领悟语调。

  3. 复杂逻辑引导: 对于数学题或推理题,给几个带有“解题步骤”的例子(这叫 Chain-of-Thought Few-shot),能显著提高 AI 的准确率。

  4. 处理边缘情况: 你可以在例子中包含一个“当找不到答案时输出什么”的样本,防止 AI 胡编乱造。


假设你想做一个 “从用户评论中提取情绪和关键词” 的智能体。

❌ 这种是 Zero-shot (效果可能不稳定)

Section titled “❌ 这种是 Zero-shot (效果可能不稳定)”

Prompt: 请分析下面的评论,告诉我用户的情绪是正面还是负面,并提取提到的产品特性。

评论: “这手机屏幕是很清楚,但是电池太不耐用了,用了半天就没电。”

AI 可能回答: “这是一个中性偏负面的评论。提到的特性有屏幕清晰度(正面)和电池续航(负面)。” (问题:回答格式随意,不方便程序后续处理)

✅ 这种是 Few-shot (效果稳定精准)

Section titled “✅ 这种是 Few-shot (效果稳定精准)”

Prompt: 任务:分析用户评论。 输出格式:情绪 (Positive/Negative/Mixed) | 关键词列表

示例 1: 输入:“味道好极了,而且送货很快!” 输出:Positive | [“味道”, “送货速度”]

示例 2: 输入:“衣服质量太差了,线头很多,而且客服不理人。” 输出:Negative | [“质量”, “做工”, “客服服务”]

示例 3: 输入:“虽然价格便宜,但是物流慢得要死。” 输出:Mixed | [“价格”, “物流速度”]

当前任务: 输入:“这手机屏幕是很清楚,但是电池太不耐用了,用了半天就没电。” 输出:

AI 会回答: Mixed | ["屏幕清晰度", "电池续航"] (结果:完全遵循了你设定的“情绪 | [列表]”这种特殊格式)


  1. 样本数量: 通常 3 到 5 个 例子性价比最高。太少(1个)可能导致 AI 过度拟合那个例子的特定内容;太多(几十个)会占用 Token,且收益递减。

  2. 多样性: 例子要覆盖不同的情况。比如上面的例子中,我分别列举了“正面”、“负面”和“混合”三种情况。

  3. 标签明确: 使用 输入:输出: 或者 User:Assistant: 这样清晰的分隔符,让 AI 知道哪里是例子,哪里是正文。

  4. 质量至上: 你的例子必须是完美的。如果例子里有错别字或逻辑错误,AI 会完美地学会这个错误。

Few-shot 就是 “先演示,后提问”

它是提示词工程(Prompt Engineering)中最简单、但提效最明显的手段。当你发现 AI 听不懂你的复杂指令,或者输出格式总是不对时,别再加长篇大论的解释了,直接给它加两个例子试试。

Python-slim镜像制作

Python基础镜像制作,添加中文字体

Windows 电脑上,可以在 C:\Windows\Fonts 下找到。 或者下载开源且风格类似的 思源宋体 (Noto Serif CJK SC)STIX (用于数学公式)

FROM python:3.11-slim
# 使用国内镜像源
# 防止 hidden 的 bookworm 源干扰
RUN rm -rf /etc/apt/sources.list.d/* /etc/apt/sources.list
RUN echo "deb http://mirrors.aliyun.com/debian/ testing main non-free non-free-firmware contrib" > /etc/apt/sources.list && \
echo "deb-src http://mirrors.aliyun.com/debian/ testing main non-free non-free-firmware contrib" >> /etc/apt/sources.list && \
echo "deb http://mirrors.aliyun.com/debian-security/ testing-security main non-free non-free-firmware contrib" >> /etc/apt/sources.list
# 1. 更新源并安装 fontconfig
# --no-install-recommends: 避免安装不必要的推荐包,保持镜像小
# rm -rf /var/lib/apt/lists/*: 安装后删除 apt 缓存,减小镜像体积 (Slim 镜像的最佳实践)
RUN apt-get update && \
apt-get install -y --no-install-recommends fontconfig && \
rm -rf /var/lib/apt/lists/*
# 2. 创建字体目录
RUN mkdir -p /usr/share/fonts/truetype/custom
# 3. 拷贝字体文件 (确保你的项目目录下有 fonts/simsun.ttc)
COPY ./fonts/simsun.ttc /usr/share/fonts/truetype/custom/
# 4. 刷新系统字体缓存 (现在这个命令可以成功运行了)
RUN fc-cache -fv
# --- 关键修改结束 ---
# 下面是原本的构建步骤
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
# ... CMD 等指令
  1. apt-get install fontconfig:

    • python:3.11 (完整版) 基于 Debian 完整版,通常自带很多工具。
    • python:3.11-slim 基于 Debian Slim,砍掉了非必要的工具(包括管理字体的工具)。如果不手动安装 fontconfig,你就无法将新字体注册到系统里。
  2. rm -rf /var/lib/apt/lists/*:

    • slim 镜像中,安装完软件后如果不清理缓存,会白白增加这一层的体积。这是编写高质量 Dockerfile 的标准操作。
  • 拷贝指令 (COPY):本身没有影响,完全通用。
  • 刷新指令 (fc-cache):在 slim 镜像下必须先安装 fontconfig 才能用。

LLM分词和嵌入

分词器负责在将输入文本送入生成模型之前,将其分割成词元。

下面使用 transformers 来加载分词器和模型。Hugging Face 网站上找到分词器和模型, 只需传入相应的 ID 即可。使用 microsoft/Phi-3- mini-4k-instruct 作为模型的主路径,这里使用的是 Google Colab 提供的 T4 GPU(device_map=“cuda”),也可以使用其他设备。

  • 加载依赖
!pip install --upgrade transformers==4.41.2 sentence-transformers==3.0.1 gensim==4.3.2 scikit-learn==1.5.0 accelerate==0.31.0 peft==0.11.1 scipy==1.10.1 numpy==1.26.4
  • 下载和运行LLM
from transformers import AutoModelForCausalLM, AutoTokenizer
# 加载模型和分词器
model = AutoModelForCausalLM.from_pretrained(
"microsoft/Phi-3-mini-4k-instruct",
device_map="cuda",
torch_dtype="auto",
trust_remote_code=False,
)
tokenizer = AutoTokenizer.from_pretrained("microsoft/Phi-3-mini-4k-instruct")
  • 首先声明提示词

然后对其进行分词,再将这些词元传递给模型,模型随后生成输出。

prompt = "Write an email apologizing to Sarah for the tragic gardening mishap. Explain how it happened.<|assistant|>"
# Tokenize the input prompt
input_ids = tokenizer(prompt, return_tensors="pt").input_ids.to("cuda")
# Generate the text
generation_output = model.generate(
input_ids=input_ids,
max_new_tokens=20
)
# Print the output
print(tokenizer.decode(generation_output[0]))
The attention mask is not set and cannot be inferred from input because pad token is same as eos token. As a consequence, you may observe unexpected behavior. Please pass your input's `attention_mask` to obtain reliable results.
Write an email apologizing to Sarah for the tragic gardening mishap. Explain how it happened.<|assistant|> Subject: Heartfelt Apologies for the Gardening Mishap
Dear
  • 模型实际上并没有直接处理提示词文本。相反,输入提示词是由分词器处理的。分词器在变量 input_ids 中返回了模型所需的信息,随后模型将其用作输入。
  • 分词器在变量 input_ids 中返回了模型所需的信息,随后模型将其用作输入。

打印 input_ids 可以看到:

print(input_ids)
  • output
tensor([[14350, 385, 4876, 27746, 5281, 304, 19235, 363, 278, 25305,
293, 16423, 292, 286, 728, 481, 29889, 12027, 7420, 920,
372, 9559, 29889, 32001]], device='cuda:0')
for id in input_ids[0]:
print(tokenizer.decode(id))
  • output
Write
an
email
apolog
izing
to
Sarah
for
the
trag
ic
garden
ing
m
ish
ap
.
Exp
lain
how
it
happened
.
<|assistant|>
  • 每个整数都是特定词元(字符、词或词的一部分)的唯一 ID。这些 ID 是分词器内部的一张词元表的索引,该表包含了分词器能够识别的所有词元;
  • 第一个词元是 ID 1(),这是一个表示文本开始的特殊词元;
  • 一些词元是完整的单词(例如 Write、an、email);
  • 一些词元是单词的部分(例如 apolog、izing、trag、ic);
  • 标点符号是独立的词元。
  • 注意空格字符不用单独的词元表示,代表词的一部分的词元(如 izing 和 ic)在开头有一个特殊的隐藏字符,表示它们与文本中前面的词元相连。没有这个特殊字符的词元前面则都被视为有一个空格。

多维标签分类评价指标来量化其表现

为了科学、系统地评判AI试题打标系统的表现,建议采用以下核心步骤组成的评估流程。该方案旨在提供一个从建立评判标准、选择量化指标、自动化执行到分析优化的完整闭环。

第一步:建立“黄金标准”数据集(Ground Truth)

Section titled “第一步:建立“黄金标准”数据集(Ground Truth)”

这是整个评判工作中最关键、最基础的一步。没有黄金标准,任何准确率的讨论都是没有意义的。

  1. 随机抽样:从你的题库中,随机抽取一部分试题作为评测集。这个集合应该足够大以保证统计意义,例如抽取300-500道题。题目的类型和学科分布最好能与你的整体题库保持一致。
  2. 人工专家打标:请至少两位(建议三位)熟悉该学科的专家(比如经验丰富的老师或教研员)独立地为评测集中的每一道题打上最合适的标签。
    • 独立打标:为了避免相互影响,专家们在开始时不应沟通。
    • 标签体系一致:确保所有专家都使用和你AI系统完全一致的标签库。
  3. 结果仲裁:比较多位专家的打标结果。
    • 如果所有专家对某道题的标签完全一致,那么这个结果就直接成为该题的“黄金标准”。
    • 如果专家的结果不一致,请他们一起讨论,或请第三位更资深的专家进行仲裁,得出一个最终的统一标签集。
  4. 形成最终数据集:经过这个流程,你就拥有了一个高质量的、带有“正确答案”的评测数据集。

对于试题打标这种“多标签分类”任务(一道题可以有多个标签),简单的“准确率”(Accuracy)指标往往会产生误导。例如,一道题有5个正确标签,AI只打对了3个,这算对还是错?因此,我们需要使用更专业的指标:

我们先定义几个基本概念,假设对于某一道题

  • TP (True Positives): AI打的标签在黄金标准里。(真阳性)
  • FP (False Positives): AI打的标签不在黄金标准里。(假阳性,AI打错了)
  • FN (False Negatives): 黄金标准里的标签,AI没有打上。(假阴性,AI漏掉了)

基于这些,我们可以计算以下三个核心指标:

  1. 精确率 (Precision)

    • 公式: $Precision = \frac{TP}{TP + FP}$
    • 含义: 在所有AI认为是正确的标签中,到底有多少是真正正确的。它衡量的是**“AI打的标,准不准”**。高精确率代表AI的打标结果比较“干净”,很少出错。
  2. 召回率 (Recall)

    • 公式: $Recall = \frac{TP}{TP + FN}$
    • 含义: 在所有应该被打上的正确标签中,AI成功打上了多少。它衡量的是**“AI找的标,全不全”**。高召回率代表AI的覆盖面很广,很少遗漏。
  3. F1分数 (F1-Score)

    • 公式: $F1 = 2 \times \frac{Precision \times Recall}{Precision + Recall}$
    • 含义: 精确率和召回率的调和平均数,是一个综合性指标。当精确率和召回率都高时,F1分数才会高。这是评估多标签分类系统时最常用、最重要的指标之一
  1. 运行AI系统:将第一步中准备好的评测集(仅包含题干和答案解析,不包含人工标签)输入到你的AI打标系统中,获取AI给出的标签结果。
  2. 数据对比与计算
    • 对于评测集中的每一道题,对比AI输出的标签和黄金标准标签,计算出该题的TP, FP, FN数量。
    • 将所有题目的TP, FP, FN进行累加,得到整个评测集的总TP, 总FP, 总FN。
    • 使用总的TP, FP, FN代入公式,计算出整个系统的宏观精确率 (Macro-Precision)、宏观召回率 (Macro-Recall) 和宏观F1分数 (Macro-F1 Score)

手动计算效率低下且易出错,因此强烈建议采用Python脚本实现自动评测。

  1. 准备环境:确保Python环境中安装了 pandasscikit-learn 库。
  2. 运行代码:使用以下代码,加载在第一步中创建的CSV文件并执行计算。
import pandas as pd
from sklearn.preprocessing import MultiLabelBinarizer
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, jaccard_score, hamming_loss, classification_report
# 1. 加载数据
# 确保CSV文件名为'your_test_data.csv',且包含'ai_labels'和'ground_truth'两列
df = pd.read_csv('your_test_data.csv')
# 2. 预处理标签数据:将逗号分隔的字符串转换为标签集合
df['ai_labels_list'] = df['ai_labels'].apply(lambda x: set(str(x).split(',')) if pd.notna(x) else set())
df['ground_truth_list'] = df['ground_truth'].apply(lambda x: set(str(x).split(',')) if pd.notna(x) else set())
# 3. 获取所有唯一标签并进行二进制化
all_labels = sorted(list(set.union(*df['ai_labels_list'], *df['ground_truth_list'])))
mlb = MultiLabelBinarizer(classes=all_labels)
y_true = mlb.fit_transform(df['ground_truth_list'])
y_pred = mlb.transform(df['ai_labels_list'])
# 4. 计算各项评估指标
# 使用'macro'平均来平等对待每个标签,zero_division=0避免因某个标签从未出现而报错
exact_accuracy = accuracy_score(y_true, y_pred) # scikit-learn的accuracy_score在多标签上计算的是严格准确率
precision_macro = precision_score(y_true, y_pred, average='macro', zero_division=0)
recall_macro = recall_score(y_true, y_pred, average='macro', zero_division=0)
f1_macro = f1_score(y_true, y_pred, average='macro', zero_division=0)
f1_micro = f1_score(y_true, y_pred, average='micro', zero_division=0) # 同时计算微平均作为参考
avg_jaccard = jaccard_score(y_true, y_pred, average='samples')
hamming = hamming_loss(y_true, y_pred)
# 5. 输出结果
print("--- 整体性能评估 ---")
print(f'严格准确率 (Exact Match Accuracy): {exact_accuracy:.3f}')
print(f'精确度 (Macro Precision): {precision_macro:.3f}')
print(f'召回率 (Macro Recall): {recall_macro:.3f}')
print(f'F1分数 (Macro F1-Score): {f1_macro:.3f}')
print(f'F1分数 (Micro F1-Score): {f1_micro:.3f}')
print(f'平均Jaccard相似度: {avg_jaccard:.3f}')
print(f'Hamming Loss (值越低越好): {hamming:.3f}\n')
# 6. 输出每个标签的详细性能报告,以便进行深入分析
print("--- 各标签详细性能报告 ---")
report = classification_report(y_true, y_pred, target_names=mlb.classes_, zero_division=0)
print(report)

假设一道数学题的:

  • 黄金标准标签: { "函数", "二次函数", "图像性质" }
  • AI打标结果: { "函数", "图像性质", "解方程" }

那么对于这道题:

  • TP: { "函数", "图像性质" } (AI打对了这两个) => TP = 2
  • FP: { "解方程" } (AI多打了这个不相关的标签) => FP = 1
  • FN: { "二次函数" } (AI漏掉了这个重要标签) => FN = 1

这道题的:

  • Precision = 2 / (2 + 1) = 0.67
  • Recall = 2 / (2 + 1) = 0.67
  • F1-Score = 2 * (0.67 * 0.67) / (0.67 + 0.67) = 0.67

你需要对评测集中所有的题目都进行这样的计算,然后累加总数来获得最终的整体评估指标。

计算出指标后,你不仅得到了一个分数,更重要的是可以深入分析错误。

  1. 高FP (精确率低):说明AI经常会打上一些不相关的标签。

    • 可能原因1: 向量相似度搜索返回的候选标签质量不高,包含了很多噪音。可以尝试调整召回候选标签的数量(比如从top 10减少到top 5)。
    • 可能原因2: 给大模型的Prompt(指令)不够清晰,没有严格限制它“必须从候选列表中选择最匹配的”,导致它自由发挥了。可以优化Prompt,让指令更严格。
  2. 高FN (召回率低):说明AI经常遗漏掉一些应该有的标签。

    • 可能原因1: 题干或标签的向量化模型(Embedding Model)对语义的理解能力不够,导致正确的标签在向量空间中距离较远,未能被召回。可以考虑更换或微调Embedding模型。
    • 可能原因2: 向量搜索召回的候选数量太少,正确的标签还没来得及进入候选列表就被筛掉了。可以尝试增加候选标签的数量(比如从top 5增加到top 10)。

通过这种方式,可以对两阶段系统进行针对性的调整和优化,不断提升打标的整体质量。

  • 精确率 (Precision)、召回率 (Recall)、F1 分数:针对多标签分类,这三个指标可基于二元混淆矩阵计算,对每个标签独立算出 TP、FP、FN。例如,精确率=TP/(TP+FP),召回率=TP/(TP+FN),F1=2·Precision·Recall/(Precision+Recall)blog.csdn.netblog.csdn.net。通常使用微平均(micro-average)或宏平均(macro-average)来综合所有标签的性能:微平均将各标签的 TP、FP、FN 全局累计再计算指标,适用于数据不平衡时反映总体性能;宏平均则对每标签指标取平均,给予每标签同等权重blog.csdn.netblog.csdn.net。在中小学试题标签任务中,如果关注标签总体匹配效果,可关注微平均F1;若希望各标签均等重要,可关注宏平均F1。精确率强调减少错误标签,召回率强调减少漏标,二者权衡时常用F1评分综合评价。

  • 汉明损失 (Hamming Loss):定义为错误预测标签的比例scikit-learn.org.cn。具体地,将预测标签和真值标签都视为二值向量后,汉明损失计算两者异或后的总和除以总标签数(所有样本标签总数)。该值越低越好。与严格的子集准确率不同,汉明损失对部分匹配较为宽容,只惩罚每个标签的错误scikit-learn.org.cn。例如,值为0.13表示平均13%的标签被错标。在标签数量多、允许部分正确的场景(如一道题目允许漏标或多标),汉明损失是常用指标atyun.com

  • Jaccard 相似度 (交并比):又称交集/并集系数,定义为预测标签集与真值标签集交集大小除以并集大小scikit-learn.org.cn。Jaccard 值越高表明两集合重合度越大。它是一种直接度量多标签集合相似度的指标,适合关心预测标签整体覆盖情况的场景。Sklearn 提供 jaccard_score 函数进行计算,可指定 average='samples'(样本级平均)或其他平均方式scikit-learn.org.cn

  • 子集准确率 (Subset Accuracy):要求预测的整个标签集合必须与真值完全一致时才算对,否则算错。其计算方式为完全匹配的样本数除以总样本数blog.csdn.net。这是最严格的指标,当标签数较多时分数通常偏低,但可以反映模型对“全对”情况的能力。对于中小学试题,如果希望题目所有标签完全匹配才视为成功,可参考此指标;但通常可以作为补充指标而非唯一指标。