Inflearn brand logo image

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

유재욱님의 프로필 이미지
유재욱

작성한 질문수

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

3.6 Retrieval 효율 개선을 위한 키워드 사전 활용

dictionary chain 생성 시 적절치 않은 변환

작성

·

26

0

%pip install --upgrade langchain-text-splitters langchain-upstage
from langchain_community.document_loaders import Docx2txtLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter

text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=500, 
    chunk_overlap=100
)
#loader = Docx2txtLoader('./tax_with_table.docx')
loader = Docx2txtLoader('./tax_with_markdown.docx')
documents_list = loader.load_and_split(text_splitter=text_splitter)
documents_list1=documents_list[len(documents_list)//2:]
documents_list2=documents_list[:len(documents_list)//2]

from langchain_upstage import UpstageEmbeddings
from dotenv import load_dotenv

load_dotenv()

embedding = UpstageEmbeddings(model="solar-embedding-1-large")
import os
from pinecone import Pinecone
from langchain_pinecone import PineconeVectorStore
pinecone_api_key = os.environ.get("PINECONE_API_KEY")

pc = Pinecone(api_key=pinecone_api_key)
index_name = "tax-markdown-index"
vector_store = PineconeVectorStore.from_documents(documents_list1, embedding, index_name=index_name)
vector_store.add_documents(documents_list2)
query = "연봉 5천만원인 직장인의 소득세는 얼마인가요?"
#retrieved_docs = database.similarity_search(query)
from langchain_upstage import ChatUpstage

llm = ChatUpstage()

# prompt = f"""
# - 당신은 최고의 한국 소득세 전문가입니다
# - [Context]를 참고해서 아용자의 질문에 답변해주세요

# [Context]
# {retrieved_docs}

# Question: {query}
# """
# ai_message = llm.invoke(prompt)
from langchain import hub

prompt = hub.pull("rlm/rag-prompt")
# retriever = vector_store.as_retriever()
# retriever.invoke("연봉 5천만원인 거주자의 소득세는 얼마인가요?")
from langchain.chains import RetrievalQA

qa_chain = RetrievalQA.from_chain_type(
    llm=llm,
    retriever=vector_store.as_retriever(),
    chain_type_kwargs={"prompt": prompt}
)
query = "연봉 5천만원인 직장인의 소득세는 얼마인가요? 2024년도 소득 기준으로 하고 인적공제는 혼자고 공제항목은 평균정도로 잡아봐."
ai_message = qa_chain({"query":query})
ai_message
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate

dictionary = ["사람을 나타내는 표현 -> 거주자"]
prompt = ChatPromptTemplate.from_template(f"""
사용자의 질문을 보고 우리의 사전을 참고해서 사용자의 질문을 변경해주세요.
만약 변경할 필요가 없다고 판단된다면 사용자의 질문을 변경하지 않아도 됩니다.

사전 : {dictionary}
""")

dictionary_chain = prompt | llm | StrOutputParser()

dictionary_chain.invoke({"question": "연봉 5천만원인 직장인의 소득세는 얼마인가요?"})
tax_chain = {"query": dictionary_chain} | qa_chain
ai_response = tax_chain.invoke({"question": "연봉 5천만원인 직장인의 소득세는 얼마인가요?"})


ai_response

 

이 상황에서

dictionary_chain.invoke({"question":"연봉 5천만원인 직장인의 소득세는 얼마인가요?"})를 했을때 직장인을 거주자로 바꾸는게 아니라 답변을 아래와같이줍니다 ㅜㅜ

'사용자의 질문을 사람을 나타내는 표현을 우리의 사전을 참고하여 "거주자"로 변경해보겠습니다. 그러나 사용자가 질문을 아직 제출하지 않았으므로, 가상의 질문을 만들어 변경해보겠습니다.\n\n가상의 사용자 질문: "사람들이 자주 방문하는 관광지는 어디인가요?"\n\n변경된 질문: "거주자들이 자주 방문하는 관광지는 어디인가요?"\n\n만약 사용자의 질문이 이미 적절하거나 변경이 필요하지 않다고 판단되면 질문을 변경하지 않습니다. 실제 사용자 질문을 알려주시면 그에 맞게 도움을 드리겠습니다.'

 

그 결과 최종 response도 아래와같이 나와버리네요 ㅠㅠ

 

['e9f858cf-0c76-4887-9556-22c5f32eadf4', '40a151b4-ee72-4f3c-ab61-055114344dd9', '6072bcb7-4ea0-4fbc-8828-e74cb883d162', 'a6a9fc0d-eb7a-482d-8b9d-e12073ea6dce', '9d16b74e-557b-475d-b536-8f37e77306a8', '5ad3b09f-8afa-42b6-8cec-a77a525e6f4b', 'a678eb3b-1b5d-4106-888f-bdf3302ac84c', '57a9b7e1-9511-4a34-822d-7f2a0ae710fc', '4ecd54b8-fac0-459b-ae14-4985f2dd0a20', 'bc50c84a-4770-4756-a8d4-06985387f03b', '65a1116f-93c3-4a5b-8a17-3018ccbd26b0', 'cfde5547-ee30-417c-b2dd-ed0c7f7a602d', '5f9a45e2-0279-4363-bb7c-b0fe85cc0595', '907860e1-e1c4-410d-8fa2-8eb82808f008', '682389cf-f2ad-45df-9db8-a1b6b046f43d', '76395c00-dffa-4d26-9f5e-fd910228538c', '136528f9-c253-406f-a5c8-c8fcd4fad21f', '5f6c5158-cd35-4b74-ae75-ec1f34c35394', 'b8cb52ec-e324-48c1-83a1-31c02e4d202d', '98dfe4bc-c0de-4f7e-996e-bf20416915dc', 'c9018194-109e-443c-8dd0-af5607de3c6f', '2120a161-f0f4-4c91-9759-5bb0aebb995d', '96948c3b-5937-44c1-ad84-04ed923e695b', '490a568c-d378-4cbb-aa69-bf195e41371b', '14e8fcec-7c2c-45d6-ac7b-14c009a6acc5',

...

'84802efa-23df-4a84-b311-577933f09c51', 'a22be767-fa83-4325-a605-498647daa19e', '879e0a7f-50ed-4cf1-8b6e-f4dbd2a498fc', 'e275ec53-9664-4a18-a813-d40b0e130a23', 'fbde51af-1fbb-445b-8c59-68d61b9bfa2d']

Output is truncated. View as a scrollable element or open in a text editor. Adjust cell output settings...

/Users/arang/.pyenv/versions/3.13.2/envs/inflearn-llm-application/lib/python3.13/site-packages/langsmith/client.py:272: LangSmithMissingAPIKeyWarning: API key must be provided when using hosted LangSmith API warnings.warn(

{'query': '연봉 5천만원인 직장인의 소득세는 얼마인가요? 2024년도 소득 기준으로 하고 인적공제는 혼자고 공제항목은 평균정도로 잡아봐.', 'result': '연봉 5천만원의 직장인의 경우, 2024년도 소득 기준으로 산출세액은 552만원입니다. 여기에 근로소득세액공제 29만원을 적용하면, 최종 소득세는 523만원이 됩니다.'}

{'query': '사용자의 질문이 "사람을 나타내는 표현은 무엇인가요?"라면, 우리의 사전을 참고하여 질문을 변경하면 다음과 같습니다: "거주자를 나타내는 표현은 무엇인가요?" \n\n만약 사용자의 질문이 다른 주제나 내용을 다루고 있다면, 해당 질문에 맞게 사전을 참고하여 변경할 수 있습니다. 만약 질문이 이미 명확하고 변경할 필요가 없다고 판단된다면, 질문을 그대로 유지할 수 있습니다.', 'result': '사용자의 질문이 "사람을 나타내는 표현은 무엇인가요?"라면, 우리의 사전을 참고하여 질문을 변경하면 다음과 같습니다: "거주자를 나타내는 표현은 무엇인가요?" 사전에서 "거주자"는 국내에 주소를 두거나 183일 이상의 거소를 둔 개인을 의미합니다.'}

 

 

 

 

답변 2

0

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

안녕하세요 재욱님! dictionary_chain에 사용된 프롬프트가 잘못작성되었기 때문인데요, 지금 작성하신 프롬프트에서는 적절하게 사용자의 질문을 처리할 수 없습니다.

강의자료로 업로드한 소스코드를 보시면 프롬프트를 아래처럼 구성하셔야 합니다

prompt = ChatPromptTemplate.from_template(f"""
    사용자의 질문을 보고, 우리의 사전을 참고해서 사용자의 질문을 변경해주세요.
    만약 변경할 필요가 없다고 판단된다면, 사용자의 질문을 변경하지 않아도 됩니다.
    그런 경우에는 질문만 리턴해주세요
    사전: {dictionary}
    
    질문: {{question}}  # 예시코드에 질문이 누락됨
""")

깃헙 강의자료와 작성하신 코드를 비교해보시고 다시 시도해보세요!

0

안녕하세요, 인프런 AI 인턴입니다. 유재욱님께서 질문하신 문제는 “dictionary chain” 사용 시 잘못된 질문 변환에 대한 것입니다. LangChain과 관련된 이러한 변환 오류는 종종 특정 구성이나 프롬프트 설정의 잘못된 처리에서 발생할 수 있습니다. 이를 해결하기 위한 몇 가지 방법을 제공해드리겠습니다.

문제 요약 및 오류 분석

  1. Dictionary Chain 설정 문제: 프롬프트 템플릿에서 질문의 핵심 변환 규칙이 정확히 전달되지 않는 경우 발생할 수 있습니다.
  2. LLM의 무작위 답변 생성: LLM이 특정 상황에서 맥락과 무관한 질문을 생성하고 이에 대한 응답을 주는 경우, 이로 인해 원치 않는 결과가 발생할 수 있습니다.

해결책

  1. 프롬프트 템플릿 수정
    • 프롬프트 템플릿의 명령어가 명확한지 검토하고, 원하는 대로 동작하도록 조건을 수정합니다. 예를 들어, “사전: {dictionary}” 부분을 수정하여 문자열이 제대로 사용되도록 할 수 있습니다.
    • 적절한 조건을 추가하여 “변경이 필요하다면” 조건을 명시해 주세요.
   prompt_template = f"""
   사용자의 질문을 보고 우리의 사전을 참고해서 사용자의 질문을 변경해주세요.
   변경이 필요하다고 판단되는 경우, 해당 부분만 변경하고, 그렇지 않으면 질문을 그대로 유지합니다.
   
   사전 : {dictionary}
   """
  1. Dictionary Chain의 동작 확인

    • 변환된 질문을 명확히 확인하고, 사전에 입력된 변환 규칙이 의도한 대로 작동하고 있는지 검토하세요.
    • 변환될 단어들이 정확히 적용되는지 체크하기 위해 여러 케이스로 테스트해 보세요.
  2. API Key 설정 확인

    • 환경변수 또는 설정에 API 키가 제대로 설정되어 있는지 확인하여 불필요한 경고가 발생하는 것을 방지하십시오.

유사한 질문 사례 및 자료

이와 관련된 문제를 겪고 해결한 사례로는 다음의 질문이 있습니다:
- LLM이 답변하지 못함: 특정 데이터의 처리 방식에 따라 결과가 좌우될 수 있다는 사례입니다.

지금까지 설명드린 해결책이 도움이 되시기를 바라며, 여전히 문제가 해결되지 않는다면 더 자세한 정보를 제공해 주시면 추가적인 도움을 드리겠습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.

현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏

추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

유재욱님의 프로필 이미지
유재욱

작성한 질문수

질문하기