نویسنده(های): انوار شرفودینوف
در ابتدا منتشر شد به سمت هوش مصنوعی.
ظهور Retrieval-Augmented Generation (RAG) نحوه ساخت اپلیکیشن های هوشمند را متحول کرده است. در هسته خود، RAG همه چیز در مورد تبدیل تکه های بزرگ متن به جاسازی های عملی و سپس اجازه دادن به یک مدل هوش مصنوعی پاسخ های مرتبط با زمینه را در کنار هم قرار می دهد.
با این حال، آنچه در تئوری کار می کند می تواند در سناریوهای دنیای واقعی دچار مشکل شود. چرا؟ یکی از بزرگترین مقصران، نمایشهای ضعیف یا نامشخص است. اغلب، این نمایشها با نیازهای برنامههای کاربردی در سطح تولید همسو نمیشوند – بهویژه برای کارهایی مانند پاسخگویی به سؤال.
راهحل، تنظیم دقیق تعبیهها است – راهی مؤثر برای بهبود پیادهسازی RAG شما.
RAG 101: چگونه کار می کند
بیایید آن را تجزیه کنیم. در اینجا گردش کار معمولی RAG آمده است:
- ورودی کاربر: کاربر یک سوال یا درخواست ارسال می کند.
- جاسازی پرس و جو: سیستم یک جاسازی برای پرس و جو ایجاد می کند.
- تطبیق تکه: با استفاده از شباهت کسینوس به جستجوی جاسازیهای تکهای میپردازد که شبیه به پرس و جو هستند.
- نسل پاسخ: محتویات تکه های بالای بازیابی شده به عنوان زمینه به یک مدل زبان ارسال می شود که پاسخ نهایی را ایجاد می کند.
این تنظیمات در تئوری به خوبی کار می کند. با این حال، زمانی که تعبیهها دقت کافی نداشته باشند، نتایج میتوانند بهخوبی به نظر برسند، بهویژه زمانی که با موارد بزرگ سروکار داریم. مجموعه داده ها.
راه حل تنظیم دقیق
اگر بتوانید جاسازیهای خود را از قبل آموزش دهید تا انواع سوالاتی که کاربران ممکن است بپرسند را پیشبینی کنید چه؟
ایده اینجاست:
- ایجاد جفت سوال-چونک: برای هر تکه متن در مجموعه داده خود، چندین سؤال بالقوه ایجاد کنید که می تواند پاسخ دهد.
- مدل جاسازی را دقیق تنظیم کنید: مدل را آموزش دهید تا در فضای چندبعدی سوالات و تکههای مرتبط را به هم نزدیکتر کند و در عین حال سؤالهای نامرتبط را از هم دورتر کند.
در حالی که این رویکرد ممکن است بیش از حد مناسب به نظر برسد، در واقع بر بهینه سازی برای تعمیم تمرکز دارد. به نظر می رسد، تنظیم دقیق جاسازی ها به این روش، سیستم را برای رسیدگی به پرس و جوهای دیده نشده با دقت بهبود یافته مجهز می کند.
نتایج برای خودشان صحبت می کنند
تعبیههای تنظیم دقیق پیشرفتهای قابلتوجهی را در چندین مدل به همراه داشت. برای آموزش، ما از یکی از مجموعه داده های تجربی داخلی خود استفاده کردیم. این شامل 52 تکه است که طول هر کدام تقریباً 800 توکن است. برای هر بخش، ما از کلود-3-غزل آنتروپیک برای ایجاد 3 تا 5 سوال متناظر استفاده کردیم.
برای ارزیابی عملکرد، اندازهگیری کردیم که تکه صحیح چند بار در 3، 5 برتر و 10 نتیجه بازیابی شده برتر ظاهر میشود. برای ارائه یک زمینه گسترده تر، ما همچنین نتایجی را برای OpenAI/text-embedding-large-3 قرار دادیم. با این حال، از آنجایی که این یک مدل منبع بسته است، نمیتوانیم تنظیمات دقیق را برای آن اعمال کنیم.
در اینجا یک عکس فوری از نتایج است:
منبع باز کد
اگر الهام گرفته شده اید که با تنظیم دقیق آزمایش کنید، ما شما را تحت پوشش قرار داده ایم. ما را بررسی کنید مخزن کد با آموزش و تست اسکریپت برای علی بابا-NLP/gte-Qwen2–1.5B-instruct و مدلهای jinaai/jina-embeddings-v3. مخزن همچنین شامل پشتیبانی از دو روش آموزشی است: TripletMarginLoss و CosineEmbedding Loss.
الزامات مدل
- علی بابا-NLP/gte-Qwen2–1.5B-instruct مورد نیاز است 30 گیگابایت VRAM. الف پردازنده گرافیکی با 40 گیگابایت حافظه و بالاتر (به عنوان مثال، A100) توصیه می شود. منطق عبور به جلو استاندارد است و می تواند برای بسیاری از مدل های تعبیه مشابه اعمال شود.
- jinaai/jina-embeddings-v3 یک مدل بسیار سبک وزن است که فقط نیاز دارد 8 گیگابایت پردازنده گرافیکی حافظه برای تنظیم دقیق منطق پاس رو به جلو آن کمی خاص است، اما مفهوم اصلی واضح است.
روش های آموزشی
- TripletMarginLoss. این روش از یک لنگر (‘a’)، یک نمونه مثبت (‘p’) و یک نمونه منفی (‘n’) استفاده می کند:
- لنگر (الف): جاسازی محتوای تکه ای
- نمونه مثبت (p): تعبیه سوال مربوطه
- نمونه منفی (n): جاسازی سوال نامربوط
برای ساخت یک مجموعه آموزشی، جفت (تکه، سوال) ایجاد کنید و به طور تصادفی سوالات نامرتبط را به عنوان نمونه منفی انتخاب کنید.
2. CosineEmbeddingLoss. در این روش از نمونه های مثبت و منفی از قسمت های مختلف مجموعه آموزشی استفاده می شود:
- x1: تعبیه تکه
- x2: تعبیه نمونه مثبت یا منفی
- y: برچسبی که نشان می دهد x2 مثبت است (y=1) یا منفی (y=-1).
تطبیق کد
برای استفاده از مجموعه داده خود، آن را تغییر دهید prepare_data
عملکرد در train.py.
اطمینان حاصل کنید که تکه ها و سوالات مربوط به آنها را به صورت جفت برمی گرداند.
توجه: مخزن شامل منطق تولید سوال نیست، اما رویکردهای مختلفی در دسترس است. در زیر، ما یک کد نمونه را قرار داده ایم که برای مرجع استفاده می کنیم.
#1. split the document into chunks (simple way)
def split_into_chunks(content, chunk_size):
import tiktoken
enc = tiktoken.get_encoding("o200k_base")
a = enc.encode(content)
left, chunks = 0, []
while left len(a):
arr = a[left : left+chunk_size]
chunks.append(enc.decode(arr))
left+=chunk_size
return chunkschunks = split_into_chunks(document_content, 400)
#2. generate questions
def anthropic_run(system_prompt, user_message):
import anthropic
client = anthropic.Anthropic(
api_key=ANTHROPIC_API_KEY,
)
message = client.messages.create(
model="claude-3-sonnet-20240229", #"claude-3-opus-20240229",
max_tokens=4096,
system=system_prompt,
messages=[
{"role": "user", "content": user_message}
]
)
return message.content[0].text
system_prompt = '''
Given a chunk from document. Generate 3-5 questions related to the chunk. Each question must be full and not require additional context.
Example output:
1. How to open new account?
2. How much BMW X5 costs?
'''
for chunk in chunks:
text = "#"+chunk["keywords"]+"\n"+chunk["content"]
out = anthropic_run(system_prompt, text)
question_pattern = re.compile(r'^\s*\d+\.\s+(.*)', re.MULTILINE)
questions = question_pattern.findall(out)
print(text, questions)
#now you have (chunk, questions) pairs
بهبود مستمر
مزیت دیگر این روش، پتانسیل آن برای بهبود مستمر است. با گذشت زمان، با ظهور موارد جدید، می توانید مدل را دوباره آموزش دهید. به عنوان مثال، اگر یک قطعه متناظر در 10 مورد برتر یافت نشد (از اعداد زیاد خودداری کنید تا از مشکل “گم شده در وسط” جلوگیری کنید) و LLM نتوانست پاسخی ایجاد کند، به سادگی این سوال و قسمت صحیح آن را به مجموعه آموزشی اضافه کنید. این تضمین می کند که سیستم برای رسیدگی موثرتر به مسائل مشابه در آینده تکامل می یابد.
منتشر شده از طریق به سمت هوش مصنوعی
منبع: https://towardsai.net/p/l/fine-tuning-embeddings-for-rag-applications