인공지능/RAG

LangChain - RunnablePassTrough

BangPro 2024. 6. 4. 15:59
728x90

RunnablePassThrough

chain을 여러 단계로 구성할때 전 단계의 출력값을 바로 다음 단계의 입력값으로 사용해야하는 경우가 있는데

이런 경우에 RunnablePassThrough를 사용하면 됨. 일반적으로 RunnableParallel이랑 같이 사용됨

1. API key 설정

%pip install -qU langchain langchain-openai

import os
from getpass import getpass

os.environ["OPENAI_API_KEY"] = getpass()

2. RunnablePassTrough 구조 살피기

from langchain_core.runnables import RunnableParallel, RunnablePassthrough

runnable = RunnableParallel(
    passed = RunnablePassthrough(),
    modified = lambda x : x["num"] + 1,
)

runnable.invoke({"num": 1})
  • 위 코드에서는 RunnablePassThrough()를 통해서 값을 전달받고 passed 변수에 저장함.
  • 이후 modified에 수정된 값을 저장함.
  • modified에는 람다식으로 앞서 passed 된 값에 1을 더해줌.
    • lambda x : 여기서 x는 입력값
    • x["num"] + 1 : x는 딕셔너리 값이므로 num이라는 key를 가진 value에 1을 더해줌

3. Retrieval Example

from langchain_community.vectorstores import FAISS
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain_openai import ChatOpenAI, OpenAIEmbeddings

vectorstore = FAISS.from_texts(
    ["harrison worked at kensho"], embedding=OpenAIEmbeddings()
)
retriever = vectorstore.as_retriever()
template = """Answer the question based only on the following context:
{context}

Question: {question}
"""
prompt = ChatPromptTemplate.from_template(template)
model = ChatOpenAI()

retrieval_chain = (
    {"context" : retriever, "question": RunnablePassthrough()}
    | prompt
    | model
    | StrOutputParser()
)

retrieval_chain.invoke("where did harrison work?")
  • Retrival_chain은 {"context", "question"}, prompt, model, StrOutputParser()로 구성된다.
  • "context"는 vector store에서 검색을 해서 가져오는 문자열
  • "question"은 RunnablePassThrough 즉,invoke() 안의 문자열이다.
  • 이후 "context"와 "question"이 prompt에 formatting 된다.
  • 이후 이 prompt로 model에 질의를 하고
  • StrOutputParser()를 통해서 결과를 문자열로 출력한다.

StrOutputParser()가 없는 경우 아래와 같다.

retrieval_chain = (
    {"context" : retriever, "question": RunnablePassthrough()}
    | prompt
    | model
)
retrieval_chain.invoke("where did harrison work?")