AGI 与未来 AI
两阶段检索和重排序技术在检索增强生成中的力量
以下代码片段演示了如何配置和使用jina-colbert-v1-en模型来索引文档集合,利用其高效处理长上下文的能力。
实现两阶段检索和重排序
现在我们已经了解了两阶段检索和重排序的原理,让我们探索其在RAG系统中的实际实现。我们将利用流行的库和框架来演示这些技术的集成。
设置环境
在我们深入代码之前,让我们设置我们的开发环境。我们将使用Python和几个流行的NLP库,包括Hugging Face Transformers、Sentence Transformers和LanceDB。
# 安装所需库 !pip install datasets huggingface_hub sentence_transformers lancedb
数据准备
为了演示目的,我们将使用Hugging Face Datasets中的“ai-arxiv-chunked”数据集,该数据集包含超过400篇关于机器学习、自然语言处理和大型语言模型的ArXiv论文。
from datasets import load_dataset <p>dataset = load_dataset("jamescalam/ai-arxiv-chunked", split="train")</p> &lt;pre&gt;
接下来,我们将预处理数据并将其分成较小的块,以便于高效的检索和处理。
from transformers import AutoTokenizer <p>tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")</p> <p>def chunk_text(text, chunk_size=512, overlap=64): tokens = tokenizer.encode(text, return_tensors="pt", truncation=True) chunks = tokens.split(chunk_size - overlap) texts = [tokenizer.decode(chunk) for chunk in chunks] return texts</p> <p>chunked_data = [] for doc in dataset: text = doc["chunk"] chunked_texts = chunk_text(text) chunked_data.extend(chunked_texts)</p>
对于初始检索阶段,我们将使用Sentence Transformer模型来将文档和查询编码为密集向量表示,然后使用向量数据库(如LanceDB)进行近似最近邻搜索。
from sentence_transformers import SentenceTransformer from lancedb import lancedb <p># 加载Sentence Transformer模型 model = SentenceTransformer('all-MiniLM-L6-v2')</p> <p># 创建LanceDB向量存储 db = lancedb.lancedb('/path/to/store') db.create_collection('docs', vector_dimension=model.get_sentence_embedding_dimension())</p> <p># 索引文档 for text in chunked_data: vector = model.encode(text).tolist() db.insert_document('docs', vector, text)</p> <p>from sentence_transformers import SentenceTransformer from lancedb import lancedb</p> <p># 加载Sentence Transformer模型 model = SentenceTransformer('all-MiniLM-L6-v2')</p> <p># 创建LanceDB向量存储 db = lancedb.lancedb('/path/to/store') db.create_collection('docs', vector_dimension=model.get_sentence_embedding_dimension())</p> <p># 索引文档 for text in chunked_data: vector = model.encode(text).tolist() db.insert_document('docs', vector, text)
有了索引的文档,我们可以通过找到给定查询向量的最近邻来执行初始检索。
from transformers import AutoTokenizer <p>tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")</p> <p>def chunk_text(text, chunk_size=512, overlap=64): tokens = tokenizer.encode(text, return_tensors="pt", truncation=True) chunks = tokens.split(chunk_size - overlap) texts = [tokenizer.decode(chunk) for chunk in chunks] return texts</p> <p>chunked_data = [] for doc in dataset: text = doc["chunk"] chunked_texts = chunk_text(text) chunked_data.extend(chunked_texts)
重排序
在初始检索之后,我们将使用重排序模型根据文档与查询的相关性对检索到的文档进行重新排序。在这个例子中,我们将使用ColBERT重排序器,一种快速准确的基于Transformer的模型,专门为文档排名而设计。
from lancedb.rerankers import ColbertReranker reranker = ColbertReranker() <p># 重排序初始文档 reranked_docs = reranker.rerank(query, initial_docs)
现在reranked_docs列表包含根据查询相关性对初始检索到的文档进行重新排序的文档,如ColBERT重排序器确定的那样。
增强和生成
有了相关的重排序文档,我们可以继续RAG管道的增强和生成阶段。我们将使用Hugging Face Transformers库中的语言模型来生成最终响应。
from transformers import AutoTokenizer, AutoModelForSeq2SeqLM <p>tokenizer = AutoTokenizer.from_pretrained("t5-base") model = AutoModelForSeq2SeqLM.from_pretrained("t5-base")</p> <p># 增强查询与重排序文档 augmented_query = query + " " + " ".join(reranked_docs[:3])</p> <p># 生成语言模型的响应 input_ids = tokenizer.encode(augmented_query, return_tensors="pt") output_ids = model.generate(input_ids, max_length=500) response = tokenizer.decode(output_ids[0], skip_special_tokens=True)</p> print(response)













