掘金 人工智能 08月07日
LangGraph构建Ai智能体-3-智能体调用工具
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文深入探讨了大模型(LLM)如何通过Tool Calls(function_calling)与外部工具进行交互。文章首先介绍了大模型本身无法直接调用工具,但可以通过工具描述来识别用户需求,并生成包含工具名称和参数的AIMessage。应用程序接收到此消息后,需自行执行工具任务并将结果反馈给大模型,这一过程即为Tool Call。文中通过查询天气和获取用户信息的实际代码示例,详细展示了从环境配置、工具定义、大模型绑定、工作流构建到结果输出的完整流程,清晰地阐述了Tool Calls机制的实现原理和应用方式。

💡 Tool Calls(function_calling)是实现大模型与外部工具交互的关键机制。大模型本身不具备执行外部操作的能力,但通过预先定义的工具描述,可以理解用户意图,并生成调用特定工具的指令(包含工具名称和参数)。

⚙️ 应用程序在接收到大模型生成的Tool Call指令后,需要负责执行相应的工具函数,并将执行结果(如查询到的天气信息或用户信息)反馈给大模型。这个闭环的交互过程使得大模型能够获取和利用外部世界的实时数据和功能。

🌦️ 以查询天气为例,文章展示了完整的Tool Call流程:首先配置环境变量和模型,然后定义一个接受地理位置参数的`get_weather`工具。通过Langgraph框架构建工作流,将用户输入传递给大模型,大模型识别出需要调用`get_weather`工具,并将包含工具调用信息的AIMessage返回。应用程序捕获此消息,执行`get_weather`工具,并将天气结果整合回大模型的响应中。

👤 模拟Tool Call的第二个示例则展示了如何直接构建一个包含Tool Call信息的AIMessage,并将其传递给`ToolNode`来执行预定义的`get_user_profile`工具。这个过程模拟了真实场景下大模型生成Tool Call指令的中间状态,有助于理解和测试工具节点的处理逻辑,以及工具执行后的`ToolMessage`格式。

🛠️ 整个Tool Calls的流程强调了应用程序在其中的桥梁作用:接收大模型的指令,执行工具,并将结果反馈,从而扩展了大模型的应用场景,使其能够处理更复杂、更依赖外部数据的任务。

前言

智能体必须能够与外界交互,我们此处介绍tool_calls(function_calling)的方式。

大模型本身是不能调用任何工具的,但是当我们给大模型增加一些工具的描述时,大模型会根据用户的问题来确认是不是需要外部工具,如果需要调用外部工具的话,就会把需要调用的工具名字和具体参数作为一个AIMessage的tool_calls参数返回给应用程序,应用程序收到后,需要自行执行相应的任务,并把任务结果告诉大模型,这个过程称之为tool_call。

具体流程如下

环境

见前文

查询天气的示例

我们给大模型配置了查询天气的工具,当我们询问某地区的天气时,看下大模型是怎么处理的

步骤

    加载环境变量定义工具和工具节点创建大模型并绑定工具定义工作流
      大模型调用节点,需要处理返回的AI消息中的tool_callstool_calls交给工具节点处理,然把结果返回
    用户输入并询问大模型输出结果
