Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Mi az a valós idejű adatfolyam válasz?
A streamelt válasz kis, növekményes adattömbökben továbbítja az üzenet tartalmát. Ez a megközelítés növeli a felhasználói élményt azáltal, hogy lehetővé teszi számukra az üzenet kibontása közbeni megtekintését és használatát, ahelyett, hogy a teljes válasz betöltésére várnak. A felhasználók azonnal megkezdhetik az információk feldolgozását, javítva a válaszkészség és az interaktivitás érzését. Ennek eredményeképpen minimalizálja a késéseket, és a felhasználókat jobban bevonja a kommunikációs folyamatba.
Streamelési hivatkozások
- OpenAI streamelési útmutató
- OpenAI Chat Completion Streaming
- OpenAI Assistant streaming szolgáltatás
- Azure OpenAI Service REST API
Streamelés szemantikus kernelben
A szemantikus kernelben történő streamelést támogató AI-szolgáltatások különböző tartalomtípusokat használnak a teljesen formázott üzenetekhez képest. Ezeket a tartalomtípusokat kifejezetten a streamelési adatok növekményes jellegének kezelésére tervezték. Ugyanezek a tartalomtípusok az Ügynök-keretrendszerben is használhatók hasonló célokra. Ez biztosítja a konzisztenciát és a hatékonyságot mindkét rendszerben a streamelési információk kezelésekor.
Jótanács
API-referencia:
Jótanács
API-referencia:
A funkció jelenleg nem érhető el a Javában.
Streamelt válasz a következőtől: ChatCompletionAgent
Amikor egy streamelt válasz meghívásra kerül a ChatCompletionAgent rendszerből, a ChatHistory a AgentThread-ben frissül a teljes válasz beérkezése után. Bár a válasz növekményesen van streamelve, az előzmények csak a teljes üzenetet rögzítik. Ez biztosítja, hogy a ChatHistory teljes mértékben kialakult válaszokat tükrözzön a konzisztencia érdekében.
// Define agent
ChatCompletionAgent agent = ...;
ChatHistoryAgentThread agentThread = new();
// Create a user message
var message = ChatMessageContent(AuthorRole.User, "<user input>");
// Generate the streamed agent response(s)
await foreach (StreamingChatMessageContent response in agent.InvokeStreamingAsync(message, agentThread))
{
// Process streamed response(s)...
}
// It's also possible to read the messages that were added to the ChatHistoryAgentThread.
await foreach (ChatMessageContent response in agentThread.GetMessagesAsync())
{
// Process messages...
}
from semantic_kernel.agents import ChatCompletionAgent, ChatHistoryAgentThread
# Define agent
agent = ChatCompletionAgent(...)
# Create a thread object to maintain the conversation state.
# If no thread is provided one will be created and returned with
# the initial response.
thread: ChatHistoryAgentThread = None
# Generate the streamed agent response(s)
async for response in agent.invoke_stream(messages="user input", thread=thread)
{
# Process streamed response(s)...
thread = response.thread
}
A funkció jelenleg nem érhető el a Javában.
Streamelt válasz a következőtől: OpenAIAssistantAgent
Streamelt válasz OpenAIAssistantAgent meghívásakor az asszisztens a beszélgetés állapotát távoli szálként kezeli. Szükség esetén beolvashatja az üzeneteket a távoli szálról.
// Define agent
OpenAIAssistantAgent agent = ...;
// Create a thread for the agent conversation.
OpenAIAssistantAgentThread agentThread = new(assistantClient);
// Create a user message
var message = new ChatMessageContent(AuthorRole.User, "<user input>");
// Generate the streamed agent response(s)
await foreach (StreamingChatMessageContent response in agent.InvokeStreamingAsync(message, agentThread))
{
// Process streamed response(s)...
}
// It's possible to read the messages from the remote thread.
await foreach (ChatMessageContent response in agentThread.GetMessagesAsync())
{
// Process messages...
}
// Delete the thread when it is no longer needed
await agentThread.DeleteAsync();
Egy meglévő Id használatával szál létrehozásához adja át a OpenAIAssistantAgentThread konstruktorának:
// Define agent
OpenAIAssistantAgent agent = ...;
// Create a thread for the agent conversation.
OpenAIAssistantAgentThread agentThread = new(assistantClient, "your-existing-thread-id");
// Create a user message
var message = new ChatMessageContent(AuthorRole.User, "<user input>");
// Generate the streamed agent response(s)
await foreach (StreamingChatMessageContent response in agent.InvokeStreamingAsync(message, agentThread))
{
// Process streamed response(s)...
}
// It's possible to read the messages from the remote thread.
await foreach (ChatMessageContent response in agentThread.GetMessagesAsync())
{
// Process messages...
}
// Delete the thread when it is no longer needed
await agentThread.DeleteAsync();
from semantic_kernel.agents import AssistantAgentThread, AzureAssistantAgent, OpenAIAssistantAgent
# Define agent
agent = OpenAIAssistantAgent(...) # or = AzureAssistantAgent(...)
# Create a thread for the agent conversation.
# If no thread is provided one will be created and returned with
# the initial response.
thread: AssistantAgentThread = None
# Generate the streamed agent response(s)
async for response in agent.invoke_stream(messages="user input", thread=thread):
# Process streamed response(s)...
thread = response.thread
# Read the messages from the remote thread
async for response in thread.get_messages():
# Process messages
# Delete the thread
await thread.delete()
Egy meglévő thread_id használatával szál létrehozásához adja át a AssistantAgentThread konstruktorának:
from semantic_kernel.agents import AssistantAgentThread, AzureAssistantAgent, OpenAIAssistantAgent
# Define agent
agent = OpenAIAssistantAgent(...) # or = AzureAssistantAgent(...)
# Create a thread for the agent conversation.
# If no thread is provided one will be created and returned with
# the initial response.
thread = AssistantAgentThread(client=client, thread_id="your-existing-thread-id")
# Generate the streamed agent response(s)
async for response in agent.invoke_stream(messages="user input", thread=thread):
# Process streamed response(s)...
thread = response.thread
# Delete the thread
await thread.delete()
A funkció jelenleg nem érhető el a Javában.
Köztes üzenetek kezelése streamelési válaszsal
A streamelési válaszok természete lehetővé teszi, hogy az LLM-modellek növekményes szövegrészleteket adjanak vissza, így gyorsabban renderelhetők a felhasználói felületen vagy a konzolon anélkül, hogy a teljes válaszra várnak. Emellett előfordulhat, hogy a hívó szeretné kezelni a köztes tartalmakat, például a függvényhívások eredményeit. Ez egy visszahívási függvény megadásával érhető el a streamelési válasz meghívásakor. A visszahívási függvény a teljes üzeneteket, amelyek be vannak foglalva a ChatMessageContent-be, fogadja.
A visszahívási
AzureAIAgentdokumentáció hamarosan elérhető lesz.
on_intermediate_message belső agent.invoke_stream(...) visszahívásának konfigurálásával a hívó fél köztes üzeneteket kaphat, amelyek az ügynök végső válaszának kidolgozása során keletkeznek.
import asyncio
from typing import Annotated
from semantic_kernel.agents import AzureResponsesAgent
from semantic_kernel.contents import 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, menu_item: str) -> 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_streaming_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}")
# Simulate a conversation with the agent
USER_INPUTS = [
"Hello",
"What is the special soup?",
"What is the special drink?",
"How much is it?",
"Thank you",
]
async def main():
# 1. Create the client using OpenAI resources and configuration
client, model = AzureResponsesAgent.setup_resources()
# 2. Create a Semantic Kernel agent for the OpenAI Responses API
agent = AzureResponsesAgent(
ai_model_id=model,
client=client,
instructions="Answer questions about the menu.",
name="Host",
plugins=[MenuPlugin()],
)
# 3. Create a thread for the agent
# If no thread is provided, a new thread will be
# created and returned with the initial response
thread = None
try:
for user_input in user_inputs:
print(f"# {AuthorRole.USER}: '{user_input}'")
first_chunk = True
async for response in agent.invoke_stream(
messages=user_input,
thread=thread,
on_intermediate_message=handle_streaming_intermediate_steps,
):
thread = response.thread
if first_chunk:
print(f"# {response.name}: ", end="", flush=True)
first_chunk = False
print(response.content, end="", flush=True)
print()
finally:
await thread.delete() if thread else None
if __name__ == "__main__":
asyncio.run(main())
Az alábbiak az ügynökhívási folyamatból származó mintakimenetet szemléltetik:
Sample Output:
# AuthorRole.USER: 'Hello'
# Host: Hello! How can I assist you with the menu 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
# Host: The special soup today is Clam Chowder. Would you like to know more about it or hear about other specials?
# AuthorRole.USER: 'What is the special drink?'
# Host: The special drink today is Chai Tea. Would you like more details or are you interested in ordering it?
# 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
# Host: The special drink, Chai Tea, is $9.99. Would you like to order one or need information on something else?
# AuthorRole.USER: 'Thank you'
# Host: You're welcome! If you have any more questions or need help with the menu, just let me know. Enjoy your day!
A funkció jelenleg nem érhető el a Javában.