Type something to search...
Ai-powered Bi Revolution:使用 Crewai 和 Openai 自动生成商业报告!

Ai-powered Bi Revolution:使用 Crewai 和 Openai 自动生成商业报告!

如何直接从 CSV 数据创建简单的 BI 报告

作者通过 ChatGPT 绘制的图像

商业信息应用程序帮助企业将数据作为资源用于做出关键决策,我们将利用 AI 构建一个。

AI 在 BI 工具中的作用必将日益增加;更具体地说,基于 LLM 的应用程序将允许 BI 应用程序创建可视化,提供数据分析的洞察,并自动化商业报告。

因此,在本文中,我们将探讨 LLM 应用程序如何帮助创建商业信息。它不会是一个完整的 BI 应用程序;然而,它将直接从数据中自动创建图表和文本报告。

我们将通过 CrewAI 使用 OpenAI API 来构建一个程序,展示 AI 在这一领域的潜力,并最终形成一个简单的 AI 驱动的 BI 应用程序。

我应该指出,我使用这些特定组件是因为它们方便——我在最近的 教程 中使用了 CrewAI,并且逐渐熟悉它。CrewAI 默认使用 OpenAI,因此我也选择了这个。

其他 LLM,如 Anthropic 的 Claude、Google 的 Gemini 等同样有效,而 CrewAI 易于使用,另一个 AI Agent 框架,如 Autogen,或者支持代码执行的类似框架也会合适。

在这里,我使用的是 CrewAI 的开源产品,当然是免费使用的;OpenAI 需要一个 API 密钥,因此您必须注册并将为使用付费[1]。

BI 应用程序和数据

我们将探索两种功能:创建图表和文本报告。这两者都需要一个能够分析和理解数据的 LLM——对于大多数现代 LLM 来说,这应该不难。

我们将创建两个 Agent:一个用于创建图表,一个用于分析数据并生成报告。

我们将使用的数据为 CSV 格式,完全是虚构的。它是通过 ChatGPT 创建的,涉及一家在全球各个地区销售各种不太可能的产品(从智能电视到床架)的公司。

有三个表格。第一个记录每月销售额。

Image 24

第二个显示各地区畅销产品的销售情况。

Image 25

第三个详细列出了每个商品的销售情况。

Image 26

这是一组销售总监可能认为有用的现实数据吗?我会坦诚地承认我没有头绪。我没有公司,也不销售任何东西,所以我无法在这个领域声称有任何专业知识。

然而,我不确定这是否真的那么重要。我们可以使用 ChatGPT 给我的数据,创建图表,并进行一些分析和报告,无论这些数据是否准确(甚至模糊)典型。

那么让我们开始吧。我正在使用 Jupyter Lab 编写这些示例,您可以在我的 GitHub 仓库AIBI-3 文件夹中找到所有笔记本。

图表始终是 BI 报告的一部分,因此让我们从图表开始。

图表生成器

首先,我们将获取 CSV 文件,并让 LLM 从中创建图表。下面是一个示例——它是用 Matplotlib 生成的。

Image 27

我们将使用 LLM 生成代码,并使用 CrewAI 运行它。

运行 LLM 生成的代码可能不安全,因为 LLM 可能会生成任意代码,这不一定是我们想要的(它可能会产生一些在运行时可能会对本地文件系统造成损害的幻觉)。

因此,它需要先经过人工检查,或者在某种沙箱中运行。对此有不同的方法,Autogen 例如,允许你选择如何运行代码,但 CrewAI 优先考虑安全,所有代码都在与本地文件系统隔离的 Docker 容器中运行。

这意味着你需要在本地机器上运行 Docker。这很简单——只需访问 Docker 网站,下载适合你操作系统的桌面应用程序,安装并运行它。你不需要创建账户或登录——你甚至不需要了解 Docker,只需让它运行,CrewAI 会使用它。

我们将让 LLM 决定要创建哪些图表,我们将看看结果如何。我在下面的每个代码块中都在单独的 Jupyter 代码单元中编写了代码;它们将一起构建完整的程序。

我们将使用默认的 OpenAI API[1],这意味着你的 API 密钥应该作为环境变量可访问。如果它存储为环境变量,你需要先运行以下代码块。

import os
os.environ["OPENAI_API_KEY"] = "your api key"

要开始,你首先导入必要的库并设置 LLM 模型。

from crewai import Agent, Task, Crew
llm = "gpt-4o-mini"

CrewAI 应用程序由几个元素组成:代理、任务和运行任务及代理的团队。我们将看到它们是如何使用的。(有关 CrewAI 的更详细介绍,请参阅我的文章,AI Agents vs. AI Pipelines: a Practical Guide to Coding Your LLM Application,其中介绍了 CrewAI)。

