ai-agents-for-beginners

कैसे डिज़ाइन करें अच्छे AI एजेंट

(इस पाठ का वीडियो देखने के लिए ऊपर की छवि पर क्लिक करें)

टूल उपयोग डिज़ाइन पैटर्न

टूल्स दिलचस्प हैं क्योंकि वे AI एजेंटों को अधिक व्यापक क्षमताओं की अनुमति देते हैं। एजेंट के पास जो क्रियाएँ सीमित होती हैं, उन्हें करने के बजाय, टूल जोड़ने से एजेंट अब कई प्रकार की क्रियाएँ कर सकता है। इस अध्याय में, हम टूल उपयोग डिज़ाइन पैटर्न को देखेंगे, जो वर्णन करता है कि AI एजेंट अपने लक्ष्यों को प्राप्त करने के लिए विशिष्ट टूल्स का उपयोग कैसे कर सकते हैं।

परिचय

इस पाठ में, हम निम्नलिखित सवालों का उत्तर देने का प्रयास कर रहे हैं:

सीखने के लक्ष्य

इस पाठ को पूरा करने के बाद, आप सक्षम होंगे:

टूल उपयोग डिज़ाइन पैटर्न क्या है?

टूल उपयोग डिज़ाइन पैटर्न LLMs को बाहरी टूल्स के साथ अंतःक्रिया करने की क्षमता देने पर केंद्रित है ताकि विशिष्ट लक्ष्यों को प्राप्त किया जा सके। टूल्स वे कोड होते हैं जिन्हें एजेंट द्वारा क्रियान्वित किया जाता है ताकि कार्रवाई की जा सके। एक टूल एक सरल फ़ंक्शन हो सकता है जैसे कैलकुलेटर, या तीसरे पक्ष की सेवा जैसे स्टॉक प्राइस लुकअप या मौसम पूर्वानुमान के लिए API कॉल। AI एजेंटों के संदर्भ में, टूल्स मॉडल-जनित फ़ंक्शन कॉल्स के जवाब में एजेंटों द्वारा निष्पादित किए जाने के लिए डिजाइन किए जाते हैं।

इसे किन उपयोग मामलों में लागू किया जा सकता है?

AI एजेंट टूल्स का उपयोग जटिल कार्यों को पूरा करने, जानकारी प्राप्त करने या निर्णय लेने के लिए कर सकते हैं। टूल उपयोग डिज़ाइन पैटर्न उन परिस्थितियों में अक्सर उपयोग किया जाता है जहाँ बाहरी सिस्टम जैसे डाटाबेस, वेब सेवाओं या कोड इंटरप्रेटर्स के साथ गतिशील इंटरैक्शन की आवश्यकता होती है। इस क्षमता का उपयोग कई विभिन्न उपयोग मामलों के लिए किया जा सकता है, जिनमें शामिल हैं:

टूल उपयोग डिज़ाइन पैटर्न को लागू करने के लिए आवश्यक तत्व/निर्माण खंड क्या हैं?

ये निर्माण खंड AI एजेंट को कई प्रकार के कार्यों को करने में सक्षम बनाते हैं। आइए टूल उपयोग डिज़ाइन पैटर्न को लागू करने के लिए आवश्यक प्रमुख तत्वों को देखें:

अगला, आइए फ़ंक्शन/टूल कॉलिंग को अधिक विस्तार से देखें।

फ़ंक्शन/टूल कॉलिंग

