Type something to search...
使用 LLM 执行分析查询

使用 LLM 执行分析查询

实用方法:使用 LLM 进行数据探索与分析

考虑以下场景。您有一个包含 500 万行和 20 列的 CSV 文件。该 CSV 文件包含客户的交易记录,例如销售日期、单价、数量、客户姓名、地址等。基于这些数据,您希望 LLM 能帮助回答以下问题:

  • 客户 A 在某一天购买了什么?
  • 某个月的总销售额是多少?
  • 列出某一年每个月的销售额。

LLM的局限性

如果你尝试使用LLM回答这些问题,你会很快意识到它无法提供准确或可靠的答案。为什么会这样呢?

  • 大多数LLM的上下文窗口大小有限,这限制了它们在一次交互中可以处理的数据量。数据集的大小(500万行)远远超过了这个限制,使得一次性将整个CSV文件输入LLM变得不可行。没有访问整个数据集的能力,LLM无法有效地执行分析查询。
  • 此外,LLM是基于静态文本数据进行训练的,缺乏对外部结构化数据集的实时访问能力。它们没有原生与大规模表格数据交互或处理的能力。此外,LLM依赖于概率推理并生成近似响应,而不是执行精确计算,这对于计算销售总额或汇总数据等任务至关重要。这些局限性使得LLM不适合直接处理来自大型数据集的分析查询。

除了上下文窗口大小有限之外,将数据发送到大型语言模型(LLM)的另一个关键问题是隐私。当使用由第三方托管的LLM时,例如OpenAI、Claude或DeepSeek,组织特别担心敏感或机密信息的潜在泄露。法律约束,例如遵守GDPR、HIPAA和其他地区数据保护法,进一步复杂化了情况。这些法规要求对个人和组织数据的存储、处理和共享进行严格控制。

  • 例如,发送到外部LLM提供商的数据可能会被记录以用于质量改进、训练或调试目的。即使这些日志被匿名化,仍然存在敏感信息可能被意外暴露或滥用的风险。此外,缺乏关于第三方提供商如何处理、存储和删除数据的透明度,可能会引发对问责制的质疑,尤其是在医疗、金融或法律服务等高风险行业。
  • 此外,一些组织担心数据泄露或反向工程的可能性。如果将专有信息输入到LLM中,则存在该数据的某些方面可能被模型“记住”,并无意中包含在未来的响应中,无论是对同一用户还是其他用户。
  • 此外,公司可能担心LLM可能被恶意利用,例如通过精心设计的提示提取商业秘密或机密商业策略。

应对挑战

鉴于这些挑战,您如何有效地解决使用 LLM 进行分析查询的困难?一种方法是使用提示工程来引导 LLM 生成检索或处理必要数据的代码。通过将其与 SQL、pandas 或检索增强生成 (RAG) 等补充工具结合使用,您可以确保在 LLM 使用之前,数据得到妥善处理。这种组合利用了结构化数据处理的优势以及 LLM 理解和生成自然语言和代码的能力,从而最终提高分析洞察的准确性和相关性。

解决方案

使用LLM执行分析查询的关键步骤,以提示工程为核心组成部分,如下图所示:

  • 步骤 1 — 用户提出与数据集相关的问题,例如:“客户A在2023年1月花费了多少?”
  • 步骤 2 — 一个提示被发送给LLM。提示中并没有嵌入整个数据集,而是包含了数据集架构的详细描述。这可以是数据库表的结构,或者仅仅是CSV文件的头部,具体取决于数据的格式。架构应该尽可能全面。使用清晰、描述性的列名将提高LLM理解问题和生成有意义响应的能力。包含数据示例也可以帮助模型理解数据类型和数据集内的关系。
  • 步骤 3 — LLM根据架构分析用户的查询并制定响应。LLM不会直接计算结果,而是返回可执行的代码——例如SQL查询或Python代码——您可以在数据集上运行这些代码以检索所需的信息。
  • 步骤 4 — 您使用LLM提供的代码在数据集或数据库上运行以计算结果。
  • 步骤 5 — 最后,代码的输出返回给用户,提供请求的答案。