为了进行 LLM 无法完成的任务,我们还需要为代理提供工具——我们很快会看到它们的工作。

我们需要的工具允许 LLM 读取数据文件以及将图表和报告写入本地文件系统。所以,接下来,我们导入 CrewAI 所需的读取和写入文件的工具。

from crewai_tools import FileReadTool, FileWriterTool

file_read_tool = FileReadTool()
file_writer_tool = FileWriterTool()

在 CrewAI 应用程序中,大部分工作由一个或多个代理完成。下面,我们设置 chart_agent

chart_agent = Agent(
        role="图表创建者",
        goal="""读取提供的数据并从该数据创建一个 matplotlib 图表。
                如果你收到关于如何绘制图表的具体指示,请遵循它们;如果没有,则创建一个最佳代表数据的图表""",
        backstory="""你的目标是读取和分析销售数据并创建一个 mathplotlib 图表""",
        tools=[file_read_tool, file_writer_tool],
        llm=llm,
        allow_code_execution=True
    )

你可以看到这是从 CrewAI Agent 类实例化的对象。前三个参数用于创建系统提示——我们期望代理执行的任务在 goalbackstory 参数中定义。你还可以看到我们声明了 LLM 可以使用的工具,并提到了我们将使用的 LLM。

我们给代理的指示将赋予它在创建内容时的自主权,除非给出具体指示。

重要的是,我们将 allow_code_execution 设置为 True。这隐含地允许 LLM 使用其代码执行工具并在 Docker 中运行代码。

我已经在一个 Python dict 中定义了我们将要使用的文件——数据文件当然已经存在,图像文件是我们希望保存图表的地方。

files = [
    {
        'data_file_name':'sales_product_cat.csv',
        'chart_file_name': 'sales_product_summary.png',
    },
    {
        'data_file_name': 'monthly_sales.csv',
        'chart_file_name': 'monthly_sales.png',
    },
    {
        'data_file_name': 'sales_by_region.csv',
        'chart_file_name': 'sales_by_region.png',
    }
]

接下来要做的是创建一个 Task,它进一步定义了我们想要做的事情。它告诉代理为数据文件创建一个图表并将其保存在本地文件中。我们还需要指定适当的代理(可能不止一个)和所需的工具。

最后,我们设置一个 Crew。这定义了我们想要运行的代理列表和任务列表(在这种情况下,列表只有一个元素)。verbose 参数的作用是你所期望的;当设置为 True 时,代理将把它的所有思考写入控制台。如果你不想被大量文本淹没,请将其设置为 False

好吧,几乎是最后一步。我们当然需要启动团队并收集结果。我们通常会使用方法 crew.kickoff(),但在这种情况下,我们有一个要处理的文件列表,而 CrewAI 为我们提供了一个有用的方法,可以在 crew.kickoff_for_each() 中遍历列表,正如我们下面看到的,这需要一个列表作为参数。

create_chart = Task(
    description="""为 {data_file_name} 创建一个图表并将其保存在 {chart_file_name} 中。""",
    expected_output="""一个 matplotlib 图表""",
    agent=chart_agent,
    tools=[file_read_tool, file_writer_tool]
)

crew = Crew(
    agents=[chart_agent],
    tasks=[create_chart],
    verbose=True
)
result = crew.kickoff_for_each(inputs=files)

以这种方式运行团队会产生大量文本,我在这里不会重现,但它详细描述了代理正在经历的步骤。事件的顺序如下:

  • 使用 files_read_tool 读取数据文件
  • 将数据发送给 LLM 以分析数据并生成创建 Matplotlib 图表的代码
  • 在 Docker 中运行 LLM 生成的代码
  • 使用 file_writer_tool 将图表写入本地文件系统中的 PNG 文件。

它会对每个数据文件执行此操作,如果你打开 Docker 窗口,你会看到它根据需要运行代码解释器映像。

Image 28

由于代码是由 LLM 生成的,我们无法保证它每次都会产生相同的结果。然而,它似乎相当一致。每个数据文件都会生成一张图像;本节开头可以看到月度销售数据,其他两张图像如下所示。

Image 29

Image 30

代理生成的报告

现在我们有了图表,让我们继续生成一个报告,该报告将是 LLM 进行一些简单分析和问答的结果。这个报告和之前生成的图像链接将被组合成一个 Markdown 文件,这将是最终报告。

我们需要一个新的代理;我们称之为 data_analysis_agent

我们以与之前相同的格式设置代理,但当然,角色、目标和背景故事是不同的。此外,这次我们禁用代码执行,因为我们不需要它来创建报告。

