CCF LMCC · CCF LMCC 青少年组第一轮认证 例题 第 21 题

阅读程序 · 答案 BA

← 整套速查表 CCF LMCC 全部真题

题目

一、检索增强生成

这是一个基于检索增强生成 (Retrieval-Augmented Generation, RAG) 的问答系统实现。该系统包含两个主要组件:

1. 检索器 (Retriever):使用嵌入模型将文档转换为向量,根据查询语义检索最相关的文档 2. 生成器 (Generator):基于检索到的相关文档和原始问题,生成准确的答案

请根据代码逻辑和注释提示,补全代码中的空位。

import torch
import torch.nn.functional as F
from transformers import AutoTokenizer, AutoModel, AutoModelForCausalLM

class Retriever:
    def __init__(self, embedder, tokenizer, corpus):
        self.embedder = embedder
        self.tokenizer = tokenizer
        self.corpus = corpus
        self.embeddings = self.build_index(corpus)

    def _text_to_vector(self, text_batch):
        enc = [21]
        enc = {k: v.to(self.embedder.device) for k, v in enc.items()}

        with torch.no_grad():
            outputs = [22]
            last_hidden_state = outputs.last_hidden_state
            attention_mask = enc["attention_mask"]
            sent_vecs = [23]

        return sent_vecs

(本题为阅读程序 / 完善程序,完整题目与测试数据见平台)
答案:BA

解题思维

这题考的是 RAG 流程里那几个关键步骤的代码实现,核心就是搞清 tokenizer 怎么用、嵌入模型怎么前向、句向量怎么池化、检索器怎么调、生成结果怎么切。拿到空位先看上下文变量,再对照类定义和 torch 的用法,排除明显语法或逻辑错误的选项,剩下的那个就是正解。

常见错误

最容易栽跟头的地方是混淆 tokenizer 和 embedder 的调用方式,比如把 embedder 当 tokenizer 用,或者在 embedder 里少写关键字传参导致报错;池化时把 attention_mask 的维度搞错,导致除零或形状不对;检索时把方法名或参数顺序写错,比如用 build_index 去搜而不是 search;还有切输出时把输入长度搞错,导致把提示词也切进去了。这些坑都源于对 API 签名和 tensor 形状不熟,做题时多盯着函数定义和变量来源就能避开。

详细解析(节选)

这道题考查的是检索增强生成(RAG)系统里几个核心组件的代码实现细节,涉及 tokenizer 调用、嵌入模型前向、池化、检索和生成输出截取。命题人喜欢在这些基础但容易混淆的 API 调用上挖坑,比如把 embedder 和 tokenizer 的用法混用、pooling 公式记错、检索方法名写错、或者切输出时把输入长度搞错。

小题 0:文本转向量第一步

这里要把一批文本转成嵌入模型能吃的 dict,而且要把 padding 去掉,所以必须用 tokenizer 的 __call__ 接口,并且带上 return_tensors="pt"、truncation、max_length 这些参数。选项 A 和 D 用的是 embedder,显然不对;C 用的是 encode 方法,但 encode 返回的是 list 或 dict,不会自动加 input_ids 等键,而且题目里已经给了 enc 变量,说明前面已经调过 tokenizer 了,这里应该直接复用 tokenizer 的 __call__。所以选 B。

在 OI伴学 里做这道题
登录后可计时作答、查看完整六段式解析,并按你的错题自动生成同类练习。
去刷题先做一次 AI 学情诊断