人工智能基础知识笔记二十一:Function Calling
FunctionCalling是一种让AI模型通过结构化请求调用外部函数的机制,使大型语言模型(LLM)能与工具、API或代码交互。它通过定义函数描述、模型推理生成结构化请求、外部执行和结果整合四个步骤工作,扩展了LLM的实时数据获取、系统交互等能力,确保输出的确定性和可靠性。开发者可使用@tool装饰器定义函数,将其与LLM绑定,并通过消息传递模拟Agent选择和执行函数。LangChain等工
1、什么是 Function Calling?
Function Calling是一种让AI模型请求执行外部函数的结构化通信机制, 是一种让大型语言模型(如GPT)与外部工具、API或你写的代码进行交互的机制。
Function Calling 是大型语言模型(Large Language Model, LLM)生成结构化数据输出的一种特定范式与能力。它并非指在编程语言中直接执行一个函数,而是指:
-
LLM 根据用户提供的自然语言指令(Prompt)和一组预定义的工具(函数)描述,进行推理后,输出一个符合预定模式的、结构化的函数调用请求。
-
这个请求通常是一个 JSON 对象,明确包含了应调用的函数名称(
function name)以及调用该函数所需的参数(arguments)。
它的关键工作流程如下:
-
定义与描述:开发者预先向 LLM 提供一系列可供调用的函数(工具)的说明。这些说明包括函数名、功能描述、参数(名称、类型、含义)。
-
模型推理与结构化输出:当用户输入一个查询时,LLM 会判断是否需要调用函数、调用哪一个函数,并基于对查询的理解,生成一个包含正确函数名和参数字典的结构化对象。
-
外部执行:开发者的应用程序接收到这个结构化对象后,在其自身的、安全的执行环境中(而非在 LLM 内部)实际执行对应的函数代码,例如调用外部 API、查询数据库或执行计算。
-
结果整合与回复:函数执行的结果被返回给 LLM。LLM 利用这个结果信息,组织并生成最终面向用户的自然语言回复。
2、Function Calling 的作用
Function Calling 的核心作用在于将 LLM 的通用语言理解和生成能力,与外部系统的确定性和执行力相结合,从而构建出功能强大且可靠的 AI 应用。其具体作用可归纳为以下几点:
-
工具集成与能力扩展
LLM 本身是一个基于参数化知识的模型,无法感知实时信息或执行具体动作。Function Calling 充当了 LLM 与外部工具和 API 之间的 “适配器” 。通过它,LLM 可以获得:-
实时数据获取能力:如查询天气、股价、新闻。
-
系统交互能力:如操作数据库、发送邮件、管理日历。
-
特定计算能力:如执行专业计算、图像处理等 LLM 不擅长的任务。
-
-
实现确定性与可靠性
直接让 LLM 生成代码或数据(如 JSON)可能存在格式错误或幻觉。Function Calling 强制 LLM 输出一个高度结构化的模式。这极大地提升了输出的可靠性和一致性,使得下游程序能够稳定地解析和执行,避免了从非结构化文本中提取信息的复杂性和不确定性。 -
构建复杂代理(Agent)的基石
在 AI Agent 的架构中,Function Calling 是 Agent 进行 “思考-行动-观察” 循环的核心机制。Agent 通过多次 Function Calling 串联起复杂的任务流程,例如先搜索信息,再进行处理,最后保存结果,从而实现多步骤任务的自动化。 -
标准化人机交互接口
它将模糊、多样的用户自然语言指令,转化为明确、可编程的函数调用指令。这为构建以 LLM 为“大脑”的应用程序提供了一个清晰、标准的交互协议,使得业务逻辑与 AI 模型能够高效、解耦地协作。
3、如何创建Function Calling
3.1、 Function Calling 的定义
需要import tool和定义函数的时候使用@tool,如下:
from langchain_core.tools import tool
@tool
def add(a:int, b:int)->int:
"""
add two numbers together
Args:
a: First number
b: Second number
"""
return a + b
@tool
def multiply(a:int, b:int)->int:
"""
multiply two numbers together
Args:
a: First number
b: Second number
"""
return a * b
定义之后,可以查看它们的属性如下:

通过@tool定义函数之后,就不能再直接调用函数了,例如:调用add函数如下:

