发布时间:2026-02-01 00:12:46编辑:123阅读(5)
LangChain1.0 create_agent接入自定义工具与React循环
能调用外部工具,是大模型进化为智能体Agent的关键,如果不能使用外部工具。大模型就只能是个简单的聊天机器人,甚至连查询天气都做不到。由于底层技术限制,大模型本身是无法和外部工具直接通信的,因此Function calling的思路,就是创建一个外部函数(Function)作为中介,一边传递大模型的请求,另一边调用外部工具,最终让大模型能够间接的调用外部工具。

例如,当要查询当前天气时,让大模型调用外部工具的function calling的过程,因此所谓的接入自定义外部工具,核心需要创建的就是能够调用外部工具的API函数。
一个典型的能够查询实时天气信息的外部函数如下:
import requests
from langchain.tools import tool
@tool
def get_weather(city):
"""
查询及时天气函数
:city:不要参数,字符串类型,需要查询的城市
:return: API查询天气结果
"""
url = 'http://apis.juhe.cn/simpleWeather/query'
headers={
"Content-Type": "application/x-www-form-urlencoded",
"charset":"UTF-8"
}
data = {
"city": city,
"key":"bef2ae20fc12a6dd10ebc30e0c4ac659"
}
response = requests.post(url=url, data=data,headers=headers)
data = response.json().get('result').get('future')[0]
return data
# 函数名
function_name = get_weather.name
print(f'函数名:{function_name}')
# 函数描述
function_description = get_weather.description
print(f'函数描述:{function_description}')
# 函数需要传递的参数
function_args = get_weather.args
print(f'函数需要传递的参数:{function_args}')
res = get_weather.invoke('上海')
print(f'查询结果:{res}')运行结果:
函数名:get_weather
函数描述:查询及时天气函数
:city:不要参数,字符串类型,需要查询的城市
:return: API查询天气结果
函数需要传递的参数:{'city': {'title': 'City'}}
查询结果:{'date': '2026-01-31', 'temperature': '1/6℃', 'weather': '阴转多云', 'wid': {'day': '02', 'night': '01'}, 'direct': '东北风'}
基于本地模型的Agent工具调用示例
注意:并不是所有模型都支持工具调用的,本地模型部署前需要调研清楚是否支持工具调用
环境介绍:
基于ollama部署的llama3.1-8b的模型-支持工具调用

用本地模型询问今天上海的天气如何?代码如下:
from langchain_ollama import ChatOllama
# 导入模型
model = ChatOllama(
model="llama3.1:8b",
temperature=0.7
)
response = model.invoke("请问上海今天的天气如何?")
print(response.content)执行结果:
非常抱歉,我无法提供实时的天气信息。
上面的结果可以看出,模型无法实时回答上海今天天气情况,整合上面调用外部API获取天气的函数,可以封装一个实时查询天气的Agent,代码如下:
from langchain.agents import create_agent
from langchain_ollama import ChatOllama
from langchain.tools import tool
import requests
# 导入模型
model = ChatOllama(
model="llama3.1:8b",
temperature=0.7
)
# 天气调用函数
@tool
def get_weather(city):
"""
查询及时天气函数
:param city: 城市名 - 上海,北京...
:return: API返回结果
"""
url = 'http://apis.juhe.cn/simpleWeather/query'
headers={
"Content-Type": "application/x-www-form-urlencoded",
"charset":"UTF-8"
}
data = {
"city": city,
"key":"bef2ae20fc12a6dd10ebc30e0c4ac659"
}
response = requests.post(url=url, data=data,headers=headers)
data = response.json().get('result').get('future')[0]
print(f"API接口返回的天气查询结果:{data}")
return data
# 创建Agent
agent = create_agent(
model=model,
tools=[get_weather],
system_prompt="你是一名多才多艺的智能助手,可以调用工具帮助用户解决问题"
)
result = agent.invoke({"messages":[{"role":"user", "content":"请问上海今天的天气如何?"}]})
print(f"大模型根据用户问题自行调用工具后的结果:{result['messages'][-1].content}")运行结果:
API接口返回的天气查询结果:{'date': '2026-01-31', 'temperature': '1/6℃', 'weather': '阴转多云', 'wid': {'day': '02',
'night': '01'}, 'direct': '东北风'}
大模型根据用户问题自行调用工具后的结果:根据工具的输出,我们可以得出以下结论:
"上海今天的天气很冷,温度在1到6℃之间。天气主要是阴转多云,风从东北吹来。建议您穿好厚衣服,带上雨伞,
以备不时之需。
可以看到跟API接口返回的信息是一致的。
对于create_agent API来说,其工具调用的核心逻辑也是React循环工具调用,既可以在简短的推理步骤和有针对性的工具调用之间交替,并将得到的观察结果反馈到后续决策中,直到能给出最终答案。并且具备如下特性:
按顺序调用多个工具(由单个提示触发)
适当时并行调用工具
根据先前结果进行动态工具选择
工具重试逻辑和错误处理
跨工具调用的状态持久性
原理图:

