خلاصه‌سازی متن با استفاده از زنجیره 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)