首頁 >科技週邊 >人工智慧 >構建Langchain代理以在Python中自動化任務

構建Langchain代理以在Python中自動化任務

William Shakespeare
William Shakespeare原創
2025-03-04 10:35:10813瀏覽

Langchain的90k GitHub星星是它所需的所有信譽 - 現在,它是構建基於LLM的應用程序的最熱門框架。它的全面工具和組件集使您可以使用幾乎所有LLM構建端到端的AI解決方案。

>也許是蘭班鏈能力的核心是Langchain代理商。它們是可以執行任務,決策並與其他工具和API互動的自主或半自治工具。它們代表了與LLMS自動化複雜工作流程的重大飛躍。

>

在本文中,您將學習如何在當今的聊天應用程序(例如ChatGpt)中構建自己無法嚴格執行任務的蘭格鏈代理。

>在進入任何內容之前,讓我們為教程設置環境。 >

首先,創建一個新的conda環境:

>安裝Langchain的軟件包和其他一些必要的庫:>

>將新創建的conda環境添加到jupyter中,作為內核:

$ conda create -n langchain python=3.9 -y
$ conda activate langchain
創建一個.env文件以存儲諸如API鍵的秘密:>

$ pip install langchain langchain_openai langchain_community langgraph ipykernel python-dotenv
>從.env文件中檢索OpenAI API鍵:

測試一切都可以通過查詢OpenAI的GPT-3.5(默認語言模型)來正確工作:
$ ipython kernel install --user --name=langchain

$ touch .env
$ vim .env  # Paste your OPENAI key
現在,我們已經準備好開始了。
OPENAI_API_KEY='YOUR_KEY_HERE'
>

什麼是Langchain代理?

>讓我們花一些時間思考代理框架。具體而言,我們將考慮它與傳統的鏈條範式的不同以及代理的組成部分是什麼。了解為什麼我們需要選擇一種構建應用程序的新方法將為我們編寫代碼做好準備。
import os
from dotenv import load_dotenv
load_dotenv()
api_key = os.getenv('OPENAI_API_KEY')
>鏈與代理

定義特徵的特徵是他們選擇最佳的行動順序解決問題的能力。
from langchain_openai import OpenAI
llm = OpenAI(openai_api_key=api_key)
question = "Is Messi the best footballer of all time?"
output = llm.invoke(question)
print(output[:75])
例如,假設我們有以下內容:
There is no definitive answer to this question, as it is subjective and de
>

天氣API

>用於服裝建議的ML型號

用於自行車路線的strava api

>用戶首選項數據庫

>圖像識別模型

語言模型(文本生成)

  • 傳統的解決問題將涉及使用列表中的一系列選擇工具:>
  • 鏈1:基於天氣的服裝推薦
  • >致電天氣API
  • >輸入天氣數據到ML服裝模型
  • 生成服裝建議
  • 向用戶提供結果

鏈2:基於天氣的自行車路線Suggester

>致電天氣API
  1. 致電流行路線
  2. 致電Strava API 根據天氣條件的過濾路線
  3. >
  4. 向用戶提供合適的路線
  5. 鏈3:服裝照片分析儀
    1. 接收用戶的服裝照片
    2. 使用圖像識別模型識別服裝項目
    3. 與用戶偏好數據庫進行比較
    4. >使用文本生成模型生成反饋
    5. 向用戶提供分析
    6. >每個鏈都使用預定的步驟序列和可用工具的子集解決了特定問題。他們無法適應其定義的範圍。他們還需要三個獨立的開發分支,這在時間和資源方面效率低下。
    現在,想像一個可以訪問所有這些工具的代理系統。它可以:

    >了解用戶的查詢或問題(通過語言模型通過自然語言)

    評估哪些工具與問題(推理)
      相關
    1. >使用最合適的工具動態創建工作流程
    2. 執行工作流程,如果需要進行實時調整(ACTING)
    3. >
    4. 評估結果並從過去的互動中學習
    5. 例如,如果用戶問:“我今天騎自行車應該穿什麼?”代理商可能會檢查天氣API,通過Strava分析合適的騎自行車路線,推薦適當的衣服,考慮用戶過去的偏好,並產生個性化的響應。
    6. 代理可以:
    >使用相同的工具來處理多種問題

    >為每種唯一情況創建自定義工作流

    >根據特定上下文和用戶需求
    調整其方法
  • 從互動中學習以提高未來的績效
  • 朗鏈將語言模型轉變的能力 - 本身只生產文本 - 將可以使用可使用的資源採取適當行動的資源的推理引擎是其主要應用之一。簡而言之,Langchain可以開發與外界相互作用的強大自主代理的發展。
  • 鍵組件
  • > Langchain代理由多個組件組成,例如聊天模型,提示模板,外部工具和其他相關構造。要構建成功的代理,我們需要查看每個組件並了解它們的用途。 >
  • 語言和聊天模型

