langchain 공부

RunnablePassthrough() 사용 이유

필만이 2024. 8. 29. 14:37

배경

  • 테디노트님의 강의를 보면서 카피하면서 RAG를 만들다가, 그냥 바로 질문 변수를 전달해도 될것 같은데, 사용하는지, 사용 이유가 궁금해 졌다.

RunnablePassthrough: 전체 개요 및 정리

RunnablePassthrough는 LangChain에서 사용하는 Runnable의 일종으로, 입력 데이터를 수정하지 않고 그대로 다음 단계로 전달하는 데 사용됩니다. 주로 체인에서 데이터 흐름을 제어할 때 유용하며, 특히 질문이나 다른 입력이 동적으로 변경될 가능성이 있는 경우에 많이 사용됩니다.

기본 개념:

  • 핵심 역할:

    • RunnablePassthrough의 핵심 역할은 입력된 데이터를 그대로 받아, 처리 없이 다음 단계로 전달하는 것입니다.
    • 이는 체인 내에서 특정 데이터 흐름을 유지하고, 필요한 경우 그대로 전달하기 위해 사용됩니다.
  • 사용 패턴:

    • RunnablePassthrough는 체인의 여러 단계에서 데이터를 가공하지 않고 전달하고자 할 때 사용됩니다. 입력된 데이터를 그대로 다른 단계로 넘겨야 할 필요가 있을 때, 이 클래스가 적합합니다.

주요 사용 사례:

  1. 질문이 동적으로 변경되는 경우:

    • 대화형 시스템이나 실시간 입력 상황에서, 사용자가 입력하는 질문이 매번 다를 수 있습니다. 이 경우 RunnablePassthrough를 사용하여 질문을 그대로 체인의 다음 단계로 전달할 수 있습니다.
  2. 질문을 수정 없이 그대로 전달해야 하는 경우:

    • 질문을 전처리하거나 변환하지 않고 그대로 전달해야 할 때 RunnablePassthrough를 사용합니다. 이는 체인 내에서 질문을 직접 사용하는 언어 모델이나 다른 처리 단계에 일관된 데이터를 전달하는 데 유용합니다.
  3. 입력 데이터의 일관된 전달:

    • 여러 종류의 입력 데이터를 체인 내에서 일관되게 전달할 필요가 있는 경우, RunnablePassthrough는 입력 데이터가 그대로 다음 단계로 넘어가도록 보장합니다.
  4. 복잡한 체인 구성에서의 유연성:

    • 체인이 복잡해지고 여러 단계로 구성될 때, 각 단계에서 입력을 명확히 제어하고 유지하는 것이 중요합니다. RunnablePassthrough는 데이터가 수정 없이 전달되는 것을 보장하여, 체인의 유연성과 확장성을 높입니다.

사용 예시:

context_chain = RunnableMap({
    'context': lambda x: retrieved_docs,  # 검색된 문서를 문맥으로 전달
    'question': RunnablePassthrough()  # 질문을 그대로 전달
})
  • 이 예시에서 RunnablePassthroughquestion을 그대로 다음 단계로 전달하는 역할을 합니다. 문맥(context)은 이미 검색된 문서들로 설정되어 있고, 질문(question)은 별도의 수정 없이 언어 모델에 전달됩니다.

장점:

  1. 유연성:

    • 체인이 복잡한 경우나, 입력 데이터가 자주 변경되는 상황에서 유연하게 사용할 수 있습니다.
    • 입력을 그대로 유지하며, 다양한 입력을 처리하는 체인을 구성할 수 있습니다.
  2. 일관성:

    • 데이터 흐름을 일관되게 유지할 수 있습니다. 체인의 각 단계에서 데이터가 수정되지 않고 그대로 전달되기 때문에, 체인의 각 단계에서 동일한 입력을 사용하는 것이 보장됩니다.
  3. 확장성:

    • 체인을 확장하거나 다른 입력 데이터를 추가해야 하는 상황에서, RunnablePassthrough를 통해 각 입력 데이터를 유연하게 처리할 수 있습니다.

단점:

  1. 단순성:

    • 데이터가 수정되지 않고 그대로 전달되기 때문에, 입력 데이터가 가공될 필요가 있을 때는 RunnablePassthrough가 적절하지 않습니다. 이 경우 별도의 데이터 처리 단계가 필요합니다.
  2. 직관성 부족:

    • 체인의 동작을 처음 접하는 사람들에게는 RunnablePassthrough의 사용이 직관적이지 않을 수 있습니다. 특히, 입력 데이터가 체인 내에서 어떤 식으로 처리되는지 명확하게 이해해야 효과적으로 사용할 수 있습니다.

언제 사용해야 하는가:

  • 입력 데이터가 고정되지 않고, 동적으로 변할 가능성이 있는 경우.
  • 여러 입력 데이터를 일관되게 유지하고 전달해야 하는 경우.
  • 체인이 복잡하거나 확장 가능한 구조를 가지고 있어, 데이터 흐름을 명확히 제어해야 하는 경우.

결론:

RunnablePassthrough는 LangChain의 체인 구성에서 데이터 흐름을 명확하고 일관되게 관리하는 데 매우 유용한 도구입니다. 특히, 질문과 같은 입력 데이터가 동적으로 변경되거나, 여러 단계에 걸쳐 동일한 데이터가 필요할 때 그 유용성이 극대화됩니다. 이러한 특성 때문에, 복잡한 체인 구조에서도 유연하게 사용될 수 있으며, 체인의 확장성과 유지보수성을 높이는 데 중요한 역할을 합니다.