上述方法提供了几个关键优势:

  1. 数据隐私:实际数据从未与LLM共享。仅传递数据集的架构,确保敏感或专有信息保持安全。这使得该方法特别适合关注数据泄露或隐私侵犯的企业。
  2. 优化的提示大小:由于不需要在提示中嵌入大型数据集,因此提示大小保持小且高效。这有助于最小化计算负载,降低使用商业LLM时的成本,尤其是那些根据令牌使用量收费的LLM。
  3. LLM选择的灵活性:您可以选择与商业LLM提供商合作,或运行自己的本地LLM。随着LLM能力的进步,部署和维护自己的LLM基础设施变得越来越可行。这使您对成本和性能有更多控制,特别是在您有特殊数据需求或希望将所有内容保留在内部时。

这些好处使得该方法不仅关注隐私,而且具有成本效益和可扩展性,这对拥有敏感数据或大规模运营的企业至关重要。

我们的 Python 示例

现在您已经理解了 LLM 的限制以及如何利用它根据自己的数据集执行分析查询,让我们构建一个示例应用程序,以了解它如何实现。

在这个示例中,我们将使用泰坦尼克号数据集,这是一个在机器学习教程和练习中常用的著名数据集。我们的目标是利用 LLM 帮助我们更好地理解这个数据集。您将能够用简单的英语提问,LLM 将生成您可以运行的 Python 代码,以分析数据、提取洞见并执行各种类型的分析。无论您是想探索生存率、识别模式还是进行预测,LLM 都会通过生成执行这些任务所需的代码来有效地指导您。

LLMs

在这个例子中,我们将使用两种不同的 LLM:

  1. OpenAI:我们将使用 OpenAI 的 gpt-4o-mini 模型。这是一个付费模型,因此您需要在 OpenAI 注册并生成一个 API 密钥以进行访问。
  2. LM Studio:LM Studio 允许您在本地机器上运行 LLM。在本文中,我们将使用 meta-llama-3.1–8b-instruct 模型,您可以直接在计算机上下载并使用 LM Studio 运行它。这提供了在不依赖外部 API 的情况下运行模型的灵活性,同时仍然提供强大的功能。

通过使用这两种模型,您将比较基于云的 LLM 和本地 LLM 在分析泰坦尼克号数据集方面的表现。无论您选择使用 OpenAI 还是 LM Studio,这两种选项都提供了一种有效的方法,通过自然语言处理查询和理解数据。

如果您是 LM Studio 的新手,请参考我之前的文章,了解如何通过 API 暴露模型:

创建笔记本

在这个例子中,我将使用 Jupyter Notebook。

添加 OpenAI API 密钥

首先,将您的 OpenAI API 密钥保存到环境变量中:

import os

os.environ['OPENAI_API_KEY'] = "OpenAI_API_KEY"

创建 LLM 提供者字典

安装 OpenAI 包:

!pip install openai

由于 LM Studio API 也使用 OpenAI 类,您可以设置两个独立的 OpenAI 类实例——一个用于与 OpenAI 的 API 交互,另一个用于在本地使用 LM Studio。为了有效管理这些实例,您可以创建一个字典来存储它们,使得根据需要在这两个模型之间切换更加方便:

import os
from openai import OpenAI

## connects to OpenAI
client_openai = OpenAI(
    api_key = os.environ.get("OPENAI_API_KEY"),
)

## connects to LM Studio API
client_lmstudio = OpenAI(
    base_url = "http://localhost:1234/v1"
)

## create a dictionary with the model name as the key and the value as the 
## OpenAI instance
clients = {
    "gpt-4o-mini": client_openai,
    "meta-llama-3.1-8b-instruct": client_lmstudio
}

创建提示并获取响应

下一步是最关键的——将提示发送给LLMs并获取响应:

import re
import pandas as pd

## load the CSV file as a Pandas DataFrame
df = pd.read_csv('Titanic_train.csv')

