从Java转行大模型应用,Agent应用开发,Function Calling学习

一、Function Calling 介绍

Function Calling(函数调用)是大语言模型(LLM)的一项核心能力,允许模型根据用户的自然语言需求,自动判断是否需要调用外部工具(如API、数据库、计算器等),并按照指定格式生成工具调用指令,待工具返回结果后,再将结果整合为自然语言回答反馈给用户。

简单来说,Function Calling 打破了大语言模型"只靠自身知识库回答"的局限,让模型从"被动应答"变成"主动调用工具解决问题",极大拓展了模型的应用边界------比如模型无法直接获取实时天气、查询数据库数据、调用第三方服务,通过Function Calling 就能联动这些外部资源,实现更精准、更具实用性的回答。

核心价值:解决大语言模型"知识滞后"(无法实时更新信息)、"能力有限"(无法完成复杂计算、数据查询)的问题,让LLM成为连接自然语言与外部工具的"桥梁"。

二、Function Calling 简单理解

用"生活化场景"类比,Function Calling 就像"你请了一个助手,你只需要告诉助手想做什么,助手会自己判断要不要找其他工具帮忙,做完后再把结果告诉你"。

举3个通俗例子,快速理解:

  1. 你问:"今天北京的天气怎么样?"------ 助手(LLM)判断自己没有实时天气数据,就调用"天气API"(工具),获取到北京今日天气后,整理成"今天北京晴,气温10-22℃,微风"的自然语言回答。

  2. 你问:"我们公司上个月的销售额是多少?"------ 助手判断需要查询公司数据库,就调用"数据库查询函数",从数据库中提取销售额数据,再反馈给你。

  3. 你问:"把我手机里的通讯录导出为Excel文件"------ 助手调用"手机通讯录API"和"Excel生成工具",完成操作后告知你"已导出,文件保存路径为XXX"。

核心逻辑(简化版):用户提问 → 模型判断"是否需要调用工具" → 若需要,生成工具调用指令 → 工具执行并返回结果 → 模型整合结果,给出自然语言回答。

三、Function Calling 的原理解析

Function Calling 的核心是"模型的决策能力"+"标准化的工具调用流程",整体可分为4个关键步骤,每个步骤环环相扣,确保调用准确、高效。

步骤1:需求解析与判断(核心步骤)

模型接收用户的自然语言提问后,首先会进行两件事:① 解析用户需求,明确"要解决什么问题";② 判断"是否需要调用外部工具"。

判断依据有3点:一是自身知识库是否有足够信息(比如查询"2026年春节日期",模型可直接回答,无需调用工具;查询"实时股票价格",则需要调用工具);二是需求是否需要执行特定操作(比如"生成Excel""调用导航",必须依赖工具);三是是否需要获取实时/动态数据(比如天气、新闻、实时库存)。

步骤2:函数选择与参数生成

若模型判断需要调用工具,会进一步:① 选择合适的函数(比如查询天气选"天气API函数",查询数据库选"数据库查询函数");② 提取需求中的关键信息,生成函数所需的参数(比如调用天气API,需要参数"城市名称""日期")。

这里的关键是"标准化格式"------模型会按照提前约定的格式(如JSON)生成调用指令,确保外部工具能准确识别。例如:

