10M数据记录的聊天:ChatGPT、PandasAI和Streamlit

2024年08月12日 由 alex 发表 102 0

"与数据聊天 "是 "与万物聊天 "系列的一篇文章。本部分将重点介绍如何用自然语言提出有关数据的问题。


对于那些不了解的人来说,"与万物对话 "系列主要是为你提供构建 LLM 应用程序的技术知识和技巧。我使用流行的框架创建了所有应用程序: Streamlit、Langchain 和 OpenAI(LLM 模型)。


1. 使用自然语言与数据 "对话

我们都非常熟悉自然语言,即我们日常用于社交交流的语言。但当涉及到与计算机和数据交互时,过程就变得复杂多了。


过去,要处理数据,我必须学习 SQL。如果我想彻底掌握它,这个过程可能需要几天甚至几周的时间。对于像我这样有技术背景的人来说,这还是可以应付的,但对于那些没有技术专长的人来说,这可能需要几个月的时间。


如今,在大型语言模型(LLM)的支持下,这一过程变得更加简单快捷。将 LLM 想象成一个天才翻译。你无需学习新的编程语言或查询语言,只需使用你的自然语言即可。LLM 会自动将你的请求翻译成编程语言,执行复杂的任务,并将结果返回给你。整个过程在几分钟内完成,快速准确地为你提供必要的信息。


使用 LLM(如 ChatGPT、Gemini 等)不仅能节省时间,还能为每个人提供机会,无论技术熟练程度如何,都能访问和利用数据的力量。


使用 LLM 处理我们的数据有两种可能的方法:

第一种方法是直接使用 ChatGPT 的功能进行数据分析。可以访问 OpenAI 网站,从电脑上传数据文件进行处理和分析。不过,这种方法有三个明显的缺点:

  1. 你的数据可能会泄露给第三方(OpenAI)
  2. 大数据处理非常 "昂贵",如何计算代币成本将在下文中说明
  3. 过多的数据处理会导致你的账户被封 1-2 个小时,因为 OpenAI 限制了用户账户的计算能力


为了克服这些限制,让我们来看第二个解决方案,我将在下一节中实施。为了更有说服力,我将使用一个拥有 1000 万条记录的数据集。有了这个数据集,就不可能使用第一种解决方案了。


2. 用数据聊天 "的实际工作原理


3


数据聊天 "应用程序的高级设计概念如下所示:

第 1 步:接收用户提问

第 2 步:连接到数据库(CSV、XLSX、PostgreSQL、MySQL、BigQuery、Databrick、Snowflake 等)以检索元数据(数据表的相关信息以及各数据字段的说明)

第 3 步:这一步不向 LLM 发送整个数据,而只发送元数据+问题

第 4 步:根据元数据,LLM 将创建可执行代码。简单解释一下: LLM 将自然语言翻译成查询语言(SQL)或编程语言(Python),以便处理数据。

第 5+6 步:在数据库中运行步骤 4 中的可执行代码,以获得最终结果

第 7 步:形成最终答案并返回给你。


3. 为演示准备技术栈和数据

PandasAI:用自然语言询问有关数据的问题。

为了实现上述概念,我将向你介绍一个非常有趣的 Python 数据分析库: PandasAI。


PandasAI 使用生成式人工智能模型来理解和解释自然语言查询,并将其翻译成 Python 代码和 SQL 查询。然后,它使用代码与数据交互,并将结果返回给用户。


PandasAI 的特点:

  • 自然语言查询: 用自然语言向数据提问
  • 数据可视化:生成图表,实现数据可视化。
  • 数据清理:通过处理缺失值来清理数据集。
  • 特征生成: 通过特征生成提高数据质量。
  • 数据连接器:连接各种数据源,如 CSV、XLSX、PostgreSQL、MySQL、BigQuery、Databrick、Snowflake 等。


IDBD 数据集:

我将使用 IMDB 的数据集。对于喜欢电影的人来说,IMDB 是一个著名的网站,提供有关电影、电视节目、演员、导演、制片人和其他影视业专业人士的详细信息。我选择了 "title.basics.tsv.gz "数据集。


包含 1000 多万条记录

每条记录的信息包括:节目(电影、电视等)的英文和母语标题。此外,还有上映年份、持续时间......

如果直接在 ChatGPT 上处理这个数据集,输入代币的成本是:


Total tokens: 322.644.846
Cost: 161.322423$


你能想象吗?161 美元只是为了把这些信息放到 ChatGPT 上,而不是处理任何东西。


计算代币数量和估算成本的代码是:


