首页 > 后端开发 > Python教程 > Python的Langchain的完整指南

Python的Langchain的完整指南

尊渡假赌尊渡假赌尊渡假赌
发布: 2025-02-10 08:29:10
原创
625 人浏览过

LangChain:构建、实验和分析语言模型和智能体的强大Python库

A Complete Guide to LangChain in Python

核心要点:

  • LangChain是一个Python库,它简化了语言模型和智能体的创建、实验和分析过程,为自然语言处理提供了广泛的功能。
  • 它允许创建多功能的智能体,这些智能体能够理解和生成文本,并可以配置特定的行为和数据源来执行各种与语言相关的任务。
  • LangChain提供三种类型的模型:大型语言模型(LLM)、聊天模型和文本嵌入模型,每种模型都为语言处理任务提供了独特的功能。
  • 它还提供了一些功能,例如将大型文本分割成易于管理的块,通过链将多个LLM功能链接起来以执行复杂的任务,以及与OpenAI以外的各种LLM和AI服务集成。

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>
登录后复制
登录后复制
登录后复制
登录后复制

A Complete Guide to LangChain in Python

如你所见,它使用了以下逻辑:

  • 使用Serp互联网搜索API搜索“wind turbine energy production worldwide 2022”
  • 分析最佳结果
  • 获取任何相关的数字
  • 使用llm-math工具将906吉瓦转换为焦耳,因为我们要求的是能量,而不是功率

智能体测试示例2:

LangChain智能体不仅限于搜索互联网。我们可以将几乎任何数据源(包括我们自己的数据源)连接到LangChain智能体,并向其提出有关数据的问题。让我们尝试创建一个在CSV数据集上训练的智能体。

从Kaggle上的SHIVAM BANSAL处下载此Netflix电影和电视节目数据集,并将其移动到你的目录中。现在将此代码添加到一个新的Python文件中:

pip3 install langchain openai
登录后复制
登录后复制
登录后复制
登录后复制

此代码调用create_csv_agent函数并使用netflix_titles.csv数据集。下图显示了我们的测试。

A Complete Guide to LangChain in Python

如上所示,其逻辑是在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?")
登录后复制
登录后复制
登录后复制
登录后复制

如果我们运行它,我们将看到如下所示的结果。

A Complete Guide to LangChain in Python A Complete Guide to LangChain in Python

这些只是一些例子。我们可以将几乎任何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更好。

如果你运行这个聊天机器人模型,你将看到如下所示的结果。

A Complete Guide to LangChain in Python

嵌入(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"))
登录后复制

块大小和重叠:

在查看上面的示例时,你可能想知道块大小和重叠参数的确切含义,以及它们对性能的影响。这可以用两点来解释:

  • 块大小决定每个块中字符的数量。块大小越大,块中的数据越多,LangChain处理它并生成输出所需的时间就越长,反之亦然。
  • 块重叠是在块之间共享信息的内容,以便它们共享一些上下文。块重叠越高,我们的块就越冗余,块重叠越低,块之间共享的上下文就越少。通常,良好的块重叠是块大小的10%到20%,尽管理想的块重叠因不同的文本类型和用例而异。

链(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中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板