สรุปเรื่อง AI Text Summarization
แบบจำลองขนาดใหญ่ (LLM) จะมีความยาวของคำที่ต้องการ input prompt ที่แตกต่างกัน หากเราต้องการสรุปบทความที่ยาวมาก แต่ความยาวของบทความเกินขีดจำกัดสูงสุดของแบบจำลอง เราจึงไม่สามารถนำบทความทั้งหมดมาให้แบบจำลอง AI ในกรณีแบบนี้ 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)
การใช้งาน Chain สำหรับสรุปข้อความที่ได้รับการห่อหุ้มโดย LangChain เป็นเรื่องง่าย แต่หากคุณต้องการปรับพารามิเตอร์บางอย่าง โปรดอ้างถึงเนื้อหาดังต่อไปนี้ ตัวอย่างเช่น ตัวอย่างข้างต้นใช้ต้นแบบคำของคำ prompt ที่ซับซ้อน ซึ่งอาจจะไม่เป็นมิตรต่อภาษาจีน คุณสามารถเปลี่ยนแปลงเป็นต้นแบบสำหรับคำ prompt ของคุณเองได้ เป็นต้น
อธิบายพารามิเตอร์ชนิด Chain_type
LangChain ออกแบบมี 4 วิธีการ สำหรับกรณีที่คำ prompt ของงาน Chain เกินขีดจำกัดความยาวของ token ของ LLM
4 ประเภทของ chain_type คือดังนี้:
- stuff
- map_reduce
- refine
- map_rerank
ประเภท stuff
นี่คือประเภทเริ่มต้นของ LangChain ซึ่งส่งเนื้อหาของเอกสารทั้งหมดไปยังแบบจำลอง LLM เพื่อสรุปทั้งหมดในครั้งเดียว ดังนั้น มันเรียกว่าโหลเฟ่ย (stuffing) ถ้าเนื้อหาของเอกสารยาวเกินไป มันคงจะเกินขีดจำกัดของ token ของ LLM แน่นอน
ประเภท map_reduce
วิธีนี้จะส่งเฉพาะรายการหนึ่งรายการไปยังแบบจำลอง LLM เพื่อสรุปแต่ละชิ้นเอกสาร จากนั้นรวมสรุปทั้งหมด และให้สรุปรวมให้แก่ AI ซึ่งเป็นอย่างใกล้เคียงกับแนวคิดของไลบราลี่ฟังก์ชัน map-reduce ในภาษาโปรแกรมไหลมาก
ประเภท refine
วิธีนี้สร้างสรุปข้อความในรูปแบบการสรุป ก่อนที่จะส่งเนื้อหาของเอกสารตัวแรกไปยังแบบจำลอง llm เพื่อสรุป จากนั้นส่งเนื้อหาสรุปของเอกสารตัวแรก + เนื้อหาของเอกสารตัวที่สองไปยังแบบจำลอง llm เพื่อสรุป ฯลฯ เพื่อให้ได้สรุปสุดท้ายสำหรับข้อความที่ยาว
ประเภท map_rerank
นี่จะใช้งานในงานตอบคำถาม มันเลือกรายการเอกสารที่เกี่ยวข้องกับคำถาม แล้วส่งไปที่แบบจำลอง llm เพื่อตอบคำถาม
ตัวอย่างของ stuff
task
นี่คือตัวอย่างการสรุปบทความโดยใช้งานประเภท stuff
ซึ่งเหมาะสำหรับบทความที่ไม่เกินขีดจำกัดความยาวของ token ของ LLM:
chain = load_summarize_chain(llm, chain_type="stuff")
chain.run(docs)
คำ Prompt แบบที่กำหนดเอง
สำหรับประเภท stuff
นี่คือตัวอย่างของคำ Prompt ที่กำหนดเอง:
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
สรุปบทความ และแน่นอนวิธีนี้จะทำให้เกิดการเรียกใช้โมเดล AI หลายรอบ
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)