LangChain:构建、实验和分析语言模型和智能体的强大Python库
核心要点:
LangChain是一个功能强大的Python库,使开发人员和研究人员能够创建、实验和分析语言模型和智能体。它为自然语言处理(NLP)爱好者提供了一套丰富的功能,从构建自定义模型到高效地操作文本数据。在本综合指南中,我们将深入探讨LangChain的基本组件,并演示如何在Python中利用其强大功能。
环境设置:
要学习本文,请创建一个新文件夹,并使用pip安装LangChain和OpenAI:
pip3 install langchain openai
智能体(Agents):
在LangChain中,智能体是一个能够理解和生成文本的实体。这些智能体可以配置特定的行为和数据源,并经过训练以执行各种与语言相关的任务,这使得它们成为各种应用的多功能工具。
创建LangChain智能体:
智能体可以配置为使用“工具”来收集所需的数据并制定良好的响应。请看下面的示例。它使用Serp API(一个互联网搜索API)来搜索与问题或输入相关的信息,并使用这些信息来做出响应。它还使用llm-math工具执行数学运算——例如,转换单位或查找两个值之间的百分比变化:
from langchain.agents import load_tools from langchain.agents import initialize_agent from langchain.agents import AgentType from langchain.llms import OpenAI import os os.environ["OPENAI_API_KEY"] = "YOUR_OPENAI_API_KEY" os.environ["SERPAPI_API_KEY"] = "YOUR_SERP_API_KEY" # 获取你的Serp API密钥:https://serpapi.com/ OpenAI.api_key = "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" llm = OpenAI(model="gpt-3.5-turbo", temperature=0) tools = load_tools(["serpapi", "llm-math"], llm=llm) agent = initialize_agent(tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True) agent.run("How much energy did wind turbines produce worldwide in 2022?")
如你所见,在完成所有基本的导入和初始化LLM (llm = OpenAI(model="gpt-3.5-turbo", temperature=0))之后,代码使用tools = load_tools(["serpapi", "llm-math"], llm=llm)加载智能体工作所需的工具。然后,它使用initialize_agent函数创建智能体,为其提供指定的工具,并为其提供ZERO_SHOT_REACT_DESCRIPTION描述,这意味着它将不记得以前的问题。
智能体测试示例1:
让我们用以下输入来测试这个智能体:
<code>"How much energy did wind turbines produce worldwide in 2022?"</code>
如你所见,它使用了以下逻辑:
智能体测试示例2:
LangChain智能体不仅限于搜索互联网。我们可以将几乎任何数据源(包括我们自己的数据源)连接到LangChain智能体,并向其提出有关数据的问题。让我们尝试创建一个在CSV数据集上训练的智能体。
从Kaggle上的SHIVAM BANSAL处下载此Netflix电影和电视节目数据集,并将其移动到你的目录中。现在将此代码添加到一个新的Python文件中:
pip3 install langchain openai
此代码调用create_csv_agent函数并使用netflix_titles.csv数据集。下图显示了我们的测试。
如上所示,其逻辑是在cast列中查找所有“Christian Bale”的出现。
我们还可以像这样创建一个Pandas DataFrame智能体:
from langchain.agents import load_tools from langchain.agents import initialize_agent from langchain.agents import AgentType from langchain.llms import OpenAI import os os.environ["OPENAI_API_KEY"] = "YOUR_OPENAI_API_KEY" os.environ["SERPAPI_API_KEY"] = "YOUR_SERP_API_KEY" # 获取你的Serp API密钥:https://serpapi.com/ OpenAI.api_key = "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" llm = OpenAI(model="gpt-3.5-turbo", temperature=0) tools = load_tools(["serpapi", "llm-math"], llm=llm) agent = initialize_agent(tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True) agent.run("How much energy did wind turbines produce worldwide in 2022?")
如果我们运行它,我们将看到如下所示的结果。
这些只是一些例子。我们可以将几乎任何API或数据集与LangChain一起使用。
模型(Models):
LangChain中有三种类型的模型:大型语言模型(LLM)、聊天模型和文本嵌入模型。让我们通过一些示例来探索每种类型的模型。
大型语言模型(Language Model):
LangChain提供了一种在Python中使用大型语言模型的方法,以根据文本输入生成文本输出。它不像聊天模型那样复杂,最适合简单的输入-输出语言任务。以下是用OpenAI的示例:
<code>"How much energy did wind turbines produce worldwide in 2022?"</code>
如上所示,它使用gpt-3.5-turbo模型为提供的输入(“Come up with a rap name for Matt Nikonorov”)生成输出。在这个例子中,我将温度设置为0.9,以使LLM更具创造性。它想出了“MC MegaMatt”。我给它打9/10分。
聊天模型(Chat Model):
让LLM模型想出说唱名字很有趣,但如果我们想要更复杂的答案和对话,我们需要使用聊天模型来提升我们的水平。从技术上讲,聊天模型与大型语言模型有何不同?用LangChain文档中的话说:
聊天模型是大型语言模型的一种变体。虽然聊天模型在后台使用大型语言模型,但它们使用的接口略有不同。它们不使用“文本输入,文本输出”的API,而是使用“聊天消息”作为输入和输出的接口。
这是一个简单的Python聊天模型脚本:
pip3 install langchain openai
如上所示,代码首先发送一个SystemMessage,并告诉聊天机器人要友好和非正式,之后它发送一个HumanMessage,告诉聊天机器人说服我们Djokovich比Federer更好。
如果你运行这个聊天机器人模型,你将看到如下所示的结果。
嵌入(Embeddings):
嵌入提供了一种将文本块中的单词和数字转换为向量的方法,然后可以将这些向量与其他单词或数字关联起来。这听起来可能很抽象,所以让我们来看一个例子:
from langchain.agents import load_tools from langchain.agents import initialize_agent from langchain.agents import AgentType from langchain.llms import OpenAI import os os.environ["OPENAI_API_KEY"] = "YOUR_OPENAI_API_KEY" os.environ["SERPAPI_API_KEY"] = "YOUR_SERP_API_KEY" # 获取你的Serp API密钥:https://serpapi.com/ OpenAI.api_key = "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" llm = OpenAI(model="gpt-3.5-turbo", temperature=0) tools = load_tools(["serpapi", "llm-math"], llm=llm) agent = initialize_agent(tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True) agent.run("How much energy did wind turbines produce worldwide in 2022?")
这将返回一个浮点数列表:[0.022762885317206383, -0.01276398915797472, 0.004815981723368168, -0.009435392916202545, 0.010824492201209068]。这就是嵌入的样子。
嵌入模型的用例:
如果我们想训练一个聊天机器人或LLM来回答与我们的数据或特定文本样本相关的问题,我们需要使用嵌入。让我们创建一个简单的CSV文件(embs.csv),其中包含一个“text”列,其中包含三条信息:
<code>"How much energy did wind turbines produce worldwide in 2022?"</code>
现在,这是一个脚本,它将使用嵌入来获取问题“Who was the tallest human ever?”并在CSV文件中找到正确的答案:
from langchain.llms import OpenAI from langchain.chat_models import ChatOpenAI from langchain.agents.agent_types import AgentType from langchain.agents import create_csv_agent import os os.environ["OPENAI_API_KEY"] = "YOUR_OPENAI_API_KEY" agent = create_csv_agent( OpenAI(temperature=0), "netflix_titles.csv", verbose=True, agent_type=AgentType.ZERO_SHOT_REACT_DESCRIPTION, ) agent.run("In how many movies was Christian Bale casted")
如果我们运行此代码,我们将看到它输出“Robert Wadlow was the tallest human ever”。该代码通过获取每条信息的嵌入并找到与问题“Who was the tallest human ever?”的嵌入最相关的嵌入来找到正确的答案。嵌入的力量!
块(Chunks):
LangChain模型不能同时处理大型文本并使用它们来生成响应。这就是块和文本分割的用武之地。让我们来看两种在将文本数据馈送到LangChain之前将其分割成块的简单方法。
按字符分割块:
为了避免块中的突然中断,我们可以通过在换行符或双换行符的每次出现处分割文本,来按段落分割文本:
from langchain.agents import create_pandas_dataframe_agent from langchain.chat_models import ChatOpenAI from langchain.agents.agent_types import AgentType from langchain.llms import OpenAI import pandas as pd import os os.environ["OPENAI_API_KEY"] = "YOUR_OPENAI_KEY" df = pd.read_csv("netflix_titles.csv") agent = create_pandas_dataframe_agent(OpenAI(temperature=0), df, verbose=True) agent.run("In what year were the most comedy movies released?")
递归分割块:
如果我们想严格地按一定长度的字符分割文本,我们可以使用RecursiveCharacterTextSplitter:
from langchain.llms import OpenAI import os os.environ["OPENAI_API_KEY"] = "YOUR_OPENAI_API_KEY" llm = OpenAI(model="gpt-3.5-turbo", temperature=0.9) print(llm("Come up with a rap name for Matt Nikonorov"))
块大小和重叠:
在查看上面的示例时,你可能想知道块大小和重叠参数的确切含义,以及它们对性能的影响。这可以用两点来解释:
链(Chains):
链基本上是多个LLM功能链接在一起以执行更复杂的任务,而这些任务无法通过简单的LLM输入->输出方式来完成。让我们来看一个很酷的例子:
pip3 install langchain openai
此代码将两个变量输入到其提示中,并制定一个有创意的答案(temperature=0.9)。在这个例子中,我们要求它为一部关于数学的恐怖电影想出一个好标题。运行此代码后的输出是“The Calculating Curse”,但这并没有真正显示链的全部功能。
让我们来看一个更实际的例子:
from langchain.agents import load_tools from langchain.agents import initialize_agent from langchain.agents import AgentType from langchain.llms import OpenAI import os os.environ["OPENAI_API_KEY"] = "YOUR_OPENAI_API_KEY" os.environ["SERPAPI_API_KEY"] = "YOUR_SERP_API_KEY" # 获取你的Serp API密钥:https://serpapi.com/ OpenAI.api_key = "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" llm = OpenAI(model="gpt-3.5-turbo", temperature=0) tools = load_tools(["serpapi", "llm-math"], llm=llm) agent = initialize_agent(tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True) agent.run("How much energy did wind turbines produce worldwide in 2022?")
这段代码可能看起来令人困惑,所以让我们逐步讲解。
这段代码读取Nas(嘻哈艺术家)的简短传记,并从文本中提取以下值,并将它们格式化为JSON对象:
在提示中,我们还指定了“Make sure to answer in the correct format”,以便我们始终以JSON格式获得输出。这是此代码的输出:
<code>"How much energy did wind turbines produce worldwide in 2022?"</code>
通过向create_structured_output_chain函数提供JSON模式,我们使链将其输出放入JSON格式。
超越OpenAI:
尽管我一直使用OpenAI模型作为LangChain不同功能的示例,但它并不局限于OpenAI模型。我们可以将LangChain与许多其他LLM和AI服务一起使用。(这是LangChain可集成LLM的完整列表。)
例如,我们可以将Cohere与LangChain一起使用。这是LangChain Cohere集成的文档,但为了提供一个实际示例,在使用pip3 install cohere安装Cohere之后,我们可以使用LangChain和Cohere编写一个简单的问答代码,如下所示:
from langchain.llms import OpenAI from langchain.chat_models import ChatOpenAI from langchain.agents.agent_types import AgentType from langchain.agents import create_csv_agent import os os.environ["OPENAI_API_KEY"] = "YOUR_OPENAI_API_KEY" agent = create_csv_agent( OpenAI(temperature=0), "netflix_titles.csv", verbose=True, agent_type=AgentType.ZERO_SHOT_REACT_DESCRIPTION, ) agent.run("In how many movies was Christian Bale casted")
上面的代码产生以下输出:
from langchain.agents import create_pandas_dataframe_agent from langchain.chat_models import ChatOpenAI from langchain.agents.agent_types import AgentType from langchain.llms import OpenAI import pandas as pd import os os.environ["OPENAI_API_KEY"] = "YOUR_OPENAI_KEY" df = pd.read_csv("netflix_titles.csv") agent = create_pandas_dataframe_agent(OpenAI(temperature=0), df, verbose=True) agent.run("In what year were the most comedy movies released?")
结论:
在本指南中,你已经看到了LangChain的不同方面和功能。掌握了这些知识后,你就可以利用LangChain的功能来进行NLP工作,无论你是研究人员、开发人员还是爱好者。
你可以在GitHub上找到包含本文所有图片和Nas.txt文件的仓库。
祝你使用Python中的LangChain进行编码和实验愉快!
以上是Python的Langchain的完整指南的详细内容。更多信息请关注PHP中文网其他相关文章!