पाठ 9 / 29
Send से Fan-Out (Map-Reduce)
कई items पर एक ही node समानांतर चलाएँ और परिणाम मिलाएँ।
प्रति item एक कार्य
जब समानांतर कार्यों की संख्या सिर्फ़ run समय पर पता हो (N दस्तावेज़ों में से हर एक का सार, N दावों में से हर एक की जाँच), तब conditional edge Send(node, payload) ऑब्जेक्ट्स की सूची लौटा सकती है। हर Send उस node को अपने निजी इनपुट के साथ समानांतर शुरू करता है, और परिणाम reducer (आम तौर पर list-append) से साझा state में बहते हैं। फिर बाद का node उन्हें घटाता है (मिलाना, rank करना, उत्तर देना)। यह map-reduce पैटर्न हाथ से loops लिखने से बचाता है और स्वतंत्र कार्य समवर्ती चलाता है, पर rate limits और लागत याद रखें: N items का मतलब N मॉडल calls।
तीन दस्तावेज़ समानांतर सार, चलाकर
मैंने यह Python virtual environment में langgraph 1.2.12 और langchain-core 1.6.6 के साथ ऑफ़लाइन चलाया। किसी API key या मॉडल की ज़रूरत नहीं क्योंकि मॉडल की जगह सादे Python functions हैं, इसलिए आउटपुट दोहराने योग्य है। तीन Send कार्य summarise node चलाते हैं, प्रति दस्तावेज़ एक। परिणाम list-append reducer से जुटाए जाते हैं; छापने से पहले sort किए गए हैं क्योंकि समानांतर कार्य किसी भी क्रम में पूरे हो सकते हैं।
import operator
from typing import Annotated, TypedDict
from langgraph.graph import StateGraph, START, END
from langgraph.types import Send
class State(TypedDict):
docs: list
summaries: Annotated[list, operator.add]
def fan_out(state):
return [Send("summarise", {"doc": d}) for d in state["docs"]] # one parallel task per document
def summarise(payload):
doc = payload["doc"]
return {"summaries": [f"{doc.split()[0]}...({len(doc.split())} words)"]}
g = StateGraph(State)
g.add_node("summarise", summarise)
g.add_conditional_edges(START, fan_out, ["summarise"])
g.add_edge("summarise", END)
out = g.compile().invoke({"docs": ["Leave policy has 24 days", "Travel policy caps hotels", "Security policy requires 2FA now"], "summaries": []})
print(sorted(out["summaries"]))
Output:
['Leave...(5 words)', 'Security...(5 words)', 'Travel...(4 words)']
समानांतर क्रम पर निर्भर न रहें
समानांतर शाखाओं के परिणाम किसी भी क्रम में आ सकते हैं। क्रम मायने रखे तो sort करें या key दें।
त्वरित जाँच: Send सबसे ज़्यादा कब उपयोगी है?
- Reducers बंद करने के लिए
- निश्चित दो-चरण chain के लिए
- जब समानांतर कार्यों की संख्या सिर्फ़ run समय पर पता हो
- Graph compile करने के लिए
Answer
जब समानांतर कार्यों की संख्या सिर्फ़ run समय पर पता हो — Send प्रति item गतिशील रूप से एक कार्य बनाता है।