目录
0. 本栏目竞赛汇总表
1. 本文主旨
- 大白话:上一篇文章中,已经实现了Transformer模型的训练与评估。本文主旨是对已经有模型进行调用,并输出结果。
- 通过本文可收获技能:AI模型调用、数据处理。
- 上文回顾:Eedi竞赛Transformer框架解决方案06-Transformer模型训练及评估
2. 调用AI模型输出结果架构
3. 模型准备
3.1 代码实现
# 1. 加载配置
config = Config()
model_config = AutoConfig.from_pretrained(config.checkpoint)
# 2. 初始化tokenizer
tokenizer = AutoTokenizer.from_pretrained(
config.checkpoint,
trust_remote_code=True,
padding_side="right",
use_fast=False,
)
tokenizer.pad_token = tokenizer.eos_token
# 3. 加载训练好的模型
model = CustomSimCSEModel(config.checkpoint, config=model_config,
quantization_config=bnb_config, temperature=config.temperature)
# 4. 模型设置为评估模式
model.config.use_cache = False
model = prepare_model_for_kbit_training(model)
3.2 大白话模型准备
这段代码就像是在准备一个"智能阅卷老师":
- 加载配置:
就像准备一份"工作说明书",告诉模型要用什么设置,比如文本最大长度、温度系数等 - 初始化tokenizer:
像是准备一个"翻译器",能把文字转换成模型能理解的数字,设置一些特殊的标记和规则 - 加载训练好的模型:
就像请来一个"经验丰富的老师",这个老师已经学会了如何判断学生的误解,使用4bit量化让它工作更高效 - 设置评估模式:
告诉"老师"现在是在判卷,不需要继续学习新知识,专注于给出准确的判断
4. 数据处理
4.1 代码实现
# 1. 读取测试数据和误解概念库
misconception_mapping = pd.read_csv(DATA_PATH_MAP) # 误解概念库
df = pd.read_csv(DATA_PATH_TRAIN) # 测试数据
# 2. 文本预处理和构建query/doc
# 添加查询字段
misconception_mapping['query'] = misconception_mapping['MisconceptionName'] # 误解概念名作为query
misconception_mapping['order_index'] = misconception_mapping['MisconceptionId'] # 添加索引
4.2 大白话数据处理
这段代码就像是在准备考试材料:
-
读取数据:
- 读取误解概念库:
像是拿出一本"错误类型参考手册",里面记录了各种常见的误解类型,每种误解都有编号和详细说明 - 读取测试数据:
像是收集学生的答卷,包含题目、正确答案和错误答案,需要分析的实际案例
- 读取误解概念库:
-
文本整理:
- 添加查询字段:
把误解概念名称作为检索用的关键词,给每个误解概念编上序号,方便后续快速查找和匹配
- 添加查询字段:
5. 特征提取
5.1 代码实现
def inference(df, model, tokenizer, max_length, device):
"""执行模型推理获取embeddings"""
batch_size = 8
sentences = list(df['query'].values) # 获取所有文本
pids = list(df['order_index'].values) # 获取ID
# 1. 批量处理文本
length_sorted_idx = np.argsort([-len(sen) for sen in sentences]) # 按长度排序
sentences_sorted = [sentences[idx] for idx in length_sorted_idx] # 重排文本
# 2. tokenize处理和模型编码
for start_index in range(0, len(sentences), batch_size):
sentences_batch = sentences_sorted[start_index: start_index + batch_size]
# tokenize处理
features = tokenizer(sentences_batch, max_length=max_length,
padding=True, truncation=True,
return_tensors="pt")
features = batch_to_device(features, device)
# 3. 获取embeddings
with torch.no_grad():
embeddings = model.encode(features) # 模型编码
embeddings = embeddings.detach().cpu().numpy().tolist()
all_embeddings.extend(embeddings)
5.2 大白话特征提取
这段代码就像是一个"文本理解处理流水线":
1. 批量处理文本:
像是把试卷分成小批次,先按长短排序,方便处理,每次处理8份,提高效率
2. tokenize处理:
像是把文字拆分成小单元,统一长度(太长的截断,太短的补齐),转换成模型能理解的格式
3. 模型编码:
像是"阅读理解"过程,模型仔细阅读每段文本,把文字的含义转换成数字向量,这些向量包含了文本的深层语义
4. 保存特征:
把所有处理结果收集起来,恢复原来的顺序,准备进行后续的相似度计算
6. 相似度匹配
6.1 代码实现
# 1. 计算相似度矩阵
sentence_embeddings = np.concatenate([e.reshape(1, -1) for e in list(doc_embeddings.values())])
index_text_embeddings_index = {index: paper_id for index, paper_id in
enumerate(list(doc_embeddings.keys()))}
predicts_test = []
for _, row in df.iterrows():
# 获取query向量
query_id = row['order_index']
query_em = query_embeddings[query_id].reshape(1, -1)
# 2. 计算相似度并排序
cosine_similarity = np.dot(query_em, sentence_embeddings.T).flatten()
sort_index = np.argsort(-cosine_similarity)[:max(top_ks)]
# 3. 获取误解概念ID
pids = [index_text_embeddings_index[index] for index in sort_index]
predicts_test.append(pids)
# 4. 计算评估指标
metric_dict = {}
for i in top_ks:
recall_score = mrecall([[data] for data in df['answer_id'].values], predicts_test, i)
map_score = mapk([[data] for data in df['answer_id'].values], predicts_test, i)
metric_dict[f"recall_at_{i}"] = recall_score
metric_dict[f"map_at_{i}"] = map_score
6.2 大白话相似度匹配
这段代码就像是一个"智能匹配系统":
- 计算相似度矩阵:
像是把每道题的错误答案,跟所有已知的误解概念进行比对,计算它们之间的相似程度 - 排序获取TopK:
对相似度进行排序,选出最相似的前25个误解概念,就像找出最可能的错误原因 - 获取误解概念ID:
把排序结果转换成具体的误解概念ID,就像给出具体的诊断结果 - 输出预测结果:
计算预测的准确率(MAP@25),计算预测的召回率(Recall@25),就像评估诊断的准确性 - 整个过程就像一个老师在:
看到学生的错误答案快速匹配可能的误解原因,找出最相关的几种可能性,最后检查判断的准确度
7. 系列总结
7.1 章节回顾
至此Eedi竞赛Transformer框架解决方案结束,章节回顾:
- 项目博客01:Eedi竞赛Transformer框架解决方案01-竞赛信息解读与数据理解
- 项目博客02:Eedi竞赛Transformer框架解决方案02-GPT_4o生成训练集缺失数据
- 项目博客03:Eedi竞赛Transformer框架解决方案03-定义Transformer数据输入层
- 项目博客04:Eedi竞赛Transformer框架解决方案04-定义Transformer模型
- 项目博客05:Eedi竞赛Transformer框架解决方案05-实例化Transformer及参数解释
- 项目博客06:Eedi竞赛Transformer框架解决方案06-Transformer模型训练及评估
- 项目博客07:Eedi竞赛Transformer框架解决方案07-调用AI模型输出结果