概述?
????????Agent 是一種能夠基于接收到的輸入,利用自身的決策邏輯和可用的工具,動態地規劃并執行一系列操作,以達成特定任務的程序或系統。它在與外界交互過程中,會根據實時情況靈活調整策略,而不是按照固定的預設流程執行任務。
核心組成部分
-
語言模型(LLM):作為 Agent 的“大腦”,負責理解用戶的輸入、生成推理和決策所需的文本信息。例如,當用戶提出一個復雜的問題時,語言模型會對問題進行分析和理解。
-
工具:是 Agent 用于完成特定任務的具體手段。這些工具可以是各種 API 接口,如搜索引擎 API 用于獲取外部信息、數學計算工具用于進行數值運算等。例如,當需要查詢某一歷史事件的具體時間時,Agent 可以調用搜索引擎工具來獲取相關信息。
-
決策邏輯:決定何時以及如何使用工具。它會根據語言模型對輸入的分析結果,結合工具的功能和描述,選擇最合適的工具來解決問題。例如,如果用戶的問題涉及到數據查詢和數學計算,決策邏輯會先讓 Agent 使用搜索引擎工具獲取相關數據,再使用數學計算工具對數據進行處理
工作流程
-
接收輸入:Agent 接收用戶提出的任務或問題。例如,用戶輸入“查詢蘋果公司最新款手機的價格,并計算其在打 8 折后的售價”。
-
分析理解:語言模型對輸入進行分析和理解,明確任務的核心目標和關鍵信息。在上述例子中,語言模型會識別出需要查詢手機價格并進行折扣計算這兩個關鍵任務。
-
決策規劃:決策邏輯根據分析結果,確定完成任務所需的工具和操作步驟。在這個例子中,會先選擇搜索引擎工具查詢蘋果公司最新款手機的價格,再選擇數學計算工具計算打折后的售價。
-
執行操作:按照規劃好的步驟,依次調用相應的工具執行任務。首先調用搜索引擎工具獲取手機價格信息,然后將價格信息傳遞給數學計算工具進行打折計算。
-
輸出結果:將最終的處理結果反饋給用戶。在這個例子中,會將計算得出的打折后售價返回給用戶。
工具
????????langchain_community.agent_toolkits提供了豐富多樣的工具包,這些工具包可以幫助開發者更方便地構建功能強大的智能代理。
? ? ? ? 可以通過如下代碼查詢工具列表:
from langchain_community.agent_toolkits.load_tools import load_tools, get_all_tool_names#查詢所有提供的工具
tool_names = get_all_tool_names()
print(tool_names)
1. 搜索與信息檢索類
-
google-search
:用于在 Google 搜索引擎上進行搜索,獲取互聯網上廣泛的信息。 -
google-search-results-json
:以 JSON 格式返回 Google 搜索的結果,方便后續數據處理和分析。 -
searx-search-results-json
:借助 Searx(一個元搜索引擎)進行搜索,并以 JSON 格式返回搜索結果。 -
bing-search
:在 Bing 搜索引擎上執行搜索操作,獲取 Bing 索引的網頁信息。 -
metaphor-search
:利用 Metaphor 搜索引擎進行搜索,可能在特定領域或搜索算法上有獨特優勢。 -
ddg-search
:使用 DuckDuckGo 搜索引擎進行搜索,DuckDuckGo 注重用戶隱私,不跟蹤用戶搜索歷史。 -
google-books
:專門用于搜索 Google 圖書數據庫,查找相關書籍信息。 -
google-scholar
:在 Google Scholar 上搜索學術文獻、研究論文、學術書籍等學術資源。 -
google-finance
:用于獲取 Google Finance 上的金融相關信息,如股票行情、財經新聞等。 -
google-trends
:從 Google Trends 獲取搜索關鍵詞的熱度趨勢數據,可用于分析市場趨勢、話題熱度等。 -
google-jobs
:搜索 Google Jobs 上的招聘信息,幫助用戶查找工作機會。 -
google-serper
:通過 Serper API 進行 Google 搜索,可能提供更定制化的搜索服務。 -
google-serper-results-json
:以 JSON 格式返回通過 Google Serper 搜索得到的結果。 -
searchapi
:使用 SearchApi 進行搜索,可訪問多種搜索引擎的功能。 -
searchapi-results-json
:以 JSON 格式返回 SearchApi 的搜索結果。 -
serpapi
:提供統一的 API 來訪問多個搜索引擎(如 Google、Bing 等)的搜索結果,簡化搜索集成。 -
wikipedia
:用于在維基百科上搜索信息,獲取權威的百科知識。 -
arxiv
:搜索 arXiv 預印本數據庫,獲取科學研究領域的最新論文。 -
pubmed
:在 PubMed 數據庫中搜索生物醫學領域的文獻。 -
reddit_search
:在 Reddit 平臺上進行搜索,獲取相關的社區討論和內容。 -
news-api
:通過 News API 搜索和獲取新聞文章,可用于新聞資訊聚合。
2. 計算與數據處理類
-
wolfram-alpha
:借助 Wolfram Alpha 強大的計算和知識引擎,進行各種數學計算、數據分析、科學知識查詢等。 -
llm-math
:利用大語言模型進行數學計算,適合處理簡單的數學問題。
3. 內容生成與媒體類
-
dalle-image-generator
:使用 DALL - E 模型生成圖像,根據文本描述創建相應的圖像。 -
eleven_labs_text2speech
:通過 Eleven Labs 的 API 將文本轉換為語音。 -
google_cloud_texttospeech
:利用 Google Cloud 的文本轉語音服務,將文本轉換為自然流暢的語音。 -
sceneXplain
:可能用于圖像理解和解釋,對圖像內容進行分析和描述。
4. 社交與通信類
-
twilio
:集成 Twilio 通信平臺,可實現短信發送、語音通話、視頻通話等通信功能。
5. 其他工具類
-
sleep
:使代理暫停執行一段時間,可用于控制流程的執行節奏。 -
human
:引入人類交互環節,在代理執行過程中可以向人類尋求幫助或獲取信息。 -
awslambda
:與 AWS Lambda 函數集成,利用 AWS Lambda 的無服務器計算能力執行自定義代碼。 -
stackexchange
:在 Stack Exchange 網絡(如 Stack Overflow)上搜索問題和答案,獲取技術領域的專業知識。 -
graphql
:用于執行 GraphQL 查詢,與支持 GraphQL 的 API 進行交互。 -
openweathermap-api
:通過 OpenWeatherMap API 獲取天氣信息,如氣溫、濕度、天氣狀況等。 -
dataforseo-api-search
:使用 DataForSEO API 進行搜索相關操作。 -
dataforseo-api-search-json
:以 JSON 格式返回 DataForSEO API 搜索的結果。 -
memorize
:可能用于在代理執行過程中存儲和記憶某些信息,方便后續使用。 -
read_file
:用于讀取文件內容,可處理本地文件或遠程文件。 -
tmdb-api
:與 The Movie Database(TMDB)API 集成,獲取電影和電視節目相關信息。 -
podcast-api
:通過 Podcast API 搜索和獲取播客相關信息。 -
open-meteo-api
:利用 Open Meteo API 獲取氣象數據。 -
requests
:使用 Python 的?requests
?庫發送 HTTP 請求,可與各種 Web API 進行交互。 -
requests_get
:專門用于發送 HTTP GET 請求。 -
requests_post
:專門用于發送 HTTP POST 請求。 -
requests_patch
:專門用于發送 HTTP PATCH 請求。 -
requests_put
:專門用于發送 HTTP PUT 請求。 -
requests_delete
:專門用于發送 HTTP DELETE 請求。 -
terminal
:允許代理在終端環境中執行命令,例如運行腳本、調用系統工具等。 -
merriam-webster
:通過 Merriam - Webster 詞典進行詞匯查詢,獲取單詞的釋義、發音等信息。 -
golden-query
:用于與 Golden 知識圖譜進行交互,查詢相關的結構化知識。 -
terminal
:可在終端環境中執行命令,適用于執行本地腳本或系統命令。
加載工具:
from langchain_community.agent_toolkits.load_tools import load_tools, get_all_tool_names#加載工具 arxiv 用于搜索arxiv上的論文 llm-math讓 LLM 執行數學計算任務(結合計算器)
tools = load_tools(["arxiv", "llm-math"], llm=deepseek_llm)
1?使用?initialize_agent
?函數創建標準 Agent
??initialize_agent
?是 LangChain 中最常用的創建 Agent 的函數,它提供了一種簡單的方式來初始化不同類型的 Agent。可以根據需要選擇不同的 Agent 類型和工具。
Agent 類型
LangChain 提供了多種 Agent 類型
1.?ZERO_SHOT_REACT_DESCRIPTION
-
含義:這是一種零樣本學習的 Agent,在采取行動之前會進行推理步驟。所謂零樣本學習,意味著該 Agent 不需要針對特定任務進行額外的訓練,就可以根據工具的描述來使用工具解決問題。
-
工作原理:當接收到用戶的輸入時,它會先對問題進行推理分析,確定需要使用哪些工具以及如何使用這些工具,然后再執行相應的操作。例如,在面對一個需要查詢數據并進行計算的問題時,它會先思考應該調用搜索引擎工具獲取數據,再調用計算工具進行計算。
2.?REACT_DOCSTORE
-
含義:同樣是一種在行動前進行推理的零樣本 Agent,但它可以訪問一個文檔存儲庫。這個文檔存儲庫允許 Agent 查找與回答問題相關的信息。
-
工作原理:在處理問題時,它不僅會進行推理分析,還會利用文檔存儲庫中的信息來輔助解決問題。例如,當用戶詢問關于某個歷史事件的詳細信息時,它可以在文檔存儲庫中查找相關的歷史文獻、資料等,結合推理過程給出更準確的答案。
3.?SELF_ASK_WITH_SEARCH
-
含義:這種 Agent 會將一個復雜的問題分解為一系列更簡單的問題,然后使用搜索工具查找這些簡單問題的答案,最終根據這些答案來回答原始的復雜問題。
-
工作原理:當接收到一個復雜問題時,它會首先分析問題的結構,將其拆分成多個簡單的子問題。然后,依次使用搜索工具查找每個子問題的答案。最后,將這些子問題的答案整合起來,形成對原始復雜問題的回答。例如,對于“如何制作一道復雜的菜肴”這個問題,它可能會將其拆分為“這道菜需要哪些食材”“每種食材的處理方法”“烹飪的步驟和時間”等子問題,分別進行搜索并整合答案。
4.?CONVERSATIONAL_REACT_DESCRIPTION
-
含義:從名稱推測,這是一種適用于對話場景的 Agent,在行動前會進行推理。它能夠在多輪對話中保持上下文的連貫性,根據之前的對話內容和當前的輸入進行推理和行動。
-
工作原理:在對話過程中,它會維護對話歷史,理解每一輪對話的上下文信息。當用戶輸入新的內容時,它會結合上下文進行推理分析,選擇合適的工具和操作來做出回應。例如,在一個關于旅游規劃的對話中,用戶先詢問了某個旅游景點的信息,之后又詢問如何到達該景點,它會根據之前關于景點的對話內容,調用地圖搜索工具等給出到達景點的路線建議。
5.?CHAT_ZERO_SHOT_REACT_DESCRIPTION
-
含義:這是一種專為聊天場景設計的零樣本 Agent,在行動前進行推理。它結合了零樣本學習的能力和聊天場景的特點,能夠在沒有針對特定聊天任務進行訓練的情況下,處理聊天中的各種問題。
-
工作原理:在聊天過程中,它會根據用戶的輸入進行推理,判斷需要使用哪些工具來滿足用戶的需求。例如,在聊天中用戶提到了想要了解某部電影的信息,它會推理出需要調用電影數據庫 API 來獲取相關信息。
6.?CHAT_CONVERSATIONAL_REACT_DESCRIPTION
-
含義:這是一種針對聊天場景優化的、適用于多輪對話的 Agent,在行動前進行推理。它綜合了聊天場景和多輪對話的特性,能夠更好地處理復雜的聊天交互。
-
工作原理:在多輪對話中,它會持續跟蹤對話的上下文,根據用戶的最新輸入和之前的對話歷史進行推理分析。例如,在一個關于購物的聊天中,用戶先詢問了某類商品的價格,之后又詢問該商品的優惠活動,它會結合之前關于價格的對話內容,調用電商平臺的 API 來獲取優惠信息。
7.?STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION
-
含義:這是一種針對聊天模型優化的零樣本反應 Agent,能夠調用具有多個輸入的工具。它在聊天場景中,即使面對需要多個參數輸入的工具,也能準確地進行調用和處理。
-
工作原理:在聊天過程中,當遇到需要使用具有多個輸入的工具時,它會根據工具的描述和用戶的輸入,準確地組織和提供所需的輸入參數。例如,在一個關于旅游規劃的聊天中,用戶想要查詢從一個城市到另一個城市的航班信息,它可以調用航班查詢 API,并根據用戶提供的出發地、目的地、出發時間等多個參數進行查詢。
8.?OPENAI_FUNCTIONS
-
含義:這是一種針對使用 OpenAI 函數進行優化的 Agent。OpenAI 提供了一些函數調用的機制,該 Agent 能夠高效地利用這些函數來完成特定的任務。
-
工作原理:它會根據用戶的輸入和任務需求,調用 OpenAI 提供的相關函數。例如,在處理文本生成任務時,它可以調用 OpenAI 的文本生成函數,根據用戶的要求生成符合特定風格和內容的文本。
9.?OPENAI_MULTI_FUNCTIONS
-
含義:從名稱推測,這是一種能夠調用多個 OpenAI 函數的 Agent。它可以根據任務的復雜性,靈活地組合和調用多個 OpenAI 函數來完成任務。
-
工作原理:在面對復雜任務時,它會分析任務的需求,選擇合適的多個 OpenAI 函數,并按照一定的順序和邏輯進行調用。例如,在一個需要進行文本分析和生成的任務中,它可以先調用 OpenAI 的文本分析函數對輸入文本進行分析,然后根據分析結果調用文本生成函數生成相關的回復。
示例1
from langchain.agents import initialize_agent, AgentType
from langchain_community.agent_toolkits.load_tools import load_tools, get_all_tool_names
from model.deepseek import deepseek_llm
#查詢所有提供的工具
#tool_names = get_all_tool_names()
#print(tool_names)#加載工具 arxiv 用于搜索arxiv上的論文 llm-math讓 LLM 執行數學計算任務(結合計算器)
tools = load_tools(["arxiv", "llm-math"], llm=deepseek_llm)agent = initialize_agent(tools,deepseek_llm,agent=AgentType.CHAT_ZERO_SHOT_REACT_DESCRIPTION, #使用的agent類型handle_parsing_errors=True, #如果解析報錯繼續verbose=True, #輸出的信息不要太多
)resp = agent.invoke({"input": "人工智能領域最新的論文是什么?請問中文回答"})
print(resp)
示例2
create_react_agent
?函數用于創建一個基于 ReACT(Reasoning + Acting in a Cycle)框架的智能代理(Agent)。ReACT 框架通過結合推理和行動,使得代理能夠更好地與環境交互,完成復雜任務。
#Tavily 搜索工具
#搜索最多返回5條結果
import osfrom langchain import hub
from langchain.agents import create_react_agent
from langchain_core.prompts import PromptTemplate
from langchain_tavily import TavilySearchfrom model.deepseek import deepseek_llm
from model.guiji import guiji_llmos.environ['TAVILY_API_KEY'] = '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'
tavily_tool = TavilySearch(max_results=1)#定義工具集
tools = [tavily_tool]
template = '''盡你所能回答以下問題。你可以使用以下工具:
{tools}
使用以下格式:
問題:你必須回答的輸入問題
思考:你應該始終思考要做什么
行動:要采取的行動,應該是 [{tool_names}] 中的一個
行動輸入:行動的輸入
觀察:行動的結果
……(這個“思考/行動/行動輸入/觀察”可以重復 N 次)
思考:我現在知道最終答案了
最終答案:原始輸入問題的最終答案
開始!
問題:{input}
思考:{agent_scratchpad}'''prompt = PromptTemplate.from_template(template)
#定義一個agent
agent = create_react_agent(llm=deepseek_llm,tools=tools,prompt=prompt
)resp = agent.invoke({"input": "請根據 ReAct 模板,逐步思考并提供關于 'langchain 中文教程' 的信息。","intermediate_steps": []
})
print(resp)
示例3
create_structured_chat_agent
?是一個重要的函數,它用于創建具備結構化輸出能力的聊天代理(Agent)。這個代理能夠處理復雜的輸入參數,并以結構化的形式輸出結果,在面對復雜任務時表現出色。
LangSmith上提供了一些常用的提示詞可以直接使用
使用方式:prompt = hub.pull("hwchase17/structured-chat-agent")
from langchain import hub
from langchain.agents import create_structured_chat_agent, AgentExecutor
from langchain_community.agent_toolkits.load_tools import load_tools
from langchain_core.tools import StructuredTool
from pydantic import BaseModel, Field
from langchain.agents import toolfrom model.deepseek import deepseek_llm"""
使用@tool裝飾器定義一個搜索模擬工具
@tool裝飾器可以將一個函數轉換成一個工具
return_direct=True表示直接返回函數的結果,不需要再進行思考
args_schema=SearchInput表示輸入的參數類型是SearchInput
"""
class SearchInput(BaseModel):keyword: str = Field(description="搜索的關鍵詞")
@tool("這是一個搜索的工具", return_direct=True, args_schema=SearchInput)
def search(keyword: str) -> str:"""這是一個搜索電腦上的數據的工具"""return f'我是一個搜索工具{keyword}'"""
使用StructuredTool.from_function定義一個排序工具
StructuredTool.from_function可以將一個函數轉換成一個工具
return_direct=True表示直接返回函數的結果,不需要再進行思考·
args_schema=SortToolInput表示輸入的參數類型是SortToolInput
"""
def sort_num(numString: str):"""這是一個工具,對所有的數字排序"""return sorted(eval(numString))class SortToolInput(BaseModel):num: str = Field(description="搜索的關鍵詞")#結構化工具
sort_tool = StructuredTool.from_function(func=sort_num,name='sort_tool',description='這是一個工具,對所有的數字排序',args_schema=SortToolInput,return_direct=True
)"""
使用StructuredTool.from_function定義一個計算字符串長度的工具
StructuredTool.from_function可以將一個函數轉換成一個工具
return_direct=True表示直接返回函數的結果,不需要再進行思考
args_schema=ArgsInput表示輸入的參數類型是ArgsInput
"""
class ArgsInput(BaseModel):a: str = Field(description="第一個字符串")b: str = Field(description="第二個字符串")def count_str(a: str, b: str) -> int:return len(a) + len(b)count_tool = StructuredTool.from_function(func=count_str,name='count_tool',description='這是一個工具,計算兩個字符串的長度',args_schema=ArgsInput,return_direct=True
)
#加載官方工具 arxiv 用于搜索arxiv上的論文 llm-math讓 LLM 執行數學計算任務(結合計算器)
tools = load_tools(["arxiv", "llm-math"], llm=deepseek_llm)
#自定義工具
tools = [search, sort_tool, count_tool] + tools
#使用提示器模版
prompt = hub.pull("hwchase17/structured-chat-agent")agent = create_structured_chat_agent(deepseek_llm, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True, handle_parsing_errors=True)
resp = agent_executor.invoke(# {"input": "‘bbccdd’的字符串長度加上‘abc’字符串長度是多少"}{"input": "最新關于ai的論文"}
)
print(resp)