人工智能基础知识笔记二十一:Function Calling

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,如下:

python 复制代码
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

要想直接调用,可以参考如下:

python 复制代码
add.invoke({"a": 1, "b": 2})

3.2、 和llm绑定

python 复制代码
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 的值如下:

bash 复制代码
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、 测试绑定结果

python 复制代码
question = "what is 1 plus 1, and what is 2 multiplied by 3?"
response = llm_with_tools.invoke(question)
print(response)

得到结果如下:

bash 复制代码
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查询最新的股票信息:

bash 复制代码
# 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?")

运行的结果如下:

运行时,如果遇到证书无效的错误,可以添加如下代码,消除错误:

python 复制代码
import os
import urllib3

os.environ['TAVILY_VERIFY_SSL'] = 'False'

5、模拟Agent从function tool列表中选择function

首先、定义function tool的列表,并且将tool的列表和llm绑定,

python 复制代码
# 定义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)

其次,可以使用代码测试一下绑定结果:

python 复制代码
query = "what is 2 add 3?"
response = llm_with_tools.invoke( query)
print(response.tool_calls)

显示如下结果,表明绑定是成功的。

bash 复制代码
[{'name': 'add', 'args': {'a': 2, 'b': 3}, 'id': 'b219dc81-fd9f-4a17-9350-1b754ee18a06', 'type': 'tool_call'}]

接着,使用HumanMessage直接调用llm_with_tools,获取绑定的工具:

python 复制代码
from langchain_core.messages import HumanMessage
query = "what is 2 add 3?"

messages = [HumanMessage(content=query)]

# 这一段是测试 message调用的是什么tool
tool_calls = llm_with_tools.invoke( messages).tool_calls
print(response.tool_calls)

# 将LLM调用的结果添加到messages的列表里。
ai_message = llm_with_tools.invoke( messages)
messages.append(ai_message)

然后,模拟Agent通过消息的获取的tool的名字,找到相关的工具:

python 复制代码
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获取最后的结果:

python 复制代码
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 应用大门的钥匙。现在,是时候将这个概念付诸实践,去构建那些曾经只存在于想象中的智能程序了。

相关推荐
NAGNIP13 小时前
一文搞懂深度学习中的通用逼近定理!
人工智能·算法·面试
冬奇Lab15 小时前
一天一个开源项目(第36篇):EverMemOS - 跨 LLM 与平台的长时记忆 OS,让 Agent 会记忆更会推理
人工智能·开源·资讯
冬奇Lab15 小时前
OpenClaw 源码深度解析(一):Gateway——为什么需要一个"中枢"
人工智能·开源·源码阅读
AngelPP18 小时前
OpenClaw 架构深度解析:如何把 AI 助手搬到你的个人设备上
人工智能
宅小年18 小时前
Claude Code 换成了Kimi K2.5后,我再也回不去了
人工智能·ai编程·claude
九狼19 小时前
Flutter URL Scheme 跨平台跳转
人工智能·flutter·github
ZFSS19 小时前
Kimi Chat Completion API 申请及使用
前端·人工智能
天翼云开发者社区20 小时前
春节复工福利就位!天翼云息壤2500万Tokens免费送,全品类大模型一键畅玩!
人工智能·算力服务·息壤
知识浅谈20 小时前
教你如何用 Gemini 将课本图片一键转为精美 PPT
人工智能
Ray Liang20 小时前
被低估的量化版模型,小身材也能干大事
人工智能·ai·ai助手·mindx