۲۹ شهریور ۱۴۰۳

Techboy

اخبار و اطلاعات روز تکنولوژی

نسل افزوده بازیابی، گام به گام

RAG یک رویکرد عملی و موثر برای استفاده از مدل های زبان بزرگ در سازمان است. بیاموزید که چگونه کار می کند، چرا به آن نیاز داریم، و چگونه آن را با OpenAI و LangChain پیاده سازی کنیم.

RAG یک رویکرد عملی و موثر برای استفاده از مدل های زبان بزرگ در سازمان است. بیاموزید که چگونه کار می کند، چرا به آن نیاز داریم، و چگونه آن را با OpenAI و LangChain پیاده سازی کنیم.

به طور معمول، استفاده از مدل‌های زبان بزرگ (LLM) در شرکت به دو دسته کلی تقسیم می‌شود. اولین مورد جایی است که LLM یک کار مرتبط با زبان مانند نوشتن یک پست وبلاگ، تهیه پیش نویس ایمیل، یا بهبود گرامر یا لحن ایمیلی را که قبلاً تهیه کرده اید را خودکار می کند. بیشتر اوقات این نوع وظایف شامل اطلاعات محرمانه شرکت نمی شود.

دسته دوم شامل پردازش اطلاعات داخلی شرکت، مانند مجموعه‌ای از اسناد (PDF، صفحات گسترده، ارائه‌ها، و غیره) است که نیاز به تجزیه و تحلیل، خلاصه‌سازی، پرس و جو یا به‌طور دیگری در یک کار مبتنی بر زبان دارند. چنین وظایفی شامل پرسیدن سؤالات دقیق در مورد پیامدهای یک بند در یک قرارداد، به عنوان مثال، یا ایجاد تصویری از پیش بینی های فروش برای راه اندازی پروژه آینده است.

دو دلیل وجود دارد که چرا استفاده از یک LLM در دسترس عموم مانند ChatGPT  ممکن است برای پردازش اسناد داخلی مناسب نباشد. رازداری اولین و بدیهی است. اما دلیل دوم، همچنین مهم، این است که داده های آموزشی یک LLM عمومی شامل اطلاعات داخلی شرکت شما نمی شود. از این رو بعید است که LLM وقتی در مورد آن اطلاعات سؤال می شود، پاسخ های مفیدی بدهد.

 نسل افزایش یافته بازیابی یا RAG را وارد کنید. RAG تکنیکی است که برای تقویت یک LLM با داده های خارجی، مانند اسناد شرکت شما، استفاده می شود که دانش و زمینه مورد نیاز مدل را برای تولید خروجی دقیق و مفید برای مورد استفاده خاص شما فراهم می کند. RAG یک رویکرد عملی و موثر برای استفاده از LLM در سازمان است.

در این مقاله، من به طور خلاصه نحوه عملکرد RAG را توضیح می‌دهم، نمونه‌هایی از نحوه استفاده از RAG را فهرست می‌کنم و یک مثال کد برای راه‌اندازی یک چارچوب RAG ساده ارائه می‌دهم.

نحوه بازیابی-افزایش نسل

همانطور که از نام آن پیداست، RAG از دو بخش تشکیل شده است-یکی بازیابی و نسل دیگر. اما این چیز زیادی را روشن نمی کند. مفیدتر است که RAG را به عنوان یک فرآیند چهار مرحله ای در نظر بگیرید. مرحله اول یک بار انجام می شود و سه مرحله دیگر به تعداد دفعات مورد نیاز انجام می شود.

چهار مرحله تولید افزایش یافته بازیابی:

  1. حذف اسناد داخلی در یک پایگاه داده برداری. این مرحله ممکن است نیاز به تمیز کردن، قالب‌بندی و تکه‌شدن داده‌های زیادی داشته باشد، اما این یک هزینه اولیه و یکباره است. (برای یک آغازگر سریع در پایگاه داده های برداری به این مقاله مراجعه کنید.)
  2. یک پرسش به زبان طبیعی، به عنوان مثال، سؤالی که یک انسان می‌خواهد از LLM بپرسد.
  3. تقویت پرس و جو با داده های بازیابی شده با استفاده از جستجوی تشابه پایگاه داده برداری. در این مرحله پیش از ارسال درخواست به LLM، زمینه از ذخیره‌سازی اسناد به درخواست اضافه می‌شود. اعلان به LLM دستور می دهد تا در زمینه محتوای اضافی پاسخ دهد. چارچوب RAG این کار را در پشت صحنه با استفاده از مؤلفه‌ای به نام retriever انجام می‌دهد که جستجو را اجرا می‌کند و زمینه مربوطه را اضافه می‌کند.
  4. تولید پاسخ به درخواست افزوده شده توسط LLM.
