如何流式传输代理响应。 (试验)

警告

语义内核代理框架是实验性的,仍在开发中,可能会更改。

什么是流式处理响应?

流式响应以较小的增量区块传送消息内容。 此方法通过允许他们在消息展开时查看和参与消息,而不是等待整个响应加载来增强用户体验。 用户可以立即开始处理信息,从而提高响应能力和交互性感。 因此,它会最大程度地减少延迟,并使用户在整个通信过程中更加参与。

流式处理引用:

语义内核中的流式处理

与用于完全格式消息相比,支持语义内核中的流式传输的 AI 服务 使用不同的内容类型。 这些内容类型专门用于处理流式处理数据的增量性质。 代理框架中也使用相同的内容类型,以实现类似目的。 这可确保在处理流式处理信息时跨两个系统的一致性和效率。

代理当前在 Java 中不可用。

流式处理代理调用

代理框架支持使用代理聊天时或直接调用聊天完成代理Open AI 助手代理时的流式响应。 在任一模式下,框架在流式传输时异步传递响应。 除了流式处理响应之外,还保留一致的非流式处理历史记录来跟踪对话。 这可确保实时交互和聊天流的可靠记录。

来自 聊天完成代理的流式响应

聊天完成代理调用流式处理响应时,收到完整响应后,将更新聊天历史记录 尽管响应以增量方式流式传输,但历史记录仅记录完整消息。 这可确保 聊天历史记录 反映完全形式的一致性响应。

// Define agent
ChatCompletionAgent agent = ...;

// Create a ChatHistory object to maintain the conversation state.
ChatHistory chat = [];

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

// Generate the streamed agent response(s)
await foreach (StreamingChatMessageContent response in agent.InvokeStreamingAsync(chat))
{
  // Process streamed response(s)...
}
# Define agent
agent = ChatCompletionAgent(...)

# Create a ChatHistory object to maintain the conversation state.
chat = ChatHistory()

# Add a user message to the conversation
chat.add_message(ChatMessageContent(AuthorRole.USER, "<user input>"))

# Generate the streamed agent response(s)
async for response in agent.invoke_stream(chat)
{
  # Process streamed response(s)...
}

代理当前在 Java 中不可用。

Open AI 助手代理的 流式响应

Open AI 助手代理调用流式响应时,可以提供可选的聊天历史记录来捕获完整的消息,以便在需要时进行进一步分析。 由于助手将聊天状态作为远程线程维护,因此捕获这些消息并不总是必要的。 存储和分析完整响应的决定取决于交互的特定要求。

// 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 streamed agent response(s)
await foreach (StreamingChatMessageContent response in agent.InvokeStreamingAsync(threadId))
{
  // Process streamed response(s)...
}

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

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

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

# Generate the streamed agent response(s)
async for response in agent.invoke_stream(thread_id=thread_id):
  # Process streamed response(s)...

代理当前在 Java 中不可用。

使用 代理聊天进行流式处理

使用代理聊天时,始终保留完整的聊天历史记录,并且可以直接通过代理聊天实例进行访问。 因此,流式调用和非流式调用之间的主要区别在于传递方法和生成的内容类型。 在这两种情况下,用户仍然可以访问完整的历史记录,但流式响应在聊天进行时提供实时更新。 这允许根据应用程序的需求,在处理交互方面具有更大的灵活性。

// Define agents
ChatCompletionAgent agent1 = ...;
OpenAIAssistantAgent agent2 = ...;

// Create chat with participating agents.
AgentGroupChat chat =
  new(agent1, agent2)
  {
    // Override default execution settings
    ExecutionSettings =
    {
        TerminationStrategy = { MaximumIterations = 10 }
    }
  };

// Invoke agents
string lastAgent = string.Empty;
await foreach (StreamingChatMessageContent response in chat.InvokeStreamingAsync())
{
    if (!lastAgent.Equals(response.AuthorName, StringComparison.Ordinal))
    {
        // Process begining of agent response
        lastAgent = response.AuthorName;
    }

    // Process streamed content...
} 
# Define agents
agent1 = ChatCompletionAgent(...)
agent2 = OpenAIAssistantAgent(...)

# Create chat with participating agents
chat = AgentGroupChat(
  agents=[agent1, agent2],
  termination_strategy=DefaultTerminationStrategy(maximum_iterations=10),
)

# Invoke agents
last_agent = None
async for response in chat.invoke_stream():
    if message.content is not None:
        if last_agent != response.name:
            # Process beginning of agent response
            last_agent = message.name
        # Process streamed content

代理当前在 Java 中不可用。