LangChain v1.0 Agent的工具定义及调用

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获取工具

posted @ 2025-11-18 22:41  AttaSayyid  阅读(88)  评论(0)    收藏  举报