from langchain_core.runnables import RunnablePassthrough
#assign으로 새로운 필드 추가
runnable = RunnablePassthrough.assign(double=lambda x: x["num"] * 2)
print(runnable.invoke({"num": 10}))
from langchain_openai import ChatOpenAI
from langchain_core.prompts import PromptTemplate
from langchain_core.output_parsers import StrOutputParser
model = ChatOpenAI()
prompt = PromptTemplate.from_template("{topic} 에 대하여 3문장으로 설명해줘")
chain = prompt | model | StrOutputParser()
for token in chain.stream({"topic": "멀티모달"}) :
print(token, end="", flush=True)
파이썬의 print()는 내부적으로 버퍼링(buffering) 을 합니다.
그래서 for token in chain.stream(...) 같은 스트리밍 출력에서는
토큰이 생성돼도 바로 표시되지 않고, 버퍼가 차야 보일 수 있습니다.
if np.isnan(X_np).any() or np.isinf(X_np).any():
raise ValueError("X에 NaN/Inf가 포함되어 있습니다.")
task 를 만드는 함수는 크게 3가지로, 파이썬 공식 문서에서는
고수준 asyncio.create_task() 함수를 사용하거나
저수준 loop.create_task() 나
ensure_future() 함수를 사용하도록 권고하고 있다.

sysctl -n hw.logicalcpu
from langchain_core.runnables import RunnablePassthrough
RunnablePassthrough().invoke(10) # 항등함수처럼 작용. 즉 input data가 그대로 리턴
from langchain_core.runnables import RunnableParallel
# 여러 인스턴스를 병렬로 실행한다.
runnable = RunnableParallel(
passed = RunnablePassthrough(), # 입력된 인자를 그대로 통과시킨다.
extra = RunnablePassthrough.assign(mult = lambda x: x["num"] * 3), #인자추가
modified= lambda x: x["num"] +1, # 입력된 딕셔너리 값에 해당값을 더한다.
)
runnable.invoke({"num": 1})
# {'passed': {'num': 1}, 'extra': {'num': 1, 'mult': 3}, 'modified': 2}



set("apple" + "pple!") # 순서보장 x, 중복제거된
# {'!', 'a', 'e', 'l', 'p'}
char_to_index = dict((c, i) for i, c in enumerate(char_vocab)) # 문자에 고유한 정수 인덱스 부여