फ़ंक्शन कॉलिंग वह प्राथमिक तरीका है जिससे हम LLMs को टूल्स के साथ इंटरैक्ट करने में सक्षम बनाते हैं। अक्सर ‘फ़ंक्शन’ और ‘टूल’ शब्दों का पर्यायवाची रूप में उपयोग किया जाता है क्योंकि ‘फ़ंक्शन्स’ (पुनः उपयोग योग्य कोड ब्लॉक) वे ‘टूल्स’ होते हैं जिनका एजेंट कार्यों को करने के लिए उपयोग करते हैं। एक फ़ंक्शन के कोड को कॉल करने के लिए, LLM को उपयोगकर्ता के अनुरोध की तुलना फ़ंक्शन्स के विवरण से करनी होती है। इसके लिए, सभी उपलब्ध फ़ंक्शन्स के विवरणों वाला एक स्कीमा LLM को भेजा जाता है। फिर LLM उपयुक्त फ़ंक्शन का चयन करता है और उसके नाम और तर्क लौटाता है। चयनित फ़ंक्शन को कॉल किया जाता है, इसका उत्तर LLM को भेजा जाता है, जो फिर उपयोगकर्ता के अनुरोध का जवाब देने के लिए उस जानकारी का उपयोग करता है।

डेवलपर्स के लिए फ़ंक्शन कॉलिंग को लागू करने के लिए, आपको निम्नलिखित की आवश्यकता होगी:

  1. एक LLM मॉडल जो फ़ंक्शन कॉलिंग का समर्थन करता हो
  2. फ़ंक्शन विवरणों वाला एक स्कीमा
  3. प्रत्येक वर्णित फ़ंक्शन के लिए कोड

चलो शहर में वर्तमान समय प्राप्त करने के उदाहरण का उपयोग करके समझते हैं:

  1. फ़ंक्शन कॉलिंग का समर्थन करने वाले LLM को इनिशियलाइज़ करें:

    सभी मॉडल फ़ंक्शन कॉलिंग का समर्थन नहीं करते, इसलिए यह जांचना महत्वपूर्ण है कि आप जो LLM उपयोग कर रहे हैं वह यह करता है। Azure OpenAI फ़ंक्शन कॉलिंग का समर्थन करता है। हम Azure OpenAI क्लाइंट प्रारंभ करके शुरुआत कर सकते हैं।

     # Azure OpenAI क्लाइंट को प्रारंभ करें
     client = AzureOpenAI(
         azure_endpoint = os.getenv("AZURE_OPENAI_ENDPOINT"), 
         api_key=os.getenv("AZURE_OPENAI_API_KEY"),  
         api_version="2024-05-01-preview"
     )
    
  2. एक फ़ंक्शन स्कीमा बनाएँ:

    अगला, हम JSON स्कीमा परिभाषित करेंगे जिसमें फ़ंक्शन का नाम, फ़ंक्शन क्या करता है इसका वर्णन, और फ़ंक्शन पैरामीटर के नाम व विवरण होंगे। फिर हम इस स्कीमा को पहले से बनाए गए क्लाइंट को उपयोगकर्ता के अनुरोध के साथ पास करेंगे, जिसमें सान फ्रांसिस्को में समय खोजने का अनुरोध होगा। महत्वपूर्ण यह है कि टूल कॉल लौटाया जाता है, प्रश्न का अंतिम उत्तर नहीं। जैसा पहले बताया गया, LLM उस फ़ंक्शन का नाम लौटाता है जिसे उसने कार्य के लिए चुना है, और उसे पास किए जाने वाले तर्क।

     # मॉडल के पढ़ने के लिए फ़ंक्शन विवरण
     tools = [
         {
             "type": "function",
             "function": {
                 "name": "get_current_time",
                 "description": "Get the current time in a given location",
                 "parameters": {
                     "type": "object",
                     "properties": {
                         "location": {
                             "type": "string",
                             "description": "The city name, e.g. San Francisco",
                         },
                     },
                     "required": ["location"],
                 },
             }
         }
     ]
    
      
     # प्रारंभिक उपयोगकर्ता संदेश
     messages = [{"role": "user", "content": "What's the current time in San Francisco"}] 
      
     # पहला एपीआई कॉल: मॉडल से फंक्शन का उपयोग करने को कहें
       response = client.chat.completions.create(
           model=deployment_name,
           messages=messages,
           tools=tools,
           tool_choice="auto",
       )
      
       # मॉडल की प्रतिक्रिया को संसाधित करें
       response_message = response.choices[0].message
       messages.append(response_message)
      
       print("Model's response:")  
    
       print(response_message)
      
    
     Model's response:
     ChatCompletionMessage(content=None, role='assistant', function_call=None, tool_calls=[ChatCompletionMessageToolCall(id='call_pOsKdUlqvdyttYB67MOj434b', function=Function(arguments='{"location":"San Francisco"}', name='get_current_time'), type='function')])
    
  3. कार्य को पूरा करने के लिए आवश्यक फ़ंक्शन कोड:

    अब जब LLM ने चुना कि कौन सा फ़ंक्शन चलाना है तो उस कार्य को पूरा करने वाला कोड लिखकर निष्पादित किया जाना चाहिए।
    हम पायथन में वर्तमान समय प्राप्त करने वाला कोड लिख सकते हैं। हमें फ़ाइनल परिणाम पाने के लिए response_message से फ़ंक्शन का नाम और तर्क निकालने वाला कोड भी लिखना होगा।

       def get_current_time(location):
         """Get the current time for a given location"""
         print(f"get_current_time called with location: {location}")  
         location_lower = location.lower()
            
         for key, timezone in TIMEZONE_DATA.items():
             if key in location_lower:
                 print(f"Timezone found for {key}")  
                 current_time = datetime.now(ZoneInfo(timezone)).strftime("%I:%M %p")
                 return json.dumps({
                     "location": location,
                     "current_time": current_time
                 })
          
         print(f"No timezone data found for {location_lower}")  
         return json.dumps({"location": location, "current_time": "unknown"})
    
      # फ़ंक्शन कॉल संभालें
       if response_message.tool_calls:
           for tool_call in response_message.tool_calls:
               if tool_call.function.name == "get_current_time":
         
                   function_args = json.loads(tool_call.function.arguments)
         
                   time_response = get_current_time(
                       location=function_args.get("location")
                   )
         
                   messages.append({
                       "tool_call_id": tool_call.id,
                       "role": "tool",
                       "name": "get_current_time",
                       "content": time_response,
                   })
       else:
           print("No tool calls were made by the model.")  
      
       # दूसरा API कॉल: मॉडल से अंतिम प्रतिक्रिया प्राप्त करें
       final_response = client.chat.completions.create(
           model=deployment_name,
           messages=messages,
       )
      
       return final_response.choices[0].message.content
    
       get_current_time called with location: San Francisco
       Timezone found for san francisco
       The current time in San Francisco is 09:24 AM.
    

