prompt | llm | parser 한 줄 안에서 값은 dict → PromptValue → AIMessage → str 로 모양을 바꾸며 흘러갑니다. 부품을 하나씩 따로 돌려 보는 components.py, 파이프로 이어 invoke·stream·batch 로 실행하는 lcel_basic.py, 단계 사이에 관찰 지점을 끼우는 lcel_debug.py 를 한 단계씩 따라갑니다. 모델이 쓰는 글은 실행마다 달라서 보라색 자리 표시로만 보여 줍니다.
윗줄이 체인 하나입니다. 상자는 부품(Runnable), 화살표 아래 글자는 부품 사이를 지나가는 값의 타입입니다. 보라색 마름모는 lcel_debug.py 가 끼워 넣는 관찰 지점(tap)이고, 아래 세 칸은 같은 체인을 실행하는 세 가지 방법입니다. 플레이어를 넘기면 그 단계에 해당하는 곳이 파랗게 빛납니다.
lcel_debug.py 15줄의 return value 를 빼면 함수가 None 을 돌려주고, 다음 부품에 None 이 흘러갑니다.{topic} 인데 {"subject": …} 를 넣으면 KeyError: Input to PromptTemplate is missing variables {'topic'} 로 멈춥니다.prompt | llm | parser 의 순서를 바꿀 수 없습니다.chain.batch(inputs, config={"max_concurrency": 2}) 처럼 묶을 수 있습니다.ai_message.content 가 늘 문자열인 것은 아닙니다. components.py 24줄은 지금처럼 글만 오는 응답이라 문자열로 찍히지만, 도구 호출 같은 블록이 섞이면 블록 리스트가 됩니다. 글만 필요하면 파서나 .text 를 씁니다.day1_practice/components.pyPromptTemplate, 모델, StrOutputParser, ChatPromptTemplate 을 하나씩 따로 실행해 입출력 타입을 찍습니다.day1_practice/lcel_basic.pyprompt | llm | parser 체인을 만들어 invoke, stream, batch 로 실행합니다.day1_practice/lcel_debug.pyRunnableLambda 로 만든 tap 을 단계 사이에 끼워 값의 타입이 바뀌는 과정을 찍습니다.