一、检索增强生成
这是一个基于检索增强生成 (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
(本题为阅读程序 / 完善程序,完整题目与测试数据见平台)这题考的是 RAG 流程里那几个关键步骤的代码实现,核心就是搞清 tokenizer 怎么用、嵌入模型怎么前向、句向量怎么池化、检索器怎么调、生成结果怎么切。拿到空位先看上下文变量,再对照类定义和 torch 的用法,排除明显语法或逻辑错误的选项,剩下的那个就是正解。
最容易栽跟头的地方是混淆 tokenizer 和 embedder 的调用方式,比如把 embedder 当 tokenizer 用,或者在 embedder 里少写关键字传参导致报错;池化时把 attention_mask 的维度搞错,导致除零或形状不对;检索时把方法名或参数顺序写错,比如用 build_index 去搜而不是 search;还有切输出时把输入长度搞错,导致把提示词也切进去了。这些坑都源于对 API 签名和 tensor 形状不熟,做题时多盯着函数定义和变量来源就能避开。
这里要把一批文本转成嵌入模型能吃的 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。