Angular 14 برای اضافه کردن فرم‌های واکنشی کاملاً تایپ‌شده

با تمرکز LLM بر روی مجموعه سند، RAG کمک می کند تا اطمینان حاصل شود که مدل پاسخ های مرتبط و دقیقی را تولید می کند. در عین حال، RAG به جلوگیری از پاسخ های خودسرانه یا مزخرف کمک می کند، که معمولاً در ادبیات به عنوان “توهم” نامیده می شود.

از دیدگاه کاربر، نسل افزوده شده با بازیابی تفاوتی با پرسیدن سوال از هر LLM با رابط چت ندارد – به جز اینکه سیستم اطلاعات بیشتری در مورد محتوای مورد نظر می‌داند و پاسخ‌های بهتری می‌دهد.

>

فرآیند RAG از دیدگاه کاربر:

  1. یک انسان سوالی از LLM می پرسد.
  2. سیستم RAG ذخیره اسناد (پایگاه داده برداری) را جستجو می کند و محتوایی را که ممکن است مرتبط باشد استخراج می کند.
  3. سیستم RAG سؤال کاربر را به اضافه محتوای اضافی بازیابی شده از فروشگاه اسناد به LLM ارسال می‌کند.
  4. اکنون LLM می داند که پاسخی را ارائه دهد که در زمینه محتوای بازیابی شده از فروشگاه اسناد (پایگاه داده برداری) منطقی باشد.
  5. سیستم RAG پاسخ را از LLM برمی گرداند. سیستم RAG همچنین می‌تواند پیوندهایی را به اسنادی که برای پاسخ به سؤال استفاده می‌شوند، ارائه دهد.

استفاده از موارد برای بازیابی-افزایش تولید

موارد استفاده برای RAG متنوع است و به سرعت در حال رشد است. اینها فقط چند نمونه از نحوه و مکان استفاده از RAG هستند.

موتورهای جستجو

موتورهای جستجو RAG را پیاده سازی کرده اند تا قطعه های دقیق تر و به روزتری را در نتایج جستجوی خود ارائه دهند. هر کاربرد LLM که باید با اطلاعات دائماً به روز شده همراه باشد، کاندیدای خوبی برای RAG است.

سیستم های پاسخگویی به پرسش

RAG برای بهبود کیفیت پاسخ‌ها در سیستم‌های پاسخ‌گویی به پرسش استفاده شده است. مدل مبتنی بر بازیابی متن‌ها یا اسناد مرتبط حاوی پاسخ را پیدا می‌کند (با استفاده از جستجوی شباهت)، سپس یک پاسخ مختصر و مرتبط بر اساس آن اطلاعات ایجاد می‌کند.

تجارت الکترونیک

RAG را می‌توان با ارائه توصیه‌های مرتبط‌تر و شخصی‌شده‌تر محصول برای بهبود تجربه کاربر در تجارت الکترونیک استفاده کرد. با بازیابی و ترکیب اطلاعات مربوط به تنظیمات برگزیده کاربر و جزئیات محصول، RAG می‌تواند توصیه‌های دقیق و مفیدتری برای مشتریان ایجاد کند.

مراقبت های بهداشتی

RAG پتانسیل بالایی در صنعت مراقبت های بهداشتی دارد، جایی که دسترسی به اطلاعات دقیق و به موقع بسیار مهم است. با بازیابی و ترکیب دانش پزشکی مرتبط از منابع خارجی، RAG می‌تواند به ارائه پاسخ‌های دقیق‌تر و آگاه به زمینه در برنامه‌های مراقبت‌های بهداشتی کمک کند. چنین برنامه‌هایی اطلاعات قابل دسترسی توسط پزشک انسانی را افزایش می‌دهند، که در نهایت تماس را برقرار می‌کند و نه مدل را.

قانونی

RAG را می توان به شدت در سناریوهای قانونی اعمال کرد، مانند M&A، که در آن اسناد حقوقی پیچیده زمینه ای را برای پرس و جو فراهم می کند و امکان پیمایش سریع را در پیچ و خم مسائل نظارتی فراهم می کند.

معرفی نشانه‌ها و جاسازی‌ها

قبل از اینکه به مثال کد خود بپردازیم، باید نگاهی دقیق‌تر به فرآیند جذب سند بیندازیم. برای اینکه بتوانیم اسناد را در یک پایگاه داده برداری برای استفاده در RAG وارد کنیم، باید آنها را به صورت زیر از قبل پردازش کنیم:

  1. متن را استخراج کنید.
  2. متن را نشانه گذاری کنید.
  3. بردارها را از نشانه ها ایجاد کنید.
  4. بردارها را در پایگاه داده ذخیره کنید.

این به چه معناست؟

یک سند ممکن است PDF یا HTML یا فرمت دیگری باشد، و ما به نشانه گذاری یا قالب اهمیتی نمی دهیم. تنها چیزی که ما می خواهیم محتوا است—متن خام.

