首页 / 文章

向数据框提问:LangChain的Pandas智能体如何生成图表

了解如何通过create_pandas_dataframe_agent将自然语言问题转换为pandas代码及图表,如何查看其中间处理步骤,以及该功能所需的保障措施。

发布者:REACTAPP.TOP阅读约 6 分钟1328 词

来源: Building Your Data Visualization Agent: A Student’s Guide to AI Analytics

过去,要分析数据集,必须熟练掌握查询语言或绘图库才能看到任何趋势。而借助由大语言模型驱动的智能体处理 pandas DataFrame 时,只需输入如“用条形图展示性别数量”这样的指令,就能同时获得图表和简短说明。尽管如此,这种便利性也带来了风险,因为智能体是在用户的机器上编写并执行 Python 代码来工作的。本指南将解释其中涉及的三个组成部分,逐步演示如何将问题转化为图表,展示如何查看智能体编写的代码,并列出在信任其输出之前需要采取的防护措施。

首先需要说明的是:create_pandas_dataframe_agent 属于 LangChain 的实验性组件。它非常适合用于原型设计和探索,但除非对其添加严格的人工审核与隔离机制,否则不适用于实际生产环境。

从语法到意图

传统的工作流程要求你在学习任何内容之前先掌握具体操作方法:哪些 pandas 方法可用于分组行、哪些 matplotlib 函数可以绘制柱状图、如何为坐标轴添加标签。而智能体方法则颠倒了这一流程——你只需描述自己想要了解的内容,模型便会自行决定如何计算并呈现结果。

实际效果是更多人可以直接处理数据。那些理解问题但不懂语法的业务分析师或领域专家无需等待熟悉相关库的人,就能找到答案。人们的注意力从如何编写代码转移到哪些问题对决策真正重要上。如下文所述,其代价是现在必须验证那些并非自己编写的代码。

智能体背后的三个组成部分

将这个系统想象成一个推理引擎、一个结构化数据存储以及连接两者的组件,是一种有效的理解方式。

作为推理引擎的LLM

语言模型会解析你的请求,编写用于回答该请求的Python代码,并选择合适的图表类型,例如用柱状图展示各类别的数量。它的职责在于连接自然语言与可执行的逻辑,包括弄清数据实际代表的含义。

作为结构化数据存储的DataFrame

pandas以行和带标签的列的形式存储数据。以UCI学生饮酒行为数据集为例:sex和age等属性被作为列存储,便于进行筛选和聚合操作。正是这种统一的结构使得模型能够快速执行精确的操作。

作为连接器的LangChain

create_pandas_dataframe_agent提供了预构建的提示语和工具,使模型能够访问DataFrame。在底层,该代理会收到一个Python执行工具,其中的DataFrame以df的形式存在,同时还会收到指示模型使用该数据的提示语。您无需自行建立这种连接。

问题如何转化为图表

通过系统处理一个请求,就能明确每个组件的功能。假设问题是“用条形图展示性别数量。”

  1. 问题被提交后,模型接收文本并开始理解请求内容。
  2. 模型将请求与数据对应起来,识别出“性别”对应sex列,并判断对于按类别统计的数量而言,条形图最为合适。
  • 数据被读取。不存在独立的数据库,内存中的DataFrame即为数据源。
  • 分析开始运行。模型会编写代码来统计和的值,并应用所需的任何过滤条件,随后连接器会执行这些代码。
  • 结果被解读。模型读取统计数值,并将其置于学生群体的背景中进行分析。
  • 最终结果呈现出来。你会看到一张展示数据分布的条形图以及用通俗语言写的总结。
  • 第2步和第4步是最容易出错的环节。错误的列映射或细微的过滤错误仍可能生成外观整洁的图表,这正是下一节内容如此重要的原因。

    深入探究:中间步骤与生成的代码

    将用户运行的代码与智能体运行的代码分开有助于提高效率。你可以自行调用df.head()来查看前五行数据并了解列的结构。而智能体则会为每个请求编写自己的代码,你可以让这些代码可见。

    使用create_pandas_dataframe_agent创建智能体时,需设置return_intermediate_steps=True。这样得到的结果会包含智能体执行的每一步操作、运行的代码以及观察到的输出。这有助于实现三方面的功能:

    • 验证:你可以确认智能体是通过计算得出答案而非猜测。你会看到诸如len(df)用于统计行数,或df[df['age'] == 18]用于筛选18岁的学生等实际代码表达式。
  • 调试:设置 verbose=True 可以在程序运行时将智能体的推理过程及生成的代码同步输出到控制台,这样当结果出现异常时就能立即发现逻辑错误所在。
  • 学习:这样一来,智能体就不再是一个黑箱,而能直观展示如何使用 pandas 来处理数据。
  • 这两个选项相辅相成。verbose=True 便于在交互式地观察程序运行时使用,而 return_intermediate_steps=True 则会将各步骤以数据形式返回,便于记录、在笔记本中展示或自动检测。

    安全性:智能体会执行其编写的代码

    由于该代理运行的是模型生成的 Python 代码,任何恶意或错误的指令都可能以与你的进程相同的权限读取文件、发起网络请求或删除数据。最新版本的 langchain_experimental 明确要求必须设置 allow_dangerous_code=True 才能构建代理,否则会拒绝操作;请查阅你所使用版本的最新文档。该标志仅用于表明存在风险,并不能真正降低风险。

    对于任何非你创建的数据也应视为不可信的。包含给模型指令等文本的单元格可能会影响其生成的代码,这是一种提示注入现象,当输入为电子表格时很容易被忽视。

    负责任使用的检查清单

    在每个项目中都应有专人负责监督,并逐一核对以下要点:

    • 在沙箱环境中运行该代理,例如容器或无凭据、文件和网络访问权限受限的一次性环境,这样意外或恶意的代码就无法造成危害。
    • 编写清晰、具体的提示。明确指出所需的列以及聚合方式,可以降低代理选择错误字段或凭空生成字段的概率。
    • 用自己的知识验证结果。切勿轻信图表显示的内容;需通过中间步骤确认使用了正确的列、筛选条件和计算方法。
    • 不断迭代。分析是一个互动过程。如果第一份图表不够准确,可利用中间步骤的发现来优化后续请求。
    • 在数据的副本上操作。直接修改DataFrame的操作可能会悄悄改变后续查询所看到的数据。

    关键要点

    • Pandas智能体由三部分组成:用于推理和编写代码的LLM、存储结构化数据的DataFrame,以及连接两者的LangChain的create_pandas_dataframe_agent函数。
    • 大多数错误发生在模型将文字映射到列或编写分析代码时,即便如此它仍能生成看似合理的图表。
    • 设置return_intermediate_steps=True和verbose=True可以显示生成的代码,便于验证和调试。
    • 该智能体能够执行任意的Python代码,目前处于实验性包中,在投入实际应用前需要经过沙箱测试和人工审核。
    • 智能体负责提升处理速度,而你需要提供领域背景知识及关键判断力,将其输出转化为准确的结论。