LangChain Agent工具的定義

大模型是Agent的大腦,工具就是Agent的手和腳

構建Agent時,要提供一個工具列表

首先需要創建Agent項目

  1. 安裝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獲取工具