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)