官方文档:https://reference.langchain.com/python/langchain/tools/#langchain.tools.tool

# 工具的定义

工具是Agent调用执行动作的组件,他们通过让模型通过定义明确的输入和输出与交互来拓展模型的功能。

在构建Agent时,需要为其提供一个他可以使用的工具列表。除了实际可调用的函数之外,工具还需要有以下属性:

  1. name:工具的名称
  2. descrition:工具的说明,给模型提供指导
  3. args_schema:使用 Pydantic 模块或 JSON 模块定义复杂的输入参数
  4. return_direct:True/False 是否直接从工具返回(不继续代理循环)
  5. parse_docstring:True/False 默认False,是否从 Google Style 函数文档中解析参数描述
  6. 。。。更多详细看官方文档

# 定义工具的方式

# 1、写一个函数,使用@tool装饰器定义工具

两种方式

1、通过标准的参数

from langchain.tools import tool
from pydantic import BaseModel, Field

# 定义参数
class SearchArgs(BaseModel):
    query: str = Field(..., description="需要进行联网查询的信息关键词")

@tool("web_search", args_schema=SearchArgs, description="互联网搜索的工具,可以联网搜索任何公开信息")
def web_search(query: str) -> str:
    
    pass

2、通过谷歌标准的注释格式,同时必须将parse_docstring参数设为True

@tool("web_search_", parse_docstring=True)
def web_search_(query: str) -> str:
    """
    互联网搜索的工具,可以联网搜索任何公开信息
    Args:
        query: 需要进行联网查询的信息关键词

    Returns:
        返回搜索的结果信息,该信息是一个文本字符串
    """
    pass
# 完整示例:

src.tools.wab_search.py

from langchain.tools import tool
from pydantic import BaseModel, Field

# 定义参数
class SearchArgs(BaseModel):
    query: str = Field(..., description="需要进行联网查询的信息关键词")

@tool("web_search", args_schema=SearchArgs, description="互联网搜索的工具,可以联网搜索任何公开信息")
def web_search(query: str) -> str:
    try:
        import requests

        url = 'https://www.searchapi.io/api/v1/search'
        params = {
            'api_key':'TYYv2ijxp2aWTVR37',
            'engine': 'google',
            'q': query
        }

        response = requests.get(url, params=params)
        print(response.text)
        return response.text
    except Exception as e:
        return str(e)

# @tool("web_search_", parse_docstring=True)
# def web_search_(query: str) -> str:
#     """
#     互联网搜索的工具,可以联网搜索任何公开信息
#     Args:
#         query: 需要进行联网查询的信息关键词

#     Returns:
#         返回搜索的结果信息,该信息是一个文本字符串
#     """
#     pass
# if __name__ == '__main__':
#     print(web_search.name)  # 工具名称
#     print(web_search.description)  # 工具描述
#     print(web_search.args)  # 工具的参数
#     print(web_search.args_schema.model_json_schema())  # 工具的参数的描述(json)
#     print(web_search.invoke({'query':'马斯克的传奇一生'}))

src.agent.py

from langchain.agents import create_agent
from pydantic import BaseModel, Field
from langchain_openai import ChatOpenAI
from dotenv import load_dotenv
import os
from src.tools.web_search import web_search
load_dotenv('../.env')


llm = ChatOpenAI(
    base_url=os.getenv('OPENAI_BASE_URL'),
    api_key=os.getenv('OPENAI_API_KEY'),
    model=os.getenv('OPENAI_MODEL'),
)

# 创建agent时传入工具
agent = create_agent(
    model=llm,
    tools=[web_search],
    system_prompt="你是一个智能助手,尽可能回答用户问题"
)

image-20251129222618892

# 2、继承BaseTool类

复杂的工具可以使用这种方式-自定义类

需要重写BaseTool类的run函数,但是我们在重写时需要定义成_run 私有化函数

工具的参数有两种实现方式

src.tools.web_search_class.py

from langchain.tools import BaseTool
from typing import Type
from pydantic import Field, BaseModel, create_model

class SearchArgs(BaseModel):
    query: str = Field(..., description="需要进行联网查询的信息关键词")

class WebSearch(BaseTool):
    name: str = 'web_search_class'  # 工具的名称
    description: str = '互联网搜索的工具,可以联网搜索任何公开信息'  # 工具的描述
    # 工具参数第一种写法
    # args_schema: Type[BaseModel] = SearchArgs  # 工具的参数
    
    # 工具参数第二种写法(如果要用这种,需要注释掉上面的 args_schema)
    def __init__(self):
        super().__init__()
        self.args_schema = create_model('SearchInput', query=(str, Field(..., description='互联网搜索的工具,可以联网搜索任何公开信息')))
    
    def _run(self, query: str) -> str:
        try:
            import requests

            url = 'https://www.searchapi.io/api/v1/search'
            params = {
                'api_key':'TYYv2ijxp2bsVR37',
                'engine': 'google',
                'q': query
            }

            response = requests.get(url, params=params)
            print(response.text)
            return response.text
        except Exception as e:
            return str(e)

src.agent.py

from langchain.agents import create_agent
from pydantic import BaseModel, Field
from langchain_openai import ChatOpenAI
from dotenv import load_dotenv
import os
# from src.tools.web_search import web_search
from src.tools.web_search_class import WebSearch
load_dotenv('../.env')

WebSearchTool = WebSearch()
llm = ChatOpenAI(
    base_url=os.getenv('OPENAI_BASE_URL'),
    api_key=os.getenv('OPENAI_API_KEY'),
    model=os.getenv('OPENAI_MODEL'),
)

# 创建agent时传入工具
agent = create_agent(
    model=llm,
    tools=[WebSearchTool],
    system_prompt="你是一个智能助手,尽可能回答用户问题"
)

image-20251130002050909

# 3、从MCP服务端获取工具

以后再说