نویسنده (ها): Anuar Sharafudinov
در ابتدا منتشر شده در به سمت هوش مصنوعیبشر
مقدمه
در قبلی مقاله ، ما به محدودیت اساسی سیستم های بازیابی امروز (RAG) امروزه: اطلاعات متنی مفقود شده به دلیل مستقل پرداختیم چاک دهیبشر با این حال ، این فقط یکی از کاستی های Rag است. یکی دیگر از چالش های مهم این است پاسخ به سوال چند هاپ (QA) ، که شامل ادغام شواهد گسترش یافته در چندین بخش برای به دست آوردن یک پاسخ کامل و دقیق است. این بدان معناست که سیستم باید در مورد اطلاعات توزیع شده در سراسر سند-که اغلب بخش های غیر مبهم را شامل می شود-جمع آوری و استدلال کند تا به پاسخ صحیح برسد.
چالش QA چند هاپ
وظایف QA چند هاپ خواستار است که چندین بخش از شواهد از بخش های مختلف یک سند (یا حتی چندین سند) برای پاسخ به یک سؤال ترکیب شود. برخی از نمونه ها ساده است. به عنوان مثال:
“ویژگی های آیفون 14 و آیفون 16 را مقایسه کنید.”
این را می توان با استفاده از دو بازیابی مستقل انجام داد: یکی برای “آیفون 14” و دیگری برای “آیفون 16”
اما دیگران پیچیده تر هستند ، مانند زنجیره های علی:
“مقایسه مفصلی از آخرین نسخه های OSX به من بدهید.”
در این حالت ، یک مدل ابتدا باید تعیین کند که آخرین نسخه های OSX چیست (به عنوان مثال ، سوناما ، کاتالینا) ، و سپس قبل از جمع آوری و مقایسه اطلاعات ، بازیابی یا نمایش داده های جداگانه ای را برای هر نسخه انجام می دهد. این فرآیند پرس و جو چند مرحله ای از نظر محاسباتی گران و کند است.
یک جایگزین ساده تر: امتیاز دهی تک مدل
چه می شود اگر ما بتوانیم از تولید پرس و جو به طور کلی جلوگیری کنیم و به طور مستقیم همه تکه های اسناد را در برابر سوال اصلی با استفاده از یک تک به ثمر برسانیم یادگیری ماشین مدل؟ این رویکرد سه مشکل اصلی پارچه را حل می کند:
- نیاز به تولید پرس و جو را از بین می برد
- از بین رفتن مستقل را کاهش می دهد چاک دهی
- استدلال چند هاپ را در یک پاس واحد امکان پذیر می کند
The Nuance: تعبیه شده به جای تعبیه های نشانه
یک اعتراض متداول این است: آیا به ثمر نمی رسد همه تکه ها به یکباره به پنجره های زمینه بزرگ احتیاج داشته باشند ، این مشکل مشکل برای حل آن بود؟ این پیچ و تاب است: ما تعبیه های توکن جداگانه را با تعبیه های تکه ای جایگزین می کنیم – هر قطعه تا 200 توکن طول دارد. با طول دنباله 500 ، این تنظیم به طور مؤثر به ما امکان می دهد تا 100000 محتوای توکن را رمزگذاری کنیم.
راه اندازی آموزش
آموزش بر روی رایانه رومیزی با 8 گیگابایت انجام شد GPU برای چند ساعت تنظیم به شرح زیر بود:
- مدل تعبیه شده:
jinaai/jina-embeddings-v3
- مدل پایه برای تنظیم دقیق:
google/bert-base-uncased
- قالب ورودی:
[question, chunk_i_1, chunk_i_2, ..., chunk_j_1, chunk_j_2, ...]
جایی که CHUNK_I_1 اولین قطعه تعبیه Document_i است. - برچسب:
[0, label_i_1, label_i_2, ..., label_j_2, ...]
کجاlabel_i_x = 1
اگرchunk_i_x
به جواب کمک می کند ، other 0 - تکه ها برای هر مینی دسته در اسناد تغییر یافته اند ، اما سفارش در یک سند حفظ می شود
پارامترهای آموزشی:
- اندازه دسته ای: 16
- دقت: fp32
- نرخ یادگیری: 1E-5
- دوره ها: 100
- طول دنباله متوسط: 511
- عملکرد از دست دادن: متقاطع باینری-آنتروپی
مجموعه داده
یک هیبرید مجموعه داده برای آموزش ، متشکل از چندین منبع انتخاب شد:
میز تست: 100 نمونه از Hotpotqa
نتایج
@10 را به یاد بیاورید به عنوان متریک عملکرد مورد استفاده قرار گرفت – چند قطعه مربوطه در 10 نامزد برتر بازیابی شد.
مقایسه های پایه:
- شباهت کاسین خام با استفاده از
jinaai
تعبیه - API CORHERE RERANK – که ارتباط را با استفاده از یک مدل امتیاز دهی آموخته شده ارزیابی می کند و نه اینکه فقط به شباهت کسین تکیه کند. شباهت كسین ، در حالی كه كارآمد است ، غالباً نتوانسته است تفاوتهای معنایی را بین یك سؤال و گذرگاه ضبط كند. برای پرداختن به این موضوع ، شرکت های CORHERE و مشابه مدل های تجدید نظر را ایجاد کرده اند که نمره ارتباط دقیق تری را بر اساس درک متنی از پرس و جو و بخش بازیابی شده (یک به یک) اختصاص می دهند.
خروجی نمونه:
- تکه های مربوطه:
[1, 312, 313]
- 10 نامزد برتر:
[1, 313, 312, 2, 188, 46, 183, 325, 91, 149]
- به یاد بیاورید@10: 3/3
منبع باز کردن کد
می خواهید خودتان این را امتحان کنید؟ ما منبع باز کرده ایم رمز با آموزش و آزمایش اسکریپت ها ، از جمله ادغام با Cohere Rerank و پایه های شباهت Cosine.
کار آینده
این آزمایش استفاده شده است bert-base-uncased
، که دارای اندازه ورودی محدود 512 نشانه است. مراحل بعدی:
- با مدل های بزرگتر آزمایش کنید:
bert-large
باDeBERTa
باLongformer
، و غیره - به طور مشترک مدل های جاسازی و امتیاز دهی را تنظیم کنید تا بهینه سازی پایان به پایان برسد. این اجازه می دهد تا فضای تعبیه به گونه ای تکامل یابد که مستقیماً با کار امتیاز دهی به پایین دست هماهنگ باشد ، به طور بالقوه باعث بهبود اهمیت هر دو بخش و دقت بازیابی کلی می شود.
- حرکت فراتر از امتیاز دهی به گل: یک مدل بزرگ زبان مانند Llama 3 را به خوبی تنظیم کنید تا مستقیماً بر روی تعبیه های تکه ای استدلال کنید و پاسخ هایی را به پایان برسانید. این مدل را قادر می سازد نه تنها محتوای مربوطه را بازیابی کند بلکه پاسخهای چند هاپ منسجم را در یک مرحله واحد سنتز و بیان می کند.
افکار نهایی
مدل های زبان مبتنی بر ترانسفورماتور همچنان تحت تأثیر قرار می گیرند. در طول آزمایشات اخیر ، ما مشاهده کردیم که آنها می توانند به سرعت با روشهای جدید مانند احتمال شخصیت یا تعبیه های تکه ای خیلی سریع سازگار شوند و سازگاری آنها با کارهای پیچیده مانند استدلال چند هاپ جذاب است.
قطعه کد
نسل تعبیه کننده (Jinaai)
# Example code for generating question and chunk embeddings
emb_cache = {}
embedding_model = AutoModel.from_pretrained("jinaai/jina-embeddings-v3", trust_remote_code=True)
embedding_model.eval()
embedding_model.cuda()
for step, (question, chunks_list, labels_list) in enumerate(dataset):
print(f"\rEmb: {step}/10k", end="", flush=True)
h = hashf(question)
if h not in emb_cache: emb_cache[h] = embedding_model.encode([question], task="retrieval.query")[0]
for chunks in chunks_list:
for chunk in chunks:
h = hashf(chunk)
if h not in emb_cache: emb_cache[h] = embedding_model.encode([chunk], task="retrieval.passage")[0]
API CORHERE RERANK
# Example usage of Cohere Rerank API
import cohere
co = cohere.Client('your-api-key')
documents_reranked = co.rerank(model="rerank-v3.5", query=question, documents=documents, top_n=10)
top_indices = [r.index for r in documents_reranked.results]
Collator Data (سازنده دسته ای)
# Example code for custom data collator
class DataCollator:
def shuffle_lists(self, a, b):
combined = list(zip(a, b)) # Pair corresponding elements
random.shuffle(combined) # Shuffle the pairs
a_shuffled, b_shuffled = zip(*combined) # Unzip after shuffling
return list(a_shuffled), list(b_shuffled)def __call__(self, features) -> Dict[str, torch.Tensor]:
batch = {"input_values": [], "labels":[], "position_ids":[]}
for x in features:
question, labels_list, chunks_list = x["question"], x["labels_list"], x["chunks_list"]
question_emb, chunks_emb = emb_cache[hashf(question)], []
for chunks in chunks_list:
chunks_emb.append( [emb_cache[hashf(chunk)] for chunk in chunks] )
chunks_emb, labels_list = self.shuffle_lists(chunks_emb, labels_list)
input_values, labels, position_ids = [question_emb], [0], [0]
for i, embs in enumerate(chunks_emb):
for idx, emb in enumerate(embs):
input_values.append(emb)
position_ids.append(idx+1)
labels += labels_list[i]
input_values, labels, position_ids = torch.tensor(input_values), torch.tensor(labels), torch.tensor(position_ids, dtype=torch.long)
batch["input_values"].append(input_values)
batch["labels"].append(labels)
batch["position_ids"].append(position_ids)
batch["input_values"] = pad_sequence(batch["input_values"], batch_first=True, padding_value=0) #B,S,C
batch["labels"] = pad_sequence(batch["labels"], batch_first=True, padding_value=0)
batch["position_ids"] = pad_sequence(batch["position_ids"], batch_first=True, padding_value=0)
return batch
منتشر شده از طریق به سمت هوش مصنوعی