LangChain Agent工具的定義
大模型是Agent的大腦,工具就是Agent的手和腳
構建Agent時,要提供一個工具列表
首先需要創建Agent項目
- 安裝LangGraph CLI(python需要大於等於3.11版本)
pip install --upgrade "langgraph-cli[inmem]"
工具的定義方法
|
屬性
|
類型
|
描述
|
|
名稱
|
str
|
提供給LLM或代理的一組工具中必須是唯一的
|
|
描述
|
str
|
描述工具的使用。被LLM或代理用作上下文
|
|
args_schema
|
pydantic.BaseModel
|
參數的描述,可選但推薦,使用回調處理程序則為必須。它可用於為預期參數提供過呢更多信息(例如:少量示例)或驗證
|
|
return_direct
|
boolean
|
默認為False,僅僅與代理相關,當為True時,在調用給定工具後,代理將停止並將結果直接返回給用户
|
一、@Tool 裝飾器定義工具
使用此裝飾器需要導入庫
from langchain_core.tools import tool
@tool("內容") 中,內容為空時,工具的函數名就默認為工具的名稱,此方法是為了解決,當項目足夠大,函數足夠多時候,出現的相同名稱的函數的問題,來對某一工具命名從而避免出錯
@tool
def web_search(query: str)->str:
pass
此處添加工具的描述,便於大模型理解我們的工具的定義,注意此方法需要加上參數parse_docstring,以解析工具的使用方法註釋,Returns是返回結果的描述,利用的是谷歌的結構
@tool('my_web_search', parse_docstring=True)
def web_search(query: str)->str:
"""互聯網搜索的工具,可以搜索所有公開的信息
Returns:
返回搜索的結果信息,該信息是一個文本字符串
"""
pass
除了上述的寫法,對於工具的描述也可以寫在裝飾器中
@tool('my_web_search', description="""互聯網搜索的工具,可以搜索所有公開的信息
Returns:
返回搜索的結果信息,該信息是一個文本字符串
""")
def web_search(query: str)->str:
pass
參數工具的描述
方法一
@tool('my_web_search', parse_docstring=True)
def web_search(query: str)->str:
"""互聯網搜索的工具,可以搜索所有公開的信息
Args:
query: 需要進行互聯網查詢的關鍵詞的信息
Returns:
返回搜索的結果信息,該信息是一個文本字符串
"""
pass
方法二
#動態定義參數
class SearchArgs(BaseModel):
query: str = Field(..., description="需要進行互聯網查詢的關鍵詞的信息")
@tool(parse_docstring=True, args_schema=SearchArgs,description="""互聯網搜索的工具,可以搜索所有公開的信息""")
def web_search_2(query: str)->str:
pass
建議使用方法一,簡單醒目
利用智譜定義簡單的聯網工具
from langchain_core.tools import tool
from pydantic import BaseModel, Field
from sqlalchemy import True_
from zhipuai import ZhipuAI
from dotenv import load_dotenv
import os
load_dotenv()
ZHIPU_API_KEY = os.getenv('ZHIPU_API_KEY')
zhipu_client = ZhipuAI(api_key=ZHIPU_API_KEY)
@tool('my_web_search', parse_docstring=True)
def web_search(query: str)->str:
"""互聯網搜索的工具,可以搜索所有公開的信息
Args:
query: 需要進行互聯網查詢的關鍵詞的信息
Returns:
返回搜索的結果信息,該信息是一個文本字符串
"""
try:
res= zhipu_client.web_search.web_search(
search_engine='search_pro',
search_query=query,
)
if res.search_result:
return "\n\n".join([d.content for d in res.search_result])
else:
return "沒有搜索到任何結果"
except Exception as e:
print(e)
return f'Error:{e}'
可以寫個主函數來檢查自己寫的函數是否有問題
if __name__ == '__main__':
print(web_search.name) #打印工具名字
print(web_search.description) #打印描述信息
print(web_search.args) #工具的參數
print(web_search.args_schema.model_json_schema()) #工具的參數的json schema(描述json字符串)
result = web_search.invoke({"query":"如何使用LangChain"})
print(result)
二、繼承BaseTool定義工具
三、從MCP獲取工具