Ringkasan Teks Otomatis dengan LangChain
Berbagai Large Language Models (LLM) memiliki batasan panjang berbeda untuk kata-kata prompt masukan. Jika kita perlu merangkum artikel panjang, tetapi panjang artikel melebihi batas maksimum model, kita tidak bisa langsung memberikan seluruh artikel ke model kecerdasan buatan (AI). Dalam skenario seperti ini, LangChain menyediakan strategi dan enkapsulasi untuk menangani hal ini. Bab ini secara utama memperkenalkan bagaimana LangChain menyelesaikan rangkuman teks.
Pra-Pemrosesan Data
Pertama, kita persiapkan data uji. Dalam contoh ini, kita memuat dokumen panjang dan kemudian memotong dokumen itu menjadi beberapa fragmen dokumen kecil.
- Catatan: Memuat data file lokal di sini hanya untuk tujuan ilustrasi. Pada skenario bisnis aktual, Anda mungkin memuat data dokumen dari basis data sendiri.
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]]
Memulai
Cara termudah untuk merangkum teks panjang adalah dengan menggunakan tugas load_summarize_chain yang disediakan oleh LangChain untuk menjalankan tugas rangkuman teks.
from langchain.chains.summarize import load_summarize_chain
chain = load_summarize_chain(llm, chain_type="map_reduce")
chain.run(docs)
Menggunakan Rangkuman Teks yang dienkapsulasi yang disediakan oleh LangChain sederhana. Namun, jika Anda perlu menyetel beberapa parameter, silakan lihat konten berikut. Contohnya, contoh di atas menggunakan template kata prompt bawaan, yang mungkin tidak ramah terhadap Bahasa Indonesia. Anda dapat mengubahnya ke template kata prompt Anda sendiri dan sebagainya.
Penjelasan Parameter chain_type
LangChain telah merancang 4 metode penanganan untuk kasus di mana kata prompt dari tugas Chain melebihi batas panjang token LLM.
Keempat jenis chain_type adalah sebagai berikut:
- stuff
- map_reduce
- refine
- map_rerank
Jenis stuff
Ini adalah tipe default LangChain, yang mengirim semua konten dokumen ke model LLM untuk dirangkum sekaligus. Oleh karena itu, disebut mode stuff. Jika konten dokumen terlalu panjang, pasti akan melebihi batas token LLM.
Jenis map_reduce
Metode ini pertama-tama mengirim setiap fragmen dokumen ke model LLM untuk dirangkum secara individu, kemudian menggabungkan semua rangkuman, dan akhirnya memberikan rangkuman keseluruhan kepada AI, yang mirip dengan konsep pustaka fungsi map-reduce dalam banyak bahasa pemrograman.
Jenis refine
Metode ini menghasilkan rangkuman teks secara peringkas. Pertama-tama, metode ini mengirim konten dokumen pertama ke model llm untuk dirangkum, kemudian mengirim konten rangkuman dokumen pertama + konten dokumen kedua ke model llm untuk dirangkum, dan seterusnya, untuk mendapatkan rangkuman akhir untuk teks panjang.
Jenis map_rerank
Ini digunakan dalam tugas menjawab pertanyaan. Ini memilih fragmen dokumen dengan relevansi tinggi terhadap pertanyaan dan kemudian mengirimnya ke model llm untuk menjawab pertanyaan.
Contoh tugas stuff
Berikut adalah contoh merangkum artikel menggunakan tipe stuff
, yang cocok untuk artikel yang tidak melebihi batas panjang token LLM:
chain = load_summarize_chain(llm, chain_type="stuff")
chain.run(docs)
Custom Kata Prompt
Untuk tipe stuff
, berikut adalah contoh kata prompt kustom:
prompt_template = """Rangkum konten berikut:
{text}
Ringkasan:"""
PROMPT = PromptTemplate(template=prompt_template, input_variables=["text"])
chain = load_summarize_chain(llm, chain_type="stuff", prompt=PROMPT)
chain.run(docs)
Contoh tugas map_reduce
map_reduce
merangkum artikel, dan tentu saja, metode ini akan menghasilkan beberapa panggilan model AI.
chain = load_summarize_chain(llm, chain_type="map_reduce")
chain.run(docs)
Kata-Kata Prompt Kustom untuk Tugas map_reduce
prompt_template = """Ringkaskan konten berikut ini:
{text}
Ringkasan:"""
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)
Contoh tugas refine
Cukup ubah parameter chain_type
menjadi refine
.
chain = load_summarize_chain(llm, chain_type="refine")
chain.run(docs)
Template Kata-Kata Prompt Tugas Refine
Berikut adalah contoh kata-kata prompt kustom untuk tugas refine
:
prompt_template = """Ringkaskan konten berikut ini:
{text}
Ringkasan:"""
PROMPT = PromptTemplate(template=prompt_template, input_variables=["text"])
refine_template = (
"Tugas Anda adalah menghasilkan ringkasan teks akhir\n"
"Berikut adalah informasi ringkasan yang sudah ada: {existing_answer}\n"
"Perkaya ringkasan yang sudah ada berdasarkan informasi latar belakang baru\n"
"Informasi latar belakang adalah sebagai berikut\n"
"------------\n"
"{text}\n"
"------------\n"
"Berdasarkan informasi latar belakang, perkaya ringkasan yang sudah ada\n"
"Kembalikan informasi ringkasan yang sudah ada jika informasi latar belakang tidak berguna."
)
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)