نویسنده (ها): مایکل ریبوی
در ابتدا منتشر شده در به سمت هوش مصنوعیبشر
دیر چاک دهی به تازگی منتشر شده است چونکی، لاغر چاک دهی کتابخانه ای که در حال حاضر دارای بیش از 2،000 ستاره در Github است. این یک به روزرسانی خوشایند برای هر کسی است که به دنبال ادغام قطعه های دیررس در خطوط لوله بازیابی خود است ، زیرا اجرای آن از زمین به بالا می تواند از نظر مفهومی مشکل و مستعد اشتباه باشد. این مقاله تجزیه و تحلیل می کند که چه اواخر است ، چرا برای تعبیه اسناد بزرگتر یا پیچیده تر و نحوه ساخت آن در خط لوله جستجوی شما با استفاده از آن ضروری است چونکی وت kdb.ai به عنوان فروشگاه بردار.
چه چیزی در اواخر چانکینگ است؟
هنگامی که شما سندی دارید که هزاران کلمه را شامل می شود ، رمزگذاری آن در یک تعبیه واحد اغلب بهینه نیست. در بسیاری از سناریوها ، شما باید بخش های کوچکتر از متن را بازیابی کنید ، و بازیابی وکتور متراکم تمایل به عملکرد بهتر در هنگام کوچکتر بودن این متن ها دارد. این تا حدی به این دلیل است که تعبیه یک سند گسترده ، ممکن است معناشناسی خود را در یک وکتور واحد “بیش از حد فشرده” کند.
نسل بازیابی (RAG) نمونه بارز است که از تقسیم اسناد به تکه های متن کوچکتر بهره می برد-اغلب در حدود 512 نشانه. در Rag ، این تکه ها را در یک پایگاه داده بردار ذخیره می کنید و آنها را با یک مدل تعبیه شده متن رمزگذاری می کنید.
مشکل متن از دست رفته
خط لوله پارچه معمولی از chunk → embed → retrieve → generate
دور از کامل است تقسیم متن ساده می تواند سهواً روابط متنی طولانی تر را بشکند. اگر اطلاعات مهم در چندین تکه پخش شود ، یا یک تکه از سند وسیع تر نیاز به زمینه دارد ، به سادگی بازیابی یک تکه به تنهایی ممکن است زمینه کافی را برای پاسخ به یک پرس و جو به طور دقیق ارائه ندهد. تعبیه های تکه ما نیز نشان دهنده معنای کامل تکه نیست ، به این معنی که ممکن است تکه های صحیح بازیابی نشوند.
به عنوان مثال ، یک پرس و جو مانند:
“جمعیت برلین چیست؟”
اگر مقاله ای به جمله جمله باشد ، یک تکه ممکن است “برلین” را ذکر کند ، در حالی که دیگری از چهره جمعیت بدون بازگرداندن نام شهر یاد می کند. بدون زمینه از کل سند ، این قطعات نمی توانند به طور مؤثر به پرس و جو پاسخ دهند ، به خصوص هنگام حل منابع مانند “آن” یا “شهر”. این مثال توسط Jina AI این موضوع را بیشتر نشان می دهد:
راه حل دیرینه
به جای اینکه هر تکه را به صورت جداگانه به یک مدل تعبیه کنید ، در اواخر قطعه قطعه:
- در متن کل (یا تا حد امکان) توسط لایه های ترانسفورماتور مدل تعبیه شما پردازش می شود و تعبیه های نشانه ای را ایجاد می کند که منعکس کننده زمینه جهانی است.
- متن است تقسیم به تکه ها، و میانگین استخر برای توک های تعبیه شده در هر تکه اعمال می شود تا تعبیه شده توسط کل سند ایجاد شود.
این زمینه را در هر تکه حفظ می کند ، و اطمینان حاصل می کند که تعبیه بیش از معناشناسی محلی بخش فردی است. البته ، این مسئله مسئله این قطعه را که زمینه کافی ندارند ، حل نمی کند. برای حل این مسئله ، مقاله من را با مقایسه قطعه های دیررس با بازیابی متنی بررسی کنید ، روشی که توسط انسان شناسی برای افزودن زمینه به بخش هایی با آن وجود دارد LLMS:
https://medium.com/kx-systems/late-chunking-vs-contextual-retrieval-the-math-behind-rags-context-problem-d5a26b9bbd38بشر
در عمل ، آنچه در عوض این کار را انجام می دهد ، کاهش تعداد بازیابی ناموفق و تعبیه های خوشه ای در اطراف سند است.
مقایسه ساده و ساده و ساده و بی پروا
در یک رویکرد ساده لوح ، هر قطعه به طور مستقل رمزگذاری می شود و تعبیه هایی را تولید می کند که فاقد متن از سایر بخش ها هستند. تکه های اواخر، از طرف دیگر ، تعبیه های تکه ای را با شرط در زمینه جهانی ایجاد می کند ، و عملکرد بازیابی را به میزان قابل توجهی بهبود می بخشد. این به کاهش توهم و پاسخ های ناموفق در سیستم های RAG کمک می کند.
نشان داده شده است که در اواخر ، عملکرد بازیابی بهبود می یابد ، که به نوبه خود به این معنی است که می تواند توهم پارچه و پاسخ های ناموفق را کاهش دهد.
اجرای با Chonkie و KDB.ai
در اینجا آمده است که چگونه می توانید با استفاده از chunking دیررس را پیاده سازی کنید kdb.ai به عنوان فروشگاه بردار.
(سلب مسئولیت ، من یک مدافع توسعه دهنده KDB.AI و مشارکت کننده Chonkie هستم.)
1. وابستگی ها را نصب کنید و Latechunker را تنظیم کنید
!pip install "chonkie[st]" kdbai-client sentence-transformersfrom chonkie import LateChunker
import kdbai_client as kdbai
import pandas as pd
# Initialize Late Chunker
chunker = LateChunker(
embedding_model="all-MiniLM-L6-v2",
mode="sentence",
chunk_size=512,
min_sentences_per_chunk=1,
min_characters_per_sentence=12,
)
2. پایگاه داده بردار را تنظیم کنید
می توانید برای یک سطح آزاد ثبت نام کنید kdb.ai مثال در kdb.ai، که حداکثر 4 مگابایت حافظه و 32 گیگابایت حافظه را ارائه می دهد. در صورتی که تعبیه شده به طور کارآمد ذخیره شود ، این موارد برای بیشتر موارد استفاده بیش از حد کافی است.
# Initialize KDB.AI session
session = kdbai.Session(
api_key="your_api_key",
endpoint="your_endpoint"
)
# Create database and define schema
db = session.create_database("documents")
schema = [
{"name": "sentences", "type": "str"},
{"name": "vectors", "type": "float64s"},
]
# Configure HNSW index for fast similarity search
indexes = [{
'type': 'hnsw',
'name': 'hnsw_index',
'column': 'vectors',
'params': {'dims': 384, 'metric': "L2"},
}]
# Create table
table = db.create_table(
table="chunks",
schema=schema,
indexes=indexes
)
3. تکه و جاسازی شده
در اینجا مثالی با استفاده از مقاله های پل گراهام در قالب Markdown آورده شده است. ما قطعات دیر هنگام تولید می کنیم و آنها را در پایگاه داده بردار ذخیره می کنیم.
import requestsurls = ["ww.paulgraham.com/wealth.html", "www.paulgraham.com/start.html"]
texts = [requests.get('http://r.jina.ai/' + url).text for url in urls]
batch_chunks = chunker(texts)
chunks = [chunk for batch in batch_chunks for chunk in batch]
# Store in KDB.AI
embeddings_df = pd.DataFrame({
"vectors": [chunk.embedding.tolist() for chunk in chunks],
"sentences": [chunk.text for chunk in chunks]
})
embeddings_df.head()
4. فروشگاه بردار را پرس و جو کنید
بیایید خط لوله بازیابی را با تعبیه یک پرس و جو جستجو و یافتن مناسب ترین تکه ها آزمایش کنیم.
import sentence_transformers
search_query = "to get rich do this"
search_embedding = sentence_transformers.SentenceTransformer("all-MiniLM-L6-v2").encode(search_query)# search for similar documents
table.search(vectors={'hnsw_index': [search_embedding]}, n=3)[0]['sentences']
و ما قادر به کسب برخی از نتایج هستیم! نتایج ایده آل نیستند ، مانند مجموعه داده اندازه کوچک است ، ما از یک مدل تعبیه ضعیف استفاده می کنیم و از استفاده مجدد استفاده نمی کنیم. اما به عنوان اندازه مجموعه داده مقیاس ، اواخر تکه شدن می تواند باعث افزایش بسیار قابل توجهی در دقت شود.
5. تمیز کنید
به یاد داشته باشید که برای صرفه جویی در منابع ، پایگاه داده را رها کنید:
db.drop()
پایان
Late Chunking مسئله مهم حفظ زمینه مسافت طولانی در خطوط لوله بازیابی را حل می کند. هنگامی که با kdb.ai، شما دریافت می کنید:
- تعبیه های آگاهانه: تعبیه هر تکه ، کل سند را منعکس می کند.
- تأخیر در زیر 100ms: استفاده از شاخص HNSW KDB.AI ، بازیابی سریع را تضمین می کند.
- مقیاس پذیری: قادر به دستیابی به مجموعه داده های در مقیاس بزرگ در تولید.
Chonkie باعث می شود تا اواخر خط لوله شما بسیار ساده باشد. اگر قبلاً از ابتدا از ابتدا این کار را انجام داده اید (مثل من) ، این کتابخانه قطعاً وقت و سردرد زیادی را برای شما صرفه جویی می کند.
برای بینش بیشتر در مورد تکنیک های پیشرفته AI ، جستجوی بردار و نسل بازیابی و بازیابی ، مرا دنبال کن در LinkedIn!
منتشر شده از طریق به سمت هوش مصنوعی
منبع: https://towardsai.net/p/machine-learning/easy-late-chunking-with-chonkie