인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

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

lsshin1056님의 프로필 이미지

작성한 질문수

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

3.2.1 OpenAIEmbeddings 대신 UpstageEmbeddings를 활용하는 방법

3.2.1 LangChain과 Chroma를 활용한 RAG 구성_결과 관련

해결된 질문

작성

·

166

0

3.2.1 LangChain과 Chroma를 활용한 RAG 구성 + Upstage Embeddings.ipynb 파일을 .py로 변환하여 실행시켰는데, 결과가 제대로 나오지 않습니다.
한번인가 정확하게 나왔던것 같습니다.

무슨 문제 인지 궁금합니다.
--------------------------------

%runfile /home/sjhappy/downloads/source_code/LLM/inflearn-lim-application/3_2_2.py --wdir

/home/sjhappy/anaconda3/envs/LLM_EN/lib/python3.9/site-packages/langsmith/client.py:253: LangSmithMissingAPIKeyWarning: API key must be provided when using hosted LangSmith API

warnings.warn(

{'query': '연봉 3천만원인 직장인의 소득세는 얼마인가요?', 'result': '질문에서 제공된 정보로는 정확한 소득세를 계산할 수 없습니다. 소득세는 근로소득 외에 다른 소득, 세액공제 및 감면액 등에 따라 달라질 수 있습니다. 따라서, 더 자세한 정보를 제공해주시면 소득세를 계산해드릴 수 있습니다.'}

------------------

# coding: utf-8

# # 1. 패키지 설치

# In[1]:

# # 2. Knowledge Base 구성을 위한 데이터 생성

#

# - [RecursiveCharacterTextSplitter](https://python.langchain.com/v0.2/docs/how_to/recursive_text_splitter/)를 활용한 데이터 chunking

# - split 된 데이터 chunk를 Large Language Model(LLM)에게 전달하면 토큰 절약 가능

# - 비용 감소와 답변 생성시간 감소의 효과

# - LangChain에서 다양한 [TextSplitter](https://python.langchain.com/v0.2/docs/how_to/#text-splitters)들을 제공

# - chunk_size 는 split 된 chunk의 최대 크기

# - chunk_overlap은 앞 뒤로 나뉘어진 chunk들이 얼마나 겹쳐도 되는지 지정

# In[1]:

from langchain_community.document_loaders import Docx2txtLoader

from langchain_text_splitters import RecursiveCharacterTextSplitter

text_splitter = RecursiveCharacterTextSplitter(

chunk_size=1500,

chunk_overlap=200,

)

loader = Docx2txtLoader('./tax.docx')

document_list = loader.load_and_split(text_splitter=text_splitter)

# In[2]:

from dotenv import load_dotenv

from langchain_upstage import UpstageEmbeddings

# 환경변수를 불러옴

load_dotenv()

# OpenAI에서 제공하는 Embedding Model을 활용해서 chunk를 vector화

embedding = UpstageEmbeddings(model="solar-embedding-1-large")

 

 

# In[7]:

 

 

from langchain_chroma import Chroma

 

# 데이터를 처음 저장할 때

database = Chroma.from_documents(documents=document_list, embedding=embedding, collection_name='chroma-tax', persist_directory="./chroma")

 

# 이미 저장된 데이터를 사용할 때

# database = Chroma(collection_name='chroma-tax', persist_directory="./chroma", embedding_function=embedding)

 

 

# # 3. 답변 생성을 위한 Retrieval

#

# - Chroma에 저장한 데이터를 유사도 검색(similarity_search())를 활용해서 가져옴

 

# In[8]:

 

 

query = '연봉 3천만원인 직장인의 소득세는 얼마인가요?'

 

# k 값을 조절해서 얼마나 많은 데이터를 불러올지 결정

retrieved_docs = database.similarity_search(query, k=4)

 

 

# In[9]:

 

 

retrieved_docs

 

 

# # 4. Augmentation을 위한 Prompt 활용

#

# - Retrieval된 데이터는 LangChain에서 제공하는 프롬프트("rlm/rag-prompt") 사용

 

# In[10]:

 

 

from langchain_upstage import ChatUpstage

 

llm = ChatUpstage()

 

 

# In[11]:

 

 

from langchain import hub

 

prompt = hub.pull("rlm/rag-prompt")

 

 

# # 5. 답변 생성

#

# - [RetrievalQA](https://docs.smith.langchain.com/old/cookbook/hub-examples/retrieval-qa-chain)를 통해 LLM에 전달

# - RetrievalQA는 [create_retrieval_chain](https://python.langchain.com/v0.2/docs/how_to/qa_sources/#using-create_retrieval_chain)으로 대체됨

# - 실제 ChatBot 구현 시 create_retrieval_chain으로 변경하는 과정을 볼 수 있음

 

# In[12]:

 

 

from langchain.chains import RetrievalQA

 

qa_chain = RetrievalQA.from_chain_type(

llm,

retriever=database.as_retriever(),

chain_type_kwargs={"prompt": prompt}

)

 

 

# In[13]:

 

 

ai_message = qa_chain({"query": query})

 

 

# In[14]:

 

 

# 강의에서는 위처럼 진행하지만 업데이트된 LangChain 문법은 .invoke() 활용을 권장

ai_message = qa_chain.invoke({"query": query})

 

 

# In[15]:

 

 

print(ai_message)

 

 

# In[ ]:

답변 2

0

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

안녕하세요!

잘못된 답변이라는 걸 눈치채지 못하시는 경우도 많은데 잘 따라오고 계신 것 같습니다

질문에 대한 해답은 3.5강과 3.6강에 있습니다.

조금만 더 힘내세요~

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

좋은 강의 감사합니다.

0

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

안녕하세요, 인프런 AI 인턴입니다. lsshin1056님께서 질문하신 내용은 LangChain과 Chroma를 활용하여 RAG 구성 시 발생한 문제이며, 이전에 제대로 된 결과가 나오지 않는 상황에 대하여 안내드립니다.

문제 요약

  1. LangSmith API Key 오류: Logs에 “LangSmith API key must be provided” 경고가 나타난 것으로 보입니다.
  2. 정확한 결과 제공 되지 않음: 소득세와 관련된 질의에 대해 원하는 대답이 나오지 않습니다.

원인 및 해결책

  1. API Key 설정

    • LangSmith나 다른 플랫폼의 API를 사용하는 모든 경우 환경변수로 API 키를 등록해야 합니다. .env 파일에서 load_dotenv() 함수를 사용해 키를 로드하거나 os.environ을 통해 직접 환경 변수로 설정해야 합니다.
  2. 질의 및 데이터베이스 설정

    • 설정한 Chroma 데이터베이스에 맞게 데이터가 정확히 로드되고 있는지 확인하세요.
    • DocumentLoader를 통해 문서를 로드할 때, chunk_sizechunk_overlap이 적절히 설정되어 있는지 검토해야 합니다.
  3. LangChain과 데이터 간의 불일치

    • RetrievalQA와 함께 사용된 rlm/rag-prompt 프롬프트가 기대하는 형식과 제공된 입력 형식이 맞지 않을 수 있습니다. 프롬프트 템플릿이 요구하는 입력 변수에 맞춰 정확히 맞추어 주세요.
  4. 확인 및 디버깅 방법

    • Chroma.from_documents()로 데이터베이스를 처음 생성한 경우 제대로 저장되었는지 및 모든 문서가 예상대로 [document_list]에 포함되었는지 검토해 봅니다.
    • database.similarity_search(query, k=4) 부분에서 적절한 문서를 검색하고 있는지 확인하며, k 값을 높여 더 많은 문서를 검색하여 검토해 보세요.

관련 유사 질문 링크:
- query 결과 값이 일치하지 않습니다.: 해당 스레드에서는 k 값을 조정 및 인덱스 재설정으로 문제를 해결한 사례가 공유되었습니다.

이와 같은 방법들을 참고하여 문제 해결을 시도해보시기 바라며, 추가적으로 문제가 지속될 경우 이어서 더 구체적인 질문을 해 주시면 상세히 답변 드리겠습니다.

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