一、Agent使用了LLM,为什么还需要调用工具?

1、大模型自己无法访问实时/专属信息

  • LLM 本质是一个知识完成工具,它擅长理解指令、推理、总结、生成内容。

  • 但它没有用户专属权限,也不能实时联网读数据库或调用公司API。

  • 所以模型“本身”永远不知道你的余额、天气、邮件、库存、订单等动态且私密的数据

2、工具 = 大模型的“具身能力”

形象点说:
  • 大模型像一个超聪明的“脑子”,但它没有“手脚”。

  • 工具(Tools)= 能让 AI 动手实践、查询外部世界的函数/接口/插件。例如银行API、天气API、网页爬虫、计算器……

  • 模型 + 工具 = 智能体(Agent)。模型【思考/决策/理解指令】,工具【行动/获取实时数据/完成任务】。

3、工具调用的优势

  • 突破预训练知识“静态”限制,跨越事实时效边界

  • 安全:模型不持有你的真实数据,只通过受控API来获取敏感信息

  • 泛化:开发者可随需扩展各种action,如网页搜索、代码执行、执行公司内部系统任务等

以下是一个不使用工具的例子,如果不使用工具,LLM无法获取天气信息。

import os
from idlelib import query
​
from langchain.tools import tool
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
from langchain.agents import create_agent
from langchain_tavily import TavilySearch
​
​
# 设置工具
tools = []  # 工具置为空,也就是不使用工具
​
# 设置模型
model = ChatOpenAI(model="gpt-4o",  # 模型
                   temperature=0.1,  # 控制模型输出的随机性。数值越高,响应越具有创造性;数值越低,响应越具确定性
                   max_tokens=1000,  # 最大tokens数量,有效控制输出的长度
                   max_retries=3,  # 最大重试次数
                   timeout=30,  # 等待模型响应的最长时间(以秒为单位),超过此事件将取消请求
                   api_key="sk-********************************",  # OPENAPI_API_KEY
                   base_url="如果直接使用openapi这里可以不用指定URL", )
​
# 系统提示词
prompt = "你是一个有用的AI助手,可以回答用户的问题。"
​
# 创建Agent
agent = create_agent(model=model,
                     tools=tools,
                     system_prompt=prompt)
​
# 运行Agent
response = agent.invoke({"messages": [{"role": "user", "content": "今天西安的天气怎么样?"}]})
# 结果打印,这里只打印content内容
print(response["messages"][-1].content)

响应结果:

二、Agent如何使用工具

1、现有工具的使用(例如:Tavily搜索工具)

需要安装Tavily,安装需要注意:在Langchain>=0.3.25将Tavily独立了出去,不再使用langchain_community.tools.tavily_search

这里使用最新的Langchain1.0.2

pip install -U langchain langchain-core langchain-openai langchain-tavily

前往Tavily官网:获取TAVILY_API_KEY:https://tavily.com/

首先进行注册:

选择合适的方式进行注册

注册完成之后,首页就能看到TAVILY_API_KEY

Tavily工具的使用示例:

import os
from idlelib import query
​
from langchain.tools import tool
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
from langchain.agents import create_agent
from langchain_tavily import TavilySearch
​
# 设置环境变量,TAVILY_API_KEY需要在官网注册账号申请
os.environ["TAVILY_API_KEY"] = "tvly-dev-**************************"
​
# 设置工具
tools = [TavilySearch(max_results=3)]
​
# 设置模型
model = ChatOpenAI(model="gpt-4o",  # 模型
                   temperature=0.1,  # 控制模型输出的随机性。数值越高,响应越具有创造性;数值越低,响应越具确定性
                   max_tokens=1000,  # 最大tokens数量,有效控制输出的长度
                   max_retries=3,  # 最大重试次数
                   timeout=30,  # 等待模型响应的最长时间(以秒为单位),超过此事件将取消请求
                   api_key="sk-********************************",  # OPENAPI_API_KEY
                   base_url="如果直接使用openapi这里可以不用指定URL", )
​
# 系统提示词
prompt = "你是一个有用的AI助手,可以回答用户的问题。当你需要查找信息时,可以使用提供的工具。"
​
# 创建Agent
agent = create_agent(model=model,
                     tools=tools,
                     system_prompt=prompt)
​
# 运行Agent
response = agent.invoke({"messages": [{"role": "user", "content": "今天西安的天气怎么样?"}]})
# 这里只打印
print(response["messages"][-1].content)

响应结果:

2、自定义工具

        工具是Agent用来执行操作的组件。它们通过定义明确的输入和输出,扩展了模型的功能,使其能够与外部世界进行交互。工具封装了一个可调用函数及其输入模式。允许模型决定是否调用工具以及调用哪些参数。在这种情况下,工具调用使模型能够生成符  合指定输入模式的请求。实际工程实现中,我们需要自己定义工具,然后供模型调用。

        创建工具最简单的方法是使用@tool装饰器。默认情况下,函数的文档字符串会成为工具的描述,帮助模型理解何时使用该工具(函数的描述很重要,清晰的准确的描述能够帮助大模型更好的理解和调用工具):

基本工具自定义:

@tool
def search_database(query: str, limit: int = 10) -> str:
    """Search the customer database for records matching the query.
​
    Args:
        query: Search terms to look for
        limit: Maximum number of results to return
    """
    return f"Found {limit} results for '{query}'"

自定义工具属性(默认情况下,工具名称就是函数名称。如果需要更具体名称,可以使用以下方式进行覆盖):

@tool("web_search")  # 自定义名称
def search(query: str) -> str:
    """Search the web for information."""
    return f"Results for: {query}"

自定义工具描述(覆盖自动生成的工具描述,以便获得更清晰的模型指导):

@tool("calculator", description="Performs arithmetic calculations. Use this for any math problems.")
def calc(expression: str) -> str:
    """Evaluate mathematical expressions."""
    return str(eval(expression))

高级模式定义(使用 Pydantic 模型或 JSON 模式定义复杂输入):

# 以下是一个json模式定义复杂输入的工具(Pydantic 模型可以参照官方文档)
weather_schema = {
    "type": "object",
    "properties": {
        "location": {"type": "string"},
        "units": {"type": "string"},
        "include_forecast": {"type": "boolean"}
    },
    "required": ["location", "units", "include_forecast"]
}
​
@tool(args_schema=weather_schema)
def get_weather(location: str, units: str = "celsius", include_forecast: bool = False) -> str:
    """Get current weather and optional forecast."""
    temp = 22 if units == "celsius" else 72
    result = f"Current weather in {location}: {temp} degrees {units[0].upper()}"
    if include_forecast:
        result += "\nNext 5 days: Sunny"
    return result

       自定义工具的使用,和上文中提到的Tavily使用方式是一样的,例如:使用get_weather工具获取西安天气。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