☰
随着大语言模型(LLM)的飞速发展,其应用场景已从单纯的文本生成扩展到复杂的任务执行与系统交互
2026/9/30 7:17:20 网站建设 项目流程

随着大语言模型(LLM)的飞速发展,其应用场景已从单纯的文本生成扩展到复杂的任务执行与系统交互。其中,Function Calling(函数调用)技术是连接大模型“大脑”与本地业务逻辑“手脚”的关键桥梁。

本报告将深入探讨如何利用 Python 实现大模型的 Function Calling 机制。我们将通过构建一个模拟的“智能助手”系统,展示模型如何理解用户意图、生成结构化参数,并由 Python 代码执行具体业务逻辑(如查询天气、计算数据),最终将结果回传给模型生成自然语言回复。

二、技术原理与架构

Function Calling 的核心并非模型直接“执行”代码,而是一种意图识别与参数提取的交互模式。其工作流程如下:

  1. 用户输入:用户提出包含特定意图的请求(例如:“帮我查一下北京明天的天气”)。
  2. 模型推理:大模型接收请求及预定义的函数描述(Schema),分析用户意图。如果意图匹配某个函数,模型不会直接回答,而是输出一个包含函数名称和参数的 JSON 结构。
  3. 本地执行:Python 后端解析该 JSON 结构,映射到本地的具体 Python 函数并执行。
  4. 结果回传:Python 将执行结果(如具体的温度数值)作为上下文再次发送给模型。
  5. 最终回复:模型结合上下文和函数执行结果,生成最终的自然语言回答给用户。

这种机制极大地扩展了 LLM 的能力边界,使其能够访问实时数据、操作数据库或控制外部设备。

三、核心代码实现

为了演示这一过程,我们将不依赖特定的商业 API,而是使用 Python 原生库构建一个完整的模拟环境。我们将定义一组工具函数,并模拟模型的决策过程。

3.1 环境准备与工具定义

首先,我们需要定义一组可供模型调用的“工具”。在实际生产中,这些函数可能连接数据库或外部 API,这里我们使用模拟数据。

importjsonimportinspect# 模拟的工具函数库defget_current_weather(location,unit="fahrenheit"):"""获取指定位置的当前天气"""# 模拟业务逻辑:返回硬编码的天气数据weather_data={"beijing":{"temp":22,"condition":"Sunny"},"shanghai":{"temp":26,"condition":"Rainy"},"shenzhen":{"temp":30,"condition":"Cloudy"}}loc=location.lower()iflocinweather_data:returnf"{location}现在的天气是{weather_data[loc]['condition']},气温{weather_data[loc]['temp']}摄氏度。"else:returnf"抱歉,未找到{location}的天气信息。"defcalculate_bmi(weight,height):"""计算BMI指数"""try:bmi=float(weight)/(float(height)**2)returnf"您的BMI指数为:{bmi:.2f}"exceptZeroDivisionError:return"身高不能为零。"defget_stock_price(symbol):"""查询股票价格"""prices={"AAPL":150.23,"TSLA":240.50,"BABA":88.10}symbol=symbol.upper()ifsymbolinprices:returnf"{symbol}当前股价为 ${prices[symbol]}"returnf"未找到{symbol}的股价信息。"# 将函数注册到工具列表中,供模型识别# 在实际应用中,这通常对应 API 的 tools 参数available_functions={"get_current_weather":get_current_weather,"calculate_bmi":calculate_bmi,"get_stock_price":get_stock_price}
3.2 模拟大模型的决策逻辑

由于我们无法在此处直接运行庞大的 LLM,我们将编写一个simulate_llm_decision函数来模拟模型在接收到用户提示词后的行为。它会分析输入,判断是否需要调用工具,并返回标准的 JSON 格式。

defsimulate_llm_decision(user_prompt,available_tools):""" 模拟大模型的决策过程。 在实际场景中,这里是调用 OpenAI / Claude / Qwen 等 API 的地方。 """prompt_lower=user_prompt.lower()# 简单的关键词匹配模拟模型的意图识别能力if"天气"inprompt_loweror"气温"inprompt_lower:# 模拟模型提取参数location="Beijing"# 默认if"北京"inprompt_lower:location="Beijing"elif"上海"inprompt_lower:location="Shanghai"elif"深圳"inprompt_lower:location="Shenzhen"return{"role":"assistant","content":None,"tool_calls":[{"id":"call_12345","type":"function","function":{"name":"get_current_weather","arguments":json.dumps({"location":location,"unit":"celsius"})}}]}elif"bmi"inprompt_loweror"体重"inprompt_lower:return{"role":"assistant","content":None,"tool_calls":[{"id":"call_67890","type":"function","function":{"name":"calculate_bmi","arguments":json.dumps({"weight":70,"height":1.75})}}]}else:# 如果不需要调用工具,直接返回文本回复return{"role":"assistant","content":"你好!我是你的智能助手。我可以帮你查天气、算BMI或查股价。请问有什么可以帮你?"}
3.3 orchestrator(编排器)的实现

