ai-agents-for-beginners

Cara Merekabentuk Ejen AI yang Baik

(Klik imej di atas untuk menonton video pelajaran ini)

Corak Reka Bentuk Penggunaan Alat

Alat menarik kerana ia membolehkan ejen AI mempunyai julat kebolehan yang lebih luas. Daripada ejen mempunyai set tindakan yang terhad, dengan menambah alat, ejen kini boleh melaksanakan pelbagai tindakan. Dalam bab ini, kita akan melihat Corak Reka Bentuk Penggunaan Alat, yang menerangkan bagaimana ejen AI boleh menggunakan alat tertentu untuk mencapai matlamat mereka.

Pengenalan

Dalam pelajaran ini, kita ingin menjawab soalan-soalan berikut:

Matlamat Pembelajaran

Selepas menyelesaikan pelajaran ini, anda akan dapat:

Apakah Corak Reka Bentuk Penggunaan Alat?

The Tool Use Design Pattern memberi tumpuan kepada memberi kemampuan kepada LLM untuk berinteraksi dengan alat luaran untuk mencapai matlamat tertentu. Alat adalah kod yang boleh dilaksanakan oleh ejen untuk melakukan tindakan. Sebuah alat boleh menjadi fungsi ringkas seperti kalkulator, atau panggilan API ke perkhidmatan pihak ketiga seperti carian harga saham atau ramalan cuaca. Dalam konteks ejen AI, alat direka untuk dilaksanakan oleh ejen sebagai tindak balas kepada model-generated function calls.

Untuk apakah kes penggunaan ia boleh digunakan?

Ejen AI boleh memanfaatkan alat untuk menyelesaikan tugas kompleks, mendapatkan maklumat, atau membuat keputusan. corak reka bentuk penggunaan alat sering digunakan dalam senario yang memerlukan interaksi dinamik dengan sistem luaran, seperti pangkalan data, perkhidmatan web, atau pentafsir kod. Kebolehan ini berguna untuk beberapa kes penggunaan termasuk:

Apakah elemen/blok binaan yang diperlukan untuk melaksanakan corak reka bentuk penggunaan alat?

Blok binaan ini membolehkan ejen AI melaksanakan pelbagai tugas. Mari lihat elemen utama yang diperlukan untuk melaksanakan Corak Reka Bentuk Penggunaan Alat:

Seterusnya, mari lihat Panggilan Fungsi/Alat dengan lebih terperinci.

Panggilan Fungsi/Alat

Panggilan fungsi adalah cara utama kita membolehkan Model Bahasa Besar (LLM) untuk berinteraksi dengan alat. Anda akan sering melihat ‘Function’ dan ‘Tool’ digunakan secara bergantian kerana ‘functions’ (blok kod boleh guna semula) adalah ‘tools’ yang digunakan ejen untuk melaksanakan tugas. Untuk kod fungsi dipanggil, LLM mesti membandingkan permintaan pengguna dengan penerangan fungsi. Untuk melakukan ini, satu skema yang mengandungi penerangan semua fungsi yang tersedia dihantar kepada LLM. LLM kemudian memilih fungsi yang paling sesuai untuk tugas tersebut dan mengembalikan nama serta argumennya. Fungsi yang dipilih dipanggil, responsnya dihantar kembali kepada LLM, yang menggunakan maklumat itu untuk memberi respons kepada permintaan pengguna.

Untuk pembangun melaksanakan panggilan fungsi untuk ejen, anda akan memerlukan:

  1. Model LLM yang menyokong panggilan fungsi
  2. Skema yang mengandungi penerangan fungsi
  3. Kod untuk setiap fungsi yang diterangkan