फ़ंक्शन कॉलिंग अधिकांश, यदि सभी नहीं, एजेंट टूल उपयोग डिज़ाइन का मूल है, फिर भी इसे स्क्रैच से लागू करना कभी-कभी चुनौतीपूर्ण हो सकता है। जैसा कि हमने पाठ 2 में सीखा, एजेंटिक फ्रेमवर्क हमें टूल उपयोग को लागू करने के लिए पहले से बने निर्माण खंड प्रदान करते हैं।

एजेंटिक फ्रेमवर्क्स के साथ टूल उपयोग उदाहरण

यहाँ कुछ उदाहरण हैं कि कैसे आप विभिन्न एजेंटिक फ्रेमवर्क्स का उपयोग करके टूल उपयोग डिज़ाइन पैटर्न को लागू कर सकते हैं:

सेमैटिक कर्नेल

सेमैटिक कर्नेल .NET, Python, और Java डेवलपर्स के लिए एक ओपन-सोर्स AI फ्रेमवर्क है जो LLMs के साथ काम करता है। यह फ़ंक्शन कॉलिंग की प्रक्रिया को सरल बनाता है, अपने फ़ंक्शन्स और उनके पैरामीटरों का मॉडल के लिए कस्टमैटिक वर्णन करके, जिसे सीरियलाइज़िंग कहा जाता है। यह मॉडल और आपके कोड के बीच आने-जाने वाले संवाद को भी संभालता है। सेमैटिक कर्नेल जैसे एजेंटिक फ्रेमवर्क का एक और लाभ यह है कि आप इसके पहले से बने टूल जैसे File Search और Code Interpreter का उपयोग कर सकते हैं।

