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

NoboDy J님의 프로필 이미지

작성한 질문수

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

3.2 LangChain과 Chroma를 활용한 RAG 구성

create_retrieval_chain, Custom LCEL 을 사용해서 chain을 구성하면 코드가 어떻게 되는지 보고 싶습니다.

해결된 질문

24.08.08 09:05 작성

·

164

·

수정됨

0

from langchain.chains import RetrievalQA

qa_chain = RetrievalQA.from_chain_type(
    llm, 
    retriever=database.as_retriever(),
    chain_type_kwargs={"prompt": prompt}
)

 

이 예제 코드에서 create_retrieval_chain, Custom LCEL 을 사용해서 chain을 구성한 코드를 보고싶습니다.

답변 1

0

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

2024. 08. 08. 09:10

print(qa_chain)

이런식으로 확인하실 수 있습니다! 아마 StuffDocumentsChain 이 찍힐건데 안에 들어있는 프롬프트랑 등등 이것저것 보이실거에요. 소스코드는 랭체인 깃헙 레포 에서 확인하실 수 있습니다!

NoboDy J님의 프로필 이미지
NoboDy J
질문자

2024. 08. 08. 11:20

  1. RetrievalQA 이 체인은 Deprecated 되었나요?
    2. 그리고 제가 공식문서를 보고 작성한 코드인데, 이렇게 작성해도 되는지 코드리뷰 한 번 부탁드립니다!

from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_community.document_loaders import Docx2txtLoader
from langchain_openai import OpenAIEmbeddings
from langchain_chroma import Chroma
from langchain import hub
from langchain.chains import create_retrieval_chain
from langchain.chains.combine_documents import create_stuff_documents_chain
from langchain_core.prompts import ChatPromptTemplate


load_dotenv()

llm = ChatOpenAI(model_name="gpt-4o-mini")

text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=1500,
    chunk_overlap=200,
)
loader = Docx2txtLoader("./tax.docx")
docs = loader.load_and_split(text_splitter=text_splitter)
embedding = OpenAIEmbeddings(model="text-embedding-3-large")
vetorstore = Chroma.from_documents(documents=docs, embedding=embedding)
retriever = vetorstore.as_retriever()

system_prompt = """
    - 당신은 최고의 한국 소득세 전문가 입니다.
    - 답변은 영어로 제공해주세요.
    - [Context]를 참고해서 사용자의 질문에 답변해주세요.
    
    [Context]
    {context}
"""

prompt = ChatPromptTemplate.from_messages(
    [
        ("system", system_prompt),
        ("human", "{input}"),
    ]
)

# prompt = hub.pull("langchain-ai/retrieval-qa-chat")
question_answer_chain = create_stuff_documents_chain(llm, prompt)
rag_chain = create_retrieval_chain(retriever, question_answer_chain)

input = '연봉 5천만원인 직장인의 소득세는 얼마인가?'
result = rag_chain.invoke({"input": input})
result

 

  1. prompt = hub.pull("langchain-ai/retrieval-qa-chat")를 사용하면 system_prompt는 따로 사용 할 수 없는 것인지 궁금합니다.

질문이 많은데, 처음하다보니 확실히 알고 넘어가야 할 것 같아서 질문드립니다. 번거로우시겠지만 답변 부탁드리겠습니다.

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

2024. 08. 09. 09:15

  1. 작성하신대로 진행하셔도 됩니다
    3. retrieval-qa-chat 이라는 프롬프트가 system prompt라서, 별도로 system prompt 작성을 원하시면 hub.pull() 을 사용하지 않으시는게 좋습니다. 만약 기존의 프롬프트에서 확장을 하고싶으시면 langsmith hub에서 내용을 확인하시고, 그대로 복사하셔서 커스텀 하고싶은 내용을 추가하시면 됩니다

NoboDy J님의 프로필 이미지

작성한 질문수

질문하기