인프런 커뮤니티 질문&답변

leejieun418님의 프로필 이미지

작성한 질문수

모두를 위한 대규모 언어 모델 LLM(Large Language Model) Part 2 - 랭체인(LangChain)으로 나만의 ChatGPT 만들기

랭체인(LangChain)으로 챗봇(Chatbot) 만들어보기 (1/2)

ConversationSummaryBufferMemory의 max_token_limit

24.07.05 18:51 작성

·

134

0

ConversationSummaryBufferMemory 설명 중
max_token_limit 관련 문의 있습니다

토큰 제한하신 경우:
max_token_limit=5

대화 요약된 경우:

{'history': 'System: \nThe human greets the AI and the AI responds asking how the human is doing. The human responds that they are not doing well and the AI responds similarly.'}

이렇게 지정한 토큰 수를 넘어서 대화 요약이 되는 이유가 있을까요?

답변 2

0

강병진님의 프로필 이미지

2024. 07. 07. 23:19

안녕하세요!

제가 올린 강의는 아니지만, 답변을 드려보자면,

일단 소스코드를 봤을때는 질문자님께서 이해하신 것처럼

  1. max_token_limit 을 확인하고,

  2. max_token_limit 을 넘어가지 않는 선에서 langchain의 LLM 을 활용해서 대화를 요약해서

  3. history로 답변을 생성하는 LLM에 넘겨주어야 합니다.

소스코드를 살펴보니 max_token_limit 이 사용되는 곳은 하나인데,

 def prune(self) -> None:
        """Prune buffer if it exceeds max token limit"""
        buffer = self.chat_memory.messages
        curr_buffer_length = self.llm.get_num_tokens_from_messages(buffer)
        if curr_buffer_length > self.max_token_limit:
            pruned_memory = []
            while curr_buffer_length > self.max_token_limit:
                pruned_memory.append(buffer.pop(0))
                curr_buffer_length = self.llm.get_num_tokens_from_messages(buffer)
            self.moving_summary_buffer = self.predict_new_summary(
                pruned_memory, self.moving_summary_buffer
            )

chat_memory에서 buffer를 확인하고 max_token_limit과 비교한 후에, 대화내용을 요약하게 되어있습니다. 그렇다면 해당 if문을 통과하지 않으니 curr_buffer_length 를 계산하는 곳에 문제가 있는 것 같아서 깃헙의 소스코드를 따라가봤는데요, LangChain에서 기본으로 제공하는 tokenizer가 gpt2 기반으로 되어있습니다. 해당 tokenizer를 huggingface에서 가져오는 상황이다보니 tokenizing에 에러가 있는게 아닌가 생각합니다. (소스코드 기준으로 2개월전 업데이트라 그래도 관리는 잘 되고있는 것 같긴 합니다)

@lru_cache(maxsize=None)  # Cache the tokenizer
def get_tokenizer() -> Any:
    """Get a GPT-2 tokenizer instance.

    This function is cached to avoid re-loading the tokenizer
    every time it is called.
    """
    try:
        from transformers import GPT2TokenizerFast  # type: ignore[import]
    except ImportError:
        raise ImportError(
            "Could not import transformers python package. "
            "This is needed in order to calculate get_token_ids. "
            "Please install it with `pip install transformers`."
        )
    # create a GPT-2 tokenizer instance
    return GPT2TokenizerFast.from_pretrained("gpt2")

 

그리고 max_token_limit 이 정상적으로 작동한다고 해도 5로 설정 하셨을 경우에는 history를 제대로 요약하지 못하는 이슈가 있을 것 같습니다. OpenAI 문법 기준으로 설명드리자면 user와 assistant의 대화를 요약해야하는데, OpenAI tokenizer 기준으로 보면 영어 대화의 대명사인 hi how are you? fine and you?도 9토큰이 소모됩니다. 따라서 5는 대화 요약보다는 사용자가 보낸 가장 최근 메세지 하나정도 요약이 가능한 수준일 것 같습니다. 이마저도 사용자의 질문이 엄청 길었으면 사용자 메세지도 짤렸을 것 같아요.

24년 5월에 업데이트된 공식문서를 보시면, 예제에서 max_token_limit 을 2000으로 설정하고 있습니다. ConversationBufferMemory 의 소스코드에 업데이트가 없는 걸로 봤을 때 2000으로 해도 에러가 있을 것 같긴 하지만, max_token_limit 숫자를 작게 잡으셨다면 outdated된 예전 문서를 참고하신게 아닌가 생각합니다.

0

인프런 AI 인턴님의 프로필 이미지

2024. 07. 07. 18:56

안녕하세요, 인프런 AI 인턴입니다.

해당 질문에 대해 직접적으로 답변 드릴 수 있는 정보가 제공된 자료에는 없습니다. 대신, 일반적인 상황에서 max_token_limit이 예상보다 더 많은 토큰으로 대화가 요약되는 경우는 여러 가지가 있을 수 있습니다.

  1. max_token_limit은 대화를 요약할 때 고려하는 최대 토큰 수를 의미하지만, 실제 요약 과정에서 알고리즘이나 모델의 내부 로직에 따라 예외 사항이 발생할 수 있습니다. 예를 들어, 요약 알고리즘이 특정 조건 하에서 최소한의 의미 전달을 위해 더 많은 토큰을 사용할 필요가 있을 때입니다.

  2. 사용 중인 모델이나 라이브러리의 버전에 따라 max_token_limit의 동작 방식이 달라질 수 있습니다. 때로는 명시된 제한보다 더 많이 토큰을 포함할 수 있도록 내부적으로 조정되기도 합니다.

  3. 토큰 수를 계산하는 방식이 예상과 다를 수 있습니다. 일부 시스템에서는 공백, 특수 문자 등도 토큰으로 카운트 할 수 있으며, 이로 인해 실제 예상한 ‘단어’의 수와는 다른 토큰 수가 산출될 수 있습니다.

구체적인 해결책이나 원인 분석을 위해서는 사용 중인 LLM 라이브러리의 공식 문서를 확인하거나, 해당 라이브러리나 모델을 관리하는 커뮤니티나 개발자에게 직접 문의하는 것이 좋습니다.