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 क्लाइंट को प्रारंभ करके शुरू कर सकते हैं।

     # Initialize the Azure OpenAI client
     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 उस कार्य के लिए चयनित फ़ंक्शन का नाम और उसे पास किए जाने वाले तर्क लौटाता है।

     # Function description for the model to read
     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"],
                 },
             }
         }
     ]
    
      
     # Initial user message
     messages = [{"role": "user", "content": "What's the current time in San Francisco"}] 
      
     # First API call: Ask the model to use the function
       response = client.chat.completions.create(
           model=deployment_name,
           messages=messages,
           tools=tools,
           tool_choice="auto",
       )
      
       # Process the model's response
       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 ने यह चुन लिया है कि कौन सा फ़ंक्शन चलाना है, तो उस कार्य को पूरा करने के लिए कोड को लागू और क्रियान्वित करने की आवश्यकता है। हम Python में वर्तमान समय प्राप्त करने के लिए कोड लागू कर सकते हैं। हमें अंतिम परिणाम प्राप्त करने के लिए 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"})
    
      # Handle function calls
       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.")  
      
       # Second API call: Get the final response from the model
       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) के साथ काम करते हैं। यह फ़ंक्शन कॉलिंग का उपयोग करने की प्रक्रिया को सरल बनाता है, आपके फ़ंक्शन्स और उनके पैरामीटर को मॉडल के लिए स्वचालित रूप से वर्णित करके, जिसे सिरीयलाइज़िंग कहा जाता है। यह मॉडल और आपके कोड के बीच आगे-पीछे होने वाले संचार को भी संभालता है। सेमांटिक कर्नेल जैसे एजेंटिक फ्रेमवर्क का उपयोग करने का एक और लाभ यह है कि यह आपको फ़ाइल खोज और कोड इंटरप्रेटर जैसे पूर्व-निर्मित टूल्स तक पहुंचने की अनुमति देता है।

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

फ़ंक्शन कॉलिंग

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

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

# Create the kernel
kernel = Kernel()

# Create the plugin
get_current_time_plugin = GetCurrentTimePlugin(location)

# Add the plugin to the kernel
kernel.add_plugin(get_current_time_plugin)

Azure AI एजेंट सेवा

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

LLM API के साथ सीधे विकास की तुलना में, Azure AI एजेंट सेवा कुछ फायदे प्रदान करती है, जिनमें शामिल हैं:

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

  1. नॉलेज टूल्स:
  2. एक्शन टूल्स:

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

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

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

एजेंटिक सेवा का उपयोग

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

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 function which can be found in a fetch_sales_data_functions.py file.
from azure.ai.projects.models import ToolSet, FunctionTool, CodeInterpreterTool

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

# Initialize function calling agent with the fetch_sales_data_using_sqlite_query function and adding it to the toolset
fetch_data_function = FunctionTool(fetch_sales_data_using_sqlite_query)
toolset = ToolSet()
toolset.add(fetch_data_function)

# Initialize Code Interpreter tool and adding it to the toolset. 
code_interpreter = code_interpreter = CodeInterpreterTool()
toolset = ToolSet()
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 इंजेक्शन या दुर्भावनापूर्ण क्रियाओं, जैसे कि डेटाबेस को हटाना या छेड़छाड़ करने का जोखिम। हालांकि ये चिंताएं वैध हैं, इन्हें डेटाबेस एक्सेस अनुमतियों को सही ढंग से कॉन्फ़िगर करके प्रभावी ढंग से कम किया जा सकता है। अधिकांश डेटाबेस के लिए, इसमें डेटाबेस को केवल-पढ़ने के रूप में कॉन्फ़िगर करना शामिल है। PostgreSQL या Azure SQL जैसी डेटाबेस सेवाओं के लिए, ऐप को केवल-पढ़ने (SELECT) भूमिका सौंपी जानी चाहिए। ऐप को सुरक्षित वातावरण में चलाना सुरक्षा को और बढ़ाता है। एंटरप्राइज़ परिदृश्यों में, डेटा आमतौर पर ऑपरेशनल सिस्टम से निकालकर एक रीड-ओनली डेटाबेस या डेटा वेयरहाउस में ट्रांसफॉर्म किया जाता है, जिसमें उपयोगकर्ता के लिए अनुकूल स्कीमा होता है। यह तरीका सुनिश्चित करता है कि डेटा सुरक्षित है, प्रदर्शन और पहुंच के लिए अनुकूलित है, और ऐप को सीमित, रीड-ओनली एक्सेस प्राप्त है।

नमूना कोड

टूल उपयोग डिज़ाइन पैटर्न के बारे में और सवाल हैं?

Azure AI Foundry Discord से जुड़ें, अन्य शिक्षार्थियों से मिलें, ऑफिस आवर्स में भाग लें और अपने AI एजेंट्स से संबंधित सवालों के जवाब पाएं।

अतिरिक्त संसाधन

पिछला पाठ

एजेंटिक डिज़ाइन पैटर्न को समझना

अगला पाठ

एजेंटिक RAG


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