首頁 >後端開發 >Python教學 >Python的Langchain的完整指南

Python的Langchain的完整指南

尊渡假赌尊渡假赌尊渡假赌
尊渡假赌尊渡假赌尊渡假赌原創
2025-02-10 08:29:10648瀏覽

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:

<code class="language-bash">pip3 install langchain openai</code>

智能體(Agents):

在LangChain中,智能體是一個能夠理解和生成文本的實體。這些智能體可以配置特定的行為和數據源,並經過訓練以執行各種與語言相關的任務,這使得它們成為各種應用的多功能工具。

創建LangChain智能體:

智能體可以配置為使用“工具”來收集所需的數據並製定良好的響應。請看下面的示例。它使用Serp API(一個互聯網搜索API)來搜索與問題或輸入相關的信息,並使用這些信息來做出響應。它還使用llm-math工具執行數學運算——例如,轉換單位或查找兩個值之間的百分比變化:

<code class="language-python">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?")</code>

如你所見,在完成所有基本的導入和初始化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文件中:

<code class="language-bash">pip3 install langchain openai</code>

此代碼調用create_csv_agent函數並使用netflix_titles.csv數據集。下圖顯示了我們的測試。

A Complete Guide to LangChain in Python

如上所示,其邏輯是在cast列中查找所有“Christian Bale”的出現。

我們還可以像這樣創建一個Pandas DataFrame智能體:

<code class="language-python">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?")</code>

如果我們運行它,我們將看到如下所示的結果。

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聊天模型腳本:

<code class="language-bash">pip3 install langchain openai</code>

如上所示,代碼首先發送一個SystemMessage,並告訴聊天機器人要友好和非正式,之後它發送一個HumanMessage,告訴聊天機器人說服我們Djokovich比Federer更好。

如果你運行這個聊天機器人模型,你將看到如下所示的結果。

A Complete Guide to LangChain in Python

嵌入(Embeddings):

嵌入提供了一種將文本塊中的單詞和數字轉換為向量的方法,然後可以將這些向量與其他單詞或數字關聯起來。這聽起來可能很抽象,所以讓我們來看一個例子:

<code class="language-python">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?")</code>

這將返回一個浮點數列表:[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文件中找到正確的答案:

<code class="language-python">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")</code>

如果我們運行此代碼,我們將看到它輸出“Robert Wadlow was the tallest human ever”。該代碼通過獲取每條信息的嵌入並找到與問題“Who was the tallest human ever?”的嵌入最相關的嵌入來找到正確的答案。嵌入的力量!

塊(Chunks):

LangChain模型不能同時處理大型文本並使用它們來生成響應。這就是塊和文本分割的用武之地。讓我們來看兩種在將文本數據饋送到LangChain之前將其分割成塊的簡單方法。

按字符分割塊:

為了避免塊中的突然中斷,我們可以通過在換行符或雙換行符的每次出現處分割文本,來按段落分割文本:

<code class="language-python">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?")</code>

遞歸分割塊:

如果我們想嚴格地按一定長度的字符分割文本,我們可以使用RecursiveCharacterTextSplitter:

<code class="language-python">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"))</code>

塊大小和重疊:

在查看上面的示例時,你可能想知道塊大小和重疊參數的確切含義,以及它們對性能的影響。這可以用兩點來解釋:

  • 塊大小決定每個塊中字符的數量。塊大小越大,塊中的數據越多,LangChain處理它並生成輸出所需的時間就越長,反之亦然。
  • 塊重疊是在塊之間共享信息的內容,以便它們共享一些上下文。塊重疊越高,我們的塊就越冗餘,塊重疊越低,塊之間共享的上下文就越少。通常,良好的塊重疊是塊大小的10%到20%,儘管理想的塊重疊因不同的文本類型和用例而異。

鏈(Chains):

鏈基本上是多個LLM功能鏈接在一起以執行更複雜的任務,而這些任務無法通過簡單的LLM輸入->輸出方式來完成。讓我們來看一個很酷的例子:

<code class="language-bash">pip3 install langchain openai</code>

此代碼將兩個變量輸入到其提示中,並製定一個有創意的答案(temperature=0.9)。在這個例子中,我們要求它為一部關於數學的恐怖電影想出一個好標題。運行此代碼後的輸出是“The Calculating Curse”,但這並沒有真正顯示鏈的全部功能。

讓我們來看一個更實際的例子:

<code class="language-python">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?")</code>

這段代碼可能看起來令人困惑,所以讓我們逐步講解。

這段代碼讀取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編寫一個簡單的問答代碼,如下所示:

<code class="language-python">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")</code>

上面的代碼產生以下輸出:

<code class="language-python">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?")</code>

結論:

在本指南中,你已經看到了LangChain的不同方面和功能。掌握了這些知識後,你就可以利用LangChain的功能來進行NLP工作,無論你是研究人員、開發人員還是愛好者。

你可以在GitHub上找到包含本文所有圖片和Nas.txt文件的倉庫。

祝你使用Python中的LangChain進行編碼和實驗愉快!

以上是Python的Langchain的完整指南的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn