Function Calling编程实践(OpenAI API)

news/2025/11/7 17:25:09/文章来源:https://www.cnblogs.com/LiShengTrip/p/19200394

目录
  • Function Calling编程实践
    • 一、Function Calling概述
      • 1. Function Calling 工作流程概述(OpenAI API)
    • 二、Function Calling实现详解
      • 1. 定义Function Schema
      • 2. 系统提示词设计
      • 3. Function Calling API 调用实现
      • 4. OpenAI客户端配置
    • 三、在客服系统中的集成应用
      • 1. 路由节点实现
      • 2. 在客服工作流中的完整调用链
    • 四、案例流程解析
      • 用户查询处理示例
        • 场景:用户询问订单发货状态

Function Calling编程实践

一、Function Calling概述

在大语言模型(LLM)应用中,Function Calling允许我们以 JSON 格式向 LLM 模型描述预定义函数,并使用模型的固有推理能力来决定在生成响应之前是否调用该函数。模型本身不执行函数,而是生成包含函数名称和执行函数所需的参数的 JSON (注意:模型可能会幻觉参数)。

本文通过一个电商客服系统,以其中的路由智能体RouterAgent通过Function Calling实现智能路由为例子,来加深对Function Calling的理解。

参考文章:
OpenAI function-calling中文文档链接
一篇不错的博客

1. Function Calling 工作流程概述(OpenAI API)

  1. 定义 Function Schema(向模型描述预定义的函数)
  2. 构建系统提示词(指导模型的功能,如何调用函数)
  3. 准备用户消息和上下文
  4. 调用 OpenAI/DeepSeek API 并传入以下参数:
    • messages(系统提示 + 用户消息)
    • tools(function schema 定义)
    • tool_choice="required"(强制调用)
  5. 模型返回 tool_calls 响应
  6. 解析 function 调用参数
  7. 使用解析后的数据进行下一步操作(智能体路由)

二、Function Calling实现详解

1. 定义Function Schema

首先,我们需要为预定义函数(路由功能)定义一个清晰的函数接口规范(向模型描述函数的调用时机,如何调用等):

# 定义function call的schema
self.function_schema = {"name": "route_user_query","description": "将用户查询路由到合适的智能体","parameters": {"type": "object","properties": {"target_agent": {"type": "string","enum": ["order_agent", "product_agent", "after_sales_agent", "promotion_agent", "general_agent", "END"],"description": "目标智能体的名称"},"confidence": {"type": "number","minimum": 0,"maximum": 1,"description": "路由决策的置信度,0到1之间的数值"},"user_intent": {"type": "string","description": "用户意图的简洁总结,便于下游智能体理解"},"original_query": {"type": "string","description": "用户的原始查询内容"}},"required": ["target_agent", "confidence", "user_intent", "original_query"]}
}

核心参数如下:

  • tool_choice:默认情况下,tool_choice 为 tool_choice: "auto",模型可以决定是否调用函数以及如果要调用的话,哪些函数要调用。
  1. 要强制模型始终调用一个或多个函数,可以将 tool_choice: "required"
  2. 要强制模型仅调用一个特定的函数,可以将 tool_choice: {"type": "function", "function": {"name": "my_function"}}}
  3. 要禁用函数调用并强制模型仅生成面向用户的消息,可以将 tool_choice: "none"

这个schema定义了一个名为route_user_query的函数,包含四个关键参数:

  • target_agent:目标智能体名称(枚举类型,确保选项的规范性)
  • confidence:路由决策的置信度(数值类型,范围0-1)
  • user_intent:用户意图总结(字符串类型)
  • original_query:用户原始查询内容(字符串类型)

2. 系统提示词设计

为了引导模型正确使用函数,本例设计了详细的系统提示词:

self.prompt = """# 角色
你是一个电商业务智能路由中心。你的核心职责是精准理解用户的提问意图,并将其分类到指定的业务模块中。...# 决策流程
在做出路由判断时,请遵循以下思考链:
1. **分析意图**:用户的核心诉求是什么?他最想获得哪方面的信息或服务?
2. **匹配分类**:这个诉求最符合哪个智能体的专业领域?
3. **设置置信度**:你有多确定这个路由选择是正确的?根据问题与分类的匹配程度,给出一个0到1之间的置信度分数。
4. **总结意图**:用一句话简洁总结用户意图,便于下游智能体快速理解。
5. **调用函数**:你必须调用route_user_query函数来输出路由结果。
..."""

这个提示词明确了模型的角色、职责和决策流程,特别是强调了必须调用指定的函数并返回结构化数据。

3. Function Calling API 调用实现

接下来,在 RouterAgent 的 run 方法中,我们实现具体的API调用逻辑:

async def run(self, messages: list[Dict[str, str]]) -> Dict[str, Any]:# 获取OpenAI客户端openai_client = client.async_openai_client# 调用OpenAI API with function callingmessages_history = [{"role": "system", "content": self.prompt}]messages_history.extend(messages)response = await openai_client.chat.completions.create(model="deepseek-chat",  # 支持function calling的模型messages=messages_history,tool_choice="required",tools=[{"type": "function", "function": self.function_schema}]  # 强制调用指定函数)# 解析function call结果if response.choices[0].message.tool_calls:router_list = []for function_info in response.choices[0].message.tool_calls:function_args = json.loads(function_info.function.arguments)router_list.append(function_args)return {"success": True,"data": router_list}else:return {"success": False,"error": "模型未返回function call结果"}

这段代码实现了以下关键步骤:

  1. 构建包含系统提示词和用户消息的对话历史
  2. 调用支持function calling的模型API
  3. 设置tool_choice="required"强制要求模型调用函数
  4. 提供函数schema定义
  5. 解析API返回的函数调用结果
  6. 返回结构化的处理结果

4. OpenAI客户端配置

系统使用异步客户端连接模型服务:

class Client:def __init__(self):settings = Settings()self.api_key = settings.OPENAI_API_KEYself.base_url = settings.OPENAI_BASE_URLself.model_name = settings.MODEL_NAME# ...@propertydef async_openai_client(self):if self._async_openai_client is None:self._async_openai_client = AsyncOpenAI(api_key=self.api_key,base_url=self.base_url)return self._async_openai_clientclient = Client()

在配置中,我们使用DeepSeek作为模型提供商:

OPENAI_BASE_URL: Optional[str] = Field(default="https://api.deepseek.com/v1", description="OpenAI API基础URL")
MODEL_NAME: str = Field(default="deepseek-chat", min_length=1, description="AI模型名称")

三、在客服系统中的集成应用

1. 路由节点实现

在客服系统的工作流中,RouterAgent被集成到路由节点:

# 路由节点(增强版,包含记忆上下文)
async def router_node(state: CustomerState):"""路由节点:分析用户意图并决定使用哪个agent"""messages = state["messages"]memory_context = state.get("memory_context", "")# 如果有记忆上下文,添加到消息中router = RouterAgent()if memory_context:router.prompt += "用户的记忆信息:" + "\n" + memory_contextresult = await router.run(messages)if result["success"]:router_data = result["data"][0]  # 取第一个路由结果return {"router_result": router_data,"current_agent": router_data["target_agent"]}else:# 路由失败,默认使用general_agentreturn {"router_result": {"target_agent": "general_agent","confidence": 0.5,"user_intent": "通用咨询","original_query": str(messages[-1].content if messages else "")},"current_agent": "general_agent"}

这个路由节点展示了几个重要特性:

  • 上下文增强:集成用户记忆信息,提高意图识别准确性
  • 容错处理:当路由失败时提供默认行为
  • 状态管理:将路由结果保存到系统状态中

2. 在客服工作流中的完整调用链

整个客服查询处理流程如下:

