해결된 질문
작성
·
89
0
graph_builder.add_edge('get_tax_base_equation', 'calculate_tax_base')
graph_builder.add_edge('get_tax_deduction', 'calculate_tax_base')
graph_builder.add_edge('get_market_ratio', 'calculate_tax_base')
2.7 병렬 처리를 통한 효율 개선 (feat. 프롬프트 엔지니어링).ipynb 에서 질문 있습니다.
3개가 병렬로 실행된다면 분명 먼저 끝나는 노드가 있을 거고 그러면 완료 노드 순서에 맞게 calculate_tax_base를 실행해야 하지만 결과를 보면 calculate_tax_base를 한번만 실행하더라고요. 그러면 어떠한 조작 없이도 ranggraph에서 add_edge를 사용한 노드라면 자동으로 병렬 처리 완료 상태를 보관하고 3개가 전부 종료 된 후 실행된다고 이해했는데 맞을 까요?
제가 이해한게 맞다면 add_edge를 사용하지 않은 노드(Comand 명령어 사용한 노드)들의 병렬 처리에서 스레드 동기화 처리가 자동으로 안되기 때문에 반드시 add_edge를 반드시 사용해야하나요?
이런 질문을 드리는 이유는 Command를 병렬로 처리해보고 있는데 궁금증이 생겨서 그렇습니다.!
messages = [
{"role": "system", "content": system_prompt},
] + state["messages"]
response = llm.with_structured_output(Routers).invoke(messages)
datasources = [router['next'] for router in response['nexts']]
print(datasources)
# FINISH를 analyst_node로 변환
goto_nodes = [
"analyst_node" if ds == "FINISH" else ds
for ds in datasources
]
# 병렬 실행을 위해 전체 리스트 반환
return Command(goto=goto_nodes)
답변 1
0
안녕하세요! 좋은 질문 감사합니다. 답변을 드리자면
3개가 병렬로 실행된다면 분명 먼저 끝나는 노드가 있을 거고 그러면 완료 노드 순서에 맞게 calculate_tax_base를 실행해야 하지만 결과를 보면 calculate_tax_base를 한번만 실행하더라고요. 그러면 어떠한 조작 없이도 ranggraph에서 add_edge를 사용한 노드라면 자동으로 병렬 처리 완료 상태를 보관하고 3개가 전부 종료 된 후 실행된다고 이해했는데 맞을 까요?
맞습니다. 3개가 모두 종료된 다음에 실행됩니다
그리고 앞에 3가지는 종종 pretty_print()
로 확인했을 때 다 안보이는 경우가 많은데, 병렬작업이 끝나고 실행되는 노드의 state를 확인해보시면 정상적으로 다 끝난것을 확인하실 수 있을거에요
이런 질문을 드리는 이유는 Command를 병렬로 처리해보고 있는데 궁금증이 생겨서 그렇습니다.!
add_edge
의 경우에는 DAG를 구성하기 때문에 의도하신대로 종속성을 가지고 병렬로 처리해야할 노드가 완료되는 것을 기다리지만, Command()
는 DAG구성이 되지 않습니다.
그래서 병렬로 실행은 가능하겠지만, analyst_node로 들어가기 전에 다른 노드의 작업들이 끝났다는게 보장되지 않을거에요.
다만 이건 이론상의 내용이고 저도 실제로 시도해보지는 않아서 만약 가능하다고 판단되시면 공유해주실 수 있을까요? 저를 비롯해서 유사한 궁금증을 갖고있는 다른 수강생분들께도 많은 도움이 될 것 같습니다
추가로 설명이 필요한 부분이 있으시면 말씀해주세요!
선생님 안녕하세요. Command()를 사용하여 병렬 처리하는 방법에 대해 고민을 계속 했습니다. 현재는 해당 문제를 해결 한 것 같아서 제가 해결한 내용 공유 드립니다.
https://github.com/tkddls3319/goto_supervisor_fastapi