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

Techboy

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

ساخت یک برنامه پرسش و پاسخ با LangChain و Google PalM 2

ما می توانیم دقت یک مدل زبان بزرگ را با ارائه زمینه از منابع داده سفارشی به طور چشمگیری افزایش دهیم. LangChain این ادغام را آسان می کند.

ما می توانیم دقت یک مدل زبان بزرگ را با ارائه زمینه از منابع داده سفارشی به طور چشمگیری افزایش دهیم. LangChain این ادغام را آسان می کند.

در قست قبلی این مجموعه، به پیچیدگی‌های PalM API و ادغام یکپارچه آن با LangChain پرداختیم. مزیت بزرگ LangChain انعطاف پذیری برای تعویض مدل زبان بزرگ (LLM) تنها با تغییرات جزئی در کد ما. همانطور که دیدیم، در چارچوب LangChain، LLM به یک “پیوند” ساده در زنجیره تبدیل می‌شود که جایگزینی ساده را تسهیل می‌کند.

LangChain از تنوع موارد استفاده از جمله خلاصه‌سازی، پاسخ به سؤال، احساسات پشتیبانی می‌کند. تجزیه و تحلیل، و بیشتر. در حالی که آخرین آموزش اصول LangChain و Google PalM API را بررسی می‌کند، این مقاله به استخراج پاسخ‌ها از یک PDF از طریق ترکیب LangChain SDK و PaLM API می‌پردازد.

بیایید شروع کنیم.

PDF را دانلود کنید

یک دایرکتوری به نام داده بسازید و PDF سخنرانی جو بایدن در سال ۲۰۲۳ وضعیت اتحادیه از وب سایت پارلمان اتحادیه اروپا.

wget -O data/sotu.pdf https://www.europarl.europa.eu/RegData/etudes/ATAG/2023/739359/EPRS_ATA(2023)739359_EN.pdf

از داده‌های این PDF برای ساختن برنامه پرسش و پاسخ خود استفاده خواهیم کرد.

میسکو هیوری Qwik JS فوق العاده سریع را توضیح می دهد

وارد کردن ماژول های پایتون

با وارد کردن ماژول های پایتون فهرست شده در زیر شروع کنید.

from langchain.llms import GooglePalm
from langchain.embeddings import GooglePalmEmbeddings
from langchain.text_splitter import CharacterTextSplitter
from langchain.vectorstores import FAISS
from langchain.document_loaders import PyPDFLoader
from langchain.chains.question_answering import load_qa_chain

سند را با PyPDFLoader بارگیری کنید.

loader = PyPDFLoader ("./data/sotu.pdf")
documents = loader.load()
Convert the content into raw text.
raw_text = ''
for i, doc in enumerate(documents):
    text = doc.page_content
    if text:
        raw_text += text

تکه هایی از متن ایجاد کنید

سپس از متن خام تکه هایی از ۲۰۰ کاراکتر ایجاد می کنیم. این به افزایش سرعت جستجوها با بارگیری تکه‌های کوچک‌تر از داده‌های مرتبط کمک می‌کند.

text_splitter = CharacterTextSplitter(        
    separator = "\n",
    chunk_size = 200,
    chunk_overlap  = ۴۰,
    length_function = len,
)
texts = text_splitter.split_text(raw_text)

جاسازی‌ها را ایجاد کنید

بیایید مدل جاسازی متن را روی Google Palm تنظیم کنیم.

embeddings = GooglePalmEmbeddings() 

اکنون آماده ایم جاسازی‌ها را برای تمام تکه‌های متنی که ایجاد کرده‌ایم ایجاد کنیم.

docsearch = FAISS.from_texts(texts, embeddings)

FAISS (جستجوی شباهت هوش مصنوعی فیس بوک) یک کتابخانه محبوب از فیس بوک برای اجرای درون جستجوهای شباهت حافظه از آنجایی که سند ما کوچک است، می توانیم به این کتابخانه اعتماد کنیم. برای اسناد بزرگتر، استفاده از پایگاه داده برداری توصیه می شود.

Bootstrap 5.3.0 بر حالت تاریک، رنگ های سفارشی تأکید دارد

یک زنجیره پرسش و پاسخ ایجاد کنید

اکنون یک زنجیره پرسش و پاسخ ایجاد می کنیم که به مدل PalM منتقل می شود.

chain = load_qa_chain(GooglePalm(), chain_type="stuff")

فرآیند زنجیره سند “موارد” ساده است. این شامل جمع آوری لیستی از اسناد، وارد کردن آنها در یک درخواست و سپس ارسال آن درخواست به یک LLM است. این فرآیند زمانی مفید است که با تعداد کمی از اسناد که خیلی گسترده نیستند سر و کار دارید.

زمان آن است که اولین سوال را مطرح کنید.

query = "Explain who created the document and what is the purpose?"
docs = docsearch.similarity_search(query)
print(chain.run(input_documents=docs, question=query).strip())

palm langchain qanda 01

به نظر می رسد که پاسخ هدفمند است. من این مدل را با چند سوال دیگر تست کردم.

palm langchain qanda 02

نمونه پرسش و پاسخ PalM 2 را کامل کنید

در زیر کد کاملی وجود دارد که می‌توانید در محیط شخصی خود یا Google Colab اجرا کنید.

from langchain.llms import GooglePalm
from langchain.embeddings import GooglePalmEmbeddings
from langchain.text_splitter import CharacterTextSplitter
from langchain.vectorstores import FAISS
from langchain.document_loaders import PyPDFLoader
from langchain.chains.question_answering import load_qa_chain

loader = PyPDFLoader ("./data/sotu.pdf")
documents = loader.load()

raw_text = ''
for i, doc in enumerate(documents):
    text = doc.page_content
    if text:
        raw_text += text

text_splitter = CharacterTextSplitter( 
    separator = "\n",
    chunk_size = 200,
    chunk_overlap  = ۴۰,
    length_function = len,
)
texts = text_splitter.split_text(raw_text)

embeddings = GooglePalmEmbeddings()

docsearch = FAISS.from_texts(texts, embeddings)

query = "Explain who created the document and what is the purpose?"
docs = docsearch.similarity_search(query)
print(chain.run(input_documents=docs, question=query).strip())

query = "What is cap for insulin prescription?"
docs = docsearch.similarity_search(query)
print(chain.run(input_documents=docs, question=query).strip())

query = "Who represented Ukrain?"
docs = docsearch.similarity_search(query)
print(chain.run(input_documents=docs, question=query).strip())

در حالی که این یک تمرین ساده و سریع بود، اما نشان می‌دهد که چگونه می‌توانیم دقت مدل PalM 2 خود را با ارائه متن از منابع داده سفارشی (در این مورد از PDF) به طرز چشمگیری افزایش دهیم. در اینجا LangChain این ادغام را با گنجاندن جستجوی مشابه (که بخش‌های مرتبط سند را بازیابی می‌کند) به عنوان زمینه برای درخواست ساده کرد. LangChain گنجاندن منابع داده سفارشی و جستجوی شباهت را به عنوان بخشی از خطوط لوله ای که می سازیم، آسان می کند.

هوش مصنوعی در مرحله تایر زدن است

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