Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Utforska den semantiska kerneln
Tips/Råd
Detaljerad API-dokumentation som rör den här diskussionen finns på:
Chatkomplettering i Semantisk Kernel
Chat Completion är i grunden ett protokoll för en chattbaserad interaktion med en AI-modell där chatthistoriken underhålls och presenteras för modellen med varje begäran. Semantic Kernel AI-tjänster erbjuder ett enhetligt ramverk för integrering av funktionerna för chattfärdigställning i olika AI-modeller.
A ChatCompletionAgent kan använda någon av dessa AI-tjänster för att generera svar, oavsett om de riktas till en användare eller en annan agent.
Förbereda din utvecklingsmiljö
Om du vill fortsätta med att utveckla en ChatCompletionAgentkonfigurerar du utvecklingsmiljön med lämpliga paket.
Lägg till Microsoft.SemanticKernel.Agents.Core-paketet i projektet:
dotnet add package Microsoft.SemanticKernel.Agents.Core --prerelease
Installera semantic-kernel-paketet:
pip install semantic-kernel
Viktigt!
Beroende på vilken AI-tjänst du använder som en del av ChatCompletionAgentkan du behöva installera extra paket. Kontrollera om det krävs extra på följande sida
<dependency>
<groupId>com.microsoft.semantic-kernel</groupId>
<artifactId>semantickernel-agents-core</artifactId>
<version>[LATEST]</version>
</dependency>
Skapa en ChatCompletionAgent
En ChatCompletionAgent är i grunden baserad på en AI-tjänst. Därför börjar skapandet av en ChatCompletionAgent med att skapa en Kernel instans som innehåller en eller flera chatttjänster och sedan instansiera agenten med en referens till den Kernel instansen.
// Initialize a Kernel with a chat-completion service
IKernelBuilder builder = Kernel.CreateBuilder();
builder.AddAzureOpenAIChatCompletion(/*<...configuration parameters>*/);
Kernel kernel = builder.Build();
// Create the agent
ChatCompletionAgent agent =
new()
{
Name = "SummarizationAgent",
Instructions = "Summarize user input",
Kernel = kernel
};
Det finns två sätt att skapa en ChatCompletionAgent:
1. Genom att tillhandahålla tjänsten för chattens slutförande direkt
from semantic_kernel.agents import ChatCompletionAgent
# Create the agent by directly providing the chat completion service
agent = ChatCompletionAgent(
service=AzureChatCompletion(), # your chat completion service instance
name="<agent name>",
instructions="<agent instructions>",
)
2. Genom att först skapa en kernel lägger du till tjänsten i den och tillhandahåller sedan kerneln
# Define the kernel
kernel = Kernel()
# Add the chat completion service to the kernel
kernel.add_service(AzureChatCompletion())
# Create the agent using the kernel
agent = ChatCompletionAgent(
kernel=kernel,
name="<agent name>",
instructions="<agent instructions>",
)
Den första metoden är användbar när du redan har en chatttjänst klar. Den andra metoden är fördelaktig när du behöver en kernel som hanterar flera tjänster eller ytterligare funktioner.
// Initialize a Kernel with a chat-completion service
var chatCompletion = OpenAIChatCompletion.builder()
.withOpenAIAsyncClient(client) // OpenAIAsyncClient with configuration parameters
.withModelId(MODEL_ID)
.build();
var kernel = Kernel.builder()
.withAIService(ChatCompletionService.class, chatCompletion)
.build();
// Create the agent
var agent = ChatCompletionAgent.builder()
.withKernel(kernel)
.build();
Val av AI-tjänst
En stöder specifikationen av en tjänstväljare, vilket inte skiljer sig från att använda semantisk kernel ChatCompletionAgent direkt. En tjänstväljare identifierar vilka AI-tjänsten att rikta in sig på när Kernel innehåller mer än en.
Anmärkning
Om flera AI-tjänster finns och ingen tjänstväljare tillhandahålls tillämpas samma standardlogik för agenten som du skulle hitta när du använder en AI-tjänst utanför Agent Framework
IKernelBuilder builder = Kernel.CreateBuilder();
// Initialize multiple chat-completion services.
builder.AddAzureOpenAIChatCompletion(/*<...service configuration>*/, serviceId: "service-1");
builder.AddAzureOpenAIChatCompletion(/*<...service configuration>*/, serviceId: "service-2");
Kernel kernel = builder.Build();
ChatCompletionAgent agent =
new()
{
Name = "<agent name>",
Instructions = "<agent instructions>",
Kernel = kernel,
Arguments = // Specify the service-identifier via the KernelArguments
new KernelArguments(
new OpenAIPromptExecutionSettings()
{
ServiceId = "service-2" // The target service-identifier.
})
};
from semantic_kernel.connectors.ai.open_ai import (
AzureChatCompletion,
AzureChatPromptExecutionSettings,
)
# Define the Kernel
kernel = Kernel()
# Add the AzureChatCompletion AI Service to the Kernel
kernel.add_service(AzureChatCompletion(service_id="service1"))
kernel.add_service(AzureChatCompletion(service_id="service2"))
settings = AzureChatPromptExecutionSettings(service_id="service2")
# Create the agent
agent = ChatCompletionAgent(
kernel=kernel,
name="<agent name>",
instructions="<agent instructions>",
arguments=KernelArguments(settings=settings)
)
Funktionen är för närvarande inte tillgänglig i Java.
Samtal med ChatCompletionAgent
Samtal med din ChatCompletionAgent baseras på en ChatHistory-instans som inte skiljer sig från att interagera med en AI-tjänst för chatkomplettering .
Du kan bara anropa agenten med ditt användarmeddelande.
// Define agent
ChatCompletionAgent agent = ...;
// Generate the agent response(s)
await foreach (ChatMessageContent response in agent.InvokeAsync(new ChatMessageContent(AuthorRole.User, "<user input>")))
{
// Process agent response(s)...
}
Du kan också använda en AgentThread för att ha en konversation med din agent.
Här använder vi en ChatHistoryAgentThread.
ChatHistoryAgentThread Kan också ta ett valfritt ChatHistory objekt som indata, via konstruktorn, om du återupptar en tidigare konversation. (visas inte)
// Define agent
ChatCompletionAgent agent = ...;
AgentThread thread = new ChatHistoryAgentThread();
// Generate the agent response(s)
await foreach (ChatMessageContent response in agent.InvokeAsync(new ChatMessageContent(AuthorRole.User, "<user input>"), thread))
{
// Process agent response(s)...
}
Det finns flera sätt att prata med en ChatCompletionAgent.
Det enklaste är att anropa och invänta get_response:
# Define agent
agent = ChatCompletionAgent(...)
# Generate the agent response
response = await agent.get_response(messages="user input")
# response is an `AgentResponseItem[ChatMessageContent]` object
Om du vill att agenten ska upprätthålla konversationshistoriken mellan anrop, kan du skicka den ett ChatHistoryAgentThread på följande sätt:
# Define agent
agent = ChatCompletionAgent(...)
# Generate the agent response(s)
response = await agent.get_response(messages="user input")
# Generate another response, continuing the conversation thread from the first response.
response2 = await agent.get_response(messages="user input", thread=response.thread)
# process agent response(s)
Att anropa invoke-metoden returnerar en AsyncIterable av AgentResponseItem[ChatMessageContent].
# Define agent
agent = ChatCompletionAgent(...)
# Define the thread
thread = ChatHistoryAgentThread()
# Generate the agent response(s)
async for response in agent.invoke(messages="user input", thread=thread):
# process agent response(s)
ChatCompletionAgent stöder också strömning där metoden invoke_stream returnerar en AsyncIterable av StreamingChatMessageContent:
# Define agent
agent = ChatCompletionAgent(...)
# Define the thread
thread = ChatHistoryAgentThread()
# Generate the agent response(s)
async for response in agent.invoke_stream(messages="user input", thread=thread):
# process agent response(s)
ChatCompletionAgent agent = ...;
// Generate the agent response(s)
agent.invokeAsync(new ChatMessageContent<>(AuthorRole.USER, "<user input>")).block();
Du kan också använda en AgentThread för att ha en konversation med din agent.
Här använder vi en ChatHistoryAgentThread.
ChatHistoryAgentThread kan också ta ett ChatHistory-objekt som indata, via konstruktorn, om en tidigare konversation återupptas. (visas inte)
// Define agent
ChatCompletionAgent agent = ...;
AgentThread thread = new ChatHistoryAgentThread();
// Generate the agent response(s)
agent.invokeAsync(new ChatMessageContent<>(AuthorRole.USER, "<user input>"), thread).block();
Hantera mellanliggande meddelanden med en ChatCompletionAgent
Semantisk kärna ChatCompletionAgent är utformad för att anropa en agent som besvarar användarens frågor eller förfrågningar. Under anropet kan agenten köra verktyg för att härleda det slutliga svaret. För att få åtkomst till mellanliggande meddelanden som skapas under den här processen kan anropare tillhandahålla en återanropsfunktion som hanterar instanser av FunctionCallContent eller FunctionResultContent.
Dokumentationen för återanrop för
ChatCompletionAgentkommer snart.
Genom att konfigurera återanropet on_intermediate_message inom agent.invoke(...) eller agent.invoke_stream(...) kan anroparen ta emot mellanliggande meddelanden som genererats under processen med att formulera agentens slutliga svar.
import asyncio
from typing import Annotated
from semantic_kernel.agents.chat_completion.chat_completion_agent import ChatCompletionAgent, ChatHistoryAgentThread
from semantic_kernel.connectors.ai.open_ai.services.azure_chat_completion import AzureChatCompletion
from semantic_kernel.contents import FunctionCallContent, FunctionResultContent
from semantic_kernel.contents.chat_message_content import ChatMessageContent
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, FunctionCallContent):
print(f"Function Call:> {item.name} with arguments: {item.arguments}")
elif isinstance(item, FunctionResultContent):
print(f"Function Result:> {item.result} for function: {item.name}")
else:
print(f"{message.role}: {message.content}")
async def main() -> None:
agent = ChatCompletionAgent(
service=AzureChatCompletion(),
name="Assistant",
instructions="Answer questions about the menu.",
plugins=[MenuPlugin()],
)
# Create a thread for the agent
# If no thread is provided, a new thread will be
# created and returned with the initial response
thread: ChatHistoryAgentThread = None
user_inputs = [
"Hello",
"What is the special soup?",
"How much does that cost?",
"Thank you",
]
for user_input in user_inputs:
print(f"# 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
if __name__ == "__main__":
asyncio.run(main())
Följande visar exempelutdata från agentanropsprocessen:
User: 'Hello'
AuthorRole.ASSISTANT: Hi there! How can I assist you today?
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 today is Clam Chowder. Would you like to know anything else from the menu?
User: 'How much does that cost?'
Function Call:> MenuPlugin-get_item_price with arguments: {"menu_item":"Clam Chowder"}
Function Result:> $9.99 for function: MenuPlugin-get_item_price
AuthorRole.ASSISTANT: The Clam Chowder costs $9.99. Would you like to know more about the menu or anything else?
User: 'Thank you'
AuthorRole.ASSISTANT: You're welcome! If you have any more questions, feel free to ask. Enjoy your day!
Funktionen är för närvarande inte tillgänglig i Java.
Deklarativ specifikation
Dokumentationen om hur du använder deklarativa specifikationer kommer snart.
Viktigt!
Den här funktionen är i den experimentella fasen. Funktioner i det här skedet är under utveckling och kan komma att ändras innan de går vidare till förhandsversionen eller lanseringsfasen.
ChatCompletionAgent Kan instansieras direkt från en YAML-deklarativ specifikation. Med den här metoden kan du definiera agentens kärnegenskaper, instruktioner och tillgängliga funktioner (plugin-program) på ett strukturerat och portabelt sätt. Genom att använda YAML kan du beskriva agentens namn, beskrivning, instruktionsprompt, verktygsuppsättning och modellparametrar i ett enda dokument, vilket gör agentens konfiguration lätt att granska och återskapa.
Anmärkning
Verktyg eller funktioner som anges i den deklarativa YAML måste redan finnas i Kernel-instansen när agenten skapas. Agentinläsaren skapar inte nya funktioner utifrån specifikationen. Istället söker den upp de refererade plugin-programmen och funktionerna genom deras identifierare i kärnan. Om ett obligatoriskt plugin-program eller en funktion inte finns i kerneln utlöses ett fel under agentkonstruktionen.
Exempel: Skapa en ChatCompletionAgent från en YAML-specifikation
import asyncio
from typing import Annotated
from semantic_kernel import Kernel
from semantic_kernel.agents import AgentRegistry, ChatHistoryAgentThread
from semantic_kernel.agents.chat_completion.chat_completion_agent import ChatCompletionAgent
from semantic_kernel.connectors.ai.open_ai import OpenAIChatCompletion
from semantic_kernel.functions import kernel_function
# Define a plugin with kernel functions
class MenuPlugin:
@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"
# YAML spec for the agent
AGENT_YAML = """
type: chat_completion_agent
name: Assistant
description: A helpful assistant.
instructions: Answer the user's questions using the menu functions.
tools:
- id: MenuPlugin.get_specials
type: function
- id: MenuPlugin.get_item_price
type: function
model:
options:
temperature: 0.7
"""
USER_INPUTS = [
"Hello",
"What is the special soup?",
"What does that cost?",
"Thank you",
]
async def main():
kernel = Kernel()
kernel.add_plugin(MenuPlugin(), plugin_name="MenuPlugin")
agent: ChatCompletionAgent = await AgentRegistry.create_from_yaml(
AGENT_YAML, kernel=kernel, service=OpenAIChatCompletion()
)
thread: ChatHistoryAgentThread | None = None
for user_input in USER_INPUTS:
print(f"# User: {user_input}")
response = await agent.get_response(user_input, thread=thread)
print(f"# {response.name}: {response}")
thread = response.thread
await thread.delete() if thread else None
if __name__ == "__main__":
asyncio.run(main())
Den här funktionen är inte tillgänglig.
Så här gör du
Ett heltäckande exempel för en ChatCompletionAgentfinns i: