تلخيص النصوص الطويلة باستخدام 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)