async def process_customer_query(user_message: str, user_id: Optional[str] = None,session_id: Optional[str] = None) -> dict:# 创建工作流app = create_customer_service_workflow()# 初始化状态initial_state = {"messages": [HumanMessage(content=user_message)],"router_result": None,"current_agent": None,"final_response": None,"user_id": user_id or f"user_{uuid.uuid4().hex[:8]}","session_id": session_id or f"session_{uuid.uuid4().hex[:8]}","memory_context": "","historical_memories": []}# 执行工作流result = await app.ainvoke(initial_state)return {"success": True,"user_message": user_message,"user_id": initial_state["user_id"],"session_id": initial_state["session_id"],"router_result": result.get("router_result"),"current_agent": result.get("current_agent"),"final_response": result.get("final_response"),"memory_context": result.get("memory_context"),"messages": result.get("messages", [])}

四、案例流程解析

用户查询处理示例

场景:用户询问订单发货状态

当用户发送"我的订单什么时候发货?"时,系统的处理流程如下:

  1. 请求接收process_customer_query接收用户消息
  2. 记忆加载:系统加载用户的历史记忆(如有)
  3. 路由处理:RouterAgent通过Function Calling分析意图
  4. 函数调用结果
    {"name": "route_user_query","arguments": "{\"target_agent\": \"order_agent\", \"confidence\": 0.95, \"user_intent\": \"查询订单发货状态\", \"original_query\": \"我的订单什么时候发货?\"}"
    }
    
  5. 智能体调用:系统将请求路由到order_agent
  6. 业务处理:订单智能体处理发货状态查询
  7. 响应返回:向用户返回订单发货信息

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/959038.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HT-LFCG-2250+成都恒利泰这款滤波器,工程师都在用!

HT-LFCG-2250+成都恒利泰这款滤波器,工程师都在用!在射频前端的每一次“降噪”战役里,低通滤波器都是守门员。成都恒利泰HT-LFCG-2250+,DC 起即通,带外抑制陡然下降,尺寸还是那颗 0805 小方块,贴片机一秒就位。…

机器狗+氢气传感器:开启巡检新时代

​ ​在“双碳”目标推动下,氢气作为零碳清洁能源,已广泛应用于加氢站、化工生产、能源存储等领域。但氢气具有极低的爆炸极限(4%-75%),且泄漏后易扩散、难察觉,一旦发生泄漏未及时处理,极易引发爆炸、火灾等…

[Python刷题记录]- 和为 K 的子数组-子串-中等

[Python刷题记录]- 和为 K 的子数组-子串-中等链接:560. 和为 K 的子数组 - 力扣(LeetCode) 1.搞一个新数组sums,记录的是从第一个数到第i个数所有数之和。这样的话两数相减得到的结果就是对应子串和 2.要再节省时…

2025年地质勘探钻机定做厂家权威推荐榜单:全液压履带式坑道钻机/煤矿用履带式全液压坑道钻机/煤矿用履带式全液压定向钻机源头厂家精选

在资源勘探与工程勘察领域,一台高性能、定制化的钻机不仅是效率的保障,更是应对复杂地质条件的关键。专业定做厂家的技术实力与经验直接决定了设备的可靠性。 地质勘探钻机作为资源勘查和工程勘察的核心装备,其技术…

2025年市面上成都小程序机构top10推荐:杰诚智享领跑行业

2025年市面上成都小程序机构top10推荐:杰诚智享领跑行业 摘要 2025年成都小程序行业持续蓬勃发展,随着数字化转型加速,中小企业对微信小程序、抖音营销等线上服务的需求激增。本文基于市场调研和用户反馈,综合评测…

Linux 命令 —— 常用命令总结 - 指南

Linux 命令 —— 常用命令总结 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mona…

2025年11月成都专业的互联网/小程序/抖音推广/视频号推荐厂家榜

2025年11月成都专业的互联网/小程序/抖音推广/视频号推荐厂家榜 文章摘要 2025年成都小程序行业持续蓬勃发展,中小企业通过微信小程序、抖音营销等数字化工具实现线上获客和品牌提升。本文基于市场调研和用户反馈,评…

java 中的集合对象

