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

张开发
2026/4/16 9:55:00 15 分钟阅读

分享文章

从Java转行大模型应用,Agent应用开发,Function Calling学习
一、Function Calling 介绍Function Calling函数调用是大语言模型LLM的一项核心能力允许模型根据用户的自然语言需求自动判断是否需要调用外部工具如API、数据库、计算器等并按照指定格式生成工具调用指令待工具返回结果后再将结果整合为自然语言回答反馈给用户。简单来说Function Calling 打破了大语言模型“只靠自身知识库回答”的局限让模型从“被动应答”变成“主动调用工具解决问题”极大拓展了模型的应用边界——比如模型无法直接获取实时天气、查询数据库数据、调用第三方服务通过Function Calling 就能联动这些外部资源实现更精准、更具实用性的回答。核心价值解决大语言模型“知识滞后”无法实时更新信息、“能力有限”无法完成复杂计算、数据查询的问题让LLM成为连接自然语言与外部工具的“桥梁”。二、Function Calling 简单理解用“生活化场景”类比Function Calling 就像“你请了一个助手你只需要告诉助手想做什么助手会自己判断要不要找其他工具帮忙做完后再把结果告诉你”。举3个通俗例子快速理解你问“今天北京的天气怎么样”—— 助手LLM判断自己没有实时天气数据就调用“天气API”工具获取到北京今日天气后整理成“今天北京晴气温10-22℃微风”的自然语言回答。你问“我们公司上个月的销售额是多少”—— 助手判断需要查询公司数据库就调用“数据库查询函数”从数据库中提取销售额数据再反馈给你。你问“把我手机里的通讯录导出为Excel文件”—— 助手调用“手机通讯录API”和“Excel生成工具”完成操作后告知你“已导出文件保存路径为XXX”。核心逻辑简化版用户提问 → 模型判断“是否需要调用工具” → 若需要生成工具调用指令 → 工具执行并返回结果 → 模型整合结果给出自然语言回答。三、Function Calling 的原理解析Function Calling 的核心是“模型的决策能力”“标准化的工具调用流程”整体可分为4个关键步骤每个步骤环环相扣确保调用准确、高效。步骤1需求解析与判断核心步骤模型接收用户的自然语言提问后首先会进行两件事① 解析用户需求明确“要解决什么问题”② 判断“是否需要调用外部工具”。判断依据有3点一是自身知识库是否有足够信息比如查询“2026年春节日期”模型可直接回答无需调用工具查询“实时股票价格”则需要调用工具二是需求是否需要执行特定操作比如“生成Excel”“调用导航”必须依赖工具三是是否需要获取实时/动态数据比如天气、新闻、实时库存。步骤2函数选择与参数生成若模型判断需要调用工具会进一步① 选择合适的函数比如查询天气选“天气API函数”查询数据库选“数据库查询函数”② 提取需求中的关键信息生成函数所需的参数比如调用天气API需要参数“城市名称”“日期”。这里的关键是“标准化格式”——模型会按照提前约定的格式如JSON生成调用指令确保外部工具能准确识别。例如{ 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个必备条件明确API的调用规则包括API地址、请求方法GET/POST、所需参数必填/可选、返回格式、请求头如API密钥。向模型注册函数告知模型“有哪些可用的API函数”“每个函数的参数要求”让模型知道如何选择和调用。搭建调用桥梁通过代码如Python实现“模型生成调用指令 → 发送请求到API → 接收API返回结果 → 传递给模型”的闭环。2. 实操步骤以Python为例调用天气API步骤1准备API资源获取天气API如聚合数据天气API获取API密钥key明确调用格式API地址http://apis.juhe.cn/simpleWeather/query请求方法GET必填参数city城市名称、keyAPI密钥步骤2向模型注册函数告知模型可用函数及参数示例自然语言描述“可用函数get_weather(city, key)功能查询指定城市的天气参数说明city字符串必填城市名称如‘北京’key字符串必填API密钥返回格式JSON包含天气、气温、风力等信息。”步骤3编写代码实现调用闭环import requests from 大模型SDK import LLM # 导入对应国产模型的SDK如豆包、文心一言 # 1. 初始化模型 llm LLM(api_key你的模型API密钥) # 2. 定义天气API调用函数 def get_weather(city, key): url fhttp://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编写代码实现联动import pymysql from 大模型SDK import LLM # 1. 初始化模型 llm LLM(api_key你的模型API密钥) # 2. 数据库连接函数 def get_db_connection(): return pymysql.connect( hostlocalhost, port3306, userroot, password你的数据库密码, databasetest_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月销售额排名产品A10000元、产品B8000元……”。七、多Function Calling 的使用多Function Calling多函数调用是指模型根据复杂需求同时或先后调用多个不同的工具函数协同完成任务——比如“查询北京天气规划从家到公司的路线”需要同时调用“天气API”和“导航API”两个函数。核心场景复杂任务拆解一个需求需要多个工具协同、多步骤操作先调用A函数获取数据再调用B函数处理数据。1. 多Function Calling 的两种模式模式1并行调用同时调用多个函数适用场景多个函数之间无依赖关系可同时执行提升效率。示例用户提问“查询北京今天的天气和上海的气温”模型可同时调用两个“天气API函数”分别查询北京、上海两个API并行执行最后整合两个结果反馈给用户。模式2串行调用先后调用多个函数适用场景多个函数之间有依赖关系后一个函数的参数需要前一个函数的返回结果。示例用户提问“查询我所在城市的天气然后规划从家到最近的超市的路线”步骤如下调用“定位API”获取用户当前所在城市如“北京”调用“天气API”根据定位结果北京查询当地天气调用“导航API”根据用户位置和“最近超市”的信息规划路线模型整合三个函数的结果反馈给用户。2. 实操要点以串行调用为例import requests from 大模型SDK import LLM # 初始化模型 llm LLM(api_key你的模型API密钥) # 定义3个工具函数定位、天气、导航 def get_location(ip): # 调用定位API根据IP获取城市 url fhttp://apis.juhe.cn/ip/ipNew?ip{ip}key你的定位API密钥 return requests.get(url).json() def get_weather(city): # 调用天气API url fhttp://apis.juhe.cn/simpleWeather/query?city{city}key你的天气API密钥 return requests.get(url).json() def get_route(start, end): # 调用导航API url fhttp://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可根据自身场景个人/企业、垂直行业选择合适的模型。

更多文章