while True:
    messages = []
    messages.append(
    {
        'role':'user',
        'content':'''
            Here is the schema of my data:
            PassengerId,Survived,Pclass,Name,Sex,Age,SibSp,Parch,Ticket,Fare,Cabin,Embarked            
            Note that for Survived, 0 means dead, 1 means alive
            Return the answer in Python code only.
            For your info, I have already loaded the CSV file into a dataframe named df.
        '''
    })

    prompt = input('\nAsk a question: ') 
    if prompt == "quit":
        break
        
    messages.append(
    {
        'role':'user',
        'content':prompt
    })

    # send the question to all the LLMs
    for client_name, client in clients.items():
        completion = client.chat.completions.create(
            model =  client_name,
            messages = messages,
            max_tokens = 1024,
            temperature = 0)

        print(f"Code generated by {client_name}")    
        response = completion.choices[0].message.content    
        print(response)

我已经将Titanic_train.csv文件加载到一个Pandas DataFrame中。现在,我需要LLM生成可以在该DataFrame上执行的Python代码。

当你运行这个代码片段时,你将被要求输入一个问题:

让我们输入问题“绘制乘客按登船港口的分布”。两个LLM将响应如下:

Code generated by gpt-4o-mini
```python
import matplotlib.pyplot as plt
import seaborn as sns

## 设置seaborn的样式
sns.set(style="whitegrid")

## 计算各登船港口的乘客数量
embarked_counts = df['Embarked'].value_counts()

## 创建条形图
plt.figure(figsize=(8, 5))
sns.barplot(x=embarked_counts.index, y=embarked_counts.values, palette='viridis')

## 添加标题和标签
plt.title('乘客按登船港口分布')
plt.xlabel('登船港口')
plt.ylabel('乘客数量')

## 显示图形
plt.show()

Code generated by meta-llama-3.1-8b-instruct

import matplotlib.pyplot as plt

## 绘制按登船港口分布的乘客数量
plt.figure(figsize=(10,6))
df['Embarked'].value_counts().plot(kind='bar')
plt.title('按登船港口分布的乘客数量')
plt.xlabel('港口')
plt.ylabel('数量')
plt.show()

这段代码将创建一个柱状图,显示按登船港口分布的乘客数量。value_counts()函数用于计算’Embarked’列中每个唯一值的出现次数,然后我们将这些计数绘制为柱状图。

第一段代码(用一对反引号包围)来自于*gpt\-4o\-mini*,而第二段代码来自于*meta\-llama\-3\.1–8b\-instruct*。如果您的计算机处理能力有限,本地运行*meta\-llama\-3\.1–8b\-instruct*可能会略显缓慢。


### 提取并执行响应

在手中拥有LLM的响应后,下一步是执行它们。为此,您可以使用正则表达式提取Python代码,然后使用`exec()`或`eval()`函数执行它。以下代码展示了如何提取返回的Python代码并执行它:


```python
import re
import pandas as pd

## 加载CSV文件作为Pandas DataFrame
df = pd.read_csv('Titanic_train.csv')

while True:
    messages = []
    messages.append(
    {
        'role':'user',
        'content':'''
            Here is the schema of my data:
            PassengerId,Survived,Pclass,Name,Sex,Age,SibSp,Parch,Ticket,Fare,Cabin,Embarked            
            Note that for Survived, 0 means dead, 1 means alive
            Return the answer in Python code only.
            For your info, I have already loaded the CSV file into a dataframe named df.
        '''
    })

    prompt = input('\nAsk a question: ') 
    if prompt == "quit":
        break
        
    messages.append(
    {
        'role':'user',
        'content':prompt
    })

    # send the question to all the LLMs
    for client_name, client in clients.items():
        completion = client.chat.completions.create(
            model =  client_name,
            messages = messages,
            max_tokens = 1024,
            temperature = 0)

        print(f"Code generated by {client_name}")
        response = completion.choices[0].message.content    
        print(response)

        #===提取响应中的Python代码===
        pattern = re.compile(r'```python\s*([\s\S]*)\n```')
        match = pattern.search(response)
    
        #===执行Python代码===
        if match:
            extracted_content = match.group(1)
            if extracted_content.count('\n') > 1:
                exec(extracted_content)           # 多行响应    
            else:              
                display(eval(extracted_content))  # 单行响应       
        else:
            print("No content found within ```python...```.")

执行由 gpt-4o-mini 返回的代码生成的图表如下:

执行由 meta-llama-3.1–8b-instruct 返回的响应生成的图表如下:

看来OpenAI模型的结果更令人印象深刻!