data_analysis_agent = Agent(
        role="Data Analyser",
        goal="""You aim is to read and analyse sales data. You should
                then write a report on sales performance 
                that includes an executive summary.
                """,
        backstory="You are assigned to perform sales analysis for a company",
        tools=[file_read_tool, file_writer_tool],
        llm=llm,
        allow_code_execution=False
    )

这次代理将被分配的任务当然是不同的。描述告诉代理该做什么:前几句话给代理提供了它所需的文件(数据和图表),然后列出了一些 LLM 应该尝试回答的问题。它还被告知报告的保存位置,并且应该以 Markdown 格式保存。

请注意,文件也包含在问题之后;这样做的原因是,在程序的早期版本中,LLM 似乎忘记了图表文件,再次包含它们可以解决这个问题。

在任务定义之后,我们设置了 Crew 并执行它。

write_report = Task(
    description=f"""The following contains a set of data files and
                    corresponding charts:
                        {files}
                    Write report in Markdown that includes an overview of all
                    of the sales data and incorporate the corresponding charts. If the information is available, or you can calculate it,
                    try and answer the following questions: 
                    1. What has been the overall revenue for the latest month?
                    2. What are the top selling 5 items during the reporting 
                    period?
                    3. In which regions have there been the most sales and 
                    what items are popular in those regions?
                    4. What sort of growth has there been over the reporting 
                    period?
                    5. Are there any trends that you can detect?
                    The overview of the data and the corresponding charts from {files} should be included in an appendix.

Save the result in the file './report.md'.
                    """,
    expected_output="""A markdown file""",
    agent=data_analysis_agent,
    tools=[file_read_tool, file_writer_tool]
)
crew = Crew(
    agents=[data_analysis_agent],
    tasks=[write_report],
    verbose=True
)
result = crew.kickoff()

生成的报告太长,无法在文本中包含,因此我已将其附加在文章末尾。然而,程序合理地尝试回答问题,并忠实地包括了图表。

报告简短,更复杂的提示可能会导致更全面的内容。然而,在设计提示时,必须小心不要给 LLM 提供不当的暗示。例如,我从 ChatGPT 会话中剪切并粘贴了一些建议,其中包括关于供应链问题的问题。当然,从给定的数据中无法推断出这样的一个问题,但 LLM 幻觉出一个虚构的供应链问题来解释销售下滑!

结论及更有用程序的展望

创建一个非常基础的 BI 报告生成器是相当简单的,但在图表创建和报告撰写方面还有许多改进空间。

这个程序相当通用,它可以处理任何一组 CSV 文件,并尽力解释它们并构建合适的图表。我们可以通过在 files 数据结构中包含数据文件的描述来更好地定制它以适应特定的应用程序,同时我们还可以添加我们想要创建的图表的规范——代理已经准备好期待这一点,但我们需要进行一些小的更改以纳入数据描述。这两项措施都将有助于确保输出更一致,更好地满足我们的需求。

报告撰写提示也可以更具体地针对特定应用程序,并扩展以提供更长的报告。

如果我们将该提示和 files 数据结构放到一个单独的文件中,这将允许程序针对不同的应用程序进行调整。

这只是对使用 AI 生成 BI 报告的基本探索,但还有很大的改进空间。使用外部文件来指定更详细的数据文件描述和明确的图表规范将允许非程序员根据他们的特定需求调整程序,同时保持程序的通用性。当然,Jupyter Notebook 并不一定是非程序员使用的应用程序的最佳载体。但我希望这能引发一些思考。

一如既往,感谢您的阅读——我希望这对您有所帮助。

本文的代码和数据可以在这个 GitHub repoAIBI-3 文件夹中找到。生成的图表和报告也在同一文件夹中。

注意事项和参考文献

  1. 如果您在此运行代码,您需要一个 OpenAI 账户和一个 API 密钥。使用此服务意味着您将被收费。在此运行代码的费用不应超过几毛钱,但您应始终在 OpenAI 控制面板上检查您的支出。
  2. 除非另有说明,所有图像和截图均由我,作者,提供。
  3. 免责声明:我与本文提到的任何公司没有商业联系。

附录 — 报告

注意,Markdown 格式在 Medium 上的渲染并不完美,但您在下面看到的内容与生成的内容非常接近。

销售业绩报告

执行摘要

本报告分析了公司在报告期内的销售业绩,重点突出整体收入、畅销商品、地区表现、增长趋势和显著观察。分析基于各产品类别的销售数据、每月销售数据和地区绩效指标。