import tiktoken
import pandas as pd
def calculate_cost():  
    encoding = tiktoken.encoding_for_model("gpt-3.5-turbo")  
    cost_per_1M_tokens = 0.5 # 0.5$ / 1M Tokens   
      
    # Load data in df  
    dataset_file = "./dataset/title.basics.tsv"  
    df = pd.read_csv(dataset_file, sep="\t", low_memory=False)  
  
    # For each row, combine all fields into a tring  
    data_as_strings = df.apply(lambda row: ' '.join(row.values.astype(str)), axis=1).tolist()  
  
    # Count the number of tokens for each row  
    token_counts = [len(encoding.encode(text)) for text in data_as_strings]  
  
    # Print the results  
    total_tokens = sum(token_counts)     
    print('Total tokens:', total_tokens)  
    print('Cost:', total_tokens * cost_per_1M_tokens / 1000000)


准备步骤已经完成,让我们开始创建应用程序吧


4. 实现 "带数据聊天 "应用程序


第 1 步:安装并导入所有程序库


pip install pandasai
pip install tiktoken
pip install streamlit
from pandasai.helpers.openai_info import get_openai_callback
import matplotlib
from pandasai.responses.response_parser import ResponseParser
from pandasai.connectors import PandasConnector
import streamlit as st
import pandas as pd
from pandasai import SmartDataframe
from pandasai.llm import OpenAI


第 2 步:将数据载入数据帧


# Load into Dataframe, the size of the dataset is around 960 MB and it took 30s of loading on my laptop
@st.cache_data
def load_data():
    dataset_file = "./dataset/title.basics.tsv"
    df = pd.read_csv(dataset_file, sep="\t", low_memory=False)
    return df


第 3 步: 为帮助 LLM 更容易地理解我们的数据,你可以创建元数据并将其附加到请求中。下面是我们数据的元数据示例。首先,我直接从 IMDB 网站获取了元数据:


4


那么,我们的主要处理代码是


# Init llm
llm = OpenAI()
# Handle response messages according to type: dataframe, plot or text
class MyStResponseParser(ResponseParser):
    def __init__(self, context) -> None:
        super().__init__(context)
    def parse(self, result):
        if result['type'] == "dataframe":
            st.dataframe(result['value'])
        elif result['type'] == 'plot':
            st.image(result["value"])
        else:
            st.write(result['value'])
        return
# Tip: Adding Description for data fields to make GPT understand more easily, using in case you don't want to use GPT's automatic understanding mechanism
field_descriptions = {
    "tconst": "An alphanumeric unique identifier of the title",
    "titleType": " the type/format of the title (e.g. movie, short, tvseries, tvepisode, video, etc)",
    "primaryTitle": "the more popular title / the title used by the filmmakers on promotional materials at the point of release",
    "originalTitle": "original title, in the original language",
    "isAdult":"0: non-adult title; 1: adult title",
    "startYear": "represents the release year of a title. In the case of TV Series, it is the series start year. YYYY format",
    "endYear" : "TV Series end year. \\N means null value",
    "runtimeMinutes": "primary runtime of the title, in minutes. \\N means null value",
    "genres":"includes up to three genres associated with the title"
}
# Create PandasConnector to pass Metadata to ChatGPT
connector = PandasConnector(
    {'original_df': df}, field_descriptions=field_descriptions)
agent = SmartDataframe(connector,
                       config={
                           "llm": llm,
                           "conversational": False,
                           "response_parser": MyStResponseParser,
                       })chat_reponse = agent.chat(prompt)


第 4 步:调用 ChatGPT 并获取回复


# Get the response
chat_reponse = agent.chat(prompt)


5. 展示案例

问题 1:绘制 2010 年至 2020 年的节目发布数量图


答案 1:


5


幕后发生了什么?现在,总成本仅为 0.002 美元左右(很便宜吧),而且你可以轻松控制生成的代码,保存起来以备将来使用。


6


问题 2: 计算标题类型之间的节目数量,以表格形式显示


答案 2:


7


8


问题 3:列出运行时间最长的 5 个节目。仅显示 ID、原标题、运行分钟数和类型字段


答案 3:


9


10

文章来源:https://medium.com/gopenai/lab-4-chat-with-10m-data-records-b2da20c4d9da
欢迎关注ATYUN官方公众号
商务合作及内容投稿请联系邮箱:bd@atyun.com
评论 登录
热门职位
Maluuba
20000~40000/月
Cisco
25000~30000/月 深圳市
PilotAILabs
30000~60000/年 深圳市
写评论取消
回复取消