KI-Textzusammenfassung

Unterschiedliche große Sprachmodelle (LLM) haben unterschiedliche Längenbeschränkungen für Eingabepromptwörter. Wenn wir einen umfangreichen Artikel zusammenfassen müssen, aber die Länge des Artikels die maximale Längenbeschränkung des Modells überschreitet, können wir den gesamten Artikel nicht direkt dem KI-Modell zuführen. In solchen Szenarien bietet LangChain Strategien und Kapselung, um dies zu bewältigen. Dieses Kapitel stellt hauptsächlich vor, wie LangChain die Textzusammenfassung löst.

Datenverarbeitung

Zunächst bereiten wir die Testdaten vor. In diesem Beispiel laden wir ein langes Dokument und teilen es dann in mehrere kleine Dokumentfragmente auf.

  • Hinweis: Das Laden lokaler Dateidaten dient hier nur zur Veranschaulichung. In tatsächlichen Geschäftsszenarien könnten Sie Dokumentdaten aus Ihrer eigenen Datenbank laden.
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]]

Loslegen

Der einfachste Weg, um einen langen Text zusammenzufassen, ist die Verwendung der load_summarize_chain-Aufgabe von LangChain, um die Textzusammenfassungsaufgabe auszuführen.

from langchain.chains.summarize import load_summarize_chain
chain = load_summarize_chain(llm, chain_type="map_reduce")
chain.run(docs)

Die Verwendung der encapsulated Textzusammenfassungs-Chain von LangChain ist einfach. Wenn Sie jedoch einige Parameter feinabstimmen müssen, beachten Sie bitte den folgenden Inhalt. Zum Beispiel verwendet das obige Beispiel eine integrierte Promptwortvorlage, die möglicherweise nicht benutzerfreundlich für Chinesen ist. Sie können sie auf Ihre eigene Promptwortvorlage usw. ändern.

Erklärung des chain_type-Parameters

LangChain hat 4 Verarbeitungsmethoden für den Fall entworfen, dass das Promptwort der Chain-Aufgabe die Tokenlängenbeschränkung des LLM überschreitet.

Die 4 Arten von chain_type sind wie folgt:

  • stuff
  • map_reduce
  • refine
  • map_rerank

Typ stuff

Dies ist der Standardtyp von LangChain, der den gesamten Dokumentinhalt in das LLM-Modell für die Zusammenfassung auf einmal sendet. Daher wird er als stuffing-Modus bezeichnet. Wenn der Dokumentinhalt zu lang ist, wird er definitiv die Tokenbegrenzung des LLM überschreiten.

Typ map_reduce

Diese Methode sendet zunächst jedes Dokumentfragment an das LLM-Modell zur individuellen Zusammenfassung, kombiniert dann alle Zusammenfassungen und liefert schließlich eine Gesamtzusammenfassung an die KI, was in etwa dem Konzept der Map-Reduce-Funktionsbibliotheken in vielen Programmiersprachen ähnelt.

Typ refine

Diese Methode generiert eine Textzusammenfassung auf eine zusammenfassende Weise. Sie sendet zunächst den Inhalt des ersten Dokuments an das LLM-Modell zur Zusammenfassung, sendet dann den Zusammenfassungsinhalt des ersten Dokuments + den Inhalt des zweiten Dokuments an das LLM-Modell zur Zusammenfassung und so weiter, um eine endgültige Zusammenfassung für einen langen Text zu erhalten.

Typ map_rerank

Dies wird bei Frage-Antwort-Aufgaben verwendet. Es wählt Dokumentfragmente mit hoher Relevanz für die Frage aus und sendet sie dann an das LLM-Modell, um die Frage zu beantworten.

Beispiel der stuff-Aufgabe

Hier ist ein Beispiel zur Zusammenfassung eines Artikels mit dem Typ stuff, der für Artikel geeignet ist, die die Tokenlängenbeschränkung des LLM nicht überschreiten:

chain = load_summarize_chain(llm, chain_type="stuff")
chain.run(docs)

Benutzerdefinierte Promptwörter

Für den Typ stuff hier ein Beispiel für benutzerdefinierte Promptwörter:

prompt_template = """Fasse den folgenden Inhalt zusammen:

{text}

Zusammenfassung:"""
PROMPT = PromptTemplate(template=prompt_template, input_variables=["text"])
chain = load_summarize_chain(llm, chain_type="stuff", prompt=PROMPT)
chain.run(docs)

Beispiel für die map_reduce-Aufgabe

map_reduce fasst den Artikel zusammen, und natürlich wird diese Methode zu mehreren KI-Modellaufrufen führen.

chain = load_summarize_chain(llm, chain_type="map_reduce")
chain.run(docs)

Benutzerdefinierte Prompt-Wörter für die map_reduce-Aufgabe

prompt_template = """Fasse den folgenden Inhalt zusammen:

{text}

Zusammenfassung:"""
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)

Beispiel für die refine-Aufgabe

Ändern Sie einfach den chain_type-Parameter auf refine.

chain = load_summarize_chain(llm, chain_type="refine")
chain.run(docs)

Benutzerdefinierte Prompt-Wörter für die refine-Aufgabe

Hier ist ein Beispiel für benutzerdefinierte Prompt-Wörter für die refine-Aufgabe:

prompt_template = """Fasse den folgenden Inhalt zusammen:

{text}

Zusammenfassung:"""

PROMPT = PromptTemplate(template=prompt_template, input_variables=["text"])

refine_template = (
    "Ihre Aufgabe ist es, eine endgültige Textzusammenfassung zu generieren\n"
    "Hier sind die vorhandenen Zusammenfassungsinformationen: {existing_answer}\n"
    "Verbessern Sie die bestehende Zusammenfassung basierend auf den neuen Hintergrundinformationen\n"
    "Die Hintergrundinformationen sind wie folgt\n"
    "------------\n"
    "{text}\n"
    "------------\n"
    "Basierend auf den Hintergrundinformationen die bestehende Zusammenfassung verbessern\n"
    "Geben Sie die vorhandenen Zusammenfassungsinformationen zurück, wenn die Hintergrundinformationen nicht nützlich sind."
)
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)