Bagikan melalui


Menggunakan alat fungsi dengan persetujuan manusia dalam proses yang melibatkan interaksi manusia

Langkah tutorial ini menunjukkan kepada Anda cara menggunakan alat fungsi yang memerlukan persetujuan manusia dengan agen, di mana agen dibangun di layanan Penyelesaian Obrolan Azure OpenAI.

Ketika agen memerlukan input pengguna apa pun, misalnya untuk menyetujui panggilan fungsi, ini disebut sebagai pola human-in-the-loop. Eksekusi agen yang memerlukan input pengguna, akan selesai dengan respons yang menunjukkan input apa yang diperlukan dari pengguna, alih-alih menyelesaikan jawaban akhir. Pemanggil agen kemudian bertanggung jawab untuk mendapatkan input yang diperlukan dari pengguna, dan meneruskannya kembali ke agen sebagai bagian dari eksekusi agen yang baru.

Prasyarat

Untuk prasyarat dan menginstal paket NuGet, lihat langkah Membuat dan menjalankan agen sederhana dalam tutorial ini.

Membuat agen dengan alat fungsi

Saat menggunakan fungsi, dimungkinkan untuk menunjukkan untuk setiap fungsi, apakah memerlukan persetujuan manusia sebelum dijalankan. Ini dilakukan dengan membungkus AIFunction instans dalam instans ApprovalRequiredAIFunction .

Berikut adalah contoh perangkat fungsi sederhana yang mensimulasikan pengambilan cuaca untuk lokasi tertentu.

using System;
using System.ComponentModel;
using System.Linq;
using Azure.AI.OpenAI;
using Azure.Identity;
using Microsoft.Agents.AI;
using Microsoft.Extensions.AI;
using OpenAI;

[Description("Get the weather for a given location.")]
static string GetWeather([Description("The location to get the weather for.")] string location)
    => $"The weather in {location} is cloudy with a high of 15°C.";

Untuk membuat AIFunction lalu membungkusnya dalam ApprovalRequiredAIFunction, Anda bisa melakukan hal berikut:

AIFunction weatherFunction = AIFunctionFactory.Create(GetWeather);
AIFunction approvalRequiredWeatherFunction = new ApprovalRequiredAIFunction(weatherFunction);

Saat membuat agen, Anda sekarang dapat memberikan alat fungsi yang membutuhkan persetujuan kepada agen dengan meneruskan daftar alat ke metode AsAIAgent.

AIAgent agent = new AzureOpenAIClient(
    new Uri("https://<myresource>.openai.azure.com"),
    new AzureCliCredential())
     .GetChatClient("gpt-4o-mini")
     .AsAIAgent(instructions: "You are a helpful assistant", tools: [approvalRequiredWeatherFunction]);

Karena Anda sekarang memiliki fungsi yang memerlukan persetujuan, agen mungkin merespons dengan permintaan persetujuan, alih-alih menjalankan fungsi secara langsung dan mengembalikan hasilnya. Anda dapat memeriksa konten respons untuk instans apa pun FunctionApprovalRequestContent , yang menunjukkan bahwa agen memerlukan persetujuan pengguna untuk fungsi.

AgentSession session = await agent.GetNewSessionAsync();
AgentResponse response = await agent.RunAsync("What is the weather like in Amsterdam?", session);

var functionApprovalRequests = response.Messages
    .SelectMany(x => x.Contents)
    .OfType<FunctionApprovalRequestContent>()
    .ToList();

Jika ada permintaan persetujuan fungsi, detail panggilan fungsi termasuk nama dan argumen dapat ditemukan di FunctionCall properti pada FunctionApprovalRequestContent instans. Ini dapat ditampilkan kepada pengguna, sehingga mereka dapat memutuskan apakah akan menyetujui atau menolak panggilan fungsi. Untuk contoh ini, asumsikan ada satu permintaan.

FunctionApprovalRequestContent requestContent = functionApprovalRequests.First();
Console.WriteLine($"We require approval to execute '{requestContent.FunctionCall.Name}'");

Setelah pengguna memberikan input mereka, Anda dapat membuat instance FunctionApprovalResponseContent menggunakan metode CreateResponse pada FunctionApprovalRequestContent. Teruskan true untuk menyetujui panggilan fungsi, atau false untuk menolaknya.

Konten respons kemudian dapat diteruskan ke agen dalam konteks baru UserChatMessage, bersama dengan objek sesi yang sama untuk mendapatkan hasil dari agen.

var approvalMessage = new ChatMessage(ChatRole.User, [requestContent.CreateResponse(true)]);
Console.WriteLine(await agent.RunAsync(approvalMessage, session));

Setiap kali Anda menggunakan alat fungsi dengan persetujuan yang melibatkan manusia, ingatlah untuk memeriksa instance FunctionApprovalRequestContent dalam respons, setiap kali agen dijalankan, hingga semua panggilan fungsi disetujui atau ditolak.

Langkah tutorial ini menunjukkan kepada Anda cara menggunakan alat fungsi yang memerlukan persetujuan manusia dengan agen.

Ketika agen memerlukan input pengguna apa pun, misalnya untuk menyetujui panggilan fungsi, ini disebut sebagai pola human-in-the-loop. Eksekusi agen yang memerlukan input pengguna, akan selesai dengan respons yang menunjukkan input apa yang diperlukan dari pengguna, alih-alih menyelesaikan jawaban akhir. Pemanggil agen kemudian bertanggung jawab untuk mendapatkan input yang diperlukan dari pengguna, dan meneruskannya kembali ke agen sebagai bagian dari eksekusi agen yang baru.