这是系统的核心部分,负责协调模型输出与本地代码执行。

defrun_agent(user_message):print(f"用户:{user_message}")print("-"*30)# 1. 获取模型的初步响应response=simulate_llm_decision(user_message,available_functions)# 2. 检查是否有工具调用请求ifresponse.get("tool_calls"):fortool_callinresponse["tool_calls"]:function_name=tool_call["function"]["name"]function_args=json.loads(tool_call["function"]["arguments"])print(f"[系统] 模型决定调用函数:{function_name}")print(f"[系统] 参数:{function_args}")# 3. 执行本地 Python 函数iffunction_nameinavailable_functions:function_to_call=available_functions[function_name]try:# 使用 ** 解包字典作为参数function_response=function_to_call(**function_args)print(f"[系统] 函数执行结果:{function_response}")exceptExceptionase:function_response=f"执行出错:{str(e)}"else:function_response="错误:模型请求了不存在的函数。"# 4. 模型根据结果生成最终回复 (模拟)# 在实际 API 中,我们需要把 function_response 再次发给模型final_reply=f"根据查询结果:{function_response}。请问还有其他需要吗?"print(f"助手:{final_reply}")else:# 无需调用工具,直接输出print(f"助手:{response['content']}")# 测试用例if__name__=="__main__":print("=== 测试场景 1: 查询天气 ===")run_agent("帮我查一下北京现在的天气")print("\n=== 测试场景 2: 计算BMI ===")run_agent("我体重70公斤,身高1.75米,帮我算算BMI")print("\n=== 测试场景 3: 闲聊 ===")run_agent("你好,你是谁?")

四、代码解析与运行结果

上述代码模拟了一个完整的 Agent 运行闭环。

  1. 意图识别:当输入“帮我查一下北京现在的天气”时,simulate_llm_decision识别出关键词,并构造了调用get_current_weather的请求,参数锁定为Beijing。
  2. 参数映射:编排器解析 JSON,将location映射到 Python 函数的参数中。
  3. 业务执行:get_current_weather函数被执行,返回了硬编码的“Sunny, 22°C”数据。
  4. 结果合成:最终输出为:“根据查询结果:北京现在的天气是Sunny,气温22摄氏度。请问还有其他需要吗?”

这种设计模式将**逻辑判断(模型)与数据执行(代码)**解耦,既利用了模型的泛化理解能力,又保证了业务数据的准确性和安全性。

五、技术亮点分析

  1. 解耦与模块化
    该架构最显著的亮点在于将“思考”与“行动”分离。模型不需要知道具体的天气数据存在哪里,也不需要知道如何计算 BMI 的公式,它只需要知道“有一个函数可以查天气”以及“需要传什么参数”。这使得我们可以随时替换底层的 Python 函数实现(例如将硬编码数据改为连接真实的气象 API),而无需重新训练或调整模型提示词。

  2. 结构化输出的稳定性
    通过强制模型输出 JSON 格式的参数,我们解决了传统 NLP 任务中非结构化文本难以解析的痛点。Python 的json.loads可以极其稳定地提取参数,避免了正则表达式提取的脆弱性。

  3. 安全性沙箱
    在 Function Calling 模式下,模型不能随意执行任意代码(如rm -rf /)。它只能调用我们在available_functions中显式注册的函数。这为大模型的应用提供了一道天然的安全防火墙,确保所有操作都在可控范围内。

  4. 上下文感知的增强
    虽然本示例是单轮对话,但该架构天然支持多轮。我们可以将函数的返回结果(如“气温22度”)作为新的消息加入对话历史,模型在下一轮对话中就能“记住”这个信息,从而实现更复杂的推理任务。

六、总结与展望

Function Calling 是大模型从“玩具”走向“工具”的关键一步。通过 Python 强大的生态库,我们可以赋予模型操作文件系统、数据库、网络请求甚至控制硬件的能力。

在未来的开发中,我们可以进一步优化这一流程,例如引入自动重试机制(当模型生成的参数格式错误时自动修正),或者构建函数链(一个函数的输出作为另一个函数的输入),从而构建出更加智能、自主的 AI Agent 系统。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询