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

한나릴님의 프로필 이미지

작성한 질문수

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

3.5 Retrieval 효율 개선을 위한 데이터 전처리

database.as_retriever 의 결과가 다릅니다.

해결된 질문

24.08.08 00:42 작성

·

143

·

수정됨

0

코드가 똑같은데도 불구하고

database.as_retriever 의 결과값이 다를 수 있을까요?

as_retriever 함수에 최소 k=5을 넣어야 제55조 항목이 검색됩니다.

tax_with_markdown.docx 파일은 제공해주신 파일이고

혹시나 싶어서 pinecone index테이블도 삭제했다가 다시 생성해서 바로 찍은 결과입니다.

 

아래는 제 코드입니다.

from langchain_community.document_loaders import Docx2txtLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter

text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=1500,  # 각 텍스트 조각의 최대 크기
    chunk_overlap=200, # 텍스트 조각 간의 중복 길이
)

# .docx 파일을 로드하고 텍스트를 분할.
loader = Docx2txtLoader('./tax_with_markdown.docx')
document_list = loader.load_and_split(text_splitter=text_splitter)
document_list[52]
from dotenv import load_dotenv
from langchain_openai import OpenAIEmbeddings
# 환경 변수를 로드합니다.
load_dotenv()

# OpenAI 임베딩 모델을 설정합니다.
embedding = OpenAIEmbeddings(model='text-embedding-3-large')
import os

from pinecone import Pinecone
from langchain_pinecone import PineconeVectorStore

# Pinecone 인덱스 이름을 설정합니다.
index_name = 'tax-markdown-index'
# 환경 변수에서 Pinecone API 키를 가져옴
pinecone_api_key = os.environ.get("PINECONE_API_KEY")
# Pinecone을 초기화
pc = Pinecone(api_key=pinecone_api_key)


# from_documents()`를 사용하여 새 인덱스 생성
database = PineconeVectorStore.from_documents(document_list, embedding, index_name=index_name)
query = '연봉 5천만원인 직장인의 소득세는?'
retriever = database.as_retriever(search_kwargs={'k': 5})
retriever.invoke(query)

쿼리를 날린 결과를 찍어보면

5번째에서 제55조가 나옵니다.

아래는 결과값 일부입니다.

[Document(metadata={'source': './tax_with_markdown.docx'}, page_content='나. 그 밖의 배당소득에 대해서는 100분의 14\n\n3.
 Document(metadata={'source': './tax_with_markdown.docx'}, page_content='차. 외국정부(외국의 지방자치단체와 연방국가인 외국의 지방정부
 Document(metadata={'source': './tax_with_markdown.docx'}, page_content='1. 「공익신탁법」에 따른 공익신탁의 이익\n\n2.
 Document(metadata={'source': './tax_with_markdown.docx'}, page_content='저. 대통령령으로 정하는 복리후생적 성질의 급여\n\n4

 

답변 2

0

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

2024. 08. 08. 00:53

공식적으로 일리스 된 자료가 없어서 물증은 없지만 상용화 된 모델의 경우에는 공식적인 문서에서 언급 하지 않으면서 조금씩 업데이트를 하는 것 같습니다. 그래서 temperature를 0으로 설정해도 값이 달라지는 경우가 많습니다. 임베딩 모델도 아마 마찬가지일 거예요. 질문을 올려 주신 시점이 3.5 강인데 3.6 강을 들으시면 지금 겪고 있는 문제들도 모두 해결 될 겁니다. 3.6강을 보시고도 의문점이 있으시면 다시 질문을 달아 주세요!

0

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

2024. 08. 08. 00:46

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

한나릴님의 질문에 대해, database.as_retriever의 결과가 다를 수 있는지에 관한 의문입니다. 이 경우에는 저희 강의 내의 질의응답 세션에서 비슷한 문제를 다룬 정보를 찾을 수 있습니다.

강의 내용 중 database.as_retriever 함수에 대한 결과가 예상과 다르게 나타날 수 있는 주된 이유는 벡터 검색(indexing)과 관련된 설정이나 해당 문서 데이터의 특성 때문일 수 있습니다. 특히, 검색에 사용되는 k 값(검색할 문서의 수)에 따라 결과가 크게 달라질 수 있습니다. k 값을 조절하여 원하는 문서가 검색결과에 포함되도록 할 수 있으나, 이는 때때로 원하지 않은 결과를 가져올 수도 있습니다.

간단히 요약하자면, k 값에 따라 database.as_retriever의 결과가 달라질 수 있으며, 이는 벡터 검색의 특성 상 일반적인 현상입니다. 이를 조정하여 원하는 결과를 얻을 수 있지만, 항상 이상적인 결과를 보장하지는 않습니다. 검색 효율성을 높이기 위해 데이터 전처리 등의 추가적인 노력이 필요할 수 있습니다.

자세한 내용은 query 결과 값이 일치하지 않습니다. 질문에서 보실 수 있으며, 다음과 같은 환경에서 k 값을 조절하고 검색의 결과를 관찰하는 방법에 대해 세부적으로 설명하고 있습니다. 특히, 이전 강의에서는 검색 결과에서 원하는 문서를 찾지 못하는 경우, 다양한 방법으로 접근해 해결 방안을 모색하는 과정이 담겨 있습니다.

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