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

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

Jongha Lim님의 프로필 이미지

작성한 질문수

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

3.2 LangChain과 Chroma를 활용한 RAG 구성

RetrievalQA is Deprecated

해결된 질문

작성

·

205

0

RetrievalQA 가 0.1.17 버전 이후로 Deprecated 되었다고 마이그레이션 가이드를 보고 다음과 같이 바꿨습니다.

from langchain import hub
from langchain.chains import create_retrieval_chain
from langchain.chains.combine_documents import create_stuff_documents_chain

retrieval_qa_chat_prompt = hub.pull("langchain-ai/retrieval-qa-chat")

combine_docs_chain = create_stuff_documents_chain(llm, retrieval_qa_chat_prompt)
rag_chain = create_retrieval_chain(database.as_retriever(), combine_docs_chain)

rag_chain.invoke({"input": query})

위 예시는 잘 작동하는데, rml/rag-prompt 를 사용하면,

KeyError: "Input to ChatPromptTemplate is missing variables {'question'}. Expected: ['context', 'question'] Received: ['input', 'context']\nNote: if you intended {question} to be part of the string and not a variable, please escape it with double curly braces like: '{{question}}'.\nFor troubleshooting, visit: https://python.langchain.com/docs/troubleshooting/errors/INVALID_PROMPT_INPUT "

가 발생하는데, template 의 placeholder 의 형태가 달라서인것 같은데, 어떻게 키값을 설정해야 하나요?

답변 3

0

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

안녕하세요 종하님! 왠지 다른 분들도 도움을 받으실 수 있을 것 같아서 PromptTemplate 활용방법을 추가촬영 했습니다. 강의에서 활용한 노트북도 깃에 올려두었으니 한번 보시고, 디버깅 해보시면 좋을 것 같습니다!

강의영상: https://www.inflearn.com/courses/lecture?courseId=333796&unitId=264388&subtitleLanguage=ko

 

노트북: https://github.com/jasonkang14/inflearn-rag-notebook/blob/main/5.5%20PromptTemplate%20%ED%99%9C%EC%9A%A9%EB%B0%A9%EB%B2%95.ipynb

0

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

invoke하는 부분을 'input' 대신 'question' 으로 변경해주시면 됩니다. 이건 랭체인에서 프롬프트를 처리하는 문법인데요, 이번 주말에 설명자료를 작성해서 강의를 업데이트하고 공유드리겠습니다!

Jongha Lim님의 프로필 이미지
Jongha Lim
질문자

KeyError                                  Traceback (most recent call last)
Cell In[9], line 1
----> 1 rag_chain.invoke({"question": query})

File ~/.pyenv/versions/3.12.8/envs/rag/lib/python3.12/site-packages/langchain_core/runnables/base.py:5352, in RunnableBindingBase.invoke(self, input, config, **kwargs)
   5346 def invoke(
   5347     self,
   5348     input: Input,
   5349     config: Optional[RunnableConfig] = None,
   5350     **kwargs: Optional[Any],
   5351 ) -> Output:
-> 5352     return self.bound.invoke(
   5353         input,
   5354         self._merge_configs(config),
   5355         **{**self.kwargs, **kwargs},
   5356     )

File ~/.pyenv/versions/3.12.8/envs/rag/lib/python3.12/site-packages/langchain_core/runnables/base.py:3020, in RunnableSequence.invoke(self, input, config, **kwargs)
   3018 context.run(_set_config_context, config)
   3019 if i == 0:
-> 3020     input = context.run(step.invoke, input, config, **kwargs)
   3021 else:
   3022     input = context.run(step.invoke, input, config)
...
     66     ).assign(answer=combine_docs_chain)
     67 ).with_config(run_name="retrieval_chain")
     69 return retrieval_chain

KeyError: 'input'

rag_chain.invoke({"question": query}) 로 변경했지만, 위와 같은 에러가 발생합니다.

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

KeyError 인걸로 봐서는 어딘가 노트북에서 실행이 꼬인게 아닌가 싶은데 전체 코드를 공유해주실 수 있나요?

 

복붙해서 올려주시면 한번 확인해보겠습니다!

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

깃에 올리셨으면 주소를 주셔도 됩니다

0

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

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

Jongha Lim님께서 질문하신 내용은 LangChain에서 RetrievalQA가 사용되지 않게 된 뒤, 새로운 체인 구성이 요구되는 상황에 관련한 것입니다. 마이그레이션 후 KeyError가 발생한다는 점에서 프롬프트 템플릿의 변수명이 기대와 맞지 않는 경우가 문제의 핵심으로 보입니다.

문제 설명 및 해결방안

KeyError는 제공된 프롬프트 템플릿에 필요한 변수들이 올바르게 매핑되지 않았을 때 발생합니다. rml/rag-prompt를 사용하는 경우, 해당 프롬프트의 기대 변수와 체인에서 사용하는 변수가 일치하지 않아 오류가 생겼습니다.

  • 프롬프트 변수 조정: retrieval_qa_chat_prompt = hub.pull("langchain-ai/retrieval-qa-chat") 대신 원하는 대로 rml/rag-prompt를 가져오신 후, 그 프롬프트가 요구하는 변수 (question, context 등)에 맞게 체인의 입력 변수를 조정해야 합니다.

코드 수정 예시

아래는 rml/rag-prompt를 사용할 때 question과 같은 변수에 맞춰 체인을 작성하는 예시입니다:

from langchain import hub
from langchain.chains import create_retrieval_chain
from langchain.chains.combine_documents import create_stuff_documents_chain

retrieval_qa_chat_prompt = hub.pull("rml/rag-prompt")

combine_docs_chain = create_stuff_documents_chain(llm, retrieval_qa_chat_prompt)
# 적절한 입력 변수명을 사용하도록 일부 조정이 필요합니다.
# 예를 들어, {'input': query} 대신 {'question': query} 등의 방식으로 키 값을 올바르게 맞춰줍니다.
rag_chain = create_retrieval_chain(database.as_retriever(), combine_docs_chain)

# invoke 할 때 필요한 입력 변수를 올바르게 지정해야 합니다.
rag_chain.invoke({"question": query, "context": some_retrieved_context})

이 방식으로 진행하시되, 프롬프트가 요구하는 변수명을 항상 검사하고 그에 맞게 코드를 조정하심으로써 적절히 해결할 수 있을 것입니다.

관련 질문이 다음의 링크에서 논의된 바 있으니, 참고하시어 문제를 해결해보시기 바랍니다.

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