promptflow [BUG] 追踪上下文变量重置

ux6nzvsh  于 2个月前  发布在  其他
关注(0)|答案(6)|浏览(36)

描述bug

当我调用AsyncOpenAI.chat.completions.create函数时,promptflow.tracing.Tracer类中的context_var被重置,从而无法保存指标,如令牌使用情况。

如何复现bug

每次重现此行为所需的步骤如下:

  1. 创建一个新工具
  2. 创建一个AsyncAzureOpenAI对象(我只通过Azure访问OpenAI)
  3. 调用chat.completions.create函数

预期行为

在流程结束时,应该有运行指标,如令牌使用情况,同时api_calls不应为空,因为我调用了一个api,即openai api

截图

http调用前:

http调用后:

在http调用后,Tracer.active_instance为None,这就是为什么无法保存指标的原因

aydmsdu9

aydmsdu91#

你好,@Gzozo ,感谢你报告这个问题。Heyi,这个问题的Maven这周正在度假。我们可能会在Heyi回来后下周进行初步处理。

1sbrub3j

1sbrub3j2#

你好 @Gzozo ,

感谢你联系并提供关于在使用AsyncOpenAI API时遇到的缺失指标问题的详细信息。我们感谢你在概述重现错误步骤和期望记录的指标(包括令牌使用和API调用)方面所做的努力。

为了确保我充分理解情况并更有效地帮助你,我已经在我的本地环境中尝试复制了这个问题。我想分享我遵循的步骤以及如何检查指标的方法:

步骤

  • 构建一个托管异步节点调用AsyncOpenAI API的流程。
from promptflow import tool
from promptflow.tracing import trace
from promptflow.connections import AzureOpenAIConnection
from promptflow.tools.common import normalize_connection_config
from openai import AsyncAzureOpenAI

@trace
async def chat(connection: AzureOpenAIConnection, question: str, stream: bool = False):
    connection_dict = normalize_connection_config(connection)
    client = AsyncAzureOpenAI(**connection_dict)

    messages = [{"role": "system", "content": "You are a helpful assistant."}, {"role": "user", "content": question}]
    response = await client.chat.completions.create(model="gpt-35-turbo", messages=messages, stream=stream)

    if stream:
        async def generator():
            async for chunk in response:
                if chunk.choices:
                    yield chunk.choices[0].delta.content or ""
        return "".join([chunk async for chunk in generator()])
    return response.choices[0].message.content or ""

@tool
async def my_python_tool(connection: AzureOpenAIConnection, question: str, stream: bool) -> str:
    return await chat(connection, question, stream)
  • 执行流程。
  • 检查 flow.detail.json 文件夹中的 .promptflow 文件。

从流程细节.json文件中找到的相关代码片段:

"system_metrics": {  
  "duration": 2.025545,  
  "prompt_tokens": 23,  
  "completion_tokens": 93,  
  "total_tokens": 116  
},

根据这个,在我的情况下,指标似乎是被正确收集的。
既然你遇到了这个问题,很明显我们在重现问题时可能存在一些差异。你愿意分享你的代码片段和你正在采取的具体步骤来重现问题吗?这将帮助我们在同一页面上,更有效地解决问题。
一旦我们获得了这些信息,我们就能更好地了解可能出现的问题以及我们如何能进一步帮助你。
感谢你的合作,期待你的回复。
顺祝商祺。

xzv2uavs

xzv2uavs3#

你好,刘成-ms,

感谢你的回复。

你写的大部分代码都是正确的,但有一个关键的区别是,在流式传输的情况下,我没有收集每个数据块。我使用AsyncGenerator函数返回。这是因为我的用例,我想将响应流回客户端,所以我需要尽快发送数据块。

提前感谢。

b09cbbtk

b09cbbtk4#

你好 @Gzozo ,

感谢你分享你的实现细节。我理解在你的用例中,及时向客户端传输响应的重要性以及使用AsyncGenerator函数的必要性。

关于Tracer无法跟踪流式操作的指标,你是对的,这是由于Tracer当前设计的一个限制。Tracer示例在API调用执行之后、异步生成器被完全消耗之前完成,这导致无法捕获流式响应的指标。

为了监控类似你的情况中的指标,我建议你使用Promptflow提供的跟踪门户。这个功能是Promptflow增强跟踪能力的一部分,可以在这里找到:https://microsoft.github.io/promptflow/how-to-guides/tracing/index.html

跟踪门户允许你在本地托管的Web UI中查看详细的指标。它是检查与你的API调用相关的指标(包括涉及流式的)的一个更强大的解决方案。

请尝试一下,并告诉我们它是否有助于满足你对指标跟踪的要求。你的反馈对于改进我们的工具和服务至关重要。

感谢你的耐心和理解。

最好的祝愿。

tktrz96b

tktrz96b5#

你好,@Gzozo ,

希望这条消息能找到你。我想跟进一下我们之前的对话,关于你在使用AsyncGenerator函数处理流式响应时遇到的度量无法捕获的问题。

你有尝试过建议的跟踪门户功能吗?如果你能确认这个解决方案是否解决了你在流式操作中跟踪度量的需求,那就太好了。

如果跟踪门户确实满足你的需求,我们可以考虑这个问题已经解决,并继续关闭它。但是,如果你仍然遇到困难,或者解决方案不能完全满足你的用例,我们会提供进一步的帮助并探索替代方案。

你的反馈对我们来说至关重要,以确保我们的工具尽可能有效和用户友好。我们期待着你的回复。

感谢你的时间和合作。

最好的祝愿。

zxlwwiss

zxlwwiss6#

你好,@liucheng-ms。

是的,我昨天有时间查看了你提供的门户,但正如我所看到的,它基本上只用于开发和本地测试。我想在生产环境中使用这些指标来创建统计数据。这就是为什么我需要在流程运行结束时访问这些指标,将其保存到数据库中,并稍后在 Jmeter 板上进行可视化。因此,正如我所看到的,跟踪门户并不能帮助我。

感谢你的回复。

相关问题