สรุปเรื่อง 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)