bash 复制代码
{ "function": "get_weather", // 选择的函数名 "parameters": { "city": "北京", // 函数参数1 "date": "2026-04-03" // 函数参数2 } }

步骤3:工具执行与结果返回

模型生成的调用指令会传递给对应的外部工具(API、数据库等),工具接收指令后,执行相应操作,并将结果以标准化格式(如JSON、文本)返回给模型。

示例:天气API接收上述指令后,返回结果:{"city":"北京","date":"2026-04-03","weather":"晴","temperature":"10-22℃","wind":"微风"}。

步骤4:结果整合与自然语言反馈

模型接收工具返回的结果后,会对结果进行解析、整理,再结合用户的原始需求,生成流畅、易懂的自然语言回答,避免直接返回工具的原始数据(降低用户理解成本)。

补充:若一次调用无法满足需求(比如参数缺失、结果不完整),模型会进行"多轮调用"------比如用户问"北京未来3天的天气",模型第一次调用获取到3天天气数据,若数据不完整,会再次调用工具补充,直至满足需求。

四、Function Calling 支持的国产模型介绍

目前国内主流大语言模型均已支持Function Calling 能力,各模型在适配性、易用性上各有侧重,以下是常用国产模型的核心信息(按市场关注度排序):

1. 字节跳动 豆包(Doubao)

支持能力:全面支持Function Calling,可联动API、数据库、本地工具,支持多函数并行调用、多轮调用,适配中文场景,对复杂需求的解析准确率高。

优势:接入门槛低,提供清晰的调用文档和示例,支持自定义函数注册,适合企业和个人开发者快速上手,与字节系生态(如飞书、火山引擎)联动性强。

2. 百度 文心一言(ERNIE)

支持能力:支持Function Calling,可调用百度生态内工具(如百度地图API、百度搜索API),也可接入第三方API和数据库,支持函数参数自动补全。

优势:中文语义理解能力强,针对垂直行业(如金融、医疗)有定制化的Function Calling 解决方案,适合企业级场景。

3. 阿里云 通义千问(Qwen)

支持能力:支持Function Calling,支持多函数调用、参数校验,可接入阿里云生态工具(如OSS、RDS数据库),也支持自定义外部工具。

优势:性能稳定,支持高并发调用,适合需要大规模部署的企业场景,提供完善的开发者工具和调试环境。

4. 华为 盘古大模型

支持能力:支持Function Calling,侧重工业、政务等垂直领域的工具联动,可调用工业传感器、政务数据库等专用工具。

优势:在工业场景的适配性强,支持私有化部署,数据安全性高,适合工业企业、政务部门使用。

5. 科大讯飞 星火大模型

支持能力:支持Function Calling,可联动讯飞生态工具(如语音转写API、OCR工具),也可接入第三方API,适合多模态场景(语音+工具调用)。

优势:语音交互与Function Calling 结合紧密,适合需要语音触发工具调用的场景(如智能音箱、车载系统)。

五、Function Calling 调用外部API

调用外部API是Function Calling 最常用的场景之一,核心是"模型生成API调用指令,API执行后返回结果,模型整合反馈",整个流程需遵循"约定格式、参数准确、异常处理"三大原则。

1. 调用前提(3个必备条件)

  1. 明确API的调用规则:包括API地址、请求方法(GET/POST)、所需参数(必填/可选)、返回格式、请求头(如API密钥)。

  2. 向模型注册函数:告知模型"有哪些可用的API函数""每个函数的参数要求",让模型知道如何选择和调用。

  3. 搭建调用桥梁:通过代码(如Python)实现"模型生成调用指令 → 发送请求到API → 接收API返回结果 → 传递给模型"的闭环。

2. 实操步骤(以Python为例,调用天气API)

步骤1:准备API资源

获取天气API(如聚合数据天气API),获取API密钥(key),明确调用格式:

API地址:http://apis.juhe.cn/simpleWeather/query

请求方法:GET

必填参数:city(城市名称)、key(API密钥)

步骤2:向模型注册函数

告知模型可用函数及参数,示例(自然语言描述):

"可用函数:get_weather(city, key),功能:查询指定城市的天气;参数说明:city(字符串,必填,城市名称,如'北京'),key(字符串,必填,API密钥);返回格式:JSON,包含天气、气温、风力等信息。"

步骤3:编写代码,实现调用闭环
python 复制代码
import requests
from 大模型SDK import LLM  # 导入对应国产模型的SDK(如豆包、文心一言)

# 1. 初始化模型
llm = LLM(api_key="你的模型API密钥")

# 2. 定义天气API调用函数
def get_weather(city, key):
    url = f"http://apis.juhe.cn/simpleWeather/query?city={city}&key={key}"
    response = requests.get(url)
    return response.json()  # 返回API结果

# 3. 用户提问
user_question = "查询北京今天的天气"

# 4. 模型生成调用指令
response = llm.chat(
    messages=[{"role": "user", "content": user_question}],
    functions=[{"name": "get_weather", "parameters": {"city": "北京", "key": "你的天气API密钥"}}]
)

# 5. 执行API调用,获取结果
if response["has_function_call"]:
    function_name = response["function_name"]
    parameters = response["parameters"]
    api_result = get_weather(**parameters)  # 执行API调用

# 6. 模型整合结果,返回自然语言回答
final_answer = llm.chat(
    messages=[{"role": "user", "content": user_question}, {"role": "function", "content": str(api_result)}]
)

print(final_answer)
3. 注意事项
  • 参数校验:确保模型生成的参数符合API要求(如参数类型、必填项),避免因参数错误导致调用失败。

  • 异常处理:处理API调用失败(如网络错误、密钥失效)的情况,让模型能重新调用或告知用户问题。

  • 格式统一:模型生成的调用指令和API返回结果,需采用统一格式(如JSON),便于模型解析。

六、Function Calling 进行数据库操作

Function Calling 可直接联动数据库(如MySQL、PostgreSQL、SQL Server),实现"自然语言提问 → 模型生成SQL语句 → 执行SQL → 返回查询结果 → 自然语言反馈",无需用户手动编写SQL,适合非技术人员查询数据库数据。

1. 核心优势

无需掌握SQL语法,通过自然语言即可查询数据库;模型可自动判断查询需求,生成正确的SQL语句,避免语法错误;支持多表关联、条件查询、排序等复杂操作。

2. 实操步骤(以MySQL为例)

步骤1:准备数据库资源

搭建MySQL数据库,创建数据表(如"sales"表,包含字段:id、product、sales_amount、sale_date),插入测试数据,获取数据库连接信息(主机、端口、用户名、密码、数据库名)。

步骤2:向模型注册数据库操作函数

告知模型可用函数(如查询、新增、修改、删除),示例:

"可用函数:query_database(sql),功能:执行SQL查询语句,返回查询结果;参数说明:sql(字符串,必填,合法的MySQL查询语句);注意:仅允许执行SELECT查询语句,禁止执行DELETE、UPDATE等危险操作。"

步骤3:编写代码,实现联动
python 复制代码
import pymysql
from 大模型SDK import LLM

# 1. 初始化模型
llm = LLM(api_key="你的模型API密钥")

# 2. 数据库连接函数
def get_db_connection():
    return pymysql.connect(
        host="localhost",
        port=3306,
        user="root",
        password="你的数据库密码",
        database="test_db"
    )

# 3. 数据库查询函数
def query_database(sql):
    conn = get_db_connection()
    cursor = conn.cursor(pymysql.cursors.DictCursor)
    try:
        cursor.execute(sql)
        result = cursor.fetchall()  # 获取查询结果
        return result
    finally:
        cursor.close()
        conn.close()

# 4. 用户提问(自然语言)
user_question = "查询2026年3月的产品销售额,按销售额从高到低排序"

# 5. 模型生成SQL语句(调用query_database函数)
response = llm.chat(
    messages=[{"role": "user", "content": user_question}],
    functions=[{"name": "query_database", "parameters": {"sql": "SELECT product, sales_amount FROM sales WHERE sale_date LIKE '2026-03-%' ORDER BY sales_amount DESC"}}]
)

# 6. 执行SQL查询,获取结果
if response["has_function_call"]:
    sql = response["parameters"]["sql"]
    db_result = query_database(sql)

# 7. 模型整合结果,返回自然语言回答
final_answer = llm.chat(
    messages=[{"role": "user", "content": user_question}, {"role": "function", "content": str(db_result)}]
)

print(final_answer)

3. 关键注意事项

  • 权限控制:限制数据库操作权限,仅允许模型执行查询(SELECT)操作,禁止执行DELETE、UPDATE、DROP等危险操作,避免数据泄露或损坏。

  • SQL校验:在执行模型生成的SQL语句前,添加校验逻辑,确保SQL语句合法、无注入风险(如过滤特殊字符)。

  • 结果解析:模型需能解析数据库返回的结构化数据(如列表、字典),并整理成易懂的自然语言(如"2026年3月销售额排名:产品A(10000元)、产品B(8000元)......")。

七、多Function Calling 的使用

多Function Calling(多函数调用)是指模型根据复杂需求,同时或先后调用多个不同的工具函数,协同完成任务------比如"查询北京天气+规划从家到公司的路线",需要同时调用"天气API"和"导航API"两个函数。

核心场景:复杂任务拆解(一个需求需要多个工具协同)、多步骤操作(先调用A函数获取数据,再调用B函数处理数据)。

1. 多Function Calling 的两种模式

模式1:并行调用(同时调用多个函数)

适用场景:多个函数之间无依赖关系,可同时执行,提升效率。

示例:用户提问"查询北京今天的天气和上海的气温",模型可同时调用两个"天气API函数"(分别查询北京、上海),两个API并行执行,最后整合两个结果反馈给用户。

模式2:串行调用(先后调用多个函数)

适用场景:多个函数之间有依赖关系,后一个函数的参数需要前一个函数的返回结果。

示例:用户提问"查询我所在城市的天气,然后规划从家到最近的超市的路线",步骤如下:

  1. 调用"定位API",获取用户当前所在城市(如"北京");

  2. 调用"天气API",根据定位结果(北京)查询当地天气;

  3. 调用"导航API",根据用户位置和"最近超市"的信息,规划路线;

  4. 模型整合三个函数的结果,反馈给用户。

2. 实操要点(以串行调用为例)

python 复制代码
import requests
from 大模型SDK import LLM

# 初始化模型
llm = LLM(api_key="你的模型API密钥")

# 定义3个工具函数(定位、天气、导航)
def get_location(ip):
    # 调用定位API,根据IP获取城市
    url = f"http://apis.juhe.cn/ip/ipNew?ip={ip}&key=你的定位API密钥"
    return requests.get(url).json()

def get_weather(city):
    # 调用天气API
    url = f"http://apis.juhe.cn/simpleWeather/query?city={city}&key=你的天气API密钥"
    return requests.get(url).json()

def get_route(start, end):
    # 调用导航API
    url = f"http://apis.juhe.cn/navigation/route?start={start}&end={end}&key=你的导航API密钥"
    return requests.get(url).json()

# 用户提问
user_question = "查询我所在城市的天气,然后规划从家到最近的超市的路线"

# 第一步:调用定位API,获取城市
response1 = llm.chat(
    messages=[{"role": "user", "content": user_question}],
    functions=[{"name": "get_location", "parameters": {"ip": "用户当前IP"}}]
)
location_result = get_location(**response1["parameters"])
city = location_result["result"]["city"]

# 第二步:调用天气API,根据城市查询天气
response2 = llm.chat(
    messages=[{"role": "user", "content": user_question}, {"role": "function", "content": str(location_result)}],
    functions=[{"name": "get_weather", "parameters": {"city": city}}]
)
weather_result = get_weather(**response2["parameters"])

# 第三步:调用导航API,规划路线(假设用户位置为定位结果中的详细地址)
start_address = location_result["result"]["address"]
response3 = llm.chat(
    messages=[{"role": "user", "content": user_question}, {"role": "function", "content": str(weather_result)}],
    functions=[{"name": "get_route", "parameters": {"start": start_address, "end": "最近的超市"}}]
)
route_result = get_route(**response3["parameters"])

# 整合所有结果,返回最终回答
final_answer = llm.chat(
    messages=[
        {"role": "user", "content": user_question},
        {"role": "function", "content": str(location_result)},
        {"role": "function", "content": str(weather_result)},
        {"role": "function", "content": str(route_result)}
    ]
)

print(final_answer)

3. 注意事项

  • 依赖管理:明确多个函数之间的依赖关系,确保前一个函数的返回结果能正确传递给后一个函数作为参数。

  • 容错处理:若某个函数调用失败(如定位API失效),模型需能调整策略(如提示用户手动输入城市),避免整个任务失败。

  • 结果整合:模型需能将多个函数的返回结果(可能格式不同)整合为连贯、统一的自然语言回答,避免信息碎片化。

八、学习总结

  1. Function Calling 的核心是"LLM + 外部工具",本质是让模型具备"主动解决问题"的能力,打破自身知识库和能力的局限。

  2. 核心流程:需求解析→函数选择→工具执行→结果整合,关键在于"模型的决策准确性"和"工具调用的标准化"。

  3. 实操重点:无论是调用API还是操作数据库,都需注意"参数准确、权限控制、异常处理";多函数调用需重点关注"依赖关系"和"结果整合"。

  4. 国产模型适配:主流国产模型(豆包、文心一言等)均支持Function Calling,可根据自身场景(个人/企业、垂直行业)选择合适的模型。

相关推荐
Thomas.Sir2 小时前
第十章:RAG知识库开发之【LangSmith 从入门到精通:构建生产级 LLM 应用的全链路可观测性平台】
人工智能·python·langsmith·langchian
tigerlib2 小时前
vscode python环境调试,不能调到环境内部,怎么解决
ide·vscode·python
MediaTea2 小时前
AI 术语通俗词典:矩阵
人工智能·线性代数·矩阵
m0_738120722 小时前
AI安全——Gandalf靶场 Gandalf Adventure 全关卡绕过详解
服务器·人工智能·安全·web安全·ai·prompt
今天又在摸鱼2 小时前
py工程+爬虫
开发语言·python
kobesdu2 小时前
laser_line_extraction线段提取开源功能包解读和使用例程
人工智能·算法·机器人·ros
李松桃2 小时前
Python爬虫-第一课
开发语言·python
清水白石0082 小时前
Python 项目 CI/CD 信心模型:证据驱动部署,从“勇敢上线”到“零风险发版”实战指南
驱动开发·python·ci/cd
NocoBase2 小时前
为 Excel 数据快速构建 Web 应用:4 种方法对比
前端·人工智能·低代码·开源·excel