Yapay Zeka Metin Özütlemesi
Farklı Büyük Dil Modellerinin (BDM) giriş metin sözcükleri için farklı uzunluk sınırlamaları bulunmaktadır. Uzun bir makaleyi özetlememiz gerekiyorsa ve makalenin uzunluğu modelin maksimum uzunluk sınırını aşıyorsa, bütün makaleyi doğrudan yapay zeka modeline besleyemeyiz. Bu tür senaryolarda LangChain, bu durumu ele almak için stratejiler ve kapsülleme sağlar. Bu bölümde, LangChain'in metin özütlemesini nasıl çözdüğünü başlıca tanıtır.
Veri Ön İşleme
İlk olarak test verilerini hazırlarız. Bu örnekte, uzun bir belge yükler ve ardından belgeyi parçalamak için belgeyi birden fazla küçük belge parçasına böleriz.
- Not: Burada yerel dosya verilerini yüklemek yalnızca açıklama amaçlıdır. Gerçek iş senaryolarında belge verilerini kendi veritabanınızdan yükleyebilirsiniz.
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(sıcaklık=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]]
Başlarken
Uzun metni özetlemek için en kolay yol, LangChain'in sunmuş olduğu load_summarize_chain
görevini kullanmaktır. Bu görev, metin özütlemesi görevini gerçekleştirmek için kullanılır.
from langchain.chains.summarize import load_summarize_chain
chain = load_summarize_chain(llm, chain_type="map_reduce")
chain.run(docs)
LangChain tarafından sağlanan kapsüllenmiş metin özütleme Zincirini kullanmak basittir. Ancak bazı parametreleri özelleştirmeniz gerekiyorsa, lütfen aşağıdaki içeriğe bakınız. Örneğin, yukarıdaki örnek, yerleşik bir giriş kelime şablonu kullanmaktadır, bu Çince için uygun olmayabilir. Kendi giriş kelime şablonunuza vb. değiştirebilirsiniz.
chain_type Parametresinin Açıklaması
LangChain, Zincir görevinin giriş kelimesinin LLM'nin simge uzunluk sınırını aştığı durumlar için 4 işleme yöntemi tasarlamıştır.
chain_type'ın 4 türü aşağıdaki gibidir:
- stuff
- map_reduce
- refine
- map_rerank
stuff Türü
Bu, LangChain'in varsayılan türüdür, tüm belge içeriğini bir seferde LLM modeline özetlemek için gönderir. Bu nedenle, dolgulama modu olarak adlandırılır. Belge içeriği çok uzunsa, kesinlikle LLM'nin simge sınırını aşacaktır.
map_reduce Türü
Bu yöntem öncelikle her belge parçasını LLM modeline ayrı ayrı özetlemek için gönderir, ardından tüm özetleri birleştirir ve nihayetinde AI'ye genel bir özet sunar, bu durum birçok programlama dilindeki map-reduce işlev kütüphanelerinin kavramına benzer.
refine Türü
Bu yöntem özetleme şeklinde bir metin özeti oluşturur. İlk olarak LLM modeline ilk belgenin içeriğini özetlemek için gönderir, sonra ilk belgenin özet içeriğini + ikinci belgenin içeriğini LLM modeline özetlemek için gönderir ve böyle devam eder, uzun bir metin için nihai bir özet elde etmek üzere.
map_rerank Türü
Bu, soru-cevaplamada kullanılır. Zincir görevinin giriş kelimesinin LLM'nin simge uzunluk sınırını aşan belge parçacıklarını seçer ve ardından bunları cevaplamak için LLM modeline gönderir.
stuff
Görevi Örneği
İşte LLM'nin simge uzunluk sınırlamasını aşmayan makaleleri özetlemek için stuff
türünü kullanarak bir örnek:
chain = load_summarize_chain(llm, chain_type="stuff")
chain.run(docs)
Özel Giriş Kelimeleri
stuff
türü için özel giriş kelimeleri için aşağıda bir örnek:
prompt_template = """Aşağıdaki içeriği özetleyin:
{text}
Özet:"""
PROMPT = PromptTemplate(template=prompt_template, input_variables=["text"])
chain = load_summarize_chain(llm, chain_type="stuff", prompt=PROMPT)
chain.run(docs)
map_reduce
görevi örneği
map_reduce
, makaleyi özetler ve tabii ki, bu yöntem birden fazla yapay zeka modeli çağrısına neden olacaktır.
chain = load_summarize_chain(llm, chain_type="map_reduce")
chain.run(docs)
map_reduce
Görevi için Özel İsteme Kelimeleri
prompt_template = """Aşağıdaki içeriği özetleyin:
{text}
Özet:"""
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
görevi örneği
Basitçe, chain_type
parametresini refine
olarak değiştirin.
chain = load_summarize_chain(llm, chain_type="refine")
chain.run(docs)
Düzeltme Görevi için Özel İsteme Kelimeleri Şablonu
refine
görevi için özel isteme kelimelerinin bir örneği aşağıda verilmiştir:
prompt_template = """Aşağıdaki içeriği özetleyin:
{text}
Özet:"""
PROMPT = PromptTemplate(template=prompt_template, input_variables=["text"])
refine_template = (
"Göreviniz bir nihai metin özeti oluşturmak\n"
"Mevcut özet bilgileri şunlardır: {existing_answer}\n"
"Yeni arka plan bilgilerine dayanarak mevcut özeti geliştirin\n"
"Arka plan bilgileri aşağıdaki gibidir\n"
"------------\n"
"{text}\n"
"------------\n"
"Arka plan bilgilerine dayanarak mevcut özeti geliştirin\n"
"Arka plan bilgileri yararlı değilse mevcut özet bilgilerini geri döndürü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)