让我们尝试另一个问题:“绘制每个乘客等级(Pclass)的生存率”。这是来自 gpt-4o-mini 的结果:

这是来自 meta-llama-3.1–8b-instruct 的结果:

让我们尝试另一个问题:“绘制显示登船点的饼图”。这是来自 gpt-4o-mini 的结果:

这是来自 eta-llama-3.1–8b-instruct 的结果:

你可以尝试一些其他问题,例如:

  • 数据集中男性和女性乘客的比例是多少?(例如,饼图或计数图)
  • 生存情况在小家庭与大家庭乘客之间有何不同?(例如,分组条形图)
  • 你能否可视化单独旅行的乘客与有家庭陪伴的乘客的生存率?
  • 你能否可视化乘客称谓(例如,Mr.、Mrs.、Miss等)与生存之间的关系?(例如,计数图或条形图)

随着你尝试更多问题,你会注意到并非所有生成的代码都是无错误的。然而,通过仔细审查和测试,你通常可以识别并纠正这些问题,以确保代码按预期工作。

一个问题是LLM生成的代码可能存在恶意。比如,它可能包含将你的数据发送到外部来源的代码片段。解决这个问题的一种方法是设置受限的执行环境,让LLM生成的代码只能访问必要的资源。例如,限制代码对敏感文件、网络和数据库的访问,以减少潜在的损害。

摘要

本文探讨了大型语言模型(LLMs)在执行分析查询方面的局限性,强调了隐私问题以及组织对向第三方LLM提供者共享敏感数据的犹豫。它强调了如何利用提示工程引导LLMs生成有效且可操作的代码,提供了一种实用的解决方案,以应对这些挑战,同时维护数据安全。

Related Posts

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

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

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

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

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

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

阅读更多
10 个强大的 Perplexity AI 提示,让您的营销任务自动化

10 个强大的 Perplexity AI 提示,让您的营销任务自动化

在当今快速变化的数字世界中,营销人员总是在寻找更智能的方法来简化他们的工作。想象一下,有一个个人助理可以为您创建受众档案,建议营销策略,甚至为您撰写广告文案。这听起来像是一个梦想? 多亏了像 Perplexity 这样的 AI 工具,这个梦想现在成为现实。通过正确的提示,您可以将 AI 转变为您的 个人营销助理。在本文中,我将分享 10 个强大的提示,帮助您自动

阅读更多
10+ 面向 UI/UX 设计师的顶级 ChatGPT 提示

10+ 面向 UI/UX 设计师的顶级 ChatGPT 提示

人工智能技术,如机器学习、自然语言处理和数据分析,正在重新定义传统设计方法。从自动化重复任务到实现个性化用户体验,人工智能使设计师能够更加专注于战略思维和创造力。随着这一趋势的不断增长,UI/UX 设计师越来越多地采用 AI 驱动的工具来促进他们的工作。利用人工智能不仅能提供基于数据的洞察,还为满足多样化用户需求的创新设计解决方案开辟了机会。 1. 用户角色开发 目的

阅读更多
在几分钟内完成数月工作的 100 种人工智能工具

在几分钟内完成数月工作的 100 种人工智能工具

人工智能(AI)的快速发展改变了企业的运作方式,使人们能够在短短几分钟内完成曾经需要几周或几个月的任务。从内容创作到网站设计,AI工具帮助专业人士节省时间,提高生产力,专注于创造力。以下是按功能分类的100个AI工具的全面列表,以及它们在现实世界中的使用实例。 1. 研究工具 研究可能耗时,但人工智能工具使查找、分析和组织数据变得更加容易。**ChatGPT, Cop

阅读更多
你从未知道的 17 个令人惊叹的 GitHub 仓库

你从未知道的 17 个令人惊叹的 GitHub 仓库

Github 隐藏的宝石!! 立即收藏的代码库 学习编程相对简单,但掌握编写更好代码的艺术要困难得多。GitHub 是开发者的宝藏,那里“金子”是其他人分享的精心编写的代码。通过探索 GitHub,您可以发现如何编写更清晰的代码,理解高质量代码的样子,并学习成为更熟练开发者的基本步骤。 1. notwaldorf/emoji-translate *谁需

阅读更多