llama_index [Bug]: 名称错误:名称'p'未定义

uqxowvwt  于 23天前  发布在  其他
关注(0)|答案(3)|浏览(18)

Bug描述

我使用PandasQueryEngine查询大型数据库,但它给出了以下错误输出:
Pandas指令:

df['gl'].apply(lambda x: x['Account']).value_counts()
Traceback (most recent call last):
  File "c:\Users\tytun\anaconda3\envs\pulse_ai\Lib\site-packages\llama_index\experimental\query_engine\pandas\output_parser.py", line 54, in default_output_processor
    output_str = str(safe_eval(module_end_str, global_vars, local_vars))
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "c:\Users\tytun\anaconda3\envs\pulse_ai\Lib\site-packages\llama_index\experimental\exec_utils.py", line 159, in safe_eval
    return eval(__source, _get_restricted_globals(__globals), __locals)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "<string>", line 1, in <module>
NameError: name 'p' is not defined

但奇怪的是,在上面的Pandas指令中没有显示“p”。

版本

llama-index 0.11.0

重现步骤

from llama_index.experimental.query_engine import PandasQueryEngine
from llama_index.llms.vertex import Vertex
import pandas as pd

def process_large_dataset_with_llamaindex(data: Dict[str, Any], query: str) -> str:
    """Process large dataset with LlamaIndex."""
    df = pd.DataFrame(data)
    vertex_gemini = Vertex(model="gemini-1.5-flash", temperature=0, additional_kwargs={})
    query_engine = PandasQueryEngine(df=df, verbose=True, llm=vertex_gemini)
    response = query_engine.query(query)
    return str(response)
    
result = <some large database here>
user_query = "summarize the data"
llamaindex_response = process_large_dataset_with_llamaindex(result, user_query)

相关日志/回溯

  • 无响应*
2nbm6dog

2nbm6dog1#

我找到了一个与你的问题可能相关的相似问题。标题为 "[Bug]: Pandas 输出:在运行输出为 Python 代码时出现错误。错误信息:名称 'p' 未定义" 的问题仍处于打开状态,最后更新于2024年7月24日。建议的解决方案是确保绘图库(如 matplotlib.pyplot 作为 plt)正确导入和使用 1(https://github.com/run-llama/llama_index/issues/13800)。

此外,NameError: name 'p' is not defined 的发生是因为 PandasQueryEnginellama-index 0.11.0 中已被弃用,并在初始化时引发了 DeprecationWarning。提供的代码没有定义或使用名为 'p' 的变量,错误很可能源于尝试使用已弃用的 PandasQueryEngine

要解决此问题,你应该按照弃用警告中的指示从 llama-index-experimental 包中使用 PandasQueryEngine。安装该包并从那里导入 PandasQueryEngine:

pip install llama-index-experimental

这是你的代码的更新版本:

import pandas as pd
from llama_index.experimental.query_engine.pandas.pandas_query_engine import PandasQueryEngine
from llama_index.llms.vertex import Vertex

def process_large_dataset_with_llamaindex(data: Dict[str, Any], query: str) -> str:
    """Process large dataset with LlamaIndex."""
    df = pd.DataFrame(data)
    vertex_gemini = Vertex(model="gemini-1.5-flash", temperature=0, additional_kwargs={})
    query_engine = PandasQueryEngine(df=df, verbose=True, llm=vertex_gemini)
    response = query_engine.query(query)
    return str(response)
    
result = <some large database here>
user_query = "summarize the data"
llamaindex_response = process_large_dataset_with_llamaindex(result, user_query)

这应该通过使用更新后的 PandasQueryEngine 实现来解决 NameError 问题 2(https://github.com/run-llama/llama_index/blob/main/llama-index-core/llama_index/core/query_engine/pandas/pandas_query_engine.py)3(https://github.com/run-llama/llama_index/blob/main/llama-index-experimental/llama_index/experimental/query_engine/pandas/pandas_query_engine.py)。

  • 要继续与 Dosu 对话,请提及 @dosu。*
tpgth1q7

tpgth1q72#

我尝试了你的代码,仍然出现了相同的错误。@dosu

tv6aics1

tv6aics13#

NameError: name 'p' is not defined 发生是因为变量 p 在被使用的范围内未定义。在 llama-index-experimental 包的 PandasQueryEngine 上下文中,如果生成的 Pandas 代码(使用 eval() 执行)引用了一个未定义的变量 p,就会出现这个错误。
要调试此问题,您可以在执行之前打印生成的 Pandas 指令,以查看是否有对未定义变量的引用。以下是 _query 方法中的一个代码片段,您可以在其中添加 print 语句来调试生成的 Pandas 指令:

def _query(self, query_bundle: QueryBundle) -> Response:
    """Answer a query."""
    context = self._get_table_context()

    pandas_response_str = self._llm.predict(
        self._pandas_prompt,
        df_str=context,
        query_str=query_bundle.query_str,
        instruction_str=self._instruction_str,
    )

    if self._verbose:
        print_text(f"> Pandas Instructions:\n" f"```\n{pandas_response_str}\n```\n")
    
    # Add this print statement to debug the generated Pandas instructions
    print(f"Generated Pandas Instructions: {pandas_response_str}")

    pandas_output = self._instruction_parser.parse(pandas_response_str)
    if self._verbose:
        print_text(f"> Pandas Output: {pandas_output}\n")

    response_metadata = {
        "pandas_instruction_str": pandas_response_str,
        "raw_pandas_output": pandas_output,
    }
    if self._synthesize_response:
        response_str = str(
            self._llm.predict(
                self._response_synthesis_prompt,
                query_str=query_bundle.query_str,
                pandas_instructions=pandas_response_str,
                pandas_output=pandas_output,
            )
        )
    else:
        response_str = str(pandas_output)

    return Response(response=response_str, metadata=response_metadata)

通过添加 print 语句,您可以检查生成的 Pandas 指令,并确保代码中使用的所有变量都已正确定义 1(https://github.com/run-llama/llama_index/blob/main/llama-index-experimental/llama_index/experimental/query_engine/pandas/pandas_query_engine.py)。

  • 要继续与 Dosu 交谈,请提及 @dosu。*

相关问题