در داخل مراکز داده ابری هوش مصنوعی Azure امروز

بعد از استخراج متن، باید آن را به تکه‌هایی تقسیم کنیم که توکن نامیده می‌شوند، سپس این نشانه‌ها را به بردارهایی با ابعاد بالا از اعداد ممیز شناور، معمولاً ۷۶۸ یا ۱۰۲۴ در اندازه یا حتی بزرگ‌تر، نگاشت می‌کنیم. این بردارها را embeddings می نامند، ظاهراً به این دلیل که ما یک نمایش عددی از یک تکه متن را در یک فضای برداری جاسازی می کنیم.

راه های زیادی برای تبدیل متن به جاسازی های برداری وجود دارد. معمولا این کار با استفاده از ابزاری به نام مدل embedding انجام می شود که می تواند یک مدل LLM یا یک رمزگذار مستقل باشد. در مثال RAG خود در زیر، از مدل تعبیه OpenAI استفاده خواهیم کرد.

یادداشتی درباره LangChain

LangChain چارچوبی برای Python و TypeScript/JavaScript است که ساخت برنامه‌هایی را که توسط مدل‌های زبانی ارائه می‌شوند آسان‌تر می‌کند. اساساً، LangChain به شما امکان می‌دهد تا عوامل یا وظایف را برای تعامل با مدل‌ها، ارتباط با منابع داده (از جمله فروشگاه‌های داده برداری) و کار با داده‌ها و پاسخ‌های مدل خود به هم متصل کنید.

LangChain برای پرش به کاوش LLM بسیار مفید است، اما به سرعت در حال تغییر است. در نتیجه، برای همگام نگه داشتن تمام کتابخانه ها کمی تلاش می شود، به خصوص اگر برنامه شما دارای قطعات متحرک زیادی با کتابخانه های مختلف پایتون در مراحل مختلف تکامل باشد. یک چارچوب جدیدتر، LlamaIndex نیز ظاهر شده است. LlamaIndex به طور خاص برای برنامه های داده LLM طراحی شده است، بنابراین بیشتر جنبه سازمانی دارد.

هر دو LangChain و LlamaIndex دارای کتابخانه های گسترده ای برای جذب، تجزیه و استخراج داده ها از مجموعه وسیعی از منابع داده، از متن، PDF، و ایمیل گرفته تا سیستم های پیام رسانی و پایگاه های داده هستند. استفاده از این کتابخانه ها درد تجزیه هر نوع داده مختلف و استخراج محتوا از قالب بندی را کم می کند. این خود ارزش ورودی را دارد.

یک مثال ساده RAG

ما یک برنامه RAG ساده “Hello World” را با استفاده از Python، LangChain و یک مدل چت OpenAI خواهیم ساخت. با ترکیب قدرت زبانی یک LLM با دانش دامنه یک سند واحد، برنامه کوچک ما به ما امکان می‌دهد که سؤالات مدل را به زبان انگلیسی بپرسیم و با مراجعه به محتوای سند ما به سؤالات ما پاسخ می‌دهد.

برای سند خود، از متن ۷ فوریه رئیس جمهور بایدن استفاده خواهیم کرد. ، ۲۰۲۳، آدرس ایالت اتحادیه. اگر می‌خواهید این کار را در خانه امتحان کنید، می‌توانید یک سند متنی سخنرانی را در لینک زیر دانلود کنید.

نسخه درجه تولید این برنامه به مجموعه‌های خصوصی اسناد (اسناد Word، PDF، و غیره) اجازه می‌دهد تا با سؤالات انگلیسی مورد پرسش قرار گیرند. در اینجا ما در حال ساختن یک سیستم ساده هستیم که حریم خصوصی ندارد، زیرا سند را به یک مدل عمومی ارسال می کند. لطفاً این برنامه را با استفاده از اسناد خصوصی اجرا نکنید.

ما از مدل‌های جاسازی و زبان میزبانی شده از OpenAI و open- استفاده خواهیم کرد منبع کتابخانه FAISS (Facebook AI Similarity Search) به عنوان فروشگاه برداری ما، برای نشان دادن پایان برنامه RAG تا با کمترین تلاش ممکن به پایان برسد. در مقاله بعدی، یک مثال ساده دوم را با استفاده از یک LLM کاملاً محلی بدون ارسال داده به خارج از برنامه خواهیم ساخت. استفاده از مدل محلی مستلزم کار بیشتر و قطعات متحرک بیشتر است، بنابراین اولین مثال ایده آل نیست.

