Podsumowanie tekstu za pomocą LanChain
Różne modele językowe mają różne ograniczenia co do maksymalnej liczby słów zapytania. Jeśli chcemy podsumować obszerny artykuł, a jego długość przekracza limit modelu, nie możemy bezpośrednio podać całego artykułu do modelu sztucznej inteligencji. W takich przypadkach LanChain oferuje strategie i kapsułkowanie, które radzą sobie z tym problemem. W tym rozdziale głównie omówiono, jak LanChain rozwiązuje problem podsumowania tekstu.
Przetwarzanie danych
Najpierw przygotowujemy dane testowe. W tym przykładzie ładujemy długi dokument, a następnie dzielimy go na kilka mniejszych fragmentów.
- Uwaga: Tutaj lokalne dane plikowe są używane tylko w celach ilustracyjnych. W rzeczywistych scenariuszach biznesowych prawdopodobnie załadujesz dane dokumentu z własnej bazy danych.
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]]
Rozpoczęcie pracy
Najprostszym sposobem podsumowania długiego tekstu jest użycie zadania load_summarize_chain
dostarczonego przez LanChain do wykonania zadania podsumowania tekstu.
from langchain.chains.summarize import load_summarize_chain
chain = load_summarize_chain(llm, chain_type="map_reduce")
chain.run(docs)
Użycie kapsułkowanego łańcucha podsumowującego tekst dostarczonego przez LanChain jest proste. Jednak jeśli potrzebujesz dostosować jakieś parametry, proszę odnieść się do poniższej zawartości. Na przykład, powyższy przykład używa wbudowanego szablonu słów zapytania, który może nie być przyjazny dla języka polskiego. Możesz go zmienić na własny szablon słów zapytania itp.
Wyjaśnienie parametru chain_type
LanChain zaprojektował 4 metody obsługi przypadku, gdy słowa kluczowe zadania przekraczają limit długości tokenów modelu LLM.
4 rodzaje parametru chain_type to:
- stuff
- map_reduce
- refine
- map_rerank
Typ stuff
Jest to domyślny typ LanChain, który wysyła całą zawartość dokumentu do modelu LLM w celu podsumowania. Dlatego nazywany jest trybem wstrzykiwania. Jeśli zawartość dokumentu jest zbyt długa, z pewnością przekroczy limit tokenów LLM.
Typ map_reduce
Ta metoda najpierw wysyła każdy fragment dokumentu do modelu LLM dla indywidualnego podsumowania, a następnie łączy wszystkie podsumowania, aby wreszcie dostarczyć ogólne podsumowanie do SI, co jest podobne do koncepcji bibliotek funkcji map-reduce w wielu językach programowania.
Typ refine
Ta metoda generuje podsumowanie tekstu w sposób łączeniowy. Najpierw wysyła zawartość pierwszego dokumentu do modelu llm w celu podsumowania, a następnie wysyła zawartość podsumowania pierwszego dokumentu + zawartość drugiego dokumentu do modelu llm w celu podsumowania, i tak dalej, aby uzyskać ostateczne podsumowanie długiego tekstu.
Typ map_rerank
Jest to używane w zadaniach odpowiedzi na pytania. Wybiera fragmenty dokumentów o wysokiej istotności dla pytania, a następnie wysyła je do modelu llm w celu udzielenia odpowiedzi na pytanie.
Przykład zadania stuff
Oto przykład podsumowania artykułu przy użyciu rodzaju zadania stuff
, który jest odpowiedni dla artykułów, które nie przekraczają limitu długości tokenów LLM:
chain = load_summarize_chain(llm, chain_type="stuff")
chain.run(docs)
Niestandardowe słowa kluczowe
Dla typu stuff
oto przykład niestandardowych słów kluczowych:
prompt_template = """Podsumuj następującą treść:
{text}
Podsumowanie:"""
PROMPT = PromptTemplate(template=prompt_template, input_variables=["text"])
chain = load_summarize_chain(llm, chain_type="stuff", prompt=PROMPT)
chain.run(docs)
Przykład zadania map_reduce
map_reduce
streszcza artykuł, a oczywiście ta metoda spowoduje wykonanie wielu wywołań modeli AI.
chain = load_summarize_chain(llm, chain_type="map_reduce")
chain.run(docs)
Niestandardowe słowa kluczowe dla zadania map_reduce
prompt_template = """Streszcz następującą zawartość:
{text}
Podsumowanie:"""
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)
Przykład zadania refine
Po prostu zmień parametr chain_type
na refine
.
chain = load_summarize_chain(llm, chain_type="refine")
chain.run(docs)
Szablon niestandardowych słów kluczowych zadania refine
Oto przykład niestandardowych słów kluczowych dla zadania refine
:
prompt_template = """Streszcz następującą zawartość:
{text}
Podsumowanie:"""
PROMPT = PromptTemplate(template=prompt_template, input_variables=["text"])
refine_template = (
"Twoim zadaniem jest wygenerowanie ostatecznego streszczenia tekstu\n"
"Oto istniejące informacje streszczające: {existing_answer}\n"
"Ulepsz istniejące streszczenie na podstawie nowych informacji tła\n"
"Informacje tła są następujące\n"
"------------\n"
"{text}\n"
"------------\n"
"Na podstawie informacji tła ulepsz istniejące streszczenie\n"
"Zwróć istniejące informacje streszczające, jeśli informacje tła nie są przydatne."
)
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)