Mari gunakan contoh mendapatkan masa semasa di sesuatu bandar untuk menerangkan:

  1. Inisialisasi LLM yang menyokong panggilan fungsi:

    Tidak semua model menyokong panggilan fungsi, jadi penting untuk menyemak bahawa LLM yang anda gunakan menyokongnya. Azure OpenAI menyokong panggilan fungsi. Kita boleh mula dengan memulakan klien Azure OpenAI.

     # Inisialisasikan klien Azure OpenAI
     client = AzureOpenAI(
         azure_endpoint = os.getenv("AZURE_AI_PROJECT_ENDPOINT"), 
         api_key=os.getenv("AZURE_OPENAI_API_KEY"),  
         api_version="2024-05-01-preview"
     )
    
  2. Buat Skema Fungsi:

    Seterusnya kita akan mentakrifkan satu skema JSON yang mengandungi nama fungsi, penerangan apa yang dilakukan fungsi itu, dan nama serta penerangan parameter fungsi. Kita kemudian akan mengambil skema ini dan menghantarnya kepada klien yang dibuat sebelum ini, bersama permintaan pengguna untuk mencari masa di San Francisco. Yang penting untuk diperhatikan ialah bahawa satu panggilan alat adalah apa yang dikembalikan, bukan jawapan akhir kepada soalan tersebut. Seperti yang dinyatakan tadi, LLM mengembalikan nama fungsi yang dipilih untuk tugas itu, dan argumen yang akan dipasangkan kepadanya.

     # Penerangan fungsi untuk dibaca oleh model
     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"],
                 },
             }
         }
     ]
    
      
     # Mesej awal pengguna
     messages = [{"role": "user", "content": "What's the current time in San Francisco"}] 
      
     # Panggilan API pertama: Minta model untuk menggunakan fungsi
       response = client.chat.completions.create(
           model=deployment_name,
           messages=messages,
           tools=tools,
           tool_choice="auto",
       )
      
       # Proses respons model
       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. Kod fungsi yang diperlukan untuk melaksanakan tugas:

    Sekarang LLM telah memilih fungsi mana yang perlu dijalankan, kod yang melaksanakan tugas perlu dilaksanakan dan dijalankan. Kita boleh melaksanakan kod untuk mendapatkan masa semasa dalam Python. Kita juga perlu menulis kod untuk mengekstrak nama dan argumen daripada response_message untuk mendapatkan keputusan akhir.

       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"})
    
      # Mengendalikan panggilan fungsi
       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.")  
      
       # Panggilan API kedua: Dapatkan respons akhir daripada 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.
    

Panggilan Fungsi adalah teras bagi kebanyakan, jika tidak semua, reka bentuk penggunaan alat ejen, namun melaksanakannya dari awal kadangkala boleh menjadi mencabar. Seperti yang kita pelajari dalam Lesson 2 rangka kerja agenik menyediakan kita dengan blok binaan siap guna untuk melaksanakan penggunaan alat.

Contoh Penggunaan Alat dengan Rangka Kerja Agenik

Berikut adalah beberapa contoh bagaimana anda boleh melaksanakan Corak Reka Bentuk Penggunaan Alat menggunakan pelbagai rangka kerja agenik:

Microsoft Agent Framework

Microsoft Agent Framework adalah rangka kerja AI sumber terbuka untuk membina ejen AI. Ia mempermudah proses penggunaan panggilan fungsi dengan membolehkan anda mentakrifkan alat sebagai fungsi Python dengan dekorator @tool. Rangka kerja mengendalikan komunikasi dua hala antara model dan kod anda. Ia juga menyediakan akses kepada alat pra-bina seperti File Search dan Code Interpreter melalui AzureAIProjectAgentProvider.

Rajah berikut menggambarkan proses panggilan fungsi dengan Microsoft Agent Framework:

panggilan fungsi

Dalam Microsoft Agent Framework, alat ditakrifkan sebagai fungsi yang didekorasi. Kita boleh menukar fungsi get_current_time yang kita lihat sebelum ini menjadi alat dengan menggunakan dekorator @tool. Rangka kerja akan secara automatik menyerialkan fungsi dan parameternya, mencipta skema untuk dihantar kepada LLM.

from agent_framework import tool
from agent_framework.azure import AzureAIProjectAgentProvider
from azure.identity import AzureCliCredential

@tool
def get_current_time(location: str) -> str:
    """Get the current time for a given location"""
    ...

# Buat klien
provider = AzureAIProjectAgentProvider(credential=AzureCliCredential())

# Buat ejen dan jalankan menggunakan alat tersebut
agent = await provider.create_agent(name="TimeAgent", instructions="Use available tools to answer questions.", tools=get_current_time)
response = await agent.run("What time is it?")

Azure AI Agent Service

Azure AI Agent Service adalah rangka kerja agenik yang lebih baharu yang direka untuk membolehkan pembangun membina, menyebarkan, dan menskala ejen AI yang berkualiti tinggi dan boleh dikembangkan dengan selamat tanpa perlu menguruskan sumber pengkomputeran dan penyimpanan yang mendasari. Ia amat berguna untuk aplikasi perusahaan kerana ia adalah perkhidmatan yang diurus sepenuhnya dengan keselamatan bertaraf perusahaan.

