isPowerfulBlog

[LangChain] LLM으로 문서 요약하기 (summarization) 본문

AI

[LangChain] LLM으로 문서 요약하기 (summarization)

왕밤빵도라에몽 2024. 4. 23. 00:21

문제 정의

  • 퀴즈 생성 시 input으로 들어오는 pdf 파일들을 모두 영구적으로 s3에 저장하는 것은 저장비용 부담이 크다. 따라서 파일 내용 요약을 포함한 생성 날짜, 생성자 등등 메타정보를 저장하는 것이 낫다.
  • 퀴즈를 생성한 사람을 제외하고는 어떤 내용의 파일로 퀴즈가 생성되었는지 알 수 없다.
  • 생성자가 직접 설명을 적어줄 수 있긴 하지만 보통의 유저들은 귀찮으니 null값으로 두는 경우가 많을 것이다.

위와 같은 이유로 자동으로 생성된 파일 내용 요약이 필요해졌다.


문서 요약 방식

LLM으로 문서를 요약하는 방식은 크게 세 가지로 나뉘어질 수 있다.

  1. Stuff - 한 번에 요약하기
  2. Map Reduce - 작게 쪼갠 문서들을 각각 요약하고, 병합하여 다시 한 번 요약하기 (병렬)
  3. Refine - 작게 쪼갠 문서들을 순차적으로 요약, 이전의 요약에 다음 내용을 추가하여 요약 (직렬)

1. Stuff

문서를 한 번에 통째로 input으로 넣어주는 방식

제목 없는 프레젠테이션 (2)

문서의 양이 많지 않다면(토큰 수가 input limit보다 적다면) stuff 방식으로도 충분히 문서 요약을 할 수 있다. 가장 간단한 방법이다.
문서의 개수가 여러개라면 하나의 문서로 combine하는 역할을 하기도 한다.

2. Map Reduce

문서를 작은 chunk 단위로 쪼개어, 각각 요약하고, 요약본들을 병합하여 최종 요약을 생성하는 방식 (병렬)

제목 없는 프레젠테이션 (3)

  1. chunk_1, 2, 3을 각각 요약한다.
  2. 각각의 요약본을 합쳐 한 번 더 요약한다.
  • 비동기처리를 하면 병렬로 처리할 수 있다. 속도가 굉장히 크게 향상된다. 다만 순서가 보장되지 않기 때문에 결과물 또한.. 읍읍..
  • 비동기처리를 하지 않으면 순서가 보장된다.
  • 이 전에 데이터엔지니어링 관련해서 깔짝깔짝 공부하던 맵리듀스 방식이 여기서도 이런식으로 적용될 수 있다는 점이 신기하고 재밌었다.

3. Refine

문서를 작은 chunk 단위로 쪼개어, 순차적으로 요약하는 방식. 이전의 요약에 다음 내용을 추가하여 요약하는 방식 (직렬)

제목 없는 프레젠테이션 (4)

  1. chunk_1을 요약한다.
  2. chunk_1의 요약본 + chunk_2 를 해서 다시 요약한다.
  3. 2의 결과물 + chunk_3을 해서 다시 요약한다.
  • 순차적으로 요약을 하기 때문에 병렬처리가 불가능하다.
  • 이전의 요약이 그다음의 요약과정에 참여하면서 점점 요약을 보완해 나가는 방식이다. 비동기처리 하지 않은 맵리듀스와 비슷해보이지만 이전의 요약본이 영향을 미친다는 점에서 차이가 있다.

Reference

https://python.langchain.com/docs/use_cases/summarization/