探索语义内核 OpenAIAssistantAgent

重要

此功能处于候选发布阶段。 此阶段的功能几乎完整且一般稳定,尽管在全面推出之前,它们可能会进行轻微的改进或优化。

有关此讨论的详细 API 文档在以下位置提供:

代理当前在 Java 中不可用。

什么是助手?

OpenAI 助手 API 是专为更高级和交互式 AI 功能设计的专用界面,使开发人员能够创建个性化的多步骤面向任务的代理。 与专注于简单聊天交换的聊天完成 API 不同,助手 API 允许动态、目标驱动的交互与代码解释器和文件搜索等其他功能交互。

准备开发环境

若要继续开发 OpenAIAIAssistantAgent,请使用相应的包配置开发环境。

Microsoft.SemanticKernel.Agents.OpenAI 包添加到项目:

dotnet add package Microsoft.SemanticKernel.Agents.AzureAI --prerelease

您可能还想要包括 Azure.Identity 包:

dotnet add package Azure.Identity

使用带有可选semantic-kernel依赖的包进行安装:

pip install semantic-kernel[azure]

代理当前在 Java 中不可用。

创建 OpenAIAssistantAgent

创建 OpenAIAssistant 需要调用异步处理的远程服务。 为了管理这一点,OpenAIAssistantAgent 通过静态工厂方法实例化,从而确保该过程以非阻塞的方式进行。 此方法抽象了异步调用的复杂性,当助手完全初始化且准备好使用时,返回一个 promise 或 future。

AssistantClient client = OpenAIAssistantAgent.CreateAzureOpenAIClient(...).GetAssistantClient();
Assistant assistant =
    await this.AssistantClient.CreateAssistantAsync(
        "<model name>",
        "<agent name>",
        instructions: "<agent instructions>");
OpenAIAssistantAgent agent = new(assistant, client);
from semantic_kernel.agents.open_ai import AzureAssistantAgent, OpenAIAssistantAgent

# Set up the client and model using Azure OpenAI Resources
client, model = AzureAssistantAgent.setup_resources()

# Define the assistant definition
definition = await client.beta.assistants.create(
    model=model,
    instructions="<instructions>",
    name="<agent name>",
)

# Create the AzureAssistantAgent instance using the client and the assistant definition
agent = AzureAssistantAgent(
    client=client,
    definition=definition,
)

# or

# Set up the client and model using OpenAI Resources
client, model = OpenAIAssistantAgent.setup_resources()

# Define the assistant definition
definition = await client.beta.assistants.create(
    model=model,
    instructions="<instructions>",
    name="<agent name>",
)

# Create the OpenAIAssistantAgent instance using the client and the assistant definition
agent = OpenAIAssistantAgent(
    client=client,
    definition=definition,
)

代理当前在 Java 中不可用。

检索一个OpenAIAssistantAgent

创建后,可以通过其标识符访问助手的标识。 此标识符可用于从已存在的助手定义创建 OpenAIAssistantAgent

对于 .NET,代理标识符通过由任何代理定义的属性以 string 的形式公开。

AssistantClient client = OpenAIAssistantAgent.CreateAzureOpenAIClient(...).GetAssistantClient();
Assistant assistant = await this.AssistantClient.GetAssistantAsync("<assistant id>");
OpenAIAssistantAgent agent = new(assistant, client);
# Using Azure OpenAI Resources

# Create the client using Azure OpenAI resources and configuration
client, model = AzureAssistantAgent.setup_resources()

# Create the assistant definition
definition = await client.beta.assistants.create(
    model=model,
    name="<agent name>",
    instructions="<instructions>",
)

# Store the assistant ID
assistant_id = definition.id

# Retrieve the assistant definition from the server based on the assistant ID
new_asst_definition = await client.beta.assistants.retrieve(assistant_id)

# Create the AzureAssistantAgent instance using the client and the assistant definition
agent = AzureAssistantAgent(
    client=client,
    definition=new_asst_definition,
)

代理当前在 Java 中不可用。

使用 OpenAIAssistantAgent

助手 API 的所有方面一样,对话会被远程存储。 每个对话称为线程,并由唯一string标识。 与你的 OpenAIAssistantAgent 的交互将绑定到此特定的线程标识符,该标识符必须在调用代理程序时指定。

// Define agent
OpenAIAssistantAgent agent = ...;

// Create a thread for the agent conversation.
string threadId = await agent.CreateThreadAsync();

// Add a user message to the conversation
chat.Add(threadId, new ChatMessageContent(AuthorRole.User, "<user input>"));

// Generate the agent response(s)
await foreach (ChatMessageContent response in agent.InvokeAsync(threadId))
{
  // Process agent response(s)...
}

// Delete the thread when it is no longer needed
await agent.DeleteThreadAsync(threadId);
# Define agent
openai_agent = await ...

# Create a thread for the agent conversation
thread_id = await agent.create_thread()

# Add a user message to the conversation
await agent.add_chat_message(
  thread_id=thread_id, 
  message=ChatMessageContent(role=AuthorRole.USER, content="<user input>"),
)

# Generate the agent response(s)
async for response in agent.invoke(thread_id=thread_id):
  # process agent response(s)...

# Delete the thread when it is no longer needed
await agent.delete_thread(thread_id)

代理当前在 Java 中不可用。

删除 OpenAIAssistantAgent

由于助手的定义是远程存储的,因此如果未删除,它将保留。
可以直接使用AssistantClient删除助理定义。

注意:在删除代理实例后尝试使用代理实例将导致服务异常。

对于 .NET,通过任何代理定义的string属性来公开代理标识符Agent.Id

AssistantClient client = OpenAIAssistantAgent.CreateAzureOpenAIClient(...).GetAssistantClient();
Assistant assistant = await this.AssistantClient.DeleteAssistantAsync("<assistant id>");
await agent.delete()

is_deleted = agent._is_deleted

代理当前在 Java 中不可用。

操作说明

有关 OpenAIAssistantAgent的从头到尾示例,请参阅: