AI 텍스트 요약

다양한 대형 언어 모델(Large Language Models, LLM)은 입력 프롬프트 단어의 최대 길이 제한이 다릅니다. 긴 길이의 기사를 요약해야 하는 경우, 그러나 기사의 길이가 모델의 최대 길이 제한을 초과하는 경우 전체 기사를 AI 모델에 직접 공급할 수는 없습니다. 이러한 시나리오에서 LangChain은 이를 처리하기 위한 전략과 캡슐화를 제공합니다. 본 장에서는 LangChain이 텍스트 요약을 처리하는 방법을 주로 소개합니다.

데이터 전처리

먼저, 테스트 데이터를 준비합니다. 이 예에서는 긴 문서를 로드한 다음 문서를 여러 작은 문서 조각으로 분할합니다.

  • 참고: 여기서 로컬 파일 데이터를 로드하는 것은 단순히 설명을 위한 것입니다. 실제 비즈니스 시나리오에서는 자체 데이터베이스에서 문서 데이터를 로드할 수 있습니다.
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]]

시작하기

긴 텍스트를 요약하는 가장 쉬운 방법은 LangChain이 제공하는 load_summarize_chain 작업을 사용하여 텍스트 요약 작업을 실행하는 것입니다.

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

LangChain이 제공하는 캡슐화된 텍스트 요약 Chain을 사용하는 것은 간단합니다. 그러나 일부 매개변수를 세밀하게 조정해야 하는 경우가 있습니다. 예를 들어 위의 예제는 내장된 프롬프트 단어 템플릿을 사용하는데, 이는 중국어에게 친숙하지 않을 수 있습니다. 이를 자체 프롬프트 단어 템플릿으로 변경할 수 있습니다.

chain_type 매개변수 설명

LangChain은 Chain 작업의 프롬프트 단어가 LLM의 토큰 길이 제한을 초과하는 경우의 4가지 처리 방법을 설계했습니다.

4가지 chain_type 유형은 다음과 같습니다:

  • stuff
  • map_reduce
  • refine
  • map_rerank

stuff 유형

이것은 LangChain의 기본 유형으로, 모든 문서 내용을 한꺼번에 LLM 모델에 전달하여 요약합니다. 따라서 stuffin 모드라고 합니다. 문서 내용이 너무 길면 LLM의 토큰 제한을 확실히 초과할 것입니다.

map_reduce 유형

이 방법은 먼저 각 문서 조각을 개별적으로 LLM 모델에 전달하여 요약한 다음 모든 요약을 결합하고 마지막으로 AI에 종합적인 요약을 제공하는 것으로, 많은 프로그래밍 언어의 map-reduce 함수 라이브러리 개념과 유사합니다.

refine 유형

이 방법은 요약하는 방식으로 텍스트 요약을 생성합니다. 먼저 첫 번째 문서 내용을 llm 모델에 요약하여, 그런 다음 첫 번째 문서의 요약 내용 + 두 번째 문서의 내용을 llm 모델에 전달하여, 이런 식으로 계속하여 긴 텍스트에 대한 최종 요약을 얻습니다.

map_rerank 유형

이것은 질문 응답 작업에서 사용됩니다. 질문과 관련이 높은 문서 조각을 선택한 다음 llm 모델에 해당 문서 조각을 전달하여 질문에 답변합니다.

stuff 작업 예시

stuff 유형을 사용하여 기사를 요약하는 예시는 다음과 같습니다. 이는 LLM의 토큰 길이 제한을 초과하지 않는 기사에 적합합니다:

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

사용자 정의 프롬프트 단어

stuff 유형을 위한 사용자 정의 프롬프트 단어 예시는 다음과 같습니다:

prompt_template = """다음 내용을 요약하세요:

{text}

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

map_reduce 작업 예시

map_reduce는 글을 요약하는데 사용되며, 이 방법은 여러 AI 모델 호출로 이끌어질 것입니다.

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

map_reduce 작업을 위한 사용자 정의 프롬프트 단어

prompt_template = """다음 내용을 요약해주세요:

{text}

요약:"""
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 작업 예시

단순히 chain_type 매개변수를 refine로 변경하세요.

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

refine 작업을 위한 사용자 정의 프롬프트 단어 템플릿

refine 작업을 위한 사용자 지정 프롬프트 단어의 예시입니다:

prompt_template = """다음 내용을 요약해주세요:

{text}

요약:"""

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

refine_template = (
    "최종 텍스트 요약을 생성하는 것이 목표입니다.\n"
    "다음은 기존 요약 정보입니다: {existing_answer}\n"
    "새로운 배경 정보를 기반으로 기존 요약을 향상시키세요\n"
    "배경 정보는 다음과 같습니다\n"
    "------------\n"
    "{text}\n"
    "------------\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)