Sumarização de Texto com LangChain
Diferentes Modelos de Linguagem Grande (Large Language Models - LLM) têm diferentes limitações de comprimento para as palavras de entrada do prompt. Se precisarmos resumir um artigo longo, mas o comprimento do artigo excede o limite máximo do modelo, não podemos alimentar diretamente o artigo inteiro ao modelo de IA. Em tais cenários, o LangChain fornece estratégias e encapsulamento para lidar com isso. Este capítulo apresenta principalmente como o LangChain resolve a sumarização de texto.
Pré-processamento de Dados
Primeiro, preparamos os dados de teste. Neste exemplo, carregamos um documento longo e, em seguida, fatiamos o documento para dividi-lo em vários fragmentos pequenos de documentos.
- Observação: O carregamento de dados de arquivos locais aqui é apenas para fins ilustrativos. Em cenários de negócios reais, você pode carregar dados de documentos de seu próprio banco de dados.
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("../../estado_da_uniao.txt") as f:
estado_da_uniao = f.read()
textos = text_splitter.split_text(estado_da_uniao)
from langchain.docstore.document import Document
docs = [Document(page_content=t) for t in textos[:3]]
Começando
A maneira mais fácil de resumir um texto longo é usar a tarefa load_summarize_chain fornecida pelo LangChain para executar a tarefa de sumarização de texto.
from langchain.chains.summarize import load_summarize_chain
chain = load_summarize_chain(llm, chain_type="map_reduce")
chain.run(docs)
Usar o Chain encapsulado de sumarização de texto fornecido pelo LangChain é simples. No entanto, se precisar ajustar alguns parâmetros, consulte o conteúdo a seguir. Por exemplo, o exemplo acima usa um modelo de palavras de prompt embutido, que pode não ser amigável para o português. Você pode alterá-lo para o seu próprio modelo de palavras de prompt, entre outras coisas.
Explicação do Parâmetro chain_type
O LangChain projetou 4 métodos de manipulação para o caso em que a palavra de prompt da tarefa de Chain excede o limite de comprimento de token do LLM.
Os 4 tipos de chain_type são os seguintes:
- stuff
- map_reduce
- refine
- map_rerank
Tipo stuff
Este é o tipo padrão do LangChain, que envia todo o conteúdo do documento para o modelo LLM para sumarização de uma vez. Portanto, é chamado de modo de "stuffing". Se o conteúdo do documento for muito longo, certamente excederá o limite de token do LLM.
Tipo map_reduce
Este método envia primeiro cada fragmento do documento para o modelo LLM para sumarização individual, em seguida, combina todos os resumos e fornece um resumo geral para a IA, que é semelhante ao conceito das bibliotecas de funções map-reduce em muitas linguagens de programação.
Tipo refine
Este método gera um resumo de texto de forma resumida. Ele envia primeiro o conteúdo do primeiro documento para o modelo LLM para sumarização, depois envia o conteúdo do resumo do primeiro documento + o conteúdo do segundo documento para o modelo LLM para sumarização, e assim por diante, para obter um resumo final para um texto longo.
Tipo map_rerank
Este é usado em tarefas de perguntas e respostas. Ele seleciona fragmentos de documentos com alta relevância para a pergunta e, em seguida, os envia ao modelo LLM para responder à pergunta.
Exemplo da tarefa 'stuff'
Aqui está um exemplo de sumarização de um artigo usando o tipo 'stuff', que é adequado para artigos que não excedem o limite de comprimento do token do LLM:
chain = load_summarize_chain(llm, chain_type="stuff")
chain.run(docs)
Palavras de Prompt Personalizadas
Para o tipo 'stuff', aqui está um exemplo de palavras de prompt personalizadas:
prompt_template = """Sumarize o seguinte conteúdo:
{text}
Resumo:"""
PROMPT = PromptTemplate(template=prompt_template, input_variables=["text"])
chain = load_summarize_chain(llm, chain_type="stuff", prompt=PROMPT)
chain.run(docs)
Exemplo de tarefa map_reduce
O map_reduce
resume o artigo e, é claro, esse método resultará em várias chamadas do modelo de IA.
chain = load_summarize_chain(llm, chain_type="map_reduce")
chain.run(docs)
Palavras de Ativação Personalizadas para a Tarefa map_reduce
prompt_template = """Resuma o seguinte conteúdo:
{text}
Resumo:"""
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)
Exemplo de tarefa refine
Basta alterar o parâmetro chain_type
para refine
.
chain = load_summarize_chain(llm, chain_type="refine")
chain.run(docs)
Modelo de Palavras Personalizadas para a Tarefa refine
Aqui está um exemplo de palavras personalizadas para a tarefa refine
:
prompt_template = """Resuma o seguinte conteúdo:
{text}
Resumo:"""
PROMPT = PromptTemplate(template=prompt_template, input_variables=["text"])
refine_template = (
"Seu trabalho é gerar um resumo final do texto\n"
"Aqui estão as informações do resumo existente: {existing_answer}\n"
"Aprimore o resumo existente com base nas novas informações de contexto\n"
"As informações de contexto são as seguintes\n"
"------------\n"
"{text}\n"
"------------\n"
"Com base nas informações de contexto, aprimore o resumo existente\n"
"Retorne as informações do resumo existente se as informações de contexto não forem úteis."
)
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)