TypeError: 'StructuredTool' object is not callable
要想直接调用,可以参考如下:
add.invoke({"a": 1, "b": 2})
3.2、 和llm绑定
from langchain_ollama import ChatOllama
base_url = "http://localhost:11434"
model = 'llama3.2'
llm = ChatOllama(base_url=base_url, model=model)
tools = [add, multiply]
llm_with_tools = llm.bind_tools(tools=tools)
可以打印llm_with_tools 的值如下:
RunnableBinding(bound=ChatOllama(model='llama3.2', base_url='http://localhost:11434'), kwargs={'tools': [{'type': 'function', 'function': {'name': 'add', 'description': 'add two numbers together\n\nArgs:\n a: First number\n b: Second number', 'parameters': {'properties': {'a': {}, 'b': {}}, 'required': ['a', 'b'], 'type': 'object'}}}, {'type': 'function', 'function': {'name': 'multiply', 'description': 'multiply two numbers together\n\nArgs:\n a: First number\n b: Second number', 'parameters': {'properties': {'a': {}, 'b': {}}, 'required': ['a', 'b'], 'type': 'object'}}}]}, config={}, config_factories=[])
3.3、 测试绑定结果
question = "what is 1 plus 1, and what is 2 multiplied by 3?"
response = llm_with_tools.invoke(question)
print(response)
得到结果如下:
content='' additional_kwargs={} response_metadata={'model': 'llama3.2', 'created_at': '2025-11-30T02:04:36.5066004Z', 'done': True, 'done_reason': 'stop', 'total_duration': 4183653400, 'load_duration': 39012900, 'prompt_eval_count': 262, 'prompt_eval_duration': 86883500, 'eval_count': 44, 'eval_duration': 4056614000, 'logprobs': None, 'model_name': 'llama3.2', 'model_provider': 'ollama'} id='lc_run--5ec229ab-d423-48ac-9f42-b61a03febb93-0' tool_calls=[{'name': 'add', 'args': {'a': '1', 'b': '1'}, 'id': '8718f689-148f-4a9a-8a8d-d0ce899127fe', 'type': 'tool_call'}, {'name': 'multiply', 'args': {'a': '2', 'b': '3'}, 'id': 'd3d65732-79a6-4161-9f58-ce038510610f', 'type': 'tool_call'}] usage_metadata={'input_tokens': 262, 'output_tokens': 44, 'total_tokens': 306}
可以看到根据question 自动找到了两个function:add和multiply。
4、如何调用langchain提供的function
在https://docs.langchain.com/oss/python/integrations/tools 列出了langchain提供的很多tools,最常用的Search有关的tool如下:

有免费的和收费的。 可以使用这些Search工具查询互联网上的最新信息。
例如,使用Tavily Search查询最新的股票信息:
# pip install langchain_tavily
from langchain_tavily import TavilySearch
tavily_search = TavilySearch(
max_results=5,
topic="general",
# include_answer=False,
# include_raw_content=False,
# include_images=False,
# include_image_descriptions=False,
# search_depth="basic",
# time_range="day",
# include_domains=None,
# exclude_domains=None
)
tavily_search.invoke("What is today's stock market news?")
运行的结果如下:

运行时,如果遇到证书无效的错误,可以添加如下代码,消除错误:
import os
import urllib3
os.environ['TAVILY_VERIFY_SSL'] = 'False'
5、模拟Agent从function tool列表中选择function
首先、定义function tool的列表,并且将tool的列表和llm绑定,
# 定义Function的列表
tools = [tavily_search, multiply, add]
list_of_tools = { tool.name: tool for tool in tools}
# 将function的列表和llm绑定
from langchain_ollama import ChatOllama
base_url = "http://localhost:11434"
model = 'llama3.2'
llm = ChatOllama(base_url=base_url, model=model)
llm_with_tools = llm.bind_tools(tools)
其次,可以使用代码测试一下绑定结果:
query = "what is 2 add 3?"
response = llm_with_tools.invoke( query)
print(response.tool_calls)
显示如下结果,表明绑定是成功的。
[{'name': 'add', 'args': {'a': 2, 'b': 3}, 'id': 'b219dc81-fd9f-4a17-9350-1b754ee18a06', 'type': 'tool_call'}]
接着,使用HumanMessage直接调用llm_with_tools,获取绑定的工具:
from langchain_core.messages import HumanMessage
query = "what is 2 add 3?"
messages = [HumanMessage(content=query)]
tool_calls = llm_with_tools.invoke( messages).tool_calls
print(response.tool_calls)
messages.append(tool_calls)
然后,模拟Agent通过消息的获取的tool的名字,找到相关的工具:
for tool_call in ai_message.tool_calls:
name = tool_call['name'].lower()
selected_tool = list_of_tools[name]
tool_message = selected_tool.invoke(tool_call)
messages.append(tool_message)
最后,根据找到的工具再次调用llm获取最后的结果:
response = llm_with_tools.invoke(messages)
print(response.content)
最终的结果显示如下:

6、总结
通过以上的探讨,我们可以看到,Function Calling 远不止是大型语言模型的一个“特性”,它是一次深刻的范式转变。它标志着 AI 从一位被动的、无所不知的“博学者”,转变为一个主动的、能够与世界交互的“智能代理”。
回顾全文,我们可以提炼出三个核心要点:
-
核心价值是“连接”:Function Calling 的本质,是在 LLM 的“思考”世界与外部工具的“行动”世界之间,架起了一座结构化的桥梁。它将模型的语义理解能力,转化为可编程、可执行的精确指令。
-
工作流程是“协作”:它建立了一个高效的“人机协同”闭环。模型负责理解意图与规划,外部程序负责可靠执行,最后再由模型将结果转化为人类可读的回复。这是一个思考、行动、再思考的智能循环。
-
未来方向是“智能体(Agent)”:你模拟的 Agent 调用多个函数的场景,正是 Function Calling 最激动人心的应用。它是构建能够自主完成复杂任务的 AI 智能体的基石,让 AI 不再是简单的聊天机器人,而是能够真正融入我们工作流、成为提升效率的得力助手。
总而言之,Function Calling 将 LLM 从一个卓越的“文本生成器”,解放成了一个强大的“操作系统接口”。它解锁了 AI 应用的无限可能,让我们能够将模型的通用智能,注入到每一个我们需要的具体场景中。
理解了 Function Calling,你就掌握了开启下一代 AI 应用大门的钥匙。现在,是时候将这个概念付诸实践,去构建那些曾经只存在于想象中的智能程序了。
更多推荐



所有评论(0)