
Langchain系列[07] 函数 VS 工具 VS Agent
目标
了解 function 调用、工具调用 和 Agent
function:别用了(OpenAI API has deprecated functions in favor of tools)
Tool :能用,但是需要我们自己调用函数,并实现后续逻辑
Agent: 推荐,自动调用我们本地定义的函数
核心思想:通过llms 来识别用户意图并调用本地函数(Agent)
https://python.langchain.com/docs/modules/agents/agent_types/openai_functions_agent
1. function call + tools
大模型的函数调用功能,最早来自OpenAI.
OpenAI 函数是 OpenAI API 中的一个功能,允许用户通过 API 调用自定义函数。这些函数可以是在 Python 中定义的任何函数,可以接受任何类型的输入,并返回任何类型的输出。这使得用户可以扩展 OpenAI 模型的功能,使其能够执行特定的任务或操作。
OpenAI 函数的接收方式如下:
- 首先,用户需要定义一个函数,并将其作为参数传递给 OpenAI API。这个函数可以接受任何类型的输入,并返回任何类型的输出。
- 然后,用户需要将这个函数传递给 OpenAI API 的 functions 参数。这个参数是一个字典,其中键是函数的名称,值是函数本身。
- 当用户调用 OpenAI API 时,他们可以在请求中指定要调用的函数的名称和参数。OpenAI API 会将这个请求转发给相应的函数,并返回函数的输出。
核心思路 我们借用阿里云上一张图来说明一下~

【1】用户描述一个函数调用(通常通过Json Schema 格式的数据构造)
- 函数名称:传给大模型,告诉模型这个函数的名字
- 函数参数:函数有哪些参数,分别是什么意思
1 | function = { |
【2】问题 + 函数描述 传递给模型
1 | # 定义模型,通过bind 方法传递给模型 |
【3】大模型进行识别,告诉用户需要执行函数,并返回输入参数
1 | content='' additional_kwargs={'function_call': |
【4】用户执行函数,并将结果返回给大模型
需要我们自己在代码里处理 如何调用 get_flight_number, 并继续
1 | # 函数名 |
【5】大模型给出最后回答
需要我们自己在代码里处理 ,如何继续处理get_flight_number 结果
问题来了
无论是 Function call 还是 Tool, 用户都要自己调用本地函数处理(硬编码在代码里)。
智谱AI举例 function call 举例
定义一个函数:获得航班号,参数:出发地,目的地,日期
1 | { |
实现这个函数
1 | def get_flight_number(date:str , departure:str , destination:str): |
将 函数 + 用户输入 传给模型
1 | messages = [] |
模型返回
Function(arguments=’{“date”:”2024-01-20”,”departure”:”北京”,”destination”:”上海”}’, name=’get_flight_number’)
1 | content=None role='assistant' tool_calls=[CompletionMessageToolCall(id='call_8513536572832694738', function=Function(arguments='{"date":"2024-01-20","departure":"北京","destination":"上海"}', name='get_flight_number'), type='function')] |
写一个函数,分析这个返回,如果需要执行函数,就执行
1 | def parse_function_call(model_response,messages): |
执行完函数之后,需要把结果反馈给模型。最后,模型给出结果
1 | content='根据您的查询,我已经帮您找到了2024年1月20日从北京出发前往上海的航班,航班号为1234。' role='assistant' tool_calls=None |
然后我们再把结构,保存在对话列表
1 | messages.append(response.choices[0].message.model_dump()) |
在Langchian中调用 function
1 | function = { |
输出
1 | content='' additional_kwargs={'function_call': {'arguments': '{\n "departure": "北京",\n "destination": "南极",\n "date": "2022-03-06"\n}', 'name': 'get_flight_number'}} response_metadata={'finish_reason': 'stop', 'logprobs': None} |
在Langchian中调用 Tool
1 | # 工具调用 |
输出
1 | content='' additional_kwargs={'tool_calls': [{'id': 'call_1lP2S9SFi9FDdhYZNkXVxpqt', 'function': {'arguments': '{\n"departure": "北京",\n"destination": "南极",\n"date": "2022-11-18"\n}', 'name': 'get_flight_number'}, 'type': 'function'}]} response_metadata={'finish_reason': 'tool_calls', 'logprobs': None} |
Agent (全自动)
代理的核心思想是使用语言模型来选择要采取的一系列行动。在链式中,一系列行动是硬编码在代码中的。而在代理中,语言模型被用作推理引擎,以确定要采取哪些行动以及它们的顺序。
函数声明: @tool
1 | from langchain.agents import tool, |
构建chain
1 | user_template = '{input}' |
调用 Agent
1 | tool_list = [get_flight_number] |
结果
1 | > Entering new AgentExecutor chain... |
完整代码
zhipuai function call
1 | import json |
langchain: function call, tool, agent
1 | import json |

