PaddleNLP 文本信息抽取应用实战:基于 UIE 微调的数据标注、模型训练与封闭域蒸馏全流程指南
人工智能大模型预训练微调LoRARLHF强化学习分布式训练【免费下载链接】PaddleNLPEasy-to-use and powerful LLM and SLM library with awesome model zoo.项目地址https://gitcode.com/gh_mirrors/pa/PaddleNLP点击查看免费下载本文以 PaddleNLP 信息抽取应用中的文本信息抽取方案位于slm/applications/information_extraction/text/为核心系统讲解如何基于 UIEUniversal Information Extraction统一建模思想打通数据标注 → 模型微调 → 模型评估 → 定制预测 → 封闭域蒸馏 → 服务化部署的完整产业级落地链路。读完本文你将掌握从 Label Studio 标注数据转换、Trainer API 一键微调、SpanEvaluator 端到端评估到 UIE Slim 数据蒸馏压缩模型、SimpleServing 上线服务的全套实操方法与底层实现原理。1. 文本信息抽取应用概览用 UIE 统一建模化解落地难点信息抽取Information Extraction通俗地说就是从给定的文本/图片等输入数据中抽取出结构化信息的过程。在落地过程中信息抽取通常面临领域多变、任务多样、数据稀缺等挑战不同行业医疗、法律、金融、公安、旅游的抽取目标千差万别实体、关系、事件、观点等任务形态各异而标注数据往往严重不足。针对这些难点PaddleNLP 基于 UIE 统一建模思想提供了文档信息抽取产业级应用方案支持文档/图片/表格和纯文本场景下实体、关系、事件、观点等不同任务的信息抽取。该应用不限定行业领域和抽取目标开发者只需通过自然语言schema prompt声明抽取目标即可实现从产品原型研发、业务 POC 阶段到业务落地、迭代阶段的无缝衔接。本目录slm/applications/information_extraction/text/正是其中面向纯文本场景的端到端应用示例。文本信息抽取应用亮点覆盖场景全面覆盖文本信息抽取各类主流任务支持多语言通过uie-m-base/uie-m-large等跨语言模型实现满足多样化落地需求。效果领先以在纯文本上具有突出效果的 UIE 系列模型作为训练基座提供uie-base、uie-medium、uie-mini、uie-micro、uie-nano等多种尺寸的预训练模型兼顾精度与速度。简单易用通过paddlenlp.Taskflow三行代码即可在无标注数据的情况下完成零样本zero-shot快速调用一行命令即可开启信息抽取训练并完成模型导出。高效调优无需机器学习背景知识即可上手数据标注与模型训练流程。从源码结构看文本信息抽取的核心能力依赖 PaddleNLP 内置的 UIE 模型族单语 UIE 实现位于 paddlenlp/transformers/ernie/modeling.py 中的UIE类跨语言 UIE-M 实现位于 paddlenlp/transformers/ernie_m/modeling.py 中的UIEM类微调脚本 finetune.py 会依据模型名称自动加载对应实现。2. 快速开始对于简单的抽取目标可以直接使用paddlenlp.Taskflow实现零样本zero-shot抽取对于细分场景推荐使用定制功能标注少量数据后进行模型微调进一步提升效果。下面按照代码结构 → 数据标注 → 模型微调 → 模型评估 → 定制预测 → 实验指标 → 封闭域蒸馏的顺序展开。2.1 代码结构. ├── utils.py # 数据处理工具 ├── finetune.py # 模型微调、压缩脚本 ├── evaluate.py # 模型评估脚本 └── README.md各文件职责如下文件职责utils.py数据处理工具提供reader数据集读取与超长文本自动切分、convert_example样本编码为模型输入、map_offset字符偏移映射到 token 偏移、create_data_loader构建 DataLoader等函数finetune.py基于 PaddleNLP Trainer API 的模型微调与压缩脚本同时承担静态图导出do_export职责evaluate.py模型评估脚本基于SpanEvaluator计算 Precision / Recall / F1data_distill/UIE Slim 封闭域数据蒸馏子目录包含教师模型数据合成、学生模型训练与评估脚本deploy/simple_serving/基于 PaddleNLP SimpleServing 的服务化部署示例server / client2.2 数据标注Label Studio 标注与数据转换项目推荐使用 Label Studio 脚本轻松转换为模型训练所需格式。标注方法含实体抽取、关系抽取、事件抽取、文本分类、实体/评价维度分类等任务的标签构建规则、prompt 设计原则与 schema 写法详见 Label Studio 数据标注指南。这里以预标注好的军事关系抽取数据集为例演示完整流程。首先下载数据集wget https://bj.bcebos.com/paddlenlp/datasets/military.tar.gz tar -xvf military.tar.gz mv military data rm military.tar.gz然后运行数据转化脚本生成训练/验证/测试集文件python ../label_studio.py \ --label_studio_file ./data/label_studio.json \ --save_dir ./data \ --splits 0.76 0.24 0 \ --negative_ratio 3 \ --task_type ext从源码看label_studio.py 的转换逻辑非常清晰先校验splits三项之和必须为 1、确认标注文件存在随后按is_shuffle决定是否随机打散数据并依据splits比例切分出train_ids / dev_ids / test_ids将划分索引写入sample_index.json这一步同时供后续数据蒸馏阶段复用划分接着根据样本中是否含image字段自动判定anno_type为image或text最终通过DataConverter分别调用convert_ext_examples抽取式任务或convert_cls_examples分类任务把标注数据转为 UIE 训练所需的content / prompt / result_list格式逐行写入train.txt、dev.txt、test.txt。转换脚本主要参数说明label_studio_file从 Label Studio 导出的数据标注文件JSON。save_dir训练数据保存目录默认./data。splits训练集、验证集、测试集划分比例默认[0.8, 0.1, 0.1]三项之和必须等于 1。negative_ratio最大负例比例仅对抽取类任务有效负例数量 negative_ratio× 正例数量适当构造负例可提升模型效果默认 5示例中设为 3。为保证评估指标准确验证集与测试集默认构造全负例。task_type任务类型可选ext抽取与cls分类默认ext。options分类任务的类别标签仅对分类任务有效默认[正向, 负向]。prompt_prefix分类任务的 prompt 前缀仅对分类任务有效默认情感倾向。is_shuffle是否随机打散标注数据默认True。seed随机种子默认 1000。schema_langschema 语言可选ch/en影响训练数据 prompt 的构造方式默认ch。separator实体类别/评价维度与分类标签的分隔符仅对实体/评价维度分类任务有效默认##。layout_analysis是否启用版面分析优化 OCR 结果顺序默认关闭。ocr_langOCR 语言可选ch/en默认ch。需要注意默认情况下脚本会按比例将数据划分为 train/dev/test 三份每次执行脚本都会覆盖已有的同名数据文件Label Studio 导出文件中的每条数据默认视为人工正确标注。2.3 模型微调Trainer API 一键微调推荐使用 Trainer API 对模型进行微调。只需输入模型、数据集等配置即可高效完成预训练、微调、模型压缩等任务并一键启用多卡训练、混合精度训练、梯度累积、断点重启、日志显示等功能Trainer API 还对优化器、学习率调度等通用训练配置做了封装。使用uie-base作为预训练模型进行微调微调后的模型保存至$finetuned_model。单卡启动python finetune.py \ --device gpu \ --logging_steps 10 \ --save_steps 100 \ --eval_steps 100 \ --seed 1000 \ --model_name_or_path uie-base \ --output_dir ./checkpoint/model_best \ --train_path data/train.txt \ --dev_path data/dev.txt \ --max_seq_len 512 \ --per_device_train_batch_size 16 \ --per_device_eval_batch_size 16 \ --num_train_epochs 20 \ --learning_rate 1e-5 \ --do_train \ --do_eval \ --do_export \ --export_model_dir ./checkpoint/model_best \ --overwrite_output_dir \ --disable_tqdm True \ --metric_for_best_model eval_f1 \ --load_best_model_at_end True \ --save_total_limit 1GPU 多卡启动通过paddle.distributed.launch指定gpus参数python -u -m paddle.distributed.launch --gpus 0,1 finetune.py \ --device gpu \ --logging_steps 10 \ --save_steps 100 \ --eval_steps 100 \ --seed 1000 \ --model_name_or_path uie-base \ --output_dir ./checkpoint/model_best \ --train_path data/train.txt \ --dev_path data/dev.txt \ --max_seq_len 512 \ --per_device_train_batch_size 8 \ --per_device_eval_batch_size 8 \ --num_train_epochs 20 \ --learning_rate 1e-5 \ --do_train \ --do_eval \ --do_export \ --export_model_dir ./checkpoint/model_best \ --overwrite_output_dir \ --disable_tqdm True \ --metric_for_best_model eval_f1 \ --load_best_model_at_end True \ --save_total_limit 1由于设置了--do_eval训练结束后会自动进行评估。可配置参数说明device训练设备可选cpu、gpu、npu默认 GPU 训练。logging_steps训练过程中日志打印的间隔 steps 数默认 10。save_steps训练过程中保存模型 checkpoint 的间隔 steps 数默认 100。eval_steps训练过程中进行评估的间隔 steps 数默认 100。seed全局随机种子默认 42示例中设为 1000。model_name_or_path微调使用的预训练模型。从 finetune.py 的ModelArguments可见代码默认值为uie-base可选uie-base、uie-tiny、uie-medium、uie-mini、uie-micro、uie-nano、uie-base-en、uie-m-base、uie-m-large或微调后的模型路径README 中同时提到可按需使用uie-x-base。output_dir必填模型训练或压缩后保存的模型目录默认None。train_path训练集路径默认None。dev_path开发集路径默认None。max_seq_len文本最大切分长度输入超过该长度时会对输入文本自动切分默认 512。per_device_train_batch_size每个 GPU 核心/CPU 的训练 batch 大小默认 8。per_device_eval_batch_size每个 GPU 核心/CPU 的评估 batch 大小默认 8。num_train_epochs训练轮次使用早停法时可选 100默认 10。learning_rate训练最大学习率UIE-X 推荐 1e-5默认 3e-5。label_names训练数据标签 label 的名称UIE-X 设置为start_positions、end_positions默认None。源码中通过training_args.label_names [start_positions, end_positions]固定设置。do_train是否进行微调训练设置该参数表示进行微调训练默认不设置。do_eval是否进行评估设置该参数表示进行评估默认不设置。do_export是否进行静态图导出设置该参数表示导出默认不设置。export_model_dir静态图导出地址默认None源码中若为None会落到output_dir/export。overwrite_output_dir若为True覆盖输出目录内容若output_dir指向检查点目录则继续训练。disable_tqdm是否使用 tqdm 进度条。metric_for_best_model最优模型指标UIE-X 推荐eval_f1默认None。load_best_model_at_end训练结束后是否加载最优模型通常与metric_for_best_model配合默认False。save_total_limit限制 checkpoint 总数删除旧 checkpoint默认None。源码级原理拆解见 finetune.py脚本使用PdArgumentParser解析ModelArguments、DataArguments、CompressionArguments三组参数model_name_or_path为uie-m-base/uie-m-large时自动把multilingual置为True若加载的是本地微调模型则通过读取其model_config.json中的init_class判断是否为UIEM并据此选择UIEM.from_pretrained或UIE.from_pretrained。数据集通过load_dataset(reader, ...)读取 utils.py 中定义的reader再经convert_example完成编码。reader内置了超长文本自动切分逻辑模型输入格式为[CLS] Prompt [SEP] Content [SEP]含 3 个特殊 token若max_seq_len len(prompt) 3会直接报错提示调大max_seq_len正文超过max_content_len时会按标注实体的边界逐段切分并同步修正各result_list中实体的start/end偏移保证切分后样本的标注仍然有效。convert_example将prompt与content拼成text/text_pair输入 tokenizer构造start_ids/end_ids作为 span 起止位置的标签对应 UIE 的序列标注范式对多语言模型仅保留input_ids、position_ids两个输入。训练使用Trainer(model..., criterionuie_loss_func, compute_metricscompute_metrics)其中uie_loss_func与compute_metrics来自 paddlenlp/utils/ie_utils.py优化器显式指定为paddle.optimizer.AdamW。do_export分支通过export_model将动态图模型按InputSpec导出为静态图推理模型单语模型输入为input_ids / token_type_ids / position_ids / attention_mask多语言模型输入为input_ids / position_idsNPU 环境下输入 dtype 自动切换为int32。do_compress分支调用trainer.compress(custom_evaluatecustom_evaluate)完成模型压缩压缩评估基于SpanEvaluator计算 F1。2.4 模型评估通过 evaluate.py 对微调后的模型进行评估python evaluate.py \ --model_path ./checkpoint/model_best \ --test_path ./data/dev.txt \ --device gpu \ --batch_size 16 \ --max_seq_len 512对多语言 UIE-M 模型进行评估增加--multilingual参数python evaluate.py \ --model_path ./checkpoint/model_best \ --test_path ./data/dev.txt \ --batch_size 16 \ --device gpu \ --max_seq_len 512 \ --multilingual评估方式说明采用单阶段评价方式即关系抽取、事件抽取等需要分阶段预测的任务对每一阶段的预测结果分别评价验证/测试集默认会利用同一层级的所有标签构造出全部负例。可开启debug模式对每个正例类别分别评估该模式仅用于模型调试python evaluate.py \ --model_path ./checkpoint/model_best \ --test_path ./data/dev.txt \ --debug输出打印示例[2022-11-21 12:48:41,794] [ INFO] - ----------------------------- [2022-11-21 12:48:41,795] [ INFO] - Class Name: 武器名称 [2022-11-21 12:48:41,795] [ INFO] - Evaluation Precision: 0.96667 | Recall: 0.96667 | F1: 0.96667 [2022-11-21 12:48:44,093] [ INFO] - ----------------------------- [2022-11-21 12:48:44,094] [ INFO] - Class Name: X的产国 [2022-11-21 12:48:44,094] [ INFO] - Evaluation Precision: 1.00000 | Recall: 0.99275 | F1: 0.99636 [2022-11-21 12:48:46,474] [ INFO] - ----------------------------- [2022-11-21 12:48:46,475] [ INFO] - Class Name: X的研发单位 [2022-11-21 12:48:46,475] [ INFO] - Evaluation Precision: 0.77519 | Recall: 0.64935 | F1: 0.70671 [2022-11-21 12:48:48,800] [ INFO] - ----------------------------- [2022-11-21 12:48:48,801] [ INFO] - Class Name: X的类型 [2022-11-21 12:48:48,801] [ INFO] - Evaluation Precision: 1.00000 | Recall: 1.00000 | F1: 1.00000评估脚本可配置参数device评估设备可选cpu、gpu、npu默认 GPU。model_path模型文件夹路径需包含权重文件model_state.pdparams与配置文件model_config.json。test_path测试集文件。batch_size批处理大小请结合机器情况调整默认 16。max_seq_len文本最大切分长度超长自动切分默认 512。debug是否开启 debug 模式对每个正例类别分别评估默认关闭。multilingual是否为跨语言模型默认关闭。schema_langschema 语言可选ch和en默认ch英文数据集选en。从 evaluate.py 源码可见评估核心是paddle.no_grad()装饰的evaluate函数模型前向输出start_prob / end_prob与标签计算SpanEvaluator的num_correct / num_infer / num_label最终accumulate()汇总出 Precision / Recall / F1。debug 模式下脚本通过unify_prompt_name归一化 prompt 名称并按类别分组用get_relation_type_dict按关系类型聚合然后逐类评估——这也解释了输出中X的产国这类关系类别名的由来中文 schema 下统一展示为X的{关系}。2.5 定制模型一键预测微调完成后可通过paddlenlp.Taskflow装载定制模型用task_path指定模型权重文件路径需包含训练好的model_state.pdparams。以下示例抽取武器名称实体及其产国、类型、研发单位关系 from pprint import pprint from paddlenlp import Taskflow schema {武器名称: [产国, 类型, 研发单位]} # 设定抽取目标和定制化模型权重路径 my_ie Taskflow(information_extraction, schemaschema, task_path./checkpoint/model_best) pprint(my_ie(威尔哥Virgo减速炸弹是由瑞典FFV军械公司专门为瑞典皇家空军的攻击机实施低空高速轰炸而研制1956年开始研制1963年进入服役装备于A32“矛盾”、A35“龙”、和AJ134“雷”攻击机主要用于攻击登陆艇、停放的飞机、高炮、野战火炮、轻型防护装甲车辆以及有生力量。)) [{武器名称: [{end: 14, probability: 0.9998632702221926, relations: {产国: [{end: 18, probability: 0.9998815094394331, start: 16, text: 瑞典}], 研发单位: [{end: 25, probability: 0.9995875123178521, start: 18, text: FFV军械公司}], 类型: [{end: 14, probability: 0.999877336059086, start: 12, text: 炸弹}]}, start: 0, text: 威尔哥Virgo减速炸弹}]}]Taskflow 的信息抽取能力在 Taskflow 文本抽取指南 中有完整介绍包括实体抽取、关系抽取、事件抽取、评论观点抽取、情感分类与跨任务抽取等场景的 schema 构造与调用示例以及schema_lang、batch_size、model、position_prob、precision等更多配置如precisionfp16需要 CUDA 11.2、cuDNN 8.1.1 且 GPU 计算能力大于 7.0。2.6 实验指标军事关系抽取数据集上的微调实验指标如下随数据量增加F1 显著提升PrecisionRecallF1 Score0-shot0.646340.535350.585645-shot0.894740.850000.8717910-shot0.927930.858330.89177full-set0.931030.900000.91525从 0-shot 的 F1 0.58564 到 full-set 的 0.91525可以看出零样本即可获得可用的抽取效果而仅标注少量样本5-shot / 10-shot进行微调后F1 可快速提升约 30 个百分点——这正是零样本起步 少量标注调优落地路径的数据支撑。2.7 封闭域蒸馏UIE Slim 数据蒸馏系统在部分工业应用场景中对性能要求较高模型若不能有效压缩则无法实际应用。为此PaddleNLP 基于数据蒸馏技术构建了UIE Slim 数据蒸馏系统。其原理是以数据为桥梁将 UIE 模型的知识迁移到封闭域信息抽取小模型从而在精度损失较小的情况下实现大幅度的预测速度提升。详细介绍见 UIE Slim 数据蒸馏。UIE 数据蒸馏三步Step 1使用 UIE 模型对标注数据进行 finetune得到 Teacher Model即上文微调产出的../checkpoint/model_best。Step 2用户提供大规模无标注数据需与标注数据同源使用 Taskflow UIE 对无监督数据进行预测合成带标签数据。Step 3使用标注数据以及步骤 2 得到的合成数据训练出封闭域 Student Model默认底座为ernie-3.0-mini-zh等轻量模型。离线蒸馏通过训练好的 UIE 定制模型预测无监督数据的标签python data_distill.py \ --data_path ../data \ --save_dir student_data \ --task_type relation_extraction \ --synthetic_ratio 10 \ --model_path ../checkpoint/model_best注意schema 需要根据标注数据在data_distill.py中进行配置且 schema 需包含标注数据中的所有标签类型。data_distill.py主要参数data_path标注数据doccano_ext.json/label_studio.json及无监督文本unlabeled_data.txt路径。model_path训练好的 UIE 定制模型路径。save_dir学生模型训练数据保存路径。synthetic_ratio控制合成数据比例最大合成数据数量 synthetic_ratio× 标注数据数量。platform标注平台可选doccano、label_studio默认label_studio。task_type任务类型可选entity_extraction、relation_extraction、event_extraction、opinion_extraction。封闭域抽取的后处理逻辑因任务而异必须显式指定。seed随机种子默认 1000。老师模型评估UIE 微调阶段的评估非端到端可通过以下脚本做端到端评估python evaluate_teacher.py \ --task_type relation_extraction \ --test_path ./student_data/dev_data.json \ --label_maps_path ./student_data/label_maps.json \ --model_path ../checkpoint/model_best学生模型训练python train.py \ --task_type relation_extraction \ --train_path student_data/train_data.json \ --dev_path student_data/dev_data.json \ --label_maps_path student_data/label_maps.json \ --num_epochs 50 \ --encoder ernie-3.0-mini-zhtrain.py主要参数包括train_path训练集、dev_path验证集、batch_size默认 16、learning_rate默认 3e-5、save_dir默认./checkpoint、max_seq_len默认 256、weight_decayAdamW 权重衰减、warmup_proportionwarmup 比例如 0.1 表示前 10% step 从 0 升至learning_rate、num_epochs默认 100、seed默认 1000、encoder学生模型底座默认ernie-3.0-mini-zh、logging_steps默认 10、eval_steps默认 200、devicecpu / gpu、init_from_ckpt可选热启动训练。学生模型评估python evaluate.py \ --model_path ./checkpoint/model_best \ --test_path student_data/dev_data.json \ --task_type relation_extraction \ --label_maps_path student_data/label_maps.json \ --encoder ernie-3.0-mini-zh通过 Taskflow 部署学生模型封闭域信息抽取的 schema 已固定task_path指向学生模型路径即可一键部署 from pprint import pprint from paddlenlp import Taskflow my_ie Taskflow(information_extraction, modeluie-data-distill-gp, task_pathcheckpoint/model_best/) # Schema is fixed in closed-domain information extraction pprint(my_ie(威尔哥Virgo减速炸弹是由瑞典FFV军械公司专门为瑞典皇家空军的攻击机实施低空高速轰炸而研制1956年开始研制1963年进入服役装备于A32“矛盾”、A35“龙”、和AJ134“雷”攻击机主要用于攻击登陆艇、停放的飞机、高炮、野战火炮、轻型防护装甲车辆以及有生力量。)) [{武器名称: [{end: 14, probability: 0.9976037, relations: {产国: [{end: 18, probability: 0.9988706, relations: {}, start: 16, text: 瑞典}], 研发单位: [{end: 25, probability: 0.9978277, relations: {}, start: 18, text: FFV军械公司}], 类型: [{end: 14, probability: 0.99837446, relations: {}, start: 12, text: 炸弹}]}, start: 0, text: 威尔哥Virgo减速炸弹}]}]延伸服务化部署。微调或蒸馏产出模型后可参考 SimpleServing 服务化部署示例 将模型上线为 HTTP 服务服务端启动命令为paddlenlp server server:app --workers 1 --host 0.0.0.0 --port 8189客户端通过python client.py发起请求服务端支持自定义 schema、通过task_path指定模型路径并支持注册多个 Taskflow task如device_id0与device_id1实现多卡负载均衡预测。总结本文完整呈现了 PaddleNLP 文本信息抽取应用的产业级落地路径零样本起步paddlenlp.Taskflow三行代码开箱即用→数据标注与转换Label Studio label_studio.pynegative_ratio自动构造负例、splits自动划分数据集→Trainer API 微调finetune.py支持单卡/多卡、断点续训、混合精度与静态图导出→端到端评估evaluate.py 的SpanEvaluator单阶段评价与 debug 分类评估→定制模型一键预测task_path装载→UIE Slim 封闭域蒸馏data_distill/ 三步走用轻量学生模型换取高吞吐→SimpleServing 服务化上线。整套方案不限定行业领域与抽取目标配合 Taskflow 文本抽取指南 中的多任务 schema 设计与 Label Studio 标注指南 的标注规范开发者可以快速构建属于自己的领域信息抽取产品。赞分享人工智能大模型预训练微调LoRARLHF强化学习分布式训练【免费下载链接】PaddleNLPEasy-to-use and powerful LLM and SLM library with awesome model zoo.项目地址https://gitcode.com/gh_mirrors/pa/PaddleNLP点击查看免费下载相关推荐AList终极指南5分钟打造你的统一云盘管理中心AList终极指南5分钟打造你的统一云盘管理中心 你是否曾为管理多个云存储服务而烦恼阿里云盘、百度网盘、Google Drive、OneDrive...每个人工智能大模型预训练微调LoRARLHF强化学习分布式训练模型推理服务推理引擎模型量化模型压缩本地部署NLP免费畅玩Switch游戏yuzu模拟器完整使用指南免费畅玩Switch游戏yuzu模拟器完整使用指南 你是否梦想在电脑上体验任天堂Switch的精彩游戏世界现在通过yuzu模拟器这个梦想可以轻松实现作人工智能大模型预训练微调LoRARLHF强化学习分布式训练模型推理服务推理引擎模型量化模型压缩本地部署NLPPaddleNLP 文档信息抽取实战指南基于 UIE-X 的标注、微调、评估与推理全流程PaddleNLP 文档信息抽取实战指南基于 UIE X 的标注、微调、评估与推理全流程 本文围绕 PaddleNLP 开源仓库 slm/applicatio人工智能大模型预训练微调LoRARLHF强化学习分布式训练模型推理服务推理引擎模型量化模型压缩本地部署NLP上一篇Feynman 代码组织评审用源码证据盘点Source Inventory定位 AI 研究 Agent 的架构债务与拆分路径下一篇探索PyMARL2多智能体强化学习的新里程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考