1、什么是 Function Calling?

Function Calling是一种让AI模型请求执行外部函数的结构化通信机制, 是一种让大型语言模型(如GPT)与外部工具、API或你写的代码进行交互的机制。

Function Calling 是大型语言模型(Large Language Model, LLM)生成结构化数据输出的一种特定范式与能力。它并非指在编程语言中直接执行一个函数,而是指:

  • LLM 根据用户提供的自然语言指令(Prompt)和一组预定义的工具(函数)描述,进行推理后,输出一个符合预定模式的、结构化的函数调用请求。

  • 这个请求通常是一个 JSON 对象,明确包含了应调用的函数名称(function name)以及调用该函数所需的参数(arguments)。

它的关键工作流程如下:

  1. 定义与描述:开发者预先向 LLM 提供一系列可供调用的函数(工具)的说明。这些说明包括函数名、功能描述、参数(名称、类型、含义)。

  2. 模型推理与结构化输出:当用户输入一个查询时,LLM 会判断是否需要调用函数、调用哪一个函数,并基于对查询的理解,生成一个包含正确函数名和参数字典的结构化对象。

  3. 外部执行:开发者的应用程序接收到这个结构化对象后,在其自身的、安全的执行环境中(而非在 LLM 内部)实际执行对应的函数代码,例如调用外部 API、查询数据库或执行计算。

  4. 结果整合与回复:函数执行的结果被返回给 LLM。LLM 利用这个结果信息,组织并生成最终面向用户的自然语言回复。

2、Function Calling 的作用

Function Calling 的核心作用在于将 LLM 的通用语言理解和生成能力,与外部系统的确定性和执行力相结合,从而构建出功能强大且可靠的 AI 应用。其具体作用可归纳为以下几点:

  1. 工具集成与能力扩展
    LLM 本身是一个基于参数化知识的模型,无法感知实时信息或执行具体动作。Function Calling 充当了 LLM 与外部工具和 API 之间的 “适配器” 。通过它,LLM 可以获得:

    • 实时数据获取能力:如查询天气、股价、新闻。

    • 系统交互能力:如操作数据库、发送邮件、管理日历。

    • 特定计算能力:如执行专业计算、图像处理等 LLM 不擅长的任务。

  2. 实现确定性与可靠性
    直接让 LLM 生成代码或数据(如 JSON)可能存在格式错误或幻觉。Function Calling 强制 LLM 输出一个高度结构化的模式。这极大地提升了输出的可靠性和一致性,使得下游程序能够稳定地解析和执行,避免了从非结构化文本中提取信息的复杂性和不确定性。

  3. 构建复杂代理(Agent)的基石
    在 AI Agent 的架构中,Function Calling 是 Agent 进行 “思考-行动-观察” 循环的核心机制。Agent 通过多次 Function Calling 串联起复杂的任务流程,例如先搜索信息,再进行处理,最后保存结果,从而实现多步骤任务的自动化。

  4. 标准化人机交互接口
    它将模糊、多样的用户自然语言指令,转化为明确、可编程的函数调用指令。这为构建以 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 从一位被动的、无所不知的“博学者”,转变为一个主动的、能够与世界交互的“智能代理”。

回顾全文,我们可以提炼出三个核心要点:

  1. 核心价值是“连接”:Function Calling 的本质,是在 LLM 的“思考”世界与外部工具的“行动”世界之间,架起了一座结构化的桥梁。它将模型的语义理解能力,转化为可编程、可执行的精确指令。

  2. 工作流程是“协作”:它建立了一个高效的“人机协同”闭环。模型负责理解意图与规划,外部程序负责可靠执行,最后再由模型将结果转化为人类可读的回复。这是一个思考、行动、再思考的智能循环。

  3. 未来方向是“智能体(Agent)”:你模拟的 Agent 调用多个函数的场景,正是 Function Calling 最激动人心的应用。它是构建能够自主完成复杂任务的 AI 智能体的基石,让 AI 不再是简单的聊天机器人,而是能够真正融入我们工作流、成为提升效率的得力助手。

总而言之,Function Calling 将 LLM 从一个卓越的“文本生成器”,解放成了一个强大的“操作系统接口”。它解锁了 AI 应用的无限可能,让我们能够将模型的通用智能,注入到每一个我们需要的具体场景中。

理解了 Function Calling,你就掌握了开启下一代 AI 应用大门的钥匙。现在,是时候将这个概念付诸实践,去构建那些曾经只存在于想象中的智能程序了。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