Agent-工具的使用(基于Langchain1.0)
大模型(LLM)虽然具备强大的推理和生成能力,但存在两大局限性:无法获取实时/专属信息,以及缺乏执行能力。工具调用(Tools)成为解决这些问题的关键方案,它赋予大模型"具身能力":通过API接口访问实时数据(如天气、订单),调用专属系统(如银行、库存),实现功能扩展(如搜索、计算)。文章展示了不使用工具时LLM的局限,并详细介绍了工具调用的实现方法,包括现成工具(Tavily
一、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工具获取西安天气。

更多推荐


所有评论(0)