1.3. Runnable

데이터를 효과적으로 전달하는 방법

  • RunnablePassthrough 는 입력을 변경하지 않거나 추가 키를 더하여 전달할 수 있습니다.
  • RunnablePassthrough() 가 단독으로 호출되면, 단순히 입력을 받아 그대로 전달합니다.
  • RunnablePassthrough.assign(…) 방식으로 호출되면, 입력을 받아 assign 함수에 전달된 추가 인수를 추가합니다.

chain 을 invoke() 하여 실행할 때는 입력 데이터의 타입이 딕셔너리여야 합니다.

from langchain_ollama import ChatOllama
from langchain_core.prompts import PromptTemplate

llm_model = ChatOllama(model="exaone3.5", temperature=0)

prompt = PromptTemplate.from_template("{num} 의 10배는?")

# chain 을 생성합니다.
chain = prompt | llm_model

# chain 을 실행합니다.
result = chain.invoke({"num": 5})
print(result
content=’5의 10배는 **50**입니다.’ additional_kwargs={} response_metadata={‘model’: ‘exaone3.5’, ‘created_at’: ‘2025-03-22T05:29:22.312077Z’, ‘done’: True, ‘done_reason’: ‘stop’, ‘total_duration’: 1808778625, ‘load_duration’: 661635833, ‘prompt_eval_count’: 42, ‘prompt_eval_duration’: 642000000, ‘eval_count’: 14, ‘eval_duration’: 500000000, ‘message’: Message(role=’assistant’, content=”, images=None, tool_calls=None)} id=’run-d78e708d-53db-40ec-be18-e9c378762469-0′ usage_metadata={‘input_tokens’: 42, ‘output_tokens’: 14, ‘total_tokens’: 56}

하지만, langchain 라이브러리가 업데이트 되면서 1개의 변수만 템플릿에 포함하고 있다면, 값만 전달하는 것도 가능합니다.

# chain 을 실행합니다.
result = chain.invoke(5)
print(result)
content=’5의 10배는 **50**입니다.’ additional_kwargs={} response_metadata={‘model’: ‘exaone3.5’, ‘created_at’: ‘2025-03-22T05:29:22.867532Z’, ‘done’: True, ‘done_reason’: ‘stop’, ‘total_duration’: 550320916, ‘load_duration’: 9354041, ‘prompt_eval_count’: 42, ‘prompt_eval_duration’: 39000000, ‘eval_count’: 14, ‘eval_duration’: 500000000, ‘message’: Message(role=’assistant’, content=”, images=None, tool_calls=None)} id=’run-27c575aa-4757-4032-af43-ba535f241bd8-0′ usage_metadata={‘input_tokens’: 42, ‘output_tokens’: 14, ‘total_tokens’: 56

아래는 RunnablePassthrough 를 사용한 예제입니다. RunnablePassthrough 는 runnable 객체이며, runnable 객체는 invoke() 메소드를 사용하여 별도 실행이 가능합니다.

from langchain_core.runnables import RunnablePassthrough

# runnable
result = RunnablePassthrough().invoke({"num": 10})
print(result)
{‘num’: 10}

아래는 RunnablePassthrough 로 체인을 구성하는 예제입니다.

runnable_chain = {"num": RunnablePassthrough()} | prompt | llm_model

# dict 값이 RunnablePassthrough() 로 변경되었습니다.
result = runnable_chain.invoke(10)
print(result)
content=’10의 10배는 **100**입니다. \n\n10 * 10 = 100′ additional_kwargs={} response_metadata={‘model’: ‘exaone3.5’, ‘created_at’: ‘2025-03-22T05:29:24.180979Z’, ‘done’: True, ‘done_reason’: ‘stop’, ‘total_duration’: 1306694208, ‘load_duration’: 8516333, ‘prompt_eval_count’: 43, ‘prompt_eval_duration’: 178000000, ‘eval_count’: 30, ‘eval_duration’: 1118000000, ‘message’: Message(role=’assistant’, content=”, images=None, tool_calls=None)} id=’run-b5534691-c572-405e-90d8-79251ccc478b-0′ usage_metadata={‘input_tokens’: 43, ‘output_tokens’: 30, ‘total_tokens’: 73}

다음은 RunnablePassthrough.assign() 을 사용하는 경우와 비교한 결과입니다.

result = RunnablePassthrough().invoke({"num": 1})
print(result)
{‘num’: 1}

RunnablePassthrough.assign() 함수는 입력  값으로 들어온 값의 key/value 쌍과 새롭게 할당된 key/value 쌍을 합칩니다.

result = (RunnablePassthrough.assign(new_num=lambda x: x["num"]*3)).invoke({"num": 1})
print(result)
{‘num’: 1, ‘new_num’: 3}
이 글은 카테고리: 랭체인 (LangChain)에 포함되어 있으며 태그: (이)가 사용되었습니다. 고유주소를 북마크하세요.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다