작은 컨텍스트 창에서 클라이언트 측 요약 확장

게시일: 2025년 3월 12일

설명 동영상 확장 프로그램 Chrome 상태 인텐트
GitHub 플래그 뒤 Origin 무료 체험 플래그 뒤 Origin 무료 체험 View 실험 의도

Summarizer API를 사용하면 다양한 길이와 형식의 정보 요약을 생성할 수 있습니다. Chrome에서 Gemini Nano와 함께 사용하여 클라이언트 측 추론을 실행하고 복잡하거나 긴 텍스트를 간결하게 설명합니다.

클라이언트 측에서 실행하면 로컬에서 데이터를 사용할 수 있으므로 민감한 정보를 안전하게 보호하고 대규모로 가용성을 제공할 수 있습니다. 하지만 컨텍스트 창은 서버 측 모델보다 훨씬 작으므로 매우 큰 문서는 요약하기 어려울 수 있습니다. 이 문제를 해결하려면 요약의 요약 기법을 사용하면 됩니다.

요약의 요약이란 무엇인가요?

요약의 요약 기법을 사용하려면 입력 콘텐츠를 주요 지점에서 분할한 다음 각 부분을 개별적으로 요약합니다. 각 부분의 출력을 연결한 다음 연결된 텍스트를 하나의 최종 요약으로 요약할 수 있습니다.

예를 들어 문서가 세 부분으로 나누어지면 각 부분이 요약됩니다. 이러한 세 가지 요약을 종합하여 최종 결과를 다시 요약합니다.

콘텐츠를 신중하게 분할하세요.

대량의 텍스트를 분할하는 방법을 고려하는 것이 중요합니다. 다른 위치에서 분할하면 Gemini Nano 또는 기타 LLM에서 완전히 다른 출력을 얻을 수 있기 때문입니다. 텍스트는 주제가 바뀔 때(예: 기사의 새 섹션 또는 단락) 분할하는 것이 좋습니다. 단어나 문장 중간에 텍스트를 분할하지 않는 것이 중요합니다. 즉, 문자 수를 유일한 분할 가이드라인으로 설정할 수 없습니다.

수동으로 하지 않고도 이를 실행하는 방법은 여러 가지가 있습니다. 다음 예에서는 성능과 출력 품질의 균형을 맞추는 LangChain.js재귀 텍스트 분할기를 사용했습니다. 대부분의 워크로드에서 작동합니다.

새 인스턴스를 만들 때는 두 가지 주요 매개변수가 있습니다.

  • chunkSize는 각 분할에서 허용되는 최대 문자 수입니다.
  • chunkOverlap는 연속된 두 분할 간에 겹치는 문자 수입니다. 이렇게 하면 각 청크에 이전 청크의 일부 컨텍스트가 포함됩니다.

splitText()로 텍스트를 분할하여 각 청크가 포함된 문자열 배열을 반환합니다.

대부분의 LLM은 컨텍스트 창을 문자 수가 아닌 토큰 수를 사용하여 표현합니다. 토큰은 평균적으로 4자이므로 문자 수를 4로 나누면 입력에서 사용된 토큰 수를 추정할 수 있습니다.

이 예에서 chunkSize는 3, 000자이며 이는 약 750개의 토큰에 해당합니다.

각 분할의 요약 생성

콘텐츠 분할 방법을 설정하면 Summarizer API를 사용하여 각 부분의 요약을 생성할 수 있습니다.

create() 함수를 사용하여 요약 도구의 인스턴스를 만듭니다. 최대한 많은 컨텍스트를 유지하기 위해 format 매개변수를 plain-text, typetl;dr, lengthlong로 설정했습니다.

그런 다음 RecursiveCharacterTextSplitter로 생성된 각 분할의 요약을 생성하고 결과를 새 문자열로 연결합니다. 각 부분의 요약을 명확하게 식별할 수 있도록 각 요약을 새 줄로 구분했습니다.

이 루프를 한 번만 실행할 때는 이 새 줄이 중요하지 않지만 각 요약이 최종 요약의 토큰 값에 추가되는 방식을 결정하는 데는 유용합니다. 대부분의 경우 이 솔루션은 중간 길이 및 긴 콘텐츠에 적합합니다.

요약의 재귀적 요약

텍스트가 너무 길면 연결된 요약의 길이가 사용 가능한 컨텍스트 창보다 길어 요약에 실패할 수 있습니다. 이 문제를 해결하려면 요약을 재귀적으로 요약하면 됩니다.

요약의 요약이 여전히 너무 긴 경우 이 과정을 반복할 수 있습니다. 이론적으로는 적절한 길이를 수신할 때까지 이 프로세스를 무한대로 반복할 수 있습니다.

RecursiveCharacterTextSplitter에서 생성된 초기 분할은 계속 수집됩니다. 그런 다음 recursiveSummarizer() 함수에서 연결된 분할의 문자 길이를 기반으로 요약 프로세스를 반복합니다. 요약의 문자 길이가 3000를 초과하면 fullSummaries로 연결됩니다. 한도에 도달하지 않으면 요약이 partialSummaries로 저장됩니다.

모든 요약이 생성되면 최종 부분 요약이 전체 요약에 추가됩니다. fullSummaries에 요약이 하나만 있는 경우 추가 재귀가 필요하지 않습니다. 이 함수는 최종 요약을 반환합니다. 요약이 두 개 이상 있으면 함수가 부분 요약을 반복하여 계속 요약합니다.

이 솔루션은 17,560단어를 포함하여 무려 110,030자(영문 기준)의 인터넷 중계 채팅(IRC) RFC를 사용하여 테스트되었습니다. Summarizer API는 다음과 같은 요약을 제공했습니다.

인터넷 중계 채팅 (IRC)은 문자 메시지를 사용하여 실시간으로 온라인에서 소통하는 방법입니다. 채널에서 채팅하거나 비공개 메시지를 보낼 수 있으며 명령어를 사용하여 채팅을 제어하고 서버와 상호작용할 수 있습니다. 인터넷의 채팅방과 같으며, 여기에서 다른 사용자의 메시지를 입력하고 즉시 확인할 수 있습니다.

효과가 좋습니다. 길이는 309자입니다.

제한사항

요약의 요약 기법을 사용하면 클라이언트 크기 모델의 컨텍스트 창 내에서 작업할 수 있습니다. 클라이언트 측 AI의 이점은 많지만 다음과 같은 문제가 발생할 수 있습니다.

  • 정확성이 떨어지는 요약: 재귀를 사용하면 요약 프로세스 반복이 무한정으로 이루어질 수 있으며 각 요약은 원본 텍스트에서 더 멀어집니다. 즉, 모델이 유용하기에는 너무 얕은 최종 요약을 생성할 수 있습니다.
  • 성능 저하: 각 요약을 생성하는 데 시간이 걸립니다. 다시 말하지만 더 큰 텍스트에서는 무한한 수의 요약이 가능하므로 이 접근 방식을 완료하는 데 몇 분 정도 걸릴 수 있습니다.

요약 도구 데모를 사용해 볼 수 있으며 전체 소스 코드를 확인할 수 있습니다.

의견 공유

입력 텍스트의 길이, 분할 크기, 겹침 길이가 다른 경우 요약의 요약 기법을 사용하여 사용 사례에 가장 적합한 방법을 결정해 보세요.

지금 오리진 트라이얼에 참여하여 Summarizer API 테스트를 시작하고 의견을 공유해 주세요. 보내 주시는 의견은 향후 이 API 버전과 모든 기본 제공 AI API를 빌드하고 구현하는 방식에 직접적인 영향을 미칠 수 있습니다.