[功能请求]提高PromptFlow与具有相对导入的Python模块之间的兼容性

nukf8bse  于 2个月前  发布在  Python
关注(0)|答案(9)|浏览(59)

我正在尝试在一个项目中使用promptflow-evals SDK,并在其中使用相对导入。由于我调用模块的方式(使用python -m modulename),这可以正常工作。然而,PromptFlow出于某种原因尝试导入我的文件,然后报错:

File "/Users/pamelafox/ai-rag-chat-evaluator/scripts/evaluate.py", line 142, in run_evaluation
    results = evaluate(
              ^^^^^^^^^
  File "/Users/pamelafox/ai-rag-chat-evaluator/.venv/lib/python3.11/site-packages/promptflow/evals/evaluate/_evaluate.py", line 252, in evaluate
    input_data_df, target_generated_columns, target_run = _apply_target_to_data(target, data, pf_client,
                                                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/pamelafox/ai-rag-chat-evaluator/.venv/lib/python3.11/site-packages/promptflow/evals/evaluate/_evaluate.py", line 128, in _apply_target_to_data
    run = pf_client.run(
          ^^^^^^^^^^^^^^
  File "/Users/pamelafox/ai-rag-chat-evaluator/.venv/lib/python3.11/site-packages/promptflow/_sdk/_pf_client.py", line 301, in run
    return self._run(
           ^^^^^^^^^^
  File "/Users/pamelafox/ai-rag-chat-evaluator/.venv/lib/python3.11/site-packages/promptflow/_sdk/_pf_client.py", line 226, in _run
    return self.runs.create_or_update(run=run, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/pamelafox/ai-rag-chat-evaluator/.venv/lib/python3.11/site-packages/promptflow/_sdk/_telemetry/activity.py", line 265, in wrapper
    return f(self, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/pamelafox/ai-rag-chat-evaluator/.venv/lib/python3.11/site-packages/promptflow/_sdk/operations/_run_operations.py", line 134, in create_or_update
    created_run = RunSubmitter(client=self._client).submit(run=run, **kwargs)
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/pamelafox/ai-rag-chat-evaluator/.venv/lib/python3.11/site-packages/promptflow/_sdk/_orchestrator/run_submitter.py", line 42, in submit
    self._run_bulk(run=run, stream=stream, **kwargs)
  File "/Users/pamelafox/ai-rag-chat-evaluator/.venv/lib/python3.11/site-packages/promptflow/_sdk/_orchestrator/run_submitter.py", line 111, in _run_bulk
    with flow_overwrite_context(flow_obj, tuning_node, variant, connections=run.connections) as flow:
  File "/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/contextlib.py", line 137, in __enter__
    return next(self.gen)
           ^^^^^^^^^^^^^^
  File "/Users/pamelafox/ai-rag-chat-evaluator/.venv/lib/python3.11/site-packages/promptflow/_sdk/_orchestrator/utils.py", line 264, in flow_overwrite_context
    override_flow_yaml(
  File "/Users/pamelafox/ai-rag-chat-evaluator/.venv/lib/python3.11/site-packages/promptflow/_sdk/_orchestrator/utils.py", line 219, in override_flow_yaml
    update_signatures(code=flow_dir_path, data=flow_dag)
  File "/Users/pamelafox/ai-rag-chat-evaluator/.venv/lib/python3.11/site-packages/promptflow/_sdk/_utilities/signature_utils.py", line 148, in update_signatures
    signatures, _, _ = infer_signature_for_flex_flow(
                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/pamelafox/ai-rag-chat-evaluator/.venv/lib/python3.11/site-packages/promptflow/_sdk/_utilities/signature_utils.py", line 72, in infer_signature_for_flex_flow
    flow_meta = inspector_proxy.get_entry_meta(entry=entry, working_dir=code)
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/pamelafox/ai-rag-chat-evaluator/.venv/lib/python3.11/site-packages/promptflow/_proxy/_python_inspector_proxy.py", line 47, in get_entry_meta
    return _generate_flow_meta(
           ^^^^^^^^^^^^^^^^^^^^
  File "/Users/pamelafox/ai-rag-chat-evaluator/.venv/lib/python3.11/site-packages/promptflow/_core/entry_meta_generator.py", line 84, in _generate_flow_meta
    raise GenerateFlowMetaJsonError(error_message)
promptflow.core._errors.GenerateFlowMetaJsonError: Generate meta failed, detail error:
["Failed to load python module from file '/Users/pamelafox/ai-rag-chat-evaluator/scripts/evaluate.py': (ImportError) attempted relative import with no known parent package"]

。因此,我现在不得不重新组织我的项目以避免使用相对导入。请放宽这个限制。

pdkcd3nj

pdkcd3nj1#

你好@pamelafox,在我们的概念中,流程应该是自包含的。这使得从本地到云端构建流程快照和共享变得更加容易。当流程具有相对外部导入时,我们无法为其构建快照。但是我们可以改进错误消息,使其对客户更加友好。

kyvafyod

kyvafyod2#

你好,我们发送这个友好的提醒是因为我们在30天内没有收到你的回复。我们需要更多关于这个问题的信息来帮助解决它。请务必给我们提供你的反馈。如果我们在7天内没有收到你的回复,问题将自动关闭。谢谢!

xfb7svmp

xfb7svmp3#

我认为promptflow应该能够处理导入其他文件的文件,因为大多数开发者使用模块来提高代码的可重用性。如果我不能引入任何其他文件,那么我将不得不在我的代码库的各个部分无谓地重复常见的代码。

nnvyjq4y

nnvyjq4y4#

为这个添加了一个长期标签。我有一个提议,要将 code 字段引入到 flow 的 YAML 中。如果用户需要在当前工作目录之外导入,他们可以将 flow 的 code 设置为基础文件夹。
例如,一个组织得像这样

src/
    common/
    flow1/
    flow2/

的项目
flow1flow2 可以像这样在 flow YAML 中设置 code

code: path/to/src

但是,您需要使用绝对导入,如下所示

from common import xxx

而不是相对导入,如下所示

from .. import xxx

因为我们使用了多进程来执行 flow,而相对导入可能会找不到其父包。

4uqofj5v

4uqofj5v5#

在同一个问题上被阻塞。

vuv7lop3

vuv7lop36#

我也在这个问题上遇到了阻碍,同一个项目中有2个流程,这两个流程都需要共享的代码逻辑,但是VS Code扩展无法将共享模块导入为Python节点/工具。
只有当根级别只有一个流程时,重新组织项目才能正常工作。

toe95027

toe950277#

你好,MingStar。根据你的描述,这是一个关于prompt流的当前设计行为的问题。一个解决方法是将这两个流程文件放在根目录下,如下所示。如果这有帮助,请告诉我。

$x_1^a_0b_1^x$

fnvucqvd

fnvucqvd8#

@MingStar,由于当前的prompt flow是设计行为。一个解决方法是将这两个流程文件放在根目录下,如下所示。如果这有帮助,请告诉我。

lib/
flow1/
flow2/
flow1.dag.yaml
flow2.dag.yaml

但是,使用这个解决方法后,VS Code扩展程序无法识别这两个DAG yaml文件...它似乎只寻找flow.dag.yaml

vohkndzv

vohkndzv9#

@MingStar,由于当前的prompt flow是设计成这样的行为。一个解决方法是将两个流程文件放在根目录下,如下所示。如果这有帮助,请告诉我。

lib/
flow1/
flow2/
flow1.dag.yaml
flow2.dag.yaml

但是,使用这个解决方法,VS Code扩展程序无法识别这两个DAG yaml文件...它似乎只寻找flow.dag.yaml
我提供的解决方法仅适用于SDK/CLI,目前VS Code扩展程序只能识别flow.dag.yaml是一个单独的文件夹。如果你需要使用VS Code扩展程序,也许你可以将通用库制作成可编辑的本地包并安装在你的本地环境中,或者将lib文件夹复制到两个流程文件夹中。
一旦支持在flow中切换工作目录,我们会在这里进行更新。

相关问题