>創建Langchain代理有很多活動部件。第一個也是最明顯的是語言模型。

>

語言模型,例如OpenAI的GPT-3.5 Turbo,拿起並生成字符串。它們通常年齡較大,最好回答單個用戶查詢。

>

>新型且功能更強大的模型通常是聊天模型,它可以將一系列消息作為輸入並返回聊天消息作為輸出(而不是使用純文本):>
$ conda create -n langchain python=3.9 -y
$ conda activate langchain

提出不同的方式,聊天模型允許我們以自然語言進行對話。在上面的示例中,我們正在使用系統消息,然後是用戶查詢的GPT-4O-MINI初始化。請注意使用SystemMessage和HumanMessage類。

輸出是一個消息對象,這是聊天模型的預期行為:>

$ pip install langchain langchain_openai langchain_community langgraph ipykernel python-dotenv
$ ipython kernel install --user --name=langchain
$ touch .env
$ vim .env  # Paste your OPENAI key
OPENAI_API_KEY='YOUR_KEY_HERE'
此外,他們還返回其他有用的元數據,可通過點通知:

import os
from dotenv import load_dotenv
load_dotenv()
api_key = os.getenv('OPENAI_API_KEY')
from langchain_openai import OpenAI
llm = OpenAI(openai_api_key=api_key)
question = "Is Messi the best footballer of all time?"
output = llm.invoke(question)
print(output[:75])
大多數代理商使用聊天模型,因為它們具有更新的知識庫和對話能力。但是,對於沒有內存要求的簡單代理,諸如GPT-3.5之類的語言模型就足夠了。

>提示模板

>查詢語言或聊天模型的最有效方法是使用提示模板。它們允許您始終如一地插入變量,使您與模型的互動更加靈活和可重複使用。

>。

>在Langchain中,有許多類型的提示模板,其中最基本的模板是提示模板類。它可以與語言(純文本)模型一起使用:

There is no definitive answer to this question, as it is subjective and de
>類要求您使用佔位符的變量創建一個帶有佔位符的字符串,使用括號符號。然後,您需要將此模板字符串與變量的名稱一起傳遞到提示程序類別,從而構建您的提示。
from langchain_openai import OpenAI
llm = OpenAI(api_key=api_key, model="gpt-3.5-turbo-instruct")
question = "What is special about the number 73?"
output = llm.invoke(question)
print(output[:100])
> 帶有變量的值的

>呼叫.invoke()將顯示您的提示將如何傳遞給模型。

將此提示模板傳遞給語言模型需要我們使用管道操作員鏈接它:>

>管道操作員(|)是Langchain Expression語言(LCEL)的一部分,旨在鏈多個Langchain組件和工具。
1. Prime Number: 73 is a prime number, which means it is only divisible by 1 and itself. This make
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage, AIMessageChunk, SystemMessage
# Initialize the model
chat_model = ChatOpenAI(api_key=api_key, model='gpt-4o-mini')
# Write the messages
messages = [SystemMessage(content='You are a grumpy pirate.'),
           HumanMessage(content="What's up?")]
output = chat_model.invoke(messages)

>在Langchain對像上使用管道操作員時,您可以創建一個RunnableSequence類的實例。可運行的序列代表支持.invoke()方法的對象鏈,例如提示模板和語言/聊天模型。
type(output)
>現在,讓我們看一下聊天模型的另一個提示模板類:
langchain_core.messages.ai.AIMessage
>

>我們提到聊天模型需要一系列消息作為輸入。初始輸入通常是一個系統提示,告訴聊天模型如何表現。因此,使用ChatPromptTemplate類,我們可以輕鬆地創建具有不同個性的聊天模型:

print(output.content)
課程需要基於角色的消息列表作為輸入。列表的每個成員必須是(角色,消息)元組,並在需要的情況下定義的可變佔位符。

>準備好後,我們可以使用相同的管道操作員創建具有不同行為的聊天模型:

