강의

멘토링

로드맵

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

ㅋㅋㅋ님의 프로필 이미지
ㅋㅋㅋ

작성한 질문수

RAG를 활용한 LLM Application 개발 (feat. LangChain)

3.3 LangChain 없이 구성하는 RAG의 불편함

split_text 문의

작성

·

27

0

안녕하세요.

코드를 보면 문서를 인코딩 후 청크 단위로 나눈 다음 다시 디코딩하여 임베딩 하는데요.

언뜻 생각하기로는 다시 디코딩하는 것이 효율적이지 않은 것 같은데요.

바로 임베딩하지 않고 디코딩하여 임베딩하는 이유가 있을까요?

 

 

답변 2

0

강병진님의 프로필 이미지
강병진
지식공유자

안녕하세요! 좋은 질문 감사합니다.

TL;DR 해보자면 토큰 단위 청크 분할을 보장하기 위해서 입니다.

임베딩 모델은 텍스트를 토큰 단위로 처리하는데요, 만약 단순히 글자 수나 단어 수 기준으로 자르면, 모델 토크나이저의 실제 토큰 경계와 어긋날 수 있습니다.그래서 tiktoken 같은 토크나이저를 이용해 먼저 인코딩(토큰화)하고, 정확히 chunk_size 개 토큰 단위로 자르는 게 가장 안정적입니다.

ㅋㅋㅋ님의 프로필 이미지
ㅋㅋㅋ
질문자

답변 감사합니다. 그런데 제가 알고 싶은 것은 인코딩하여 청킹하는 것 까지는 알겠는데 이걸 다시 디코딩하여 임베딩하는 것입니다. 토큰화하여 청킹된 데이터를 바로 임베딩하지 않고 디코딩하여 임베딩 하는 것이 이해가 가지 않네요;;;

강병진님의 프로필 이미지
강병진
지식공유자

tiktoken은 임베딩 모델이 아니고 토크나이저 라이브러리입니다. 텍스트를 토큰 ID 배열로 변환(encode)하거나, 토큰 ID 배열을 다시 문자열로 변환(decode)할 수 있을 뿐이고, 임베딩 모델이 아닙니다.

즉, tiktoken이 만든 토큰 ID 리스트 자체는 임베딩 벡터가 아닙니다.

 

ㅋㅋㅋ님의 프로필 이미지
ㅋㅋㅋ
질문자

chunk_list = split_text(full_text, 1500)
이 코드를 실행하여 chunk_list를 찍어보면 디코딩되어 사람이 읽을수 있는 텍스트였습니다.

이 데이터를 결국 아래의 tax_collection에 넣는데요

tax_collection.add(documents=chunk_list, ids=id_list)

질문은 다음과 같습니다.

 

  1. 디코딩된 데이터를 넣는 이유가 있나요?

  2. 디코딩하지 않고 그 전까지만 처리된(토근화하여 청킹된) 데이터를 tax_collection에 넣을 수 있나요?

  3. 2번에서 그렇게 할 수 없다면 왜 그런지 이유를 알고 싶습니다.

     

감사합니다.

강병진님의 프로필 이미지
강병진
지식공유자

답변 드립니다!

  1. 사람이 읽을 수 있는 텍스트를 활용해서 tax_collection.add()를 호출해야, 원본 문서가 임베딩되고, 사용자의 질문(사람이 읽을 수 있는 텍스트)을 활용해서 유사도 검색을 할 수 있습니다.

  2. 벡터 저장소에서 embedding모델을 실행한 결과값을 직접 적재할 수 있는 기능이 있다면 가능합니다.

     

  3. 다만 embedding 모델의 실행 결과는 tiktoken으로 인코딩한 값이 아닙니다.

    1. tiktoken의 인코딩값이 embedding 모델을 실행한 결과가 다르기 때문에 tiktoken으로 인코딩된 값을 넣으면 유사도검색이 이루어지지 않습니다

 

0

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

문서를 인코딩 후 청크 단위로 나눈 뒤 다시 디코딩하여 임베딩하는 과정은 여러 이유로 설계됩니다. 이 과정에서의 핵심은 텍스트의 의미와 문맥을 최대한 보존하면서 효율적으로 처리하기 위한 것입니다.

이유

  1. 토큰 수 제한 관리: 임베딩 과정에서 최대 토큰 수 제한이 있을 수 있습니다. 인코딩 후 청크 단위로 나누어서 이 제한에 맞추기 위해 텍스트를 조정할 수 있습니다.

  2. 의미적 일관성 유지: 디코딩을 통해 청크가 잘리지 않고 온전한 문맥을 유지합니다. 이렇게 하면 임베딩 과정에서 데이터의 의미가 왜곡되지 않고 보다 정확한 추천이나 검색 결과를 제공할 수 있습니다.

  3. 효율적 처리: 인코딩한 상태에서 텍스트를 분할하면, 시스템은 텍스트의 크기와 구조에 기반하여 더 효율적으로 처리할 수 있습니다. 디코딩 과정은 때때로 텍스트의 원래 의미와 문맥을 유지하기 위해 불가피합니다.

참고 URL 및 자료

  • 유사한 인코딩 및 디코딩 관련 토론은 이곳에서 확인하실 수 있습니다.
  • 해당 과정에 대해서는 예전에 강의 커뮤니티에서도 비슷한 주제에 대해 논의된 적이 있습니다. 그 결과 링크를 참조하면 도움이 될 수 있습니다.

이 설명이 ㅋㅋㅋ님의 의문을 푸는 데 도움이 되었으면 합니다. 추가적으로 궁금한 점이 있거나 더 논의하고 싶은 부분이 있다면 언제든지 질문해 주세요. 곧 지식공유자께서도 추가 설명을 제공해 주실 것입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

ㅋㅋㅋ님의 프로필 이미지
ㅋㅋㅋ

작성한 질문수

질문하기