برای ساختن سیستم RAG ساده خود به اجزای زیر نیاز داریم:

  1. یک مجموعه سند. در اینجا ما فقط از یک سند استفاده خواهیم کرد.
  2. یک لودر برای سند. این کد متن را از سند استخراج می کند و آن را برای ایجاد یک جاسازی از قبل پردازش می کند (توکن می کند).
  3. یک مدل تعبیه شده. این مدل سند از پیش پردازش شده را می گیرد و جاسازی هایی ایجاد می کند که نشان دهنده تکه های سند است.
  4. ذخیره داده های برداری با نمایه ای برای جستجوی شباهت.
  5. یک LLM بهینه شده برای پاسخگویی به سوالات و آموزش.
  6. الگوی چت برای تعامل با LLM.
چرا کسب و کارها از استفاده از داده ها بدشان می آید؟

مراحل آماده سازی:

pip install -U  langchain
pip install -U langchain_community
pip install -U langchain_openai

کد منبع سیستم RAG ما:

# We start by fetching a document that loads the text of President Biden’s 2023 State of the Union Address

from langchain_community.document_loaders import TextLoader
loader = TextLoader('./stateOfTheUnion2023.txt')

from langchain.text_splitter import CharacterTextSplitter
from langchain_community.vectorstores import FAISS
from langchain_openai.embeddings import OpenAIEmbeddings
import os
os.environ["OPENAI_API_KEY"] =<you will need to get an API ket from OpenAI>

# We load the document using LangChain’s handy extractors, formatters, loaders, embeddings, and LLMs

documents = loader.load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
texts = text_splitter.split_documents(documents)

# We use an OpenAI default embedding model
# Note the code in this example does not preserve privacy

embeddings = OpenAIEmbeddings()

# LangChain provides API functions to interact with FAISS

db = FAISS.from_documents(texts, embeddings)  

# We create a 'retriever' that knows how to interact with our vector database using an augmented context
# We could construct the retriever ourselves from first principles but it's tedious
# Instead we'll use LangChain to create a retriever for our vector database

retriever = db.as_retriever()
from langchain.agents.agent_toolkits import create_retriever_tool
tool = create_retriever_tool(
    retriever,
    "search_state_of_union",
    "Searches and returns documents regarding the state-of-the-union."
)
tools = [tool]

# We wrap an LLM (here OpenAI) with a conversational interface that can process augmented requests

from langchain.agents.agent_toolkits import create_conversational_retrieval_agent

# LangChain provides an API to interact with chat models

from langchain_openai.chat_models import ChatOpenAI
llm = ChatOpenAI(temperature = 0)
agent_executor = create_conversational_retrieval_agent(llm, tools, verbose=True)

input = "what is NATO?"
result = agent_executor.invoke({“input": input})

# Response from the model

input = "When was it created?"
result = agent_executor.invoke({“input": input})

# Response from the model 

خروجی rag

همانطور که در تصویر بالا نشان داده شده است، پاسخ مدل به سوال اول ما کاملاً دقیق است:

ناتو مخفف سازمان پیمان آتلانتیک شمالی است. این یک اتحاد نظامی بین دولتی است که در سال ۱۹۴۹ تشکیل شد. هدف اصلی ناتو تضمین دفاع جمعی از کشورهای عضو آن است. این کشور متشکل از ۳۰ کشور عضو است که اکثراً از آمریکای شمالی و اروپا هستند. این سازمان ارزش های دموکراتیک، همکاری و امنیت را در میان اعضای خود ترویج می کند. ناتو همچنین نقش مهمی در مدیریت بحران و عملیات حفظ صلح در سراسر جهان ایفا می کند.

زنجیره تمام شده.

و پاسخ مدل به سوال دوم دقیقاً درست است:

ناتو در ۴ آوریل ۱۹۴۹ ایجاد شد.

زنجیره تمام شده.

همانطور که دیدیم، استفاده از چارچوبی مانند LangChain اولین قدم های ما را در برنامه های LLM بسیار ساده می کند. اگر تازه شروع کرده اید و می خواهید چند نمونه اسباب بازی را امتحان کنید، اکیداً LangChain توصیه می شود. این به شما کمک می‌کند تا به جای گیر کردن در لوله‌کشی، مستقیماً به گوشت تولید افزوده‌شده بازیابی، یعنی جذب سند و تعاملات بین پایگاه داده برداری و LLM برسید.

برای مقیاس‌بندی به یک مجموعه بزرگ‌تر و استقرار یک برنامه تولید، به بررسی عمیق‌تری در LLM‌های محلی، پایگاه‌های داده برداری، و جاسازی‌ها نیاز است. به طور طبیعی، استقرار تولید شامل جزئیات و سفارشی سازی بسیار بیشتری خواهد بود، اما همان اصول اعمال می شود. ما LLM های محلی، پایگاه های داده برداری، و جاسازی ها را با جزئیات بیشتری در مقاله های آینده اینجا بررسی خواهیم کرد.