销售概览

  1. 最新月份的整体收入:

    • 八月总收入: $4,000,000
  2. 销售前五名商品:

      1. 智能手机 — $1,200,000
      1. 笔记本电脑 — $850,000
      1. 智能电视 — $450,000
      1. 冰箱 — $400,000
      1. 洗衣机 — $200,000
  3. 销售最多的地区:

    • 北美:
      • 总收入:$1,500,000
      • 最畅销产品:智能手机(800台)
    • 欧洲:
      • 总收入:$1,200,000
      • 最畅销产品:笔记本电脑(600台)
    • 亚太地区:
      • 总收入:$800,000
      • 最畅销产品:智能电视(900台)
    • 南美:
      • 总收入:$350,000
      • 最畅销产品:冰箱(300台)
    • 非洲:
      • 总收入:$250,000
      • 最畅销产品:沙发(150台)
  4. 报告期内的增长:

    • 整体趋势显示销售持续增长。例如,收入从一月的 $3,500,000 增长到八月的 $4,000,000,表明销售业绩呈逐步上升的趋势。
  5. 检测到的趋势:

    • 电子产品的销售稳步增长,特别是智能手机和笔记本电脑。
    • 季节性可能会影响销售,月度业绩波动可见一斑。
    • 新产品类别,特别是在家电和家具方面,显示出良好的增长潜力。

附录

  • 按产品类别销售图表:

Image 31

  • 每月销售图表:

Image 32

  • 按地区销售图表:

Image 33

Related Posts

结合chatgpt-o3-mini与perplexity Deep Research的3步提示:提升论文写作质量的终极指南

结合chatgpt-o3-mini与perplexity Deep Research的3步提示:提升论文写作质量的终极指南

AI 研究报告和论文写作 合并两个系统指令以获得两个模型的最佳效果 Perplexity AI 的 Deep Research 工具提供专家级的研究报告,而 OpenAI 的 ChatGPT-o3-mini-high 擅长推理。我发现你可以将它们结合起来生成令人难以置信的论文,这些论文比任何一个模型单独撰写的都要好。你只需要将这个一次性提示复制到 **

阅读更多
让 Excel 过时的 10 种 Ai 工具:实现数据分析自动化,节省手工作业时间

让 Excel 过时的 10 种 Ai 工具:实现数据分析自动化,节省手工作业时间

Non members click here作为一名软件开发人员,多年来的一个发现总是让我感到惊讶,那就是人们还在 Excel

阅读更多
使用 ChatGPT 搜索网络功能的 10 种创意方法

使用 ChatGPT 搜索网络功能的 10 种创意方法

例如,提示和输出 你知道可以使用 ChatGPT 的“搜索网络”功能来完成许多任务,而不仅仅是基本的网络搜索吗? 对于那些不知道的人,ChatGPT 新的“搜索网络”功能提供实时信息。 截至撰写此帖时,该功能仅对使用 ChatGPT 4o 和 4o-mini 的付费会员开放。 ![](https://images.weserv.nl/?url=https://cdn-im

阅读更多
掌握Ai代理:解密Google革命性白皮书的10个关键问题解答

掌握Ai代理:解密Google革命性白皮书的10个关键问题解答

10 个常见问题解答 本文是我推出的一个名为“10 个常见问题解答”的新系列的一部分。在本系列中,我旨在通过回答关于该主题的十个最常见问题来分解复杂的概念。我的目标是使用简单的语言和相关的类比,使这些想法易于理解。 图片来自 [Solen Feyissa](https://unsplash.com/@solenfeyissa?utm_source=medium&utm_medi

阅读更多
在人工智能和技术领域保持领先地位的 10 项必学技能 📚

在人工智能和技术领域保持领先地位的 10 项必学技能 📚

在人工智能和科技这样一个动态的行业中,保持领先意味着不断提升你的技能。无论你是希望深入了解人工智能模型性能、掌握数据分析,还是希望通过人工智能转变传统领域如法律,这些课程都是你成功的捷径。以下是一个精心策划的高价值课程列表,可以助力你的职业发展,并让你始终处于创新的前沿。 1. 生成性人工智能简介课程: [生成性人工智能简介](https://genai.works

阅读更多
揭开真相!深度探悉DeepSeek AI的十大误区,您被误导了吗?

揭开真相!深度探悉DeepSeek AI的十大误区,您被误导了吗?

在AI军备竞赛中分辨事实与虚构 DeepSeek AI真的是它所宣传的游戏规则改变者,还是仅仅聪明的营销和战略炒作?👀 虽然一些人将其视为AI效率的革命性飞跃,但另一些人则认为它的成功建立在借用(甚至窃取的)创新和可疑的做法之上。传言称,DeepSeek的首席执行官在疫情期间像囤积卫生纸一样囤积Nvidia芯片——这只是冰山一角。 从其声称的550万美元培训预算到使用Open

阅读更多
Type something to search...