निम्न आरेख सेमैटिक कर्नेल के साथ फ़ंक्शन कॉलिंग की प्रक्रिया को दर्शाता है:

function calling

सेमैटिक कर्नेल में फ़ंक्शन्स/टूल्स को प्लगइन्स कहा जाता है। हम पहले देखी गई get_current_time फ़ंक्शन को एक क्लास में बदलकर एक प्लगइन बना सकते हैं जिसमें वह फ़ंक्शन होता है। हम kernel_function डेकोरेटर भी इम्पोर्ट कर सकते हैं, जो फ़ंक्शन के विवरण को लेता है। जब आप GetCurrentTimePlugin के साथ कर्नेल बनाएंगे, तो कर्नेल स्वचालित रूप से फ़ंक्शन और उसके पैरामीटर को सीरियलाइज़ करेगा, जिससे स्कीमा बनेगा जिसे मॉडल को भेजा जाएगा।

from semantic_kernel.functions import kernel_function

class GetCurrentTimePlugin:
    async def __init__(self, location):
        self.location = location

    @kernel_function(
        description="Get the current time for a given location"
    )
    def get_current_time(location: str = ""):
        ...

from semantic_kernel import Kernel

# कर्नेल बनाएं
kernel = Kernel()

# प्लगइन बनाएं
get_current_time_plugin = GetCurrentTimePlugin(location)

# प्लगइन को कर्नेल में जोड़ें
kernel.add_plugin(get_current_time_plugin)

Azure AI Agent Service

Azure AI Agent Service एक नवीन एजेंटिक फ्रेमवर्क है जो डेवलपर्स को सुरक्षित रूप से उच्च गुणवत्ता, और विस्तार योग्य AI एजेंट बनाने, तैनात करने, और स्केल करने के लिए सक्षम बनाता है बिना अंतर्निहित कंप्यूट और स्टोरेज संसाधनों को प्रबंधित किए। यह विशेष रूप से एंटरप्राइज़ अनुप्रयोगों के लिए उपयोगी है क्योंकि यह एक पूरी तरह से प्रबंधित सेवा है जिसमें एंटरप्राइज़ ग्रेड सुरक्षा शामिल है।

सीधा LLM API के साथ विकास के मुकाबले, Azure AI Agent Service कुछ लाभ प्रदान करता है, जिनमें शामिल हैं:

Azure AI Agent Service में उपलब्ध टूल्स को दो श्रेणियों में विभाजित किया जा सकता है:

  1. ज्ञान टूल्स:
  2. एक्शन टूल्स:

Agent Service हमें इन टूल्स को toolset के रूप में एक साथ उपयोग करने की अनुमति देता है। यह threads का उपयोग करता है, जो किसी विशिष्ट बातचीत के संदेशों का इतिहास रखता है।

कल्पना करें कि आप Contoso नामक कंपनी में एक सेल्स एजेंट हैं। आप एक संवादात्मक एजेंट विकसित करना चाहते हैं जो आपकी बिक्री डेटा के बारे में प्रश्नों का उत्तर दे सके।

निम्न छवि दिखाती है कि आप Azure AI Agent Service का उपयोग करके अपनी बिक्री डेटा का विश्लेषण कैसे कर सकते हैं:

Agentic Service In Action

सेवा के साथ इनमें से किसी भी टूल का उपयोग करने के लिए हम एक क्लाइंट बना सकते हैं और एक टूल या टूलसेट को परिभाषित कर सकते हैं। इसे व्यावहारिक रूप से लागू करने के लिए हम निम्नलिखित पायथन कोड का उपयोग कर सकते हैं। LLM टूलसेट को देख सकेगा और उपयोगकर्ता अनुरोध के आधार पर या तो उपयोगकर्ता द्वारा बनाई गई फ़ंक्शन fetch_sales_data_using_sqlite_query का उपयोग करेगा या पूर्व-निर्मित Code Interpreter का।

