Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Explorando o kernel semântico
Importante
Recursos de agente único, como OpenAIAssistantAgent, estão no estágio de candidato à liberação. Esses recursos são quase completos e geralmente estáveis, embora possam passar por pequenos refinamentos ou otimizações antes de atingir a disponibilidade geral completa.
Dica
A documentação detalhada da API relacionada a esta discussão está disponível em:
Dica
A documentação detalhada da API relacionada a esta discussão está disponível em:
Recurso atualmente indisponível em Java.
O que é um assistente?
A API de Assistentes do OpenAI é uma interface especializada projetada para funcionalidades de IA mais avançadas e interativas, permitindo que os desenvolvedores criem agentes personalizados e orientados a tarefas de várias etapas. Ao contrário da API Chat Completion (conclusão de bate-papo), que se concentra em trocas de conversas simples, a API do Assistente permite interações dinâmicas e orientadas por objetivos com recursos adicionais, como interpretador de código e pesquisa de arquivos.
Preparando seu ambiente de desenvolvimento
Para continuar desenvolvendo um OpenAIAssistantAgent, configure seu ambiente de desenvolvimento com os pacotes apropriados.
Adicione o pacote de Microsoft.SemanticKernel.Agents.OpenAI ao seu projeto:
dotnet add package Microsoft.SemanticKernel.Agents.OpenAI --prerelease
Talvez você também queira incluir o pacote Azure.Identity:
dotnet add package Azure.Identity
Instalar o pacote semantic-kernel:
pip install semantic-kernel
Recurso atualmente indisponível em Java.
Criando um OpenAIAssistantAgent
Para criar um OpenAIAssistant, é necessário primeiro criar um cliente para se comunicar com um serviço remoto.
AssistantClient client = OpenAIAssistantAgent.CreateAzureOpenAIClient(...).GetAssistantClient();
Assistant assistant =
await client.CreateAssistantAsync(
"<model name>",
"<agent name>",
instructions: "<agent instructions>");
OpenAIAssistantAgent agent = new(assistant, client);
from semantic_kernel.agents import AssistantAgentThread, AzureAssistantAgent, OpenAIAssistantAgent
from semantic_kernel.connectors.ai.open_ai import AzureOpenAISettings, OpenAISettings
# Set up the client and model using Azure OpenAI Resources
client = AzureAssistantAgent.create_client()
# Define the assistant definition
definition = await client.beta.assistants.create(
model=AzureOpenAISettings().chat_deployment_name,
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 = OpenAIAssistantAgent.create_client()
# Define the assistant definition
definition = await client.beta.assistants.create(
model=OpenAISettings().chat_model_id,
instructions="<instructions>",
name="<agent name>",
)
# Create the OpenAIAssistantAgent instance using the client and the assistant definition
agent = OpenAIAssistantAgent(
client=client,
definition=definition,
)
Recurso atualmente indisponível em Java.
Recuperando um OpenAIAssistantAgent
Uma vez criado, o identificador do assistente pode ser acessado por meio de seu identificador. Esse identificador pode ser usado para criar um OpenAIAssistantAgent a partir de uma definição existente de assistente.
Para o .NET, o identificador do agente é exposto como um string por meio da propriedade definida por qualquer agente.
AssistantClient client = OpenAIAssistantAgent.CreateAzureOpenAIClient(...).GetAssistantClient();
Assistant assistant = await client.GetAssistantAsync("<assistant id>");
OpenAIAssistantAgent agent = new(assistant, client);
# Using Azure OpenAI Resources
# Create the client using Azure OpenAI resources and configuration
client = AzureAssistantAgent.create_client()
# Create the assistant definition
definition = await client.beta.assistants.create(
model=AzureOpenAISettings().chat_deployment_name,
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,
)
Recurso atualmente indisponível em Java.
Usando um OpenAIAssistantAgent
Assim como acontece com todos os aspectos da API do Assistente, as conversas são armazenadas remotamente. Cada conversa é conhecida como um thread e identificada por um identificador exclusivo string . As suas interações com o OpenAIAssistantAgent estão vinculadas a este identificador de tópico específico. As especificidades da thread da API Assistant são abstraídas por meio da classe OpenAIAssistantAgentThread, que é uma implementação de AgentThread.
O OpenAIAssistantAgent atualmente só dá suporte a threads do tipo OpenAIAssistantAgentThread.
Você pode invocar o OpenAIAssistantAgent sem especificar um AgentThread, para iniciar uma nova thread, e um novo AgentThread será retornado como parte da resposta.
// Define agent
OpenAIAssistantAgent agent = ...;
AgentThread? agentThread = null;
// Generate the agent response(s)
await foreach (AgentResponseItem<ChatMessageContent> response in agent.InvokeAsync(new ChatMessageContent(AuthorRole.User, "<user input>")))
{
// Process agent response(s)...
agentThread = response.Thread;
}
// Delete the thread if no longer needed
if (agentThread is not null)
{
await agentThread.DeleteAsync();
}
Você também pode invocar o OpenAIAssistantAgent com um AgentThread que você criou.
// Define agent
OpenAIAssistantAgent agent = ...;
// Create a thread with some custom metadata.
AgentThread agentThread = new OpenAIAssistantAgentThread(client, metadata: myMetadata);
// Generate the agent response(s)
await foreach (ChatMessageContent response in agent.InvokeAsync(new ChatMessageContent(AuthorRole.User, "<user input>"), agentThread))
{
// Process agent response(s)...
}
// Delete the thread when it is no longer needed
await agentThread.DeleteAsync();
Você também pode criar um OpenAIAssistantAgentThread que retome uma conversa anterior por ID.
// Create a thread with an existing thread id.
AgentThread agentThread = new OpenAIAssistantAgentThread(client, "existing-thread-id");
from semantic_kernel.agents import AssistantAgentThread, AzureAssistantAgent
# Define agent
openai_agent = await ...
# Create a thread for the agent conversation
thread: AssistantAgentThread = None
# Generate the agent response(s)
async for response in agent.invoke(messages="user input", thread=thread):
# process agent response(s)...
thread = response.thread
# Delete the thread when it is no longer needed
await thread.delete() if thread else None
Recurso atualmente indisponível em Java.
Excluindo um OpenAIAssistantAgent
Como a definição do assistente é armazenada remotamente, ela persistirá se não for excluída.
A exclusão de uma definição de assistente pode ser executada diretamente com o cliente.
Observação: a tentativa de usar uma instância do agente depois de ser excluída resultará em uma exceção de serviço.
Para o .NET, o identificador do agente é exposto como um string por meio da Agent.Id propriedade definida por qualquer agente.
AssistantClient client = OpenAIAssistantAgent.CreateAzureOpenAIClient(...).GetAssistantClient();
await client.DeleteAssistantAsync("<assistant id>");
await client.beta.assistants.delete(agent.id)
Recurso atualmente indisponível em Java.
Gerenciando mensagens intermediárias com um OpenAIAssistantAgent
O Kernel OpenAIAssistantAgent Semântico foi projetado para invocar um agente que atende a consultas ou perguntas do usuário. Durante a invocação, o agente pode executar ferramentas para derivar a resposta final. Para acessar mensagens intermediárias produzidas durante este processo, os chamadores podem fornecer uma função de callback que lida com instâncias de FunctionCallContent ou FunctionResultContent.
A documentação de callback para o
OpenAIAssistantAgentestará disponível em breve.
Configurar o on_intermediate_message retorno de chamada dentro de agent.invoke(...) ou agent.invoke_stream(...) permite que o chamador receba mensagens intermediárias geradas durante o processo de formulação da resposta final do agente.
import asyncio
from typing import Annotated
from semantic_kernel.agents import AssistantAgentThread, AzureAssistantAgent
from semantic_kernel.connectors.ai.open_ai import AzureOpenAISettings
from semantic_kernel.contents import AuthorRole, ChatMessageContent, FunctionCallContent, FunctionResultContent
from semantic_kernel.functions import kernel_function
# Define a sample plugin for the sample
class MenuPlugin:
"""A sample Menu Plugin used for the concept sample."""
@kernel_function(description="Provides a list of specials from the menu.")
def get_specials(self) -> Annotated[str, "Returns the specials from the menu."]:
return """
Special Soup: Clam Chowder
Special Salad: Cobb Salad
Special Drink: Chai Tea
"""
@kernel_function(description="Provides the price of the requested menu item.")
def get_item_price(
self, menu_item: Annotated[str, "The name of the menu item."]
) -> Annotated[str, "Returns the price of the menu item."]:
return "$9.99"
# This callback function will be called for each intermediate message,
# which will allow one to handle FunctionCallContent and FunctionResultContent.
# If the callback is not provided, the agent will return the final response
# with no intermediate tool call steps.
async def handle_intermediate_steps(message: ChatMessageContent) -> None:
for item in message.items or []:
if isinstance(item, FunctionResultContent):
print(f"Function Result:> {item.result} for function: {item.name}")
elif isinstance(item, FunctionCallContent):
print(f"Function Call:> {item.name} with arguments: {item.arguments}")
else:
print(f"{item}")
async def main():
# Create the client using Azure OpenAI resources and configuration
client = AzureAssistantAgent.create_client()
# Define the assistant definition
definition = await client.beta.assistants.create(
model=AzureOpenAISettings().chat_deployment_name,
name="Host",
instructions="Answer questions about the menu.",
)
# Create the AzureAssistantAgent instance using the client and the assistant definition and the defined plugin
agent = AzureAssistantAgent(
client=client,
definition=definition,
plugins=[MenuPlugin()],
)
# Create a new thread for use with the assistant
# If no thread is provided, a new thread will be
# created and returned with the initial response
thread: AssistantAgentThread = None
user_inputs = [
"Hello",
"What is the special soup?",
"What is the special drink?",
"How much is that?",
"Thank you",
]
try:
for user_input in user_inputs:
print(f"# {AuthorRole.USER}: '{user_input}'")
async for response in agent.invoke(
messages=user_input,
thread=thread,
on_intermediate_message=handle_intermediate_steps,
):
print(f"# {response.role}: {response}")
thread = response.thread
finally:
await thread.delete() if thread else None
await client.beta.assistants.delete(assistant_id=agent.id)
if __name__ == "__main__":
asyncio.run(main())
O seguinte demonstra a saída de exemplo do processo de invocação do agente:
AuthorRole.USER: 'Hello'
AuthorRole.ASSISTANT: Hello! How can I assist you today?
AuthorRole.USER: 'What is the special soup?'
Function Call:> MenuPlugin-get_specials with arguments: {}
Function Result:>
Special Soup: Clam Chowder
Special Salad: Cobb Salad
Special Drink: Chai Tea
for function: MenuPlugin-get_specials
AuthorRole.ASSISTANT: The special soup is Clam Chowder. Would you like to know more about the specials or
anything else?
AuthorRole.USER: 'What is the special drink?'
AuthorRole.ASSISTANT: The special drink is Chai Tea. If you have any more questions, feel free to ask!
AuthorRole.USER: 'How much is that?'
Function Call:> MenuPlugin-get_item_price with arguments: {"menu_item":"Chai Tea"}
Function Result:> $9.99 for function: MenuPlugin-get_item_price
AuthorRole.ASSISTANT: The Chai Tea is priced at $9.99. If there's anything else you'd like to know,
just let me know!
AuthorRole.USER: 'Thank you'
AuthorRole.ASSISTANT: You're welcome! If you have any more questions or need further assistance, feel free to
ask. Enjoy your day!
Recurso atualmente indisponível em Java.
Especificação declarativa
A documentação sobre como usar especificações declarativas será fornecida em breve.
Importante
Esse recurso está em estágio experimental. Os recursos nesta fase estão em desenvolvimento e sujeitos a alterações antes de avançar para a versão preliminar ou para o estágio de candidato a lançamento.
O OpenAIAssistantAgent permite a instanciação a partir de uma especificação declarativa YAML. A abordagem declarativa permite definir as propriedades, as instruções, a configuração do modelo, as ferramentas e outras opções do agente em um único documento auditável. Isso torna a composição do agente portátil e facilmente gerenciada entre ambientes.
Observação
Todas as ferramentas, funções ou plug-ins listados no YAML declarativo devem estar disponíveis para o agente no momento da construção. Para plug-ins baseados em kernel, isso significa que eles devem ser registrados no Kernel. Para ferramentas internas, como Interpretador de Código ou Pesquisa de Arquivos, a configuração e as credenciais corretas devem ser fornecidas. O carregador do agente não criará funções do zero. Se um componente necessário estiver ausente, a criação do agente falhará.
Como usar a especificação declarativa
Em vez de enumerar todas as configurações possíveis do YAML, esta seção descreve os principais princípios e fornece links para exemplos de conceito que mostram código completo para cada tipo de ferramenta. Consulte estes exemplos de conceito para implementações de ponta a ponta de um OpenAIAssistantAgent com especificações declarativas:
AzureAssistantAgent Amostras:
- Interpretador de códigos
- Pesquisa de Arquivos
- Plugin de função a partir de um arquivo
- Carregar ID de Assistente Existente
- Modelo de prompt
OpenAIAssistantAgent Amostras:
- Interpretador de códigos
- Pesquisa de Arquivos
- Plugin de função
- Plugin de função a partir de um arquivo
- Carregar ID de Assistente Existente
- Modelo de prompt
Exemplo: criando um AzureAIAgent a partir do YAML
Uma especificação declarativa mínima do YAML pode ser semelhante à seguinte:
type: openai_assistant
name: Host
instructions: Respond politely to the user's questions.
model:
id: ${OpenAI:ChatModelId}
tools:
- id: MenuPlugin.get_specials
type: function
- id: MenuPlugin.get_item_price
type: function
Para obter detalhes sobre como conectar o agente, consulte os exemplos de código completos acima.
Pontos Principais
- As especificações declarativas permitem definir a estrutura, as ferramentas e o comportamento do agente no YAML.
- Todas as ferramentas e plug-ins referenciados devem ser registrados ou acessíveis em tempo de execução.
- Ferramentas internas como Bing, Pesquisa de Arquivos e Interpretador de Código exigem configuração e credenciais adequadas (geralmente por meio de variáveis de ambiente ou argumentos explícitos).
- Para obter exemplos abrangentes, consulte os links de exemplo fornecidos que demonstram cenários práticos, incluindo registro de plug-in, configuração de identidade do Azure e uso avançado de ferramentas.
Esse recurso não está disponível.
Como Fazer
Para obter um exemplo completo para um OpenAIAssistantAgent, consulte:
- Guia Prático: Interpretador de Código
OpenAIAssistantAgent - Como Fazer:
OpenAIAssistantAgentPesquisa de Arquivo