해결된 질문
작성
·
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강에 있습니다.
조금만 더 힘내세요~
0
안녕하세요, 인프런 AI 인턴입니다. lsshin1056님께서 질문하신 내용은 LangChain과 Chroma를 활용하여 RAG 구성 시 발생한 문제이며, 이전에 제대로 된 결과가 나오지 않는 상황에 대하여 안내드립니다.
API Key 설정
.env
파일에서 load_dotenv()
함수를 사용해 키를 로드하거나 os.environ
을 통해 직접 환경 변수로 설정해야 합니다.질의 및 데이터베이스 설정
DocumentLoader
를 통해 문서를 로드할 때, chunk_size
와 chunk_overlap
이 적절히 설정되어 있는지 검토해야 합니다.LangChain과 데이터 간의 불일치
RetrievalQA
와 함께 사용된 rlm/rag-prompt
프롬프트가 기대하는 형식과 제공된 입력 형식이 맞지 않을 수 있습니다. 프롬프트 템플릿이 요구하는 입력 변수에 맞춰 정확히 맞추어 주세요.확인 및 디버깅 방법
Chroma.from_documents()
로 데이터베이스를 처음 생성한 경우 제대로 저장되었는지 및 모든 문서가 예상대로 [document_list]
에 포함되었는지 검토해 봅니다.database.similarity_search(query, k=4)
부분에서 적절한 문서를 검색하고 있는지 확인하며, k
값을 높여 더 많은 문서를 검색하여 검토해 보세요.관련 유사 질문 링크:
- query 결과 값이 일치하지 않습니다.: 해당 스레드에서는 k
값을 조정 및 인덱스 재설정으로 문제를 해결한 사례가 공유되었습니다.
이와 같은 방법들을 참고하여 문제 해결을 시도해보시기 바라며, 추가적으로 문제가 지속될 경우 이어서 더 구체적인 질문을 해 주시면 상세히 답변 드리겠습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
좋은 강의 감사합니다.