Bootstrap

1.7 Kaggle大白话:Eedi竞赛Transformer框架解决方案07-调用AI模型输出结果

0. 本栏目竞赛汇总表

Kaggle竞赛汇总

1. 本文主旨

2. 调用AI模型输出结果架构

相似度匹配
特征提取
数据处理
模型准备
排序获取TopK
计算相似度矩阵
获取误解概念ID
输出预测结果
tokenize处理
批量处理文本
模型编码
获取embeddings
读取误解概念库
读取测试数据
文本预处理
构建query和doc
初始化tokenizer
加载配置
加载训练好的模型
模型设置为评估模式

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框架解决方案结束,章节回顾:

7.2 竞赛排名

在这里插入图片描述

7.3 其他优秀项目(皆为竞赛金牌)

;