خلاصهسازی متن با استفاده از زنجیره LangChain
مدلهای زبان بزرگ (LLM) مختلف محدودیتهای طول متفاوتی برای کلمات ورودی دارند. اگر نیاز به خلاصهسازی یک مقاله بلند داشته باشیم ولی طول مقاله از حداکثر محدودیت طول مدل بیشتر شود، نمیتوانیم مستقیماً کل مقاله را به مدل هوش مصنوعی وارد کنیم. در چنین حالتهایی، LangChain استراتژیها و کپسولهسازی را برای انجام این کار فراهم میکند. این فصل به طور اصلی نحوه حل مسئله خلاصهسازی متن توسط LangChain را معرفی میکند.
پیشپردازش داده
ابتدا، دادههای آزمون را آماده میکنیم. در این مثال، یک سند بلند را بارگیری کرده و سپس آن را به چندین قطعه کوچک تقسیم میکنیم.
- توجه: بارگیری داده فایل محلی در اینجا فقط به عنوان مثال استفاده شده است. در صورتی که در صنایع واقعی، ممکن است دادههای سند را از پایگاه داده خود بارگیری کنید.
from langchain import OpenAI, PromptTemplate, LLMChain
from langchain.text_splitter import CharacterTextSplitter
from langchain.chains.mapreduce import MapReduceChain
from langchain.prompts import PromptTemplate
llm = OpenAI(temperature=0)
text_splitter = CharacterTextSplitter()
with open("../../state_of_the_union.txt") as f:
state_of_the_union = f.read()
texts = text_splitter.split_text(state_of_the_union)
from langchain.docstore.document import Document
docs = [Document(page_content=t) for t in texts[:3]]
شروع کار
آسانترین راه برای خلاصهسازی متن بلند استفاده از وظیفه load_summarize_chain
ارائه شده توسط LangChain برای اجرای وظیفه خلاصهسازی متن است.
from langchain.chains.summarize import load_summarize_chain
chain = load_summarize_chain(llm, chain_type="map_reduce")
chain.run(docs)
استفاده از زنجیره خلاصهسازی متن کپسولهسازی شده ارائه شده توسط LangChain ساده است. با این حال، اگر نیاز به تنظیم پارامترهایی باشد، لطفاً به محتوای زیر مراجعه کنید. به عنوان مثال، مثال فوق از یک الگوی کلمهی ترغیب داخلی استفاده کرد که ممکن است به زبان چینی مودب نباشد. میتوانید آن را به الگوی کلمهی ترغیب خود تغییر دهید و غیره.
توضیحات پارامتر chain_type
LangChain چهار روش برای مواجهه با مواردی که کلمه ترغیب وظیفه طول توکن محدودیت LLM را باز میکند، طراحی کرده است.
چهار نوع chain_type به صورت زیر است:
- stuff
- map_reduce
- refine
- map_rerank
نوع stuff
این شیوه نوع پیشفرض LangChain است، که تمام محتوای سند را به مدل LLM برای خلاصهسازی یکجا ارسال میکند. بنابراین، به شیوهی stuffing گفته میشود. اگر محتوای سند خیلی بلند باشد، حتماً محدودیت توکن LLM را بیشتر میکند.
نوع map_reduce
این روش ابتدا هر قطعه از سند را به مدل LLM برای خلاصهسازی فردی ارسال میکند، سپس تمام خلاصهها را ترکیب میکند، و در نهایت یک خلاصه کلی را به هوش مصنوعی ارائه میدهد که مشابه مفهوم کتابخانههای تابع map-reduce در بسیاری از زبانهای برنامهنویسی است.
نوع refine
این روش به صورت خلاصهسازیکردنی یک متن از آن به شیوهای هست. ابتدا محتوای سند اول را به مدل llm برای خلاصهسازی ارسال میکند، سپس محتوای خلاصه سند اول + محتوای سند دوم را به مدل llm برای خلاصهسازی میفرستد، و غیره تا برای یک متن بلند یک خلاصهنهایی را به دست آورد.
نوع map_rerank
این نوع در وظایف پرسش و پاسخ استفاده میشود. این ابتدا قطعات سند با ارتباط بالا به سوال را انتخاب میکند و سپس آنها را به مدل llm برای پاسخ به سوال ارسال میکند.
مثال وظیفه stuff
در اینجا یک مثال از خلاصهسازی یک مقاله با استفاده از نوع stuff
است که برای مقالاتی که حداکثر محدودیت طول LLM را نمیگذرند، مناسب است:
chain = load_summarize_chain(llm, chain_type="stuff")
chain.run(docs)
الگوی کلمات ترغیبی سفارشی
برای نوع stuff
، اینجا یک مثال از الگوهای کلمات ترغیبی سفارشی است:
prompt_template = """متن زیر را خلاصه کنید:
{text}
خلاصه:"""
PROMPT = PromptTemplate(template=prompt_template, input_variables=["text"])
chain = load_summarize_chain(llm, chain_type="stuff", prompt=PROMPT)
chain.run(docs)
مثالی از وظیفه map_reduce
map_reduce
مقاله را خلاصه میکند، و البته این روش منجر به چندین فراخوانی مدل هوش مصنوعی خواهد شد.
chain = load_summarize_chain(llm, chain_type="map_reduce")
chain.run(docs)
کلمات دستوری سفارشی برای وظیفه map_reduce
prompt_template = """خلاصه کنید:
{text}
خلاصه:"""
PROMPT = PromptTemplate(template=prompt_template, input_variables=["text"])
chain = load_summarize_chain(OpenAI(temperature=0), chain_type="map_reduce", return_intermediate_steps=True, map_prompt=PROMPT, combine_prompt=PROMPT)
chain({"input_documents": docs}, return_only_outputs=True)
مثالی از وظیفه refine
به سادگی پارامتر chain_type
را به refine
تغییر دهید.
chain = load_summarize_chain(llm, chain_type="refine")
chain.run(docs)
قالب کلمات سفارشی برای وظیفه refine
در زیر مثالی از کلمات دستوری سفارشی برای وظیفه refine
آمده است:
prompt_template = """خلاصه کنید:
{text}
خلاصه:"""
PROMPT = PromptTemplate(template=prompt_template, input_variables=["text"])
refine_template = (
"وظیفه شما تولید یک خلاصه متن نهایی است\n"
"اینجا اطلاعات خلاصه موجود است: {existing_answer}\n"
"بر اساس اطلاعات زمینه جدید خلاصه موجود را بهبود بخشید\n"
"اطلاعات زمینه به شرح زیر است\n"
"------------\n"
"{text}\n"
"------------\n"
"بر اساس اطلاعات زمینه، خلاصه موجود را بهبود بخشید\n"
"اگر اطلاعات زمینه مفید نیست، اطلاعات خلاصه موجود را بازگردانید."
)
refine_prompt = PromptTemplate(
input_variables=["existing_answer", "text"],
template=refine_template,
)
chain = load_summarize_chain(OpenAI(temperature=0), chain_type="refine", return_intermediate_steps=True, question_prompt=PROMPT, refine_prompt=refine_prompt)
chain({"input_documents": docs}, return_only_outputs=True)