LangChain1.0 Agent工具的多次调用示例
两个地方的天气比较,会调用多次工具获取信息之后比较返回结果
from langchain.agents import create_agent
from langchain_ollama import ChatOllama
from langchain.tools import tool
import requests
# 导入模型
model = ChatOllama(
model="llama3.1:8b",
temperature=0.7
)
# 天气调用函数
@tool
def get_weather(city):
"""
查询及时天气函数
:param city: 城市名 - 上海,北京...
:return: API返回结果
"""
url = 'http://apis.juhe.cn/simpleWeather/query'
headers={
"Content-Type": "application/x-www-form-urlencoded",
"charset":"UTF-8"
}
data = {
"city": city,
"key":"bef2ae20fc12a6dd10ebc30e0c4ac659"
}
response = requests.post(url=url, data=data,headers=headers)
if response.status_code == 200:
tmp = {}
tmp.setdefault('city', city)
ret = response.json().get('result').get('future')[0]
tmp.update(ret)
print(f"API接口返回的天气查询结果:{tmp}")
return ret
# 创建Agent
agent = create_agent(
model=model,
tools=[get_weather],
system_prompt="你是智能助手,可以调用工具帮助用户解决问题,如果用户问了多个地方的天气,调用多次工具"
)
# 工具并联调用
result = agent.invoke({"messages":[{"role":"user", "content":"请问今天北京和上海哪里更冷?"}]})
print(result['messages'][-1].content)运行结果:
API接口返回的天气查询结果:{'city': '上海', 'date': '2026-01-31', 'temperature': '1/6℃', 'weather': '阴转多云', 'wid': {'day': '02', 'night': '01'}, 'direct': '东北风'}
API接口返回的天气查询结果:{'city': '北京', 'date': '2026-01-31', 'temperature': '-6/6℃', 'weather': '多云转晴', 'wid': {'day': '01', 'night': '00'}, 'direct': '东北风转西南风'}
根据工具的输出结果,北京今天温度为-6摄氏度,上海今天温度为1摄氏度。所以,北京比上海更冷。
这里有个需要注意的点,在系统提示词模板那里,如果不加后面的提示词(如果用户问了多个地方的天气,调用多次工具),最终会导致失败,所以对于大模型而言,提示词是很重要的,直接影响最终结果的准确性。
LangChain1.0 Agent工具的多步调用
from langchain.agents import create_agent
from langchain_ollama import ChatOllama
from langchain.tools import tool
import requests
from datetime import datetime
import os
# 导入模型
model = ChatOllama(
model="llama3.1:8b",
temperature=0.7
)
# 天气调用函数
# @tool
def get_weather(city:str):
"""
查询及时天气函数
:param city: 城市名 - 上海,北京...
:return: API返回结果
"""
url = 'http://apis.juhe.cn/simpleWeather/query'
headers={
"Content-Type": "application/x-www-form-urlencoded",
"charset":"UTF-8"
}
data = {
"city": city,
"key":"bef2ae20fc12a6dd10ebc30e0c4ac659"
}
try:
response = requests.post(url=url, data=data,headers=headers)
if response.status_code == 200:
tmp = {}
tmp.setdefault('city', city)
ret = response.json().get('result').get('future')[0]
tmp.update(ret)
print(f"API接口返回的天气查询结果:{tmp}")
return tmp
except Exception as e:
print(f"工具调用失败:{e}")
@tool
def write_file(content:str):
"""
将指定内容写入本地文件
:param content:必要参数,字符串类型,用于表示需要写入文档的具体内容
:return:写入结果提示信息
"""
try:
timestamp = datetime.now().strftime('%Y%m%d_%H%M%S')
filename = f"output_{timestamp}.txt"
with open(filename, 'w', encoding='utf-8') as f:
f.write(content)
abs_path = os.path.abspath(filename)
return f"已成功写入本地文件:{abs_path}"
except Exception as e:
return f"文件写入失败:{e}"
agent = create_agent(
model=model,
tools=[get_weather, write_file],
system_prompt="""
你是一名多才多艺的智能助手,可以调用工具帮助用户解决问题,严格遵循以下规则:
1.如果用户问了多个地方的天气,调用多次工具
2.用户提出写入本地文件,把最终汇总结果写入本地文件
"""
)
result = agent.invoke({"messages":[{"role":"user", "content":"帮我查询北京,上海的天气,并写入本地文件"}]})
print(result['messages'][-1].content)运行结果:
API接口返回的天气查询结果:{'city': '北京', 'date': '2026-02-01', 'temperature': '-6/6℃', 'weather': '多云转晴', 'wid':
{'day': '01', 'night': '00'}, 'direct': '东北风转西南风'}
API接口返回的天气查询结果:{'city': '上海', 'date': '2026-01-31', 'temperature': '1/6℃', 'weather': '阴转多云', 'wid':
{'day': '02', 'night': '01'}, 'direct': '东北风'}
北京天气:多云转晴,-6℃/6℃,东北风转西南风
上海天气:阴转多云,1℃/6℃,东北风
已成功写入本地文件:D:\spider_agent\output_20260201_000738.txt
下一篇: 没有了
51993
51822
42080
38929
33433
30385
29023
24042
23961
22310
5°
31°
62°
75°
74°
101°
525°
2699°
3414°
2811°