تلخيص النصوص الطويلة باستخدام 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 4 طرق للتعامل في الحالة التي يتجاوز فيها كلمة الاستعلام لمهمة السلسلة حد الطول المحدّد للفردة الكلية في النموذج الكبير للغة.

إذا كنت بحاجة إلى ترجمة هذه الصفحة إلى لغة عربية أخرى، يُرجى مراسلتنا أولاً للحصول على موافقة.

  • stuff
  • map_reduce
  • refine
  • map_rerank

نوع stuff

هذا هو النوع الافتراضي في LangChain، حيث يُرسل جميع محتويات الوثيقة إلى نموذج LLM لتلخيصها دفعة واحدة. لذلك، يُطلق عليه وضع stuffing. إذا كان محتوى الوثيقة طويلاً جدًا، فسيتجاوز بالتأكيد الحد الأقصى للرموز في LLM.

نوع map_reduce

تُرسل هذه الطريقة أولاً كل قطعة وثيقة إلى نموذج LLM للتلخيص الفردي، ثم يتم دمج جميع التلخيصات، وأخيرًا يتم تقديم تلخيص شامل للذكاء الاصطناعي، وهذا مشابه لمفهوم مكتبات وظيفة الخريطة-التقليص في العديد من لغات البرمجة.

نوع 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)