import os
from azure.ai.projects import AIProjectClient
from azure.identity import DefaultAzureCredential
from fetch_sales_data_functions import fetch_sales_data_using_sqlite_query # fetch_sales_data_using_sqlite_query फ़ंक्शन जिसे fetch_sales_data_functions.py फ़ाइल में पाया जा सकता है।
from azure.ai.projects.models import ToolSet, FunctionTool, CodeInterpreterTool

project_client = AIProjectClient.from_connection_string(
    credential=DefaultAzureCredential(),
    conn_str=os.environ["PROJECT_CONNECTION_STRING"],
)

# टूलसेट प्रारंभ करें
toolset = ToolSet()

# फ़ंक्शन कॉलिंग एजेंट को fetch_sales_data_using_sqlite_query फ़ंक्शन के साथ प्रारंभ करें और इसे टूलसेट में जोड़ें
fetch_data_function = FunctionTool(fetch_sales_data_using_sqlite_query)
toolset.add(fetch_data_function)

# कोड इंटरप्रेटर टूल प्रारंभ करें और इसे टूलसेट में जोड़ें।
code_interpreter = code_interpreter = CodeInterpreterTool()
toolset.add(code_interpreter)

agent = project_client.agents.create_agent(
    model="gpt-4o-mini", name="my-agent", instructions="You are helpful agent", 
    toolset=toolset
)

विश्वसनीय AI एजेंट बनाने के लिए टूल उपयोग डिज़ाइन पैटर्न का उपयोग करते समय विशेष विचार क्या हैं?

LLMs द्वारा गतिशील रूप से जेनरेट किए गए SQL के साथ एक सामान्य चिंता सुरक्षा है, विशेष रूप से SQL इंजेक्शन या दुर्भावनापूर्ण क्रियाओं जैसे डेटाबेस को ड्रॉप या छेड़छाड़ करने का जोखिम। जबकि ये चिंताएँ वैध हैं, उन्हें डेटाबेस एक्सेस अनुमतियों को सही तरीके से कॉन्फ़िगर करके प्रभावी रूप से कम किया जा सकता है। अधिकांश डेटाबेस के लिए इसका मतलब है डेटाबेस को केवल पढ़ने (read-only) के रूप में कॉन्फ़िगर करना। PostgreSQL या Azure SQL जैसी डेटाबेस सेवाओं के लिए, ऐप को केवल पढ़ने वाले (SELECT) भूमिका असाइन की जानी चाहिए। एक सुरक्षित वातावरण में ऐप चलाना सुरक्षा को और भी बढ़ाता है। एंटरप्राइज परिप्रेक्ष्य में, डेटा आमतौर पर परिचालन प्रणालियों से निकाला और रूपांतरित किया जाता है ताकि इसे एक रीड-ओनली डेटाबेस या डेटा वेयरहाउस में स्थानांतरित किया जा सके जिसमें उपयोगकर्ता के अनुकूल स्कीमा होता है। यह दृष्टिकोण सुनिश्चित करता है कि डेटा सुरक्षित है, प्रदर्शन और पहुंच के लिए अनुकूलित है, और ऐप की अनुमति सीमित, रीड-ओनली एक्सेस है।

Sample Codes

Got More Questions about the Tool Use Design Patterns?

Join the Azure AI Foundry Discord to meet with other learners, attend office hours and get your AI Agents questions answered.

Additional Resources

Previous Lesson

Understanding Agentic Design Patterns

Next Lesson

Agentic RAG


अस्वीकरण: इस दस्तावेज़ का अनुवाद AI अनुवाद सेवा Co-op Translator का उपयोग करके किया गया है। जबकि हम शुद्धता के लिए प्रयासरत हैं, कृपया ध्यान दें कि स्वचालित अनुवाद में त्रुटियाँ या गलतियाँ हो सकती हैं। मूल दस्तावेज़ अपनी मूल भाषा में ही अधिकारिक स्रोत माना जाना चाहिए। महत्वपूर्ण जानकारी के लिए पेशेवर मानव अनुवाद की सलाह दी जाती है। इस अनुवाद के उपयोग से उपजने वाली किसी भी गलतफहमी या गलत व्याख्या के लिए हम जिम्मेदार नहीं होंगे।