AGI og fremtidens AI
Kraften af Rerankers og To-Trins Retrieval til Retrieval Augmenteret Generering
Dette kodeeksempel demonstrerer, hvordan man kan konfigurere og anvende jina-colbert-v1-en-modellen til at indekserere en samling af dokumenter, udnyttende dens evne til at håndtere lange kontekster effektivt.
Implementering af To-Trins Henting med Rerankere
Nu, hvor vi har en forståelse for principperne bag to-trins henting og rerankere, lad os udforske deres praktiske implementering inden for en RAG-kontekst. Vi vil anvende populære biblioteker og rammer til at demonstrere integrationen af disse teknikker.
Opsætning af Miljøet
Før vi dykker ned i koden, lad os opsætte vores udviklingsmiljø. Vi vil anvende Python og flere populære NLP-biblioteker, herunder Hugging Face Transformers, Sentence Transformers og LanceDB.
# Installér nødvendige biblioteker !pip install datasets huggingface_hub sentence_transformers lancedb
Dataforberedelse
Til demonstration formål vil vi anvende “ai-arxiv-chunked”-datasettet fra Hugging Face Datasets, der indeholder over 400 ArXiv-papirer om maskinlæring, naturlig sprogbehandling og store sprogmodeller.
from datasets import load_dataset <p>dataset = load_dataset("jamescalam/ai-arxiv-chunked", split="train")</p> &lt;pre&gt;
Herefter vil vi forberede dataene og opdele dem i mindre stykker for at lette effektiv henting og bearbejdning.
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>
Til den initiale hentningsfase vil vi anvende en Sentence Transformer-model til at kodificere vores dokumenter og spørgsmål i tætte vektorrepræsentationer og derefter udføre approximativ nærmeste nabo-søgning ved hjælp af en vektor-database som LanceDB.
from sentence_transformers import SentenceTransformer from lancedb import lancedb <p># Indlæs Sentence Transformer-model model = SentenceTransformer('all-MiniLM-L6-v2')</p> <p># Opret LanceDB-vektorlagre db = lancedb.lancedb('/path/to/store') db.create_collection('docs', vector_dimension=model.get_sentence_embedding_dimension())</p> <p># Indeksér dokumenter 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># Indlæs Sentence Transformer-model model = SentenceTransformer('all-MiniLM-L6-v2')</p> <p># Opret LanceDB-vektorlagre db = lancedb.lancedb('/path/to/store') db.create_collection('docs', vector_dimension=model.get_sentence_embedding_dimension())</p> <p># Indeksér dokumenter for text in chunked_data: vector = model.encode(text).tolist() db.insert_document('docs', vector, text)
Med vores dokumenter indekseret kan vi udføre den initiale henting ved at finde de nærmeste naboer til en given spørgsmålsvektor.
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)
Reranking
Efter den initiale henting vil vi anvende en reranker-model til at omordne de hentede dokumenter baseret på deres relevans for spørgsmålet. I dette eksempel vil vi anvende ColBERT-rerankereren, en hurtig og præcis transformer-baseret model specifikt designet til dokument-rangordning.
from lancedb.rerankers import ColbertReranker reranker = ColbertReranker() <p># Rerank initialt dokumenter reranked_docs = reranker.rerank(query, initial_docs)
Listen reranked_docs indeholder nu dokumenterne omordnet baseret på deres relevans for spørgsmålet, som bestemt af ColBERT-rerankereren.
Udvikling og Generering
Med de omordnede og relevante dokumenter i hånden kan vi fortsætte til udviklings- og genereringsstadierne af RAG-pipelines. Vi vil anvende en sprogmodel fra Hugging Face Transformers-biblioteket til at generere den endelige respons.
from transformers import AutoTokenizer, AutoModelForSeq2SeqLM <p>tokenizer = AutoTokenizer.from_pretrained("t5-base") model = AutoModelForSeq2SeqLM.from_pretrained("t5-base")</p> <p># Udvikler spørgsmål med omordnede dokumenter augmented_query = query + " " + " ".join(reranked_docs[:3])</p> <p># Generer respons fra sprogmodel 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)














