Када је у питању обрада природног језика (НЛП) и проналажење информација, способност ефикасног и тачног преузимања релевантних информација је од највеће важности. Како поље наставља да се развија, нове технике и методологије се развијају како би се побољшале перформансе система за проналажење, посебно у контексту Ретриевал Аугментед Генератион (РАГ). Једна таква техника, позната као двостепено проналажење са реранкерима, појавила се као моћно решење за решавање инхерентних ограничења традиционалних метода проналажења.
У овом чланку расправљамо о замршеностима двостепеног проналажења и поновног рангирања, истражујући њихове основне принципе, стратегије имплементације и предности које нуде у побољшању тачности и ефикасности РАГ система. Такође ћемо обезбедити практичне примере и исечке кода како бисмо илустровали концепте и олакшали дубље разумевање ове најсавременије технике.
Разумевање проширене генерације преузимања (РАГ)
Пре него што уђемо у специфичности двостепеног преузимања и поновног рангирања, хајде да се укратко вратимо на концепт проширене генерације преузимања (РАГ). РАГ је техника која проширује знање и могућности великих језичких модела (ЛЛМ) тако што им омогућава приступ екстерним изворима информација, као што су базе података или збирке докумената. Погледајте више из чланка „Дубоко уроњење у проширену генерацију преузимања у ЛЛМ".
Типичан РАГ процес укључује следеће кораке:
- Питање: Корисник поставља питање или даје инструкције систему.
- Дохваћање: Систем испитује векторску базу података или колекцију докумената да пронађе информације релевантне за упит корисника.
- Повећање: Преузете информације се комбинују са оригиналним упитом или упутством корисника.
- Генерација: Језички модел обрађује проширени улаз и генерише одговор, користећи спољне информације да побољша тачност и свеобухватност његовог излаза.
Иако се РАГ показао као моћна техника, није без изазова. Једно од кључних питања лежи у фази проналажења, где традиционалне методе проналажења можда неће успети да идентификују најрелевантније документе, што доводи до неоптималних или нетачних одговора из језичког модела.
Потреба за двостепеним проналажењем и поновним рангирањем
Традиционалне методе проналажења, као што су оне засноване на подударању кључних речи или моделима векторског простора, често се боре да ухвате нијансиране семантичке односе између упита и докумената. Ово ограничење може резултирати проналажењем докумената који су само површно релевантни или пропуштају кључне информације које би могле значајно побољшати квалитет генерисаног одговора.
Да би одговорили на овај изазов, истраживачи и практичари су се окренули двостепеном проналажењу са реранкерима. Овај приступ укључује процес у два корака:
- Инитиал Ретриевал: У првој фази, релативно велики скуп потенцијално релевантних докумената се преузима коришћењем брзог и ефикасног метода проналажења, као што је модел векторског простора или претрага заснована на кључним речима.
- Поновно рангирање: У другој фази, користи се софистициранији модел поновног рангирања како би се првобитно преузети документи променили на основу њихове релевантности за упит, чиме се најрелевантнији документи ефективно доводе на врх листе.
Модел поновног рангирања, често неуронска мрежа или архитектура заснована на трансформатору, је посебно обучен да процени релевантност документа за дати упит. Користећи напредне могућности разумевања природног језика, реранкер може да ухвати семантичке нијансе и контекстуалне односе између упита и докумената, што резултира прецизнијим и релевантнијим рангирањем.
Предности двостепеног преузимања и поновног рангирања
Усвајање двостепеног преузимања са реранкерима нуди неколико значајних предности у контексту РАГ система:
- Импровед Аццураци: Поновно рангирањем првобитно преузетих докумената и промоцијом најрелевантнијих на врх, систем може пружити тачније и прецизније информације језичком моделу, што доводи до квалитетнијих генерисаних одговора.
- Ублажени проблеми ван домена: Модели уградње који се користе за традиционално проналажење често се обучавају на корпусима текста опште намене, који можда неће адекватно обухватити језик и семантику специфичан за домен. С друге стране, модели поновног рангирања могу се обучити на подацима специфичним за домен, ублажавајући проблем „ван домена“ и побољшавајући релевантност преузетих докумената унутар специјализованих домена.
- скалабилност: Двостепени приступ омогућава ефикасно скалирање коришћењем брзих и лаких метода проналажења у почетној фази, док се рачунарски интензивнији процес прерангирања резервише за мањи подскуп докумената.
- еластичност: Модели за поновно рангирање могу се заменити или ажурирати независно од методе иницијалног проналажења, обезбеђујући флексибилност и прилагодљивост растућим потребама система.
ЦолБЕРТ: Ефикасна и ефективна касна интеракција
Један од истакнутих модела у области прерангирања је ЦолБЕРТ (Контекстуализована касна интеракција преко БЕРТ-а). ЦолБЕРТ је модел реранкера докумената који користи могућности дубоког разумевања језика БЕРТ-а док уводи нови механизам интеракције познат као „касна интеракција“.
ЦолБЕРТ: Ефикасна и ефективна претрага пролаза преко контекстуализоване касне интеракције преко БЕРТ-а
Механизам касне интеракције у ЦолБЕРТ-у омогућава ефикасно и прецизно проналажење обрадом упита и докумената одвојено до завршних фаза процеса проналажења. Конкретно, ЦолБЕРТ независно кодира упит и документ користећи БЕРТ, а затим користи лагани, али моћни корак интеракције који моделира њихову фино зрнату сличност. Одлагањем али задржавањем ове фино-зрнасте интеракције, ЦолБЕРТ може да искористи експресивност дубоких језичких модела док истовремено добија могућност да унапред израчуна репрезентације докумената ван мреже, значајно убрзавајући обраду упита.
ЦолБЕРТ-ова касна интеракцијска архитектура нуди неколико предности, укључујући побољшану рачунарску ефикасност, скалабилност са величином збирке докумената и практичну применљивост за сценарије из стварног света. Поред тога, ЦолБЕРТ је додатно побољшан техникама као што су надзор без шума и резидуална компресија (у ЦолБЕРТв2), које побољшавају процес обуке и смањују просторни отисак модела уз одржавање високе ефикасности проналажења.
Овај исечак кода показује како да конфигуришете и користите модел јина-цолберт-в1-ен за индексирање колекције докумената, користећи његову способност да ефикасно рукује дугим контекстима.
Имплементација двостепеног преузимања са Реранкерс
Сада када имамо разумевање принципа који стоје иза двостепеног проналажења и поновног рангирања, хајде да истражимо њихову практичну примену у контексту РАГ система. Користићемо популарне библиотеке и оквире да демонстрирамо интеграцију ових техника.
Постављање животне средине
Пре него што заронимо у код, хајде да поставимо наше развојно окружење. Користићемо Питхон и неколико популарних НЛП библиотека, укључујући Хуггинг Фаце Трансформерс, Сентенце Трансформерс и ЛанцеДБ.
# Install required libraries
!pip install datasets huggingface_hub sentence_transformers lancedb
Припрема података
У сврху демонстрације, користићемо скуп података „аи-аркив-цхункед” из скупова података Хуггинг Фаце, који садржи преко 400 АрКсив радова о машинском учењу, обради природног језика и великим језичким моделима.
from datasets import load_dataset
dataset = load_dataset("jamescalam/ai-arxiv-chunked", split="train")
<pre>
Затим ћемо претходно обрадити податке и поделити их на мање делове да бисмо олакшали ефикасно преузимање и обраду.
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")
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
chunked_data = []
for doc in dataset:
text = doc["chunk"]
chunked_texts = chunk_text(text)
chunked_data.extend(chunked_texts)
За почетну фазу преузимања, користићемо модел Сентенце Трансформер да кодирамо наше документе и упите у густе векторске репрезентације, а затим извршимо приближну претрагу најближег суседа користећи векторску базу података као што је ЛанцеДБ.
from sentence_transformers import SentenceTransformer
from lancedb import lancedb
# Load Sentence Transformer model
model = SentenceTransformer('all-MiniLM-L6-v2')
# Create LanceDB vector store
db = lancedb.lancedb('/path/to/store')
db.create_collection('docs', vector_dimension=model.get_sentence_embedding_dimension())
# Index documents
for text in chunked_data:
vector = model.encode(text).tolist()
db.insert_document('docs', vector, text)
from sentence_transformers import SentenceTransformer
from lancedb import lancedb
# Load Sentence Transformer model
model = SentenceTransformer('all-MiniLM-L6-v2')
# Create LanceDB vector store
db = lancedb.lancedb('/path/to/store')
db.create_collection('docs', vector_dimension=model.get_sentence_embedding_dimension())
# Index documents
for text in chunked_data:
vector = model.encode(text).tolist()
db.insert_document('docs', vector, text)
Када су наши документи индексирани, можемо извршити почетно преузимање проналажењем најближих суседа датом вектору упита.
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")
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
chunked_data = []
for doc in dataset:
text = doc["chunk"]
chunked_texts = chunk_text(text)
chunked_data.extend(chunked_texts)
Поновно рангирање
Након иницијалног преузимања, користићемо модел поновног рангирања да променимо редослед преузетих докумената на основу њихове релевантности за упит. У овом примеру, користићемо ЦолБЕРТ реранкер, брз и прецизан модел заснован на трансформатору посебно дизајниран за рангирање докумената.
from lancedb.rerankers import ColbertReranker
reranker = ColbertReranker()
# Rerank initial documents
reranked_docs = reranker.rerank(query, initial_docs)
reranked_docs
листа сада садржи документе који су промењени на основу њихове релевантности за упит, како је одредио ЦолБЕРТ реранкер.
Повећање и генерисање
Са поново рангираним и релевантним документима у руци, можемо прећи на фазе повећања и генерисања РАГ цевовода. Користићемо модел језика из библиотеке Хуггинг Фаце Трансформерс да генеришемо коначни одговор.
from transformers import AutoTokenizer, AutoModelForSeq2SeqLM
tokenizer = AutoTokenizer.from_pretrained("t5-base")
model = AutoModelForSeq2SeqLM.from_pretrained("t5-base")
# Augment query with reranked documents
augmented_query = query + " " + " ".join(reranked_docs[:3])
# Generate response from language model
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)
print(response)