------------------------------------------------------------------------------------------------------ Java 中的集合框架(java.util 包下)包含众多用于存储和操作对象的容器类,主要分为 Collection 和 Map …

【ACM出版 | 往届于会后四个月检索】第二届大数据、神经网络与深度学习研讨会(BDNNDL 2025)

第二届大数据、神经网络与深度学习研讨会(BDNNDL 2025)将于2025年11月14-16日在山东济南举行。【ACM出版 | 山东师范大学主办!】 【往届于会后四个月检索!| EI、Scopus双检索!】 第二届大数据、神经网络与深度学习…

可靠的成都小程序公司2025年推荐列表

摘要 2025年,成都小程序行业持续蓬勃发展,随着数字化转型加速,中小企业对小程序服务的需求日益增长。本文基于市场调研和用户反馈,为您提供2025年成都小程序服务商排名前十的权威列表,旨在帮助中小企业主高效选择…

2025年成都互联网服务商排名前十强:哪家最强?

2025年成都互联网服务商排名前十强:杰诚智享科技领跑 摘要 随着数字化转型加速,2025年成都互联网服务行业呈现爆发式增长,中小企业对线上营销需求激增。本文基于市场调研和用户口碑,为您精选成都地区十大互联网服务…

2025 年 11 月山东黄锈石,黄锈石荔枝面,黄锈石外墙干挂石材厂家最新推荐,实力品牌深度解析采购无忧之选!

引言 随着建筑装饰领域对石材品质要求的升级,山东黄锈石、黄锈石荔枝面及外墙干挂石材的采购需求持续攀升,但市场乱象始终困扰采购方。为精准筛选优质厂家,行业协会联合专业测评机构开展专项测评,以 “原料管控、工…

2025 年 11 月黄锈石异型石材,黄锈石光面,黄锈石仿古石厂家最新推荐,实力品牌深度解析采购无忧之选!

引言 2025 年 11 月,行业协会联合第三方检测机构发布专项测评榜单,聚焦黄锈石异型石材、黄锈石光面、黄锈石仿古石三大品类,为采购方提供权威参考。本次测评历时两个月,覆盖 82 家主流生产企业,采用 12 项核心指标…

2025年成都互联网公司推荐:靠谱服务商榜单

摘要 2025年成都互联网行业持续蓬勃发展,中小企业对线上品牌宣传和获客营销的需求日益增长。本文基于市场调研和用户反馈,为您呈现成都互联网公司排名前十的榜单,并附上详细的公司介绍、核心优势和服务案例,供您参…

APB

目录一、什么是APB总线?二、信号描述三、传输3.1 写传输声明 一、什么是APB总线? APB协议是一种低成本接口,专门用于访问外设的可编程控制寄存器。 该接口采用非流水线式的简单同步协议,每次传输至少需要两个时钟周…

PostgreSQL技术大讲堂 - 第110讲:pg流复制管理repmgr应用实践

PostgreSQL从入门到精通系列课程,100+节PG技术讲解,让你从小白一步步成长为独当一面的PG专业人员,点击这里查看章节内容,持续更新,欢迎加入。 第110讲:重讲pg流复制管理repmgr应用实践内容介绍:1、repmgr工作原…

ModelScope 模型一键上线?FunModel 让你 5 分钟从零到生产

下一个AI爆款应用,或许就从您点击"立即部署"的那一刻开始!一、前言:AI 浪潮下的模型诉求 在当今这个全民 AI 的时代,快速入门 AI,赶上时代的浪潮,成为了大家当下最热切的追求和期盼。于是,模型作为 A…

欧姆龙CQMH寿命管制

因为CQM1H,没有长传送和等于比较

JAVA:Spring Boot 集成 FFmpeg 完成多媒体处理

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Windows如何解决远程连接提示内部错误的问题?

在 Windows 系统中,远程桌面连接提示 “内部错误” 是一个常见问题,可能由网络、配置、服务或系统更新引起。以下是详细的排查与解决方法:1. 常见原因分析网络问题网络不稳定或目标计算机与本地计算机之间的连接中断…