# 调用工具from dotenv import load_dotenvimport osfrom langchain_openai import ChatOpenAIfrom langgraph.graph import StateGraph, START, END, MessageGraph, MessagesStatefrom langchain_core.tools import toolfrom langgraph.prebuilt import ToolNode#1. 加载环境变量load_dotenv()base_url = os.getenv("BASE_URL")openai_api_key = os.getenv("OPENAI_API_KEY")model_name = "qwen-plus"#2. 定义工具和工具节点# Define a tool to get the weather for a city@tooldef get_weather(location: str):    """Fetch the current weather for a specific location."""    weather_data = {        "San Francisco": "Its 60 degrees and foggy.",        "New York": "Its 90 degrees and sunny.",        "London": "Its 70 degrees and cloudy.",        "上海": "晴天 20摄氏度",        "北京": "大雨 10摄氏度",    }    return weather_data.get(location, "无法获取当地天气状况")# 错误传播出来tool_node = ToolNode([get_weather], handle_tool_errors=False)#3. 创建大模型并绑定工具model = ChatOpenAI(    base_url=base_url, api_key=openai_api_key, model=model_name).bind_tools([get_weather])# 4. 定义工作流def call_llm(state: MessagesState):    messages = state["messages"]    response = model.invoke(messages[-1].content)    # 是否 toolcall    if response.tool_calls:        tool_result = tool_node.invoke({"messages": [response]})        tool_message = tool_result["messages"][-1].content        response.content += f"\nTool Result:{tool_message}"    return {"messages": [response]}workflow = StateGraph(MessagesState)workflow.add_node("call_llm", call_llm)workflow.add_edge(START, "call_llm")workflow.add_edge("call_llm", END)app = workflow.compile()# 持续对话def interact_with_agent():    while True:        # 5. 用户输入并询问大模型        user_input = input("You: ")        if user_input.lower() in ["exit", "quit", "q"]:            print("结束对话")            break        input_message = {"messages": [("human", user_input)]}        for chunk in app.stream(input_message, stream_mode="values"):            # 6. 输出结果            chunk["messages"][-1].pretty_print()interact_with_agent()

输出结果

You: London 天气如何================================ Human Message =================================London 天气如何================================== Ai Message ==================================Tool Result:Its 70 degrees and cloudy.Tool Calls:  get_weather (call_1b89d3f1afe94be3bfc020) Call ID: call_1b89d3f1afe94be3bfc020  Args:    location: LondonYou: 上海天气怎么样================================ Human Message =================================上海天气怎么样================================== Ai Message ==================================Tool Result:晴天 20摄氏度Tool Calls:  get_weather (call_f05384e466f84037b4cb81) Call ID: call_f05384e466f84037b4cb81  Args:    location: 上海You: 北京天气呢================================ Human Message =================================北京天气呢================================== Ai Message ==================================Tool Result:大雨 10摄氏度Tool Calls:  get_weather (call_00cae603cea84dacb4cfaf) Call ID: call_00cae603cea84dacb4cfaf  Args:    location: 北京You: exit结束对话

ToolCall 的原理模拟示例

上面的示例是大模型直接返回的tool_calls参数,我们也可以直接模拟这一行为,用于演示原理或者测试我们自己的工具。

下面我们将创建一个获取用户信息的工具,然后创建一个带tool_calls的AIMessage,来调用工具节点

步骤

    加载环境定义工具和工具节点定义AiMessage调用工具节点输出结果
# 调用工具from dotenv import load_dotenvimport osfrom langchain_openai import ChatOpenAIfrom langgraph.graph import StateGraph, START, END, MessageGraph, MessagesStatefrom langchain_core.tools import toolfrom langchain_core.messages import AIMessagefrom langgraph.prebuilt import ToolNode# 1. 加载环境load_dotenv()base_url = os.getenv("BASE_URL")openai_api_key = os.getenv("OPENAI_API_KEY")model_name = "qwen-plus"# 2. 定义工具和工具节点# Define a tool to get the weather for a city@tooldef get_user_profile(user_id: str):    """通过user_id获取用户信息"""    weather_data = {        "101": {"name": "爱丽丝", "年龄": 30, "location": "纽约"},        "102": {"name": "Bob", "age": 25, "location": "旧金山"},    }    return weather_data.get(user_id, "没有此用户")# 工具节点# handle_tool_errors 错误传播出来tool_node = ToolNode([get_user_profile], handle_tool_errors=False)# 3. 定义AiMessagemessage_with_tool_call = AIMessage(    content="",    tool_calls=[        {            "name": "get_user_profile",            "args": {"user_id": "101"},            "id": "tool_call_id",            "type": "tool_call",        }    ],)#state = {"messages": [message_with_tool_call]}# 4. 调用工具节点# 直接把消息交给工具节点调用result = tool_node.invoke(state)# 5. 输出结果print(result)

输出结果

{'messages': [ToolMessage(content='{"name": "爱丽丝", "年龄": 30, "location": "纽约"}', name='get_user_profile', tool_call_id='tool_call_id')]}

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

大模型 Tool Calls Langgraph function_calling 智能体
相关文章