$ conda create -n langchain python=3.9 -y
$ conda activate langchain
$ pip install langchain langchain_openai langchain_community langgraph ipykernel python-dotenv

>工具

>在上一節中,我們提到代理可以選擇可以使用的工具組合來解決特定問題,而LLMS作為引擎蓋下的推理引擎。 Langchain提供了與數十個流行的API和服務的集成,使代理商與世界其他地區互動。其中大多數都在langchain_community軟件包下可用,而有些則在langchain_core內部。

> 例如,您可以使用Arxiv工具在各種主題上檢索紙張摘要:>

$ ipython kernel install --user --name=langchain
有一種替代方法可以加載工具,而不是通過其類名導入工具:>
$ touch .env
$ vim .env  # Paste your OPENAI key
上面的
OPENAI_API_KEY='YOUR_KEY_HERE'
,我們使用load_tools()函數同時加載了ARXIV和DALL-E Image Generator工具。加載此功能的工具具有相同的用法語法:

import os
from dotenv import load_dotenv
load_dotenv()
api_key = os.getenv('OPENAI_API_KEY')

from langchain_openai import OpenAI
llm = OpenAI(openai_api_key=api_key)
question = "Is Messi the best footballer of all time?"
output = llm.invoke(question)
print(output[:75])
There is no definitive answer to this question, as it is subjective and de
from langchain_openai import OpenAI
llm = OpenAI(api_key=api_key, model="gpt-3.5-turbo-instruct")
question = "What is special about the number 73?"
output = llm.invoke(question)
print(output[:100])
load_tools函數要求您知道工具類的字符串名稱,例如Arxivqueryrun與“ Arxiv”的示例。您可以通過運行GET_ALL_TOOL_NAMES函數快速檢查任何工具的字符串名稱:
1. Prime Number: 73 is a prime number, which means it is only divisible by 1 and itself. This make
>

構建Langchain代理以在Python中自動化任務

請注意,load_tools()只是速記函數。建築代理時,建議使用其類構造函數加載工具,這使您可以根據其特定行為進行配置。

>逐步的工作流程如何構建Langchain Agents

from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage, AIMessageChunk, SystemMessage
# Initialize the model
chat_model = ChatOpenAI(api_key=api_key, model='gpt-4o-mini')
# Write the messages
messages = [SystemMessage(content='You are a grumpy pirate.'),
           HumanMessage(content="What's up?")]
output = chat_model.invoke(messages)
>最後,在本節中,我們將使用我們在前面的部分中獲得的知識逐步創建Langchain Agent。
type(output)
>在接下來的示例中,我們將建立一個能夠通過三種媒介解釋任何主題的代理:文本,圖像或視頻。更具體地說,根據問題的提出,代理商將決定是否以哪種格式解釋該主題。

>讓我們開始。請記住要查看如何設置本文開頭涵蓋的環境。 

1。定義工具

配置我們的環境後的第一步是定義我們將提供給代理商的工具。讓我們導入它們:

我們正在導入五個類:

>

> wikipediaapiwrapper:配置如何訪問wikipedia api

> wikipediaqueryrun:要生成wikipedia頁面摘要
langchain_core.messages.ai.AIMessage

> YouTubesearchTool:要在主題上搜索YouTube視頻