Prasyarat

Untuk prasyarat dan menginstal paket Python, lihat langkah Membuat dan menjalankan agen sederhana dalam tutorial ini.

Membuat agen dengan alat fungsi yang memerlukan persetujuan

Saat menggunakan fungsi, dimungkinkan untuk menunjukkan untuk setiap fungsi, apakah memerlukan persetujuan manusia sebelum dijalankan. Ini dilakukan dengan mengatur parameter approval_mode ke "always_require" ketika menggunakan dekorator @tool.

Berikut adalah contoh perangkat fungsi sederhana yang mensimulasikan pengambilan cuaca untuk lokasi tertentu.

from typing import Annotated
from agent_framework import tool

@tool
def get_weather(location: Annotated[str, "The city and state, e.g. San Francisco, CA"]) -> str:
    """Get the current weather for a given location."""
    return f"The weather in {location} is cloudy with a high of 15°C."

Untuk membuat fungsi yang memerlukan persetujuan, Anda dapat menggunakan approval_mode parameter :

@tool(approval_mode="always_require")
def get_weather_detail(location: Annotated[str, "The city and state, e.g. San Francisco, CA"]) -> str:
    """Get detailed weather information for a given location."""
    return f"The weather in {location} is cloudy with a high of 15°C, humidity 88%."

Saat membuat agen, Anda sekarang dapat memberikan alat fungsi yang memerlukan persetujuan kepada agen, dengan meneruskan daftar alat fungsi ke ChatAgent konstruktor.

from agent_framework import ChatAgent
from agent_framework.openai import OpenAIResponsesClient

async with ChatAgent(
    chat_client=OpenAIResponsesClient(),
    name="WeatherAgent",
    instructions="You are a helpful weather assistant.",
    tools=[get_weather, get_weather_detail],
) as agent:
    # Agent is ready to use

Karena Anda sekarang memiliki fungsi yang memerlukan persetujuan, agen mungkin merespons dengan permintaan persetujuan, alih-alih menjalankan fungsi secara langsung dan mengembalikan hasilnya. Anda dapat memeriksa respons untuk setiap permintaan input pengguna, yang menunjukkan bahwa agen memerlukan persetujuan pengguna untuk fungsi.

result = await agent.run("What is the detailed weather like in Amsterdam?")

if result.user_input_requests:
    for user_input_needed in result.user_input_requests:
        print(f"Function: {user_input_needed.function_call.name}")
        print(f"Arguments: {user_input_needed.function_call.arguments}")

Jika ada permintaan persetujuan fungsi, detail panggilan fungsi termasuk nama dan argumen dapat ditemukan di function_call properti pada permintaan input pengguna. Ini dapat ditampilkan kepada pengguna, sehingga mereka dapat memutuskan apakah akan menyetujui atau menolak panggilan fungsi.

Setelah pengguna memberikan input mereka, Anda dapat membuat respons menggunakan create_response metode pada permintaan input pengguna. Teruskan True untuk menyetujui panggilan fungsi, atau False untuk menolaknya.

Respons kemudian dapat diteruskan ke agen di ChatMessage yang baru, untuk gunanya mendapatkan hasilnya kembali dari agen.

from agent_framework import ChatMessage, Role

# Get user approval (in a real application, this would be interactive)
user_approval = True  # or False to reject

# Create the approval response
approval_message = ChatMessage(
    role=Role.USER, 
    contents=[user_input_needed.create_response(user_approval)]
)

# Continue the conversation with the approval
final_result = await agent.run([
    "What is the detailed weather like in Amsterdam?",
    ChatMessage(role=Role.ASSISTANT, contents=[user_input_needed]),
    approval_message
])
print(final_result.text)

Menangani persetujuan dalam perulangan

Saat bekerja dengan beberapa panggilan fungsi yang memerlukan persetujuan, Anda mungkin perlu menangani persetujuan dalam sebuah loop hingga semua fungsi dikerjakan atau ditolak.

async def handle_approvals(query: str, agent) -> str:
    """Handle function call approvals in a loop."""
    current_input = query

    while True:
        result = await agent.run(current_input)

        if not result.user_input_requests:
            # No more approvals needed, return the final result
            return result.text

        # Build new input with all context
        new_inputs = [query]

        for user_input_needed in result.user_input_requests:
            print(f"Approval needed for: {user_input_needed.function_call.name}")
            print(f"Arguments: {user_input_needed.function_call.arguments}")

            # Add the assistant message with the approval request
            new_inputs.append(ChatMessage(role=Role.ASSISTANT, contents=[user_input_needed]))

            # Get user approval (in practice, this would be interactive)
            user_approval = True  # Replace with actual user input

            # Add the user's approval response
            new_inputs.append(
                ChatMessage(role=Role.USER, contents=[user_input_needed.create_response(user_approval)])
            )

        # Continue with all the context
        current_input = new_inputs

# Usage
result_text = await handle_approvals("Get detailed weather for Seattle and Portland", agent)
print(result_text)

Setiap kali Anda menggunakan alat fungsi dengan persetujuan keterlibatan manusia, ingatlah untuk memeriksa permintaan input pengguna dalam respons, setelah setiap kali agen dijalankan, sampai semua panggilan fungsi telah disetujui atau ditolak.

Langkah selanjutnya