작성
·
176
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
안녕하세요!
제가 올린 강의는 아니지만, 답변을 드려보자면,
일단 소스코드를 봤을때는 질문자님께서 이해하신 것처럼
max_token_limit
을 확인하고,
max_token_limit
을 넘어가지 않는 선에서 langchain의 LLM 을 활용해서 대화를 요약해서
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 인턴입니다.
해당 질문에 대해 직접적으로 답변 드릴 수 있는 정보가 제공된 자료에는 없습니다. 대신, 일반적인 상황에서 max_token_limit
이 예상보다 더 많은 토큰으로 대화가 요약되는 경우는 여러 가지가 있을 수 있습니다.
max_token_limit
은 대화를 요약할 때 고려하는 최대 토큰 수를 의미하지만, 실제 요약 과정에서 알고리즘이나 모델의 내부 로직에 따라 예외 사항이 발생할 수 있습니다. 예를 들어, 요약 알고리즘이 특정 조건 하에서 최소한의 의미 전달을 위해 더 많은 토큰을 사용할 필요가 있을 때입니다.
사용 중인 모델이나 라이브러리의 버전에 따라 max_token_limit
의 동작 방식이 달라질 수 있습니다. 때로는 명시된 제한보다 더 많이 토큰을 포함할 수 있도록 내부적으로 조정되기도 합니다.
토큰 수를 계산하는 방식이 예상과 다를 수 있습니다. 일부 시스템에서는 공백, 특수 문자 등도 토큰으로 카운트 할 수 있으며, 이로 인해 실제 예상한 ‘단어’의 수와는 다른 토큰 수가 산출될 수 있습니다.
구체적인 해결책이나 원인 분석을 위해서는 사용 중인 LLM 라이브러리의 공식 문서를 확인하거나, 해당 라이브러리나 모델을 관리하는 커뮤니티나 개발자에게 직접 문의하는 것이 좋습니다.