एजेंट्स

एक एजेंट एक मॉडल है जो एक लूप में चलता है, अगले टूल को कॉल करने का चयन करता है जब तक कि कार्य पूरा न हो जाए। इस अध्याय का बाकी हिस्सा यह है कि इसका मतलब क्या है, यह कहां काम आता है, और यह कहां चुपचाप खर्च करता है।
एजेंट लूप
टूल उपयोग में मॉडल ने एक फ़ंक्शन को कॉल किया और आपने परिणाम वापस भेजा। लेकिन कुछ कार्यों में कई चरण होते हैं, और आप पहले से चरणों को नहीं जानते हैं। "सबसे सस्ती उड़ान खोजें और इसे बुक करें" का मतलब खोजना, तुलना करना, कैलेंडर जांचना, फिर बुक करना हो सकता है, और मॉडल को यह क्रम जैसे-जैसे बढ़ता है वैसे ही काम करना पड़ता है।
तो एक एकल टूल कॉल को संभालने की जगह, आप पूरी चीज़ को एक लूप में रखते हैं। यह दोहराया जाने वाला चक्र एजेंट लूप है, एक बार बार-बार तब तक जब तक कार्य पूरा न हो जाए:
- कॉनवर्सेशन और उपलब्ध टूल्स को मॉडल को भेजें।
- मॉडल या तो एक टूल को कॉल करता है या एक अंतिम उत्तर देता है।
- अगर इसने एक टूल को कॉल किया, तो इसे चलाएं, परिणाम को कॉनवर्सेशन में जोड़ें, और चरण 1 पर वापस जाएं।
- अगर इसने एक अंतिम उत्तर दिया, तो रुकें।
प्रत्येक बार मॉडल सब कुछ देखता है जो अब तक हुआ है, पिछले टूल परिणामों सहित, और अगला कदम तय करता है। यह टूल उपयोग से पूरी तरह अलग है: आप तब तक लूप करते रहते हैं जब तक मॉडल को संतुष्टि न हो कि वह पूरा हो गया है।
असली बदलाव यह है कि कौन स्टीयर कर रहा है। अब तक के हर अध्याय में, आपका कोड कंट्रोल फ्लो तय करता था: आपने चुना कि मॉडल को कब कॉल करें, कब टूल चलाएं, अगला क्या हो। एक एजेंट वह निर्णय मॉडल को सौंप देता है। लूप बार-बार पूछता है "अगला क्या होना चाहिए?" और मॉडल की भविष्यवाणी हर बार उत्तर है। आप नियंत्रण को लचीलेपन के लिए व्यापार करते हैं, और यह व्यापार पहुंच और जोखिम दोनों का स्रोत है।
नीचे, कुछ नया नहीं हो रहा है। यह बढ़ते संदर्भ पर समान भविष्यवाणी है, टूल-उपयोग राउंड-ट्रिप दोहरी। मॉडल एक योजना तैयार नहीं करता है और इसका पालन नहीं करता है। प्रत्येक बार यह अगला एकल सर्वोत्तम कदम की भविष्यवाणी करता है जो वह अभी देख सकता है, फिर लूप फिर से चलता है।
जब यह काम करता है, तो यह एक लक्ष्य की ओर तर्क करने जैसा लगता है। जब यह नहीं होता है, तो एजेंट अपने आप पर लूप करता है या एक डेड एंड पर भटकता है, क्योंकि सिस्टम का कोई हिस्सा भी समग्र योजना को नहीं रखता है।
न्यूनतम एजेंट
यहाँ लूप कोड में है। यह टूल उपयोग से टूल परिभाषाओं और कार्यान्वयनों को पुनः उपयोग करता है और एक लूप में लपेटता है जो तब तक चलता है जब तक मॉडल टूल्स मांगना बंद नहीं करता।
import json
def run_agent(user_text, tools, tool_impls, max_steps=6):
messages = [{"role": "user", "content": user_text}]
step = 0
while step < max_steps:
response = client.chat.completions.create(model=MODEL, messages=messages, tools=tools)
message = response.choices[0].message
messages.append(message)
calls = message.tool_calls
if not calls:
return message.content # कोई टूल नहीं चाहता: यह अंतिम उत्तर है
# हर अनुरोधित टूल को चलाएं और परिणाम वापस खिलाएं
for call in calls:
args = json.loads(call.function.arguments)
result = tool_impls[call.function.name](args)
messages.append({"role": "tool", "tool_call_id": call.id, "content": json.dumps(result)})
step += 1
return "रुक गया: एजेंट अपनी कदम सीमा तक पहुंच गया।" # सुरक्षा जालइसे ऊपर से नीचे पढ़ें: मॉडल को कॉल करें, इसके संदेश को कॉनवर्सेशन में धकेलें, और अगर इसने टूल्स मांगे, तो उन सभी को चलाएं और परिणाम जोड़ें, फिर फिर से लूप करें। जब मॉडल एक टूल कॉल की जगह टेक्स्ट लौटाता है, तो वह टेक्स्ट अंतिम उत्तर है और आप इसे लौटाते हैं।
max_steps मान एक कदम सीमा सेट करता है, सुरक्षा जाल जो लूप को दूर नहीं दौड़ने देता है, जो अगला अनुभाग है। यहाँ आकार एक प्रदाता के SDK से मेल खाता है; फ़ील्ड नाम प्रदाताओं में भिन्न होते हैं, लेकिन लूप हर जगह एक जैसा है।
रुकना और सुरक्षा उपाय
एक लूप जो मॉडल को रुकना तय करता है विफल हो सकता है। यह उपकरणों को हमेशा के लिए कॉल कर सकता है, अपने आप को दोहरा सकता है, या एक डेड एंड का पीछा कर सकता है। क्योंकि हर कदम एक मॉडल कॉल है जो टोकन द्वारा बिल किया जाता है, एक भागते हुए एजेंट पैसे और समय को तेज़ी से जलाते हैं।
तो सुरक्षा उपाय, जो लूप के चारों ओर सीमाएँ होती हैं, डिज़ाइन का हिस्सा हैं, न कि एक पॉलिश चरण जो आप अंत में जोड़ते हैं:
- एक कदम सीमा। लूप की संख्या को कैप करें,
max_stepsतरीका। जब यह हिट हो, रुकें और लौटें। - टूल इनपुट को सत्यापित करें। मॉडल तर्क चुनता है, इसलिए असली परिणाम वाली किसी भी चीज़ को चलाने से पहले उन्हें जांचें।
- सीमा करें कि उपकरण क्या कर सकते हैं। एजेंट को सबसे कम शक्ति दें जिसे उसे चाहिए। एक टूल जो पढ़ता है वह एक जैसा है जो हटाता है।
- लागत देखें। कई मॉडल कॉल प्रति कार्य तेज़ी से गुणा करते हैं, इसलिए टोकन को ट्रैक करें और एक बजट सेट करें।
इन्हें जोड़ने वाला धागा: मॉडल पथ को तुरुप कर रहा है, इसलिए आप सीमाएँ रखते हैं जो यह नहीं होगा। मान लें कि एजेंट कम से कम एक बार गलत काम करेगा, और वह जीवित रहेगा।
जब वर्कफ़्लो एजेंट को हराता है
एजेंट्स रोमांचक हैं, जो इसे लुभावना बनाता है जब आपको एक की आवश्यकता नहीं है। सादा नियम: अगर आप पहले से ही चरणों को जानते हैं, तो एजेंट का उपयोग न करें। उन्हें सादे कोड के रूप में लिखें, एक वर्कफ़्लो, जहाँ हर कदम एक निश्चित क्रम में चलता है।
एक वर्कफ़्लो अधिक विश्वसनीय, सस्ता, और डिबग करना बहुत आसान है, क्योंकि आप पथ को नियंत्रित करते हैं, इसके बजाय कि मॉडल इसे खोजता है। खुले सिरे वाले कार्यों के लिए एजेंट्स बचाएं जहाँ चरण उस पर निर्भर करते हैं जो आविष्कार किया गया है।
कई सुविधाएँ जो एजेंट की तरह दिखती हैं वास्तव में एक संरचित आउटपुट कॉल या एक RAG लुकअप हाथ से जुड़ी हुई हैं। एजेंट के लिए पहुंचें केवल जब आप चरणों को आगे से लिख न सकें।
व्यावहारिक में
ऊपर run_agent फ़ंक्शन पूरी चीज़ है। इसे एक सवाल, एक सेट उपकरण, और उनकी कार्यान्वयन दें, और यह तब तक लूप करता है जब तक किया या कदम सीमा तक पहुँचता है। एक छोटा कार्य लूप अर्जन को दिखाता है:
answer = run_agent(
"Oslo में मौसम क्या है और क्या मुझे छाता लाना चाहिए?",
tools, # टूल-उपयोग अध्याय से get_weather शामिल है
tool_impls, # {"get_weather": ...}
)
# एजेंट get_weather को कॉल करता है, "बादल" पढ़ता है, फिर एक अंतिम बार में उत्तर देता है:
# "यह Oslo में बादल भरा है 18 डिग्री पर है, इसलिए छाता एक विवेकपूर्ण विचार है।"एक टूल, एक लूप, एक उत्तर। एक ही संरचना कई उपकरणों और कई कदम तक बिना बदलाव के पैमाने।
एक बार जब आप इतनी क्षमता की चीज़ें बनाने में सक्षम हो जाते हैं, तो अगला सवाल यह है कि आप कैसे जानते हैं कि वे वास्तव में काम करते हैं, जो evals के बारे में है।
run_agent लूप पूरी पैटर्न है: इसे एक सवाल, उपकरण, और उनकी कार्यान्वयन दें, और यह तब तक लूप करता है जब तक मॉडल टूल्स मांगना बंद नहीं करता या कैप से टकराता है। एक उपकरण और एक लूप बिना बदलाव के कई तक पैमाने। अगला सवाल यह है कि आप कैसे जानते हैं कि यह वास्तव में काम करता है, जो evals है। 
