작성
·
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과 관련된 이러한 변환 오류는 종종 특정 구성이나 프롬프트 설정의 잘못된 처리에서 발생할 수 있습니다. 이를 해결하기 위한 몇 가지 방법을 제공해드리겠습니다.
prompt_template = f"""
사용자의 질문을 보고 우리의 사전을 참고해서 사용자의 질문을 변경해주세요.
변경이 필요하다고 판단되는 경우, 해당 부분만 변경하고, 그렇지 않으면 질문을 그대로 유지합니다.
사전 : {dictionary}
"""
Dictionary Chain의 동작 확인
API Key 설정 확인
이와 관련된 문제를 겪고 해결한 사례로는 다음의 질문이 있습니다:
- LLM이 답변하지 못함: 특정 데이터의 처리 방식에 따라 결과가 좌우될 수 있다는 사례입니다.
지금까지 설명드린 해결책이 도움이 되시기를 바라며, 여전히 문제가 해결되지 않는다면 더 자세한 정보를 제공해 주시면 추가적인 도움을 드리겠습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.