Apabila dibandingkan dengan pembangunan menggunakan API LLM secara terus, Azure AI Agent Service menyediakan beberapa kelebihan, termasuk:

Alat yang tersedia dalam Azure AI Agent Service boleh dibahagikan kepada dua kategori:

  1. Alat Pengetahuan:
  2. Alat Tindakan:

Perkhidmatan Agen membolehkan kita menggunakan alat-alat ini bersama sebagai satu toolset. Ia juga memanfaatkan threads yang menjejaki sejarah mesej dari perbualan tertentu.

Bayangkan anda seorang ejen jualan di sebuah syarikat bernama Contoso. Anda ingin membangunkan ejen perbualan yang boleh menjawab soalan tentang data jualan anda.

Imej berikut menggambarkan bagaimana anda boleh menggunakan Azure AI Agent Service untuk menganalisis data jualan anda:

Perkhidmatan Agen Dalam Tindakan

Untuk menggunakan mana-mana alat ini dengan perkhidmatan, kita boleh membuat klien dan mentakrifkan alat atau set alat. Untuk melaksanakannya secara praktikal kita boleh menggunakan kod Python berikut. LLM akan dapat melihat toolset dan memutuskan sama ada untuk menggunakan fungsi yang dicipta pengguna, fetch_sales_data_using_sqlite_query, atau Code Interpreter pra-bina bergantung pada permintaan pengguna.

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 # fungsi fetch_sales_data_using_sqlite_query yang boleh ditemui dalam fail 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"],
)

# Inisialisasikan set alat
toolset = ToolSet()

# Inisialisasikan ejen pemanggil fungsi dengan fungsi fetch_sales_data_using_sqlite_query dan menambahkannya ke dalam set alat
fetch_data_function = FunctionTool(fetch_sales_data_using_sqlite_query)
toolset.add(fetch_data_function)

# Inisialisasikan alat Penafsir Kod dan menambahkannya ke dalam set alat.
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
)

Apakah pertimbangan khas untuk menggunakan Corak Reka Bentuk Penggunaan Alat untuk membina ejen AI yang boleh dipercayai?

Kebimbangan biasa dengan SQL yang dijana secara dinamik oleh LLM ialah keselamatan, terutamanya risiko suntikan SQL atau tindakan berniat jahat, seperti menjatuhkan atau memanipulasi pangkalan data. Walaupun kebimbangan ini sah, ia boleh diatasi dengan berkesan dengan mengkonfigurasi kebenaran akses pangkalan data dengan betul. Untuk kebanyakan pangkalan data ini melibatkan mengkonfigurasi pangkalan data sebagai baca sahaja. Untuk perkhidmatan pangkalan data seperti PostgreSQL atau Azure SQL, aplikasi harus diberikan peranan baca sahaja (SELECT).

Menjalankan aplikasi dalam persekitaran yang selamat meningkatkan perlindungan lagi. Dalam senario perusahaan, data biasanya diekstrak dan diubah dari sistem operasi kepada pangkalan data baca sahaja atau gudang data dengan skema mesra pengguna. Pendekatan ini memastikan data selamat, dioptimumkan untuk prestasi dan kebolehcapaian, dan bahawa aplikasi mempunyai akses terhad, baca sahaja.

Kod Sampel

Ada Lagi Soalan tentang Corak Reka Bentuk Penggunaan Alat?

Sertai Microsoft Foundry Discord untuk bertemu dengan pelajar lain, menghadiri waktu pejabat dan dapatkan soalan Ejen AI anda dijawab.

Sumber Tambahan

Pelajaran Sebelumnya

Memahami Corak Reka Bentuk Agenik

Pelajaran Seterusnya

RAG Beragensi


Penafian: Dokumen ini telah diterjemahkan menggunakan perkhidmatan penterjemahan AI Co-op Translator. Walaupun kami berusaha untuk memastikan ketepatan, sila ambil maklum bahawa terjemahan automatik mungkin mengandungi kesilapan atau ketidakakuratan. Dokumen asal dalam bahasa asalnya hendaklah dianggap sebagai sumber rujukan yang sah. Untuk maklumat yang kritikal, adalah disarankan mendapatkan terjemahan profesional oleh penterjemah manusia. Kami tidak bertanggungjawab terhadap sebarang salah faham atau salah tafsir yang timbul daripada penggunaan terjemahan ini.