用Langchain Agents创建您自己的数据分析助手
创建自己的数据分析助手
让我分享一下我对LLM代理的个人观点:它们将彻底改变一切!如果你已经在使用大型语言模型,你可能已经了解它们。如果你对这个概念还不熟悉,准备好感到惊奇吧。
在大型语言模型的世界中,什么是代理?
代理是一种应用程序,它使大型语言模型能够使用工具来实现目标。
到目前为止,我们使用语言模型来完成诸如文本生成、分析、摘要、翻译、情感分析等任务。
在技术领域中最具前景的一个功能是它们能够生成不同编程语言的代码。
换句话说,它们不仅能够通过自然语言理解和生成与人类进行交流,还能够与API、库、操作系统、数据库等进行交互…这一切都归功于它们理解和生成代码的能力。它们可以生成Python、JavaScript、SQL代码,并调用众所周知的API。
这种能力组合,只有大型语言模型才具备,我认为从GPT-3.5开始就至关重要,这对于创建代理是至关重要的。
代理接收到自然语言的用户请求。它解释和分析请求的意图,然后利用它所拥有的知识生成完成第一步所需的内容。它可以是一个SQL查询,发送给代理知道会执行SQL查询的工具。代理分析接收到的响应是否是用户想要的。如果是,它返回答案;如果不是,代理分析下一步应该是什么,并再次进行迭代。
总结一下,代理会不断为它可以控制的工具生成命令,直到获得用户想要的答案为止。它甚至能够解释发生的执行错误并生成纠正后的命令。代理会不断迭代,直到满足用户的问题或达到我们设定的限制。
从我的角度来看,代理是大型语言模型的终极理由。当这些模型具备解释任何语言的能力时,它们才有意义。创建代理是我认为更适合使用最强大的模型的少数用例之一。
现在,LangChain是创建代理的最先进的库,但Hugging Face也加入了这个领域,推出了他们的Transformers代理和工具,甚至ChatGPT插件也可以适用于这个类别。
我们要创建什么样的代理?
我们将创建一个非常强大的代理,使我们能够对提供的任何Excel表格执行数据分析操作。最好的部分是,尽管它很强大,但它可能是最简单的代理之一。因此,作为课程的第一个代理,它是一个很好的选择:强大而简单。
源代码可以在《大型语言模型实用课程》的GitHub存储库中找到。
GitHub – peremartra/Large-Language-Model-Notebooks-Course
通过在GitHub上创建一个帐户,为peremartra/Large-Language-Model-Notebooks-Course做出贡献。
github.com
https://github.com/peremartra/Large-Language-Model-Notebooks-Course/blob/main/LangChain_Agent_create_Data_Scientist_Assistant.ipynb。
作为模型,我们将使用OpenAI API,这使我们可以选择GPT-3.5或GPT-4。重要的是要说,代理中使用的模型应该是最新一代的,能够理解文本、生成文本、生成代码和调用API。换句话说,模型越强大,越好。
开始我们的LangChain代理。
在本节中,我们将介绍笔记本中提供的代码。我建议同时打开笔记本并执行命令。
它已经准备好与Kaggle上可用的数据集一起使用,该数据集可以在https://www.kaggle.com/datasets/goyaladi/climate-insights-dataset找到。您可以从数据集中下载Excel文件并使用它来按照完全相同的步骤进行操作,或者您也可以使用任何可用的Excel文件。
笔记本已经设置好,因此您可以将来自本地机器的Excel文件上传到Colab。如果选择使用自己的文件,请注意查询结果将会有所不同,您可能需要相应调整问题。
安装和加载所需的库。
像往常一样,我们需要安装在Colab环境中不可用的库。在这种情况下,有四个:
- langchain:一个Python库,允许我们将模型与不同的工具链在一起。我们在之前的一些文章中已经见过它的用法。
- openai:它将使我们能够使用拥有ChatGPT的知名AI公司的API。通过这个API,我们可以访问他们的几个模型,包括GPT-3.5和GPT4。
- tabulate:另一个简化数据表打印的Python库,我们的代理可能会使用它。
- xformers:由Facebook最近创建并维护的使用LangChain的库。它对我们的代理的运行是必要的。
!pip install langchain!pip install openai!pip install tabulate!pip install xformers
现在,是时候导入其他必要的库并设置我们的环境了。由于我们将调用OpenAI的API,因此我们需要一个API密钥。如果您没有API密钥,可以轻松从https://platform.openai.com/account/api-keys获取它。
由于这是一个付费的API,它会要求提供信用卡信息。不用担心,这不是一个昂贵的服务。您按使用量付费,如果您不使用它,就没有费用。我进行了多次测试,不仅为了这篇文章,因为我在大量写关于如何使用OpenAI的API,上个月的总费用少于1欧元。
import osos.environ["OPENAI_API_KEY"] = "your-open-ai-api-key"
保持API密钥的保密性非常重要。如果有人获取到它,他们可以使用它,并且您将对产生的费用负责。我设置了一个每月20欧元的限额,以防我犯错误并意外地将其上传到GitHub或在Kaggle上发布。在我这种情况下,我更有可能犯一些错误,因为我在公共平台上分享代码,以便您可以使用它。
现在,我们可以导入创建代理所需的必要库。
让我们导入三个库:
- OpenAI:它允许我们与OpenAI的模型进行交互。
- create_pandas_dataframe_agent:顾名思义,这个库用于创建我们的专用代理,能够处理存储在Pandas DataFrame中的数据。
- Pandas:用于处理表格数据的著名库。
from langchain.llms import OpenAIfrom langchain.agents import create_pandas_dataframe_agentimport Pandas.
加载数据并创建代理。
为了加载数据,我准备了一个函数,允许您从本地磁盘上传Excel文件。关键部分是Excel文件应转换为名为“document”的DataFrame。我使用了在Kaggle上可用的气候见解数据集中的Excel文件。
from google.colab import filesdef load_csv_file(): uploaded_file = files.upload() file_path = next(iter(uploaded_file)) document = pd.read_csv(file_path) return documentif __name__ == "__main__": document = load_csv_file()
创建代理的过程就像进行一次简单的调用一样简单。
litte_ds = create_pandas_dataframe_agent(OpenAI(temperature=0), document, verbose=True)
如您所见,我们将三个参数传递给create_pandas_dataframe_agent函数:
- 模型:我们通过调用从langchain.llms导入的OpenAI函数获得。我们没有指定要使用的模型的名称,而是让它决定返回哪个模型。temperature参数设置为0,表示我们希望模型尽可能确定性。温度值的范围是0到2,值越高,模型的响应越富有想象力和随机性。
- 要使用的文档:在这种情况下,是由Pandas库的read_csv函数创建的DataFrame。
- “Verbose”参数:我们将其设置为True,因为我们想看到Agent在过程中是如何思考和做出决策的。
就是这样!正如我提到的,这是最简单的Agent之一。我们将在以后探索其他类型的Agent。
现在是时候看看它有多强大了。
使用Agent。
让我们看看它如何对数据的不同问题做出反应并进行处理。了解如何使用我们的Agent是一项关键技能。
让我们来看一个使用的数据示例。
在研究数据之后,我们可以开始向我们的Agent提问。为此,我们将使用新创建的agent的run方法。
第一个问题将是非常一般的:我们希望它查看数据并给我们一个大约100个词的简要摘要。
litte_ds.run("对这些数据进行分析,并写一个大约100个词的简要说明。")
让我们分析一下回应:
> 进入新的AgentExecutor链...思考:我需要查看数据并思考它告诉我的内容。操作:python_repl_ast操作输入:df.describe()观察: Temperature CO2 Emissions Sea Level Rise Precipitation \count 10000.000000 10000.000000 10000.000000 10000.000000 mean 14.936034 400.220469 -0.003152 49.881208 std 5.030616 49.696933 0.991349 28.862417 min -3.803589 182.131220 -4.092155 0.010143 25% 11.577991 367.109330 -0.673809 24.497516 50% 14.981136 400.821324 0.002332 49.818967 75% 18.305826 433.307905 0.675723 74.524991 max 33.976956 582.899701 4.116559 99.991900 Humidity Wind Speed count 10000.000000 10000.000000 mean 49.771302 25.082066 std 28.929320 14.466648 min 0.018998 0.001732 25% 24.713250 12.539733 50% 49.678412 24.910787 75% 75.206390 37.670260 max 99.959665 49.997664 思考:我可以看出数据主要围绕平均值,有一些异常值。操作:python_repl_ast操作输入:df.info()观察: <class 'pandas.core.frame.DataFrame'>RangeIndex: 10000 entries, 0 to 9999Data columns (total 9 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 Date 10000 non-null object 1 Location 10000 non-null object 2 Country 10000 non-null object 3 Temperature 10000 non-null float64 4 CO2 Emissions 10000 non-null float64 5 Sea Level Rise 10000 non-null float64 6 Precipitation 10000 non-null float64 7 Humidity 10000 non-null float64 8 Wind Speed 10000 non-null float64dtypes: float64(6), object(3)memory usage: 703.2+ KB思考:我可以看到数据主要是数值型的,还有一些分类数据。最终答案:该数据框包含有关世界各地气候的信息。它包括温度、CO2排放、海平面上升、降水量、湿度和风速等数值数据。它还包括日期、位置和国家等分类数据。数据主要围绕平均值,有一些异常值。> 链结束。该数据框包含有关世界各地气候的信息。它包括温度、CO2排放、海平面上升、降水量、湿度和风速等数值数据。它还包括日期、位置和国家等分类数据。数据主要围绕平均值,有一些异常值。
如果我们研究这个追踪,我们可以观察到三个字段:
- Thought(思考):它展示了它的思考过程,指示它计划做什么和它的即时目标。
- Action(行动):我们看到它执行的动作,通常是调用它可以访问的Python函数。
- Observation(观察):行动返回的数据,它用它来详细说明它的下一个目标。
让我们来看看第一次迭代。它首先陈述了它的目标:
Thought(思考):我需要查看数据并思考它告诉我的内容。
然后,它继续定义了两个行动。
Action(行动):python_repl_astAction 输入:df.describe()
首先,它加载一个Python shell,它将用于执行Python命令。然后,它调用内部创建的DataFrame的describe函数来查看数据的形状。结果显示在Observation(观察)中。
在最后一次迭代中,它得出了结论。
这个数据框包含了世界各地各个地点的气候信息。它包括温度、CO2排放量、海平面上升、降水量、湿度和风速等数值数据。它还包括日期、地点和国家等分类数据。数据大部分集中在均值附近,有一些异常值。
正如我们所看到的,它完全理解了数据并解释了我们可以找到的内容。这是一个我认为正确并真正回答了我们的请求的回答。对我们的代理来说是一个完美的分数。
现在让我们继续给我们的代理在笔记本中的最后一个任务。一个更复杂的任务,我必须说,它表现得相当不错。
litte_ds.run("首先清理数据,没有空值并准备在机器学习模型中使用\然后决定哪种模型更好地预测温度\告诉我决策并使用这种模型来预测未来15年的温度\创建一个包含15个温度预测的柱状图。")
这个任务更复杂。我们要求代理清理数据,选择一个算法,并使用它来对未来15年的温度进行预测。最后,我们要求显示预测温度的图表。
> 进入新的AgentExecutor链...Thought(思考):我首先需要清理数据,然后决定哪种模型更好地预测温度,然后使用模型来预测未来15年的温度。Action(行动):python_repl_astAction 输入:df.dropna()Observation(观察): Date Location Country \0 2000-01-01 00:00:00.000000000 New Williamtown Latvia 1 2000-01-01 20:09:43.258325832 North Rachel South Africa 2 2000-01-02 16:19:26.516651665 West Williamland French Guiana 3 2000-01-03 12:29:09.774977497 South David Vietnam 4 2000-01-04 08:38:53.033303330 New Scottburgh Moldova ... ... ... ... 9995 2022-12-27 15:21:06.966696576 South Elaineberg Bhutan 9996 2022-12-28 11:30:50.225022464 Leblancville Congo 9997 2022-12-29 07:40:33.483348224 West Stephanie Argentina 9998 2022-12-30 03:50:16.741674112 Port Steven Albania 9999 2022-12-31 00:00:00.000000000 West Anthonyburgh Sao Tome and Principe Temperature CO2 Emissions Sea Level Rise Precipitation Humidity \0 10.688986 403.118903 0.717506 13.835237 23.631256 1 13.814430 396.663499 1.205715 40.974084 43.982946 2 27.323718 451.553155 -0.160783 42.697931 96.652600 3 12.309581 422.404983 -0.475931 5.193341 47.467938 4 13.210885 410.472999 1.135757 78.695280 61.789672 ... ... ... ... ... ... 9995 15.020523 391.379537 -1.452243 93.417109 25.293814 9996 16.772451 346.921190 0.543616 49.882947 96.787402 9997 22.370025 466.042136 1.026704 30.659841 15.211825 9998 19.430853 337.899776 -0.895329 18.932275 82.774520 9999 12.661928 381.172746 2.260788 78.339658 99.243923 Wind Speed 0 18.492026 1 34.249300 2 34.124261 3 8.554563 4 8.001164 ... ... 9995 6.531866 9996 42.249014 9997 18.293708 9998 42.424255 9999 41.856539 [10000 rows x 9 columns]Thought(思考):我需要决定哪种模型更好地预测温度Action(行动):python_repl_astAction 输入:from sklearn.linear_model import LinearRegressionObservation(观察):Thought(思考):我需要使用模型来预测未来15年的温度Action(行动):python_repl_astAction 输入:X = df[['CO2 Emissions', 'Sea Level Rise', 'Precipitation', 'Humidity', 'Wind Speed']]y = df['Temperature']model = LinearRegression()model.fit(X, y)# 预测未来15年的温度X_pred = [[403.119, 0.717506, 13.8352, 23.6313, 18.492]]y_pred = model.predict(X_pred)Observation(观察):Thought(思考):我现在知道最终答案最终答案:最好的模型来预测温度是线性回归,柱状图显示了未来15年的预测温度。> 完成链。最好的模型来预测温度是线性回归,柱状图显示了未来15年的预测温度。
正如我们所看到的,它使用各种库来完成我们分配的任务。该Agent选择了线性回归算法,并从SKlearn库中加载它。
为了生成图表,它使用了Matplotlib库。
如果有什么批评的话,那就是生成的图表不易阅读;我们不能清楚地看到温度是否有增加。
从我的角度来看,我认为它在分配的任务中表现得非常好,我会给它评7分。
要提高得分,需要改进图表。尽管如此,我仍能够分析数据并使用机器学习模型对未来15年的温度进行预测。
结论。
正如我在文章开头提到的,基于大型语言模型的代理将彻底改变我们工作的方式。不仅在数据分析领域,我相信许多工作都可以从这些代理的能力中受益。
重要的是要考虑到我们目前处于这项技术的早期阶段,它的能力将不断增加,不仅是模型的能力,更重要的是它们可用的接口数量将增加。在未来的几个月里,我们可能会目睹这些代理突破物理世界的壁垒,并开始通过API控制机器。
完整的关于大型语言模型的课程可以在Github上找到。要保持更新,请考虑关注该存储库或给它点赞。这样,您将在添加新内容时收到通知。
GitHub – peremartra/Large-Language-Model-Notebooks-Course
通过在GitHub上创建一个帐户,为peremartra/Large-Language-Model-Notebooks-Course做出贡献。
github.com
本文是我们探索大型语言模型实际应用的系列文章之一。您可以在以下列表中找到其他文章:
Pere Martra
大型语言模型实践课程
查看列表4个故事
我经常写关于深度学习和人工智能的文章。考虑在VoAGI上关注我以获取新文章的更新。当然,欢迎与我在LinkedIn上建立联系。