>
    dalleapiwrapper:要配置如何訪問Openai的Dalle端點
  • > openAidalleimageGenerationTool:要使用提示
  • 生成圖像
  • 用戶查詢我們的代理時,它將決定是使用文本格式的Wikipedia文章來解釋該主題,還是使用DALL-E創建圖像以進行視覺理解,還是通過建議YouTube視頻進行更深入的理解。

    讓我們初始化它們,從Wikipedia工具開始:>

    $ conda create -n langchain python=3.9 -y
    $ conda activate langchain
    $ pip install langchain langchain_openai langchain_community langgraph ipykernel python-dotenv
    > dalle映像生成器:

    $ ipython kernel install --user --name=langchain

    構建Langchain代理以在Python中自動化任務

    > YouTube搜索工具:

    $ touch .env
    $ vim .env  # Paste your OPENAI key
    OPENAI_API_KEY='YOUR_KEY_HERE'
    >特別關心工具描述。代理將根據您提供的描述來決定使用哪種工具。 

    現在,我們將這些工具放入列表中:

    import os
    from dotenv import load_dotenv
    load_dotenv()
    api_key = os.getenv('OPENAI_API_KEY')
    >我們已經可以將此工具綁定到聊天模型,而無需創建代理:>

    讓我們嘗試用簡單的消息調用模型:
    from langchain_openai import OpenAI
    llm = OpenAI(openai_api_key=api_key)
    question = "Is Messi the best footballer of all time?"
    output = llm.invoke(question)
    print(output[:75])

    There is no definitive answer to this question, as it is subjective and de
    >輸出表明在生成答案時未使用任何界限工具。現在,讓我們提出一個特定的問題,該問題迫使模型超越其培訓數據:
    from langchain_openai import OpenAI
    llm = OpenAI(api_key=api_key, model="gpt-3.5-turbo-instruct")
    question = "What is special about the number 73?"
    output = llm.invoke(question)
    print(output[:100])

    >我們可以看到沒有文本輸出,但是提到了Openai的Dalle。該工具尚未調用;該模型只是建議我們使用它。要實際稱呼它 - 要採取行動,我們需要創建一個代理。 >
    1. Prime Number: 73 is a prime number, which means it is only divisible by 1 and itself. This make
    2。創建一個簡單的代理
    from langchain_openai import ChatOpenAI
    from langchain_core.messages import HumanMessage, AIMessageChunk, SystemMessage
    # Initialize the model
    chat_model = ChatOpenAI(api_key=api_key, model='gpt-4o-mini')
    # Write the messages
    messages = [SystemMessage(content='You are a grumpy pirate.'),
               HumanMessage(content="What's up?")]
    output = chat_model.invoke(messages)

    定義模型和工具後,我們創建代理。 Langchain提供了從其langgraph軟件包中的高級create_react_agent()函數接口,以快速創建React(原因和ACT)代理:

    >在使用聊天模型和工具列表初始化代理時,我們正在傳遞系統提示,以告訴模型如何表現。現在已經準備好接受查詢:

    type(output)
    我們已經收到了可能的響應,這是一個沒有工具調用的簡單文本答案。現在,讓我們提出更多要點:

    >

    langchain_core.messages.ai.AIMessage
    print(output.content)
    這次,有四個消息。讓我們看看消息類名稱及其內容:

    >

    Arrr, not much but the sound of waves and the creakin' of me ship. What do ye want? Make it quick, I've got treasure to hunt and rum to drink!
    output.dict()
    >我們走了!第三個消息來自工具調用,這是光合作用的Wikipedia頁面的摘要。最後一條消息來自聊天模型,該模型在構造答案時使用工具調用的內容。

    >讓我們快速創建一個函數,以模塊化我們採取的最後一步:>

    {'content': "Arrr, not much but the sound of waves and the creakin' of me ship. What do ye want? Make it quick, I've got treasure to hunt and rum to drink!",
    'additional_kwargs': {},
    'response_metadata': {'token_usage': {'completion_tokens': 38,
      'prompt_tokens': 21,
      'total_tokens': 59},
     'model_name': 'gpt-4o-mini-2024-07-18',
     'system_fingerprint': 'fp_48196bc67a',
     'finish_reason': 'stop',
     'logprobs': None},
    'type': 'ai',
    'name': None,
    'id': 'run-fde829bf-8f5f-4926-a1ed-ab53609ce03a-0',
    'example': False,
    'tool_calls': [],
    'invalid_tool_calls': [],
    'usage_metadata': {'input_tokens': 21,
     'output_tokens': 38,
     'total_tokens': 59}}
    3。完善系統提示
    from langchain_core.prompts import PromptTemplate
    query_template = "Tell me about {book_name} by {author}."
    prompt = PromptTemplate(input_variables=["book_name", "author"], template=query_template)
    prompt.invoke({"book_name": "Song of Ice and Fire", "author": "GRRM"})

    現在,讓我們使用有關代理如何行為的詳細說明更新系統提示

    >讓我們通過新系統提示重新創建我們的代理:

    StringPromptValue(text='Tell me about Song of Ice and Fire by GRRM.')

    >很棒,基於我們的消息(這是非常有啟發性的:),代理商選擇了正確的工具。這是生成的圖像:

    from langchain_openai import OpenAI
    llm = OpenAI(api_key=api_key)
    # Create a chain
    chain = prompt | llm
    # Invoke the chain
    output = chain.invoke({"book_name": "Deathly Hallows", "author": "J.K. Rowling"})
    print(output[:100])

    4。將內存添加到代理
    Deathly Hallows is the seventh and final book in the popular Harry Potter series, written by J.K. R
    >
    type(chain)
    >現在,我們的代理人是無狀態的,這意味著它不記得以前的交互:>
    $ conda create -n langchain python=3.9 -y
    $ conda activate langchain
    $ pip install langchain langchain_openai langchain_community langgraph ipykernel python-dotenv

    >將聊天消息歷史記錄添加到代理的最簡單方法是使用langgraph的sqlitesaver類:

    $ ipython kernel install --user --name=langchain

    >我們使用SQLITESAVER類的.from_conn_string()方法初始化存儲器,該方法創建了一個數據庫文件。然後,我們將存儲器傳遞到Create_react_agent()函數的Checkpointer參數。

    >

    現在,我們需要創建一個配置字典:>

    $ touch .env
    $ vim .env  # Paste your OPENAI key
    詞典定義了一個線程ID,以區分一個對話和另一種對話,並將其傳遞給代理的.invoke()方法。因此,讓我們更新我們的execute()函數以包含此行為:

    >

    OPENAI_API_KEY='YOUR_KEY_HERE'
    import os
    from dotenv import load_dotenv
    load_dotenv()
    api_key = os.getenv('OPENAI_API_KEY')
    現在,讓我們向代理商詢問以前的查詢:

    >

    from langchain_openai import OpenAI
    llm = OpenAI(openai_api_key=api_key)
    question = "Is Messi the best footballer of all time?"
    output = llm.invoke(question)
    print(output[:75])
    There is no definitive answer to this question, as it is subjective and de
    >正如預期的那樣,代理正在返回以前的消息!現在,我們只需要像chatgpt這樣的聊天UI,我們已經獲得了自定義的聊天機器人。

    未來的趨勢和發展

    在整篇文章中,我們瞥見了Langchain在代理方面的去向。直到最近,Langchain主要使用了AgensExecutor類,但它正在慢慢地被Langgraph Agents取代。

    純蘭鏈代理可以開始使用,但是它們需要更多的代碼來構建相同的代理,而不是在langgraph中。另外,在某個點之後,AgensExecutor框架將無法提供Langgraph來構建複雜多工具代理的靈活性。

    這就是為什麼現在是騎波浪並直接從langgraph開始的好時機。

    >

    >我們強烈建議也開始使用Langsmith,這已成為Langchain生態系統的核心部分,用於建立生產級LLM應用程序。以下是其主要好處:

    調試:Langsmith提供了代理執行的詳細痕跡,使識別和解決問題變得更容易。

    >
      性能優化:使用Langsmith,您可以分析令牌用法,延遲和其他性能指標,以優化代理商的效率。 >
    • 測試和評估:Langsmith促進了測試數據集的創建和管理,使您能夠在各種方案中嚴格評估代理商的性能。
    • >
    • 監視:在生產環境中,Langsmith提供了實時監視功能,使您可以快速跟踪代理商的性能並檢測異常。
    • >
    • 這是您可以從Langsmith開始的方式:
    • >在此處註冊一個免費帳戶。

    設置環境變量。

    1. >導出langchain_tracing_v2 =“ true”
    2. >導出langchain_api_key =“ ...”
    你很好!當您開始查詢語言/聊天模型時,Langsmith開始記錄有關每次運行的各種指標:

    結論

    在本文中,我們探討了是什麼使Langchain代理不同於鏈條以及用於構建它們的重要構建塊。我們首先介紹了什麼是代理商,以及它們與在決策方面的靈活性和能力方面的傳統鏈結構有何不同。 然後,我們查看了您需要了解的關鍵組件以構建代理:聊天模型,工具和提示模板。最後,我們瀏覽了兩個示例,演示瞭如何構建簡單和高級的代理。自然語言處理正在不斷發展,蘭班司代理在這種進步的最前沿,為一個更聰明,更多功能的AI家族鋪平了道路。

    以下是一些相關資源來增加您的蘭鏈:

    >使用Langchain課程開發LLM應用程序

    > langchain
      提示工程的簡介
    • 如何使用langchain教程構建LLM應用程序
    • >使用Langchain Tools構建具有瀏覽功能的GPT模型
    • 蘭鏈與llamaindex:詳細的比較
    • >
    • 謝謝您的閱讀!

以上是構建Langchain代理以在Python中自動化任務的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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