نویسنده (ها): dwaipayan bandyopadhyay
در ابتدا منتشر شده در به سمت هوش مصنوعیبشر
امروز ، در این مقاله ، من در مورد چگونگی استفاده از اطلس خود MongoDB به عنوان شاخص جستجوی بردار و مدل تعبیه شده ، یک پیاده روی دقیق ارائه خواهم داد LLM به عنوان یک نقطه پایانی در پورتال Databricks برای انجام بازیابی نسل تقویت شده (RAG) بر روی یک قطعه از داده ها خدمت کرده است.
در دنیای هوش مصنوعی امروز ، جایی که روزانه مقادیر زیادی از داده های ساختار یافته و بدون ساختار تولید می شود ، با استفاده از دانش با دقت با استفاده از دانش به سنگ بنای فناوری امروزی تبدیل شده است. بازیابی نسل افزایش یافته (RAG) یک رویکرد گسترده است که با ادغام قدرت در دنیای واقعی حل می کند هوش مصنوعی و بازیابی اطلاعات
نسل تقویت شده بازیابی به طور کلی از سه مرحله اصلی تشکیل شده است ، من آنها را به طور خلاصه در زیر توضیح خواهم داد –
- بازیابی اطلاعات – اولین مرحله شامل بازیابی اطلاعات مربوطه از پایگاه دانش ، بانک اطلاعاتی یا بانک اطلاعاتی بردار است که در آن جاسازی های داده هایی را که از آن اطلاعات را بازیابی خواهیم کرد ، ذخیره می کنیم. این بخش بازیابی به طور معمول از طریق جستجوی شباهت انجام می شود ، که در آن ما شباهت هایی بین پرس و جو تعبیه شده و تعبیه شده که قبلاً در پایگاه داده بردار ذخیره شده اند ، می یابیم.
- مرحله تقویت – پس از بازیابی اطلاعات مشابه از پایگاه داده وکتور ، با پرس و جو پرسیده شده توسط کاربر ترکیب می شود تا بازپرداخت زمینه را به آنچه خواسته شده است تبدیل کند و پاسخ بهتری برای پرس و جو ایجاد کند.
- مرحله نسل – این مرحله آخر است ، که در آن یک مدل زبان بزرگ به نمایش در می آید ، ما اطلاعات افزوده را به LLM تغذیه می کنیم و بر اساس آن اطلاعات ارائه شده ، یک پاسخ مناسب برای خواندنی انسان ایجاد می کند. تغذیه اطلاعات افزوده بسیار مهم است زیرا در غیر این صورت ممکن است هوش مصنوعی برخی از اطلاعات تصادفی را ایجاد کند زیرا هیچ زمینه ای از آنچه خواسته شده است ندارد.
اطلس MongoDB چیست؟
Atlas یک سرویس پایگاه داده چند ابر است که توسط MongoDB ارائه شده است که در آن توسعه دهندگان می توانند بدون نصب چیزی در محلی ، خوشه ها ، پایگاه داده ها و ایندکس ها را مستقیماً در ابر ایجاد کنند. در اصل ، این MongoDB در ابر است ، کاربران می توانند با ثبت نام از وب سایت رسمی خود که در زیر ارائه شده است ، یک حساب کاربری ایجاد کنند –
ATLAS MongoDB: پایگاه داده اسناد ابری | منگوله
پس از ورود به سیستم برای اولین بار ، فقط مراحل ذکر شده در مستندات زیر را دنبال کنید تا یک خوشه رایگان بچرخید.
با اطلس شروع کنید – اطلس MongoDB
پس از ایجاد خوشه ، وقت آن است که یک پایگاه داده و یک مجموعه ایجاد کنید. اکنون ، از آنجا که MongoDB یک پایگاه داده NOSQL است ، ما ابتدا باید یک پایگاه داده ایجاد کنیم (برخلاف طرحواره برای پایگاه داده های SQL ، اگرچه مفهوم یکسان است) ، سپس در داخل پایگاه داده باید یک مجموعه را ایجاد کنیم ، که در آن می توانیم اسناد را ذخیره کنیم (این است مانند ایجاد یک جدول در یک پایگاه داده). اگر این احساس گیج کننده است ، لطفاً به مقاله زیر نحوه ایجاد یک مجموعه و پایگاه داده مراجعه کنید ، اما به یاد داشته باشید ، هیچ اسناد را اضافه نکنید ، فقط مجموعه و یک پایگاه داده ایجاد کنید.
اتصال MongoDB با Python – قسمت برنامه نویسی اکنون شروع می شود
اکنون ، ما MongoDB را با Python متصل خواهیم کرد ، تا بتوانیم بقیه مراحل را بصورت برنامه ای انجام دهیم ، بدون استفاده از UI برای یک ثانیه.
برای اتصال و دسترسی به اطلس MongoDB از طریق Python ، باید بسته ای به نام نصب کنیم ‘Pymongo’. می توان آن را از طریق دستور PIP زیر نصب کرد.
pip install pymongo
پس از نصب ، ما Mongoclient کلاس را برای اتصال با MongoDB از طریق Python وارد می کنیم. برای این کار ما به رشته اتصال نیاز خواهیم داشت ، که می توان در آن یافت شد راننده تنظیمات پس از کلیک بر روی وصل کردن از خوشه این روند را می توان در لینک زیر ، مرحله – 2 یافت.
شروع سریع: شروع با اطلس MongoDB و Python | منگوله
پس از یافتن رشته اتصال ، موارد زیر را برای اتصال با MongoDB بنویسید و اجرا کنید
from pymongo import MongoClientclient = MongoClient("YOUR_CONNECTION_URL")
dbName = "YOUR_DATABASE_NAME"
collectionName = "YOUR_COLLECTION_NAME"
collection = client[dbName][collectionName]
این امر باعث ایجاد ارتباط با MongoDB می شود ، در صورت عدم وجود خطایی ، ارتباط با MongoDB با موفقیت انجام شده است.
پس از برقراری ارتباط ، بیایید در مورد تمام بسته های دیگری که برای انجام کل فرآیند RAG ، جدا از Pymongo ، نیاز داریم ، صحبت کنیم. بسته های زیر را از طریق PIP نصب کنید
pip install langchain
pip install langchain_databricks
pip install langchain_mongodb
ما فقط به این سه بسته نیاز داریم تا کل فرآیند را انجام دهند. پس از نصب موفقیت آمیز ، بیایید تمام کلاس های لازم را از این بسته ها وارد کنیم.
وارد کردن کلاسهای لازم از بسته ها
from pymongo import MongoClient
from langchain_mongodb.vectorstores import MongoDBAtlasVectorSearch
from langchain.document_loaders import TextLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.chains import RetrievalQA
from langchain_databricks import ChatDatabricks
from langchain_databricks import DatabricksEmbeddings
همانطور که قبلاً ارتباط با Databricks را برقرار کرده ایم ، بیایید فقط داده های خود را بارگیری کنیم و این کار را انجام دهیم چاک دهی با استفاده از RevursIveCharacterTextSplitter. ما هر اندازه را به عنوان 1000 با همپوشانی 100 کاراکتر و یک پاراگراف جدید (\ n \ n) به عنوان جداکننده نگه می داریم.
# Importing the data using TextLoader
loader = TextLoader("story.txt")
data = loader.load()# Configuring the Chunking strategy
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=100,
separators="\n\n"
)
# keeping the chunks in this variable
chunked_docs = text_splitter.split_documents(data)
پیکربندی مدل های LLM و تعبیه
در مرحله بعد ، ما مدل جاسازی و مدل زبان بزرگ خود را که می خواهیم از آن استفاده کنیم پیکربندی خواهیم کرد. اکنون ، در اینجا ما از مدل هایی که به عنوان نقطه پایانی در پورتال Databricks استفاده می شوند ، استفاده خواهیم کرد. اگر کسی دسترسی به پایگاه داده را نداشته باشد ، می تواند با رویکرد منظم استفاده از کلاسهای OpenAiembeddings و Chatopenai استفاده کند و بر این اساس آنها را پیکربندی کند.
embeddings = DatabricksEmbeddings(
endpoint="databricks-gte-large-en"
)llm = ChatDatabricks(
target_uri="databricks",
endpoint="databricks-meta-llama-3-1-70b-instruct",
temperature=0.0,
)
ما استفاده خواهیم کرد GTE بزرگ مدل تعبیه شده و متا لاما 3.1 70B دستورالعمل مدل های این نسخه ی نمایشی.
ایجاد یک فهرست جستجوی بردار در اطلس MongoDB
اکنون ، پس از انجام تمام پیکربندی ها ، ما یک شاخص جستجوی بردار در اطلس ایجاد خواهیم کرد ، که در آن تعبیه های خود را ذخیره می کنیم و بعداً از آنها برای انجام پارچه استفاده می کنیم. دو روش برای ایجاد شاخص جستجوی بردار وجود دارد ، یکی یا UI یا روش دیگر از طریق کد است. اکنون Atlas نام شاخص جستجوی پیش فرض را در اختیار ما قرار می دهدVector_index ‘، اگر کسی بخواهد با این نام برود ، می تواند کد زیر را بنویسد و اجرا کند
vectorStore = MongoDBAtlasVectorSearch.from_documents(
chunked_docs,
embeddings,
collection=collection).create_vector_search_index(
dimensions=1024
)
این یک فهرست جستجوی بردار به نام ایجاد می کند بردار_دکس با ابعاد 1024 ، در داخل مجموعه ای که قبلاً ایجاد کردیم. ما فقط اسناد خرد شده را در کنار تعبیه ها و پیکربندی مجموعه ای که از طریق آن به اطلس متصل شده ایم ، عبور می دهیم.
تصویر قبل از ایجاد شاخص جستجو (اجرای کد فوق)
تصویر پس از اجرای کد فوق (ایجاد شاخص جستجوی پیش فرض)
همانطور که اکنون می بینیم ، پس از اجرای کد فوق ، فهرست جستجوی ما با نام پیش فرض ‘بردار_دکس‘ایجاد شده است و 129 سند درج شده است (که تعداد تکه های ایجاد شده در ابتدا است)
اما اگر کسی بخواهد یک قدم جلوتر برود و با ارائه نام سفارشی خود ، شاخص جستجوی خود را ایجاد کند ، باید در کد فوق تغییراتی ایجاد کنیم. ابتدا باید با استفاده از نامی که توسط کاربر ارائه شده است ، شاخص سفارشی را ایجاد کنیم و سپس تعبیه ها را در آن وارد کنیم ، این کار را نمی توان با یک کار انجام داد (اگر به صورت برنامه ای انجام شود).
ایجاد فهرست جستجوی بردار سفارشی
MongoDBAtlasVectorSearch(index_name="mongo_rag",
collection=collection,
embedding=embeddings).create_vector_search_index(
dimensions=1024
)
در اینجا ، ما در حال ایجاد یک شاخص به نام هستیم mongo_rag ابتدا با ابعاد 1024 ، اکنون ابعاد بسیار مهم است که آیا ما شاخص پیش فرض یا شاخص سفارشی را ایجاد می کنیم ، زیرا اگر این بعد با یکی از مدل های تعبیه مطابقت نداشته باشد ، پس این یک مسئله مهم خواهد بود ، برنامه حتی اجرا نخواهد شد. برای مدل تعبیه شده در اینجا یعنی GTE-LARGE ، ابعاد 1024 است.
تصویر پس از ایجاد فهرست سفارشی (هنوز تعبیه شده اضافه نشده است)
همانطور که در اینجا می بینیم ، این شاخص با موفقیت ایجاد شده است ، اما اسناد هنوز هم در 129 ارزش هستند زیرا ما در اینجا تعبیه نشده ایم. ما باید ابتدا تکه های قبلی را حذف کنیم ، در غیر این صورت ما دوباره همان تکه ها را فشار خواهیم داد ، که این یک تکرار خواهد بود که ممکن است توهم را معرفی کند.
جمع آوری شاخص سفارشی با تعبیه
با استفاده از کد زیر ، می توانیم شاخص سفارشی را با تعبیه ها جمع کنیم
vectorStore = MongoDBAtlasVectorSearch.from_documents(index_name="mongo_rag",
embedding=embeddings,
documents=chunked_docs,
collection=collection)
در این رویکرد ، ضمن قرار دادن تعبیه ها در شاخص جستجو ، ما در اینجا index_name را ارائه می دهیم ، این به ما اجازه می دهد تا شاخص ها را در آن شاخص جستجوی خاص ذخیره کنیم.
طراحی عملکرد RAG
در این مرحله ، ما فقط با استفاده از LLMS و پیکربندی نقطه پایانی که قبلاً تعریف کردیم ، یک تابع RAG عمومی را طراحی خواهیم کرد.
def query_data(query):
# Perform Atlas Vector Search using Langchain's vectorStore
# similarity_search returns MongoDB documents most similar to the query docs = vectorStore.similarity_search(query, k=3)
# Putting the similar chunks into a list to print it later
similar_chunks = [chunk for chunk in docs]
# Setting up the retriever defined using MongDBAtlasVectorSearch
retriever = vectorStore.as_retriever()
# Load "stuff" documents chain. Stuff documents chain takes a list of documents,
# inserts them all into a prompt and passes that prompt to an LLM.
qa = RetrievalQA.from_chain_type(llm, chain_type="stuff", retriever=retriever)
# Execute the chain
retriever_output = qa.invoke(query)
# Return Atlas Vector Search output, and output generated using RAG Architecture
return (f"Similar Chunks\n-{similar_chunks}\n, Answer-{retriever_output}")
اکنون ما یک سؤال نمونه را تصویب می کنیم و بررسی می کنیم که چگونه کار می کند
query = "Explain the Character of Macbeth"
query_data(query)
پاسخ
'Similar Chunks\n-[Document(metadata={\'_id\': \'6798ecf0a3137ba55ff6b544\', \'source\': \'story.txt\'}, page_content="1606\\nTHE TRAGEDY OF MACBETH\\n\\n\\nby William Shakespeare\\n\\n\\n\\nDramatis Personae\\n\\n DUNCAN, King of Scotland\\n MACBETH, Thane of Glamis and Cawdor, a general in the King\'s\\narmy\\n LADY MACBETH, his wife\\n MACDUFF, Thane of Fife, a nobleman of Scotland\\n LADY MACDUFF, his wife\\n MALCOLM, elder son of Duncan\\n DONALBAIN, younger son of Duncan\\n BANQUO, Thane of Lochaber, a general in the King\'s army\\n FLEANCE, his son\\n LENNOX, nobleman of Scotland\\n ROSS, nobleman of Scotland\\n MENTEITH nobleman of Scotland\\n ANGUS, nobleman of Scotland\\n CAITHNESS, nobleman of Scotland\\n SIWARD, Earl of Northumberland, general of the English forces\\n YOUNG SIWARD, his son\\n SEYTON, attendant to Macbeth\\n HECATE, Queen of the Witches\\n The Three Witches\\n Boy, Son of Macduff \\n Gentlewoman attending on Lady Macbeth\\n An English Doctor\\n A Scottish Doctor\\n A Sergeant\\n A Porter\\n An Old Man\\n The Ghost of Banquo and other Apparitions\\n Lords, Gentlemen, Officers, Soldiers, Murtherers, Attendants,"), Document(metadata={\'_id\': \'6798ecf0a3137ba55ff6b5a7\', \'source\': \'story.txt\'}, page_content="Was a most sainted king; the queen that bore thee,\\n Oftener upon her knees than on her feet,\\n Died every day she lived. Fare thee well!\\n These evils thou repeat\'st upon thyself\\n Have banish\'d me from Scotland. O my breast,\\n Thy hope ends here!\\n MALCOLM. Macduff, this noble passion,\\n Child of integrity, hath from my soul\\n Wiped the black scruples, reconciled my thoughts\\n To thy good truth and honor. Devilish Macbeth\\n By many of these trains hath sought to win me\\n Into his power, and modest wisdom plucks me\\n From over-credulous haste. But God above\\n Deal between thee and me! For even now\\n I put myself to thy direction and \\n Unspeak mine own detraction; here abjure\\n The taints and blames I laid upon myself,\\n For strangers to my nature. I am yet\\n Unknown to woman, never was forsworn,\\n Scarcely have coveted what was mine own,\\n At no time broke my faith, would not betray\\n The devil to his fellow, and delight"), Document(metadata={\'_id\': \'6798ecf0a3137ba55ff6b57d\', \'source\': \'story.txt\'}, page_content="Particular addition, from the bill\\n That writes them all alike; and so of men. \\n Now if you have a station in the file,\\n Not i\' the worst rank of manhood, say it,\\n And I will put that business in your bosoms\\n Whose execution takes your enemy off,\\n Grapples you to the heart and love of us,\\n Who wear our health but sickly in his life,\\n Which in his death were perfect.\\n SECOND MURTHERER. I am one, my liege,\\n Whom the vile blows and buffets of the world\\n Have so incensed that I am reckless what\\n I do to spite the world.\\n FIRST MURTHERER. And I another\\n So weary with disasters, tugg\'d with fortune,\\n That I would set my life on any chance,\\n To mend it or be rid on\'t.\\n MACBETH. Both of you\\n Know Banquo was your enemy.\\n BOTH MURTHERERS. True, my lord.\\n MACBETH. So is he mine, and in such bloody distance\\n That every minute of his being thrusts \\n Against my near\'st of life; and though I could")]\n, Answer-{\'query\': \'Explain the Character of Macbeth\', \'result\': "Based on the provided context, Macbeth is a complex character who is the Thane of Glamis and Cawdor, and a general in the King\'s army. He is a prominent figure in the play and is driven by a desire for power and prestige. \\n\\nInitially, Macbeth is portrayed as a respected and accomplished military leader, but as the play progresses, his darker qualities are revealed. He is shown to be ruthless, ambitious, and willing to do whatever it takes to achieve his goals, including murder. \\n\\nMacbeth\'s relationship with his wife, Lady Macbeth, also plays a significant role in shaping his character. He is influenced by her goading and encouragement, which pushes him to commit regicide and seize the throne. \\n\\nHowever, Macbeth\'s actions are also motivated by a sense of insecurity and paranoia, as he becomes increasingly obsessed with the idea of being overthrown and killed. This fear drives him to order the murder of his friend Banquo and his family, further highlighting his descent into darkness and tyranny.\\n\\nThroughout the play, Macbeth\'s character undergoes a significant transformation, from a respected nobleman to a tyrannical and isolated ruler. His downfall is ultimately sealed when he is killed by Macduff, and his head is brought to Malcolm, the rightful king. \\n\\nIt\'s worth noting that the provided context only gives a glimpse into Macbeth\'s character, and a more comprehensive understanding would require a broader analysis of the entire play."}'
خروجی را می توان بر اساس نیاز اصلاح کرد.
منتشر شده از طریق به سمت هوش مصنوعی