LangChain1.0-Agent接入自定义工具与React循环

发布时间:2026-02-01 00:12:46编辑:123阅读(14)

    LangChain1.0 create_agent接入自定义工具与React循环

    能调用外部工具,是大模型进化为智能体Agent的关键,如果不能使用外部工具。大模型就只能是个简单的聊天机器人,甚至连查询天气都做不到。由于底层技术限制,大模型本身是无法和外部工具直接通信的,因此Function calling的思路,就是创建一个外部函数(Function)作为中介,一边传递大模型的请求,另一边调用外部工具,最终让大模型能够间接的调用外部工具。

    image.png

    例如,当要查询当前天气时,让大模型调用外部工具的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的模型-支持工具调用

    image.png


    用本地模型询问今天上海的天气如何?代码如下:

    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循环工具调用,既可以在简短的推理步骤和有针对性的工具调用之间交替,并将得到的观察结果反馈到后续决策中,直到能给出最终答案。并且具备如下特性:

    按顺序调用多个工具(由单个提示触发)

    适当时并行调用工具

    根据先前结果进行动态工具选择

    工具重试逻辑和错误处理

    跨工具调用的状态持久性

    原理图:

    image.png


    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


关键字

上一篇: LangChain1.0-Agent开发流程

下一篇: 没有了