AI Agent框架探秘:拆解 OpenHands(12)--- Function call

发布时间:2026/9/28 9:51:48

AI Agent框架探秘:拆解 OpenHands(12)--- Function call
AI Agent框架探秘拆解 OpenHands12— Function call一、从基础讲起什么是 Function Call在 AI Agent 的日常工作中模型常常需要调用外部工具或获取实时数据。比如当用户问“今天北京天气怎么样”大语言模型LLM自身无法直接访问天气API这就需要一种机制让模型发出一个“函数调用请求”然后由系统去执行并返回结果。Function Call函数调用就是这样一个桥梁它允许 LLM 生成结构化的调用指令而不是纯文本回复。在 OpenHands 框架中Function call 是 Agent 与外部世界交互的核心机制之一。我们可以把它理解为 Agent 的“手”和“脚”——模型负责思考函数调用负责执行。下面是一个最简单的 Python 示例模拟 LLM 发出函数调用请求python# 示例 1模拟一个简单的函数调用系统import json# 定义可用的工具函数def get_weather(city: str) - str: 获取天气信息模拟 weather_data { 北京: 晴朗25°C, 上海: 多云28°C } return weather_data.get(city, 未知城市)# 模拟 LLM 返回的函数调用请求通常由 LLM 输出的 JSON 表示llm_response { function: get_weather, arguments: {city: 北京}}# 执行函数调用if llm_response[function] get_weather: result get_weather(**llm_response[arguments]) print(f函数调用结果{result}) # 输出函数调用结果晴朗25°C这段代码展示了最核心的流程定义函数 → 解析调用请求 → 执行并返回结果。但在真实框架中这个过程要复杂得多。## 二、OpenHands 中的函数调用架构OpenHands 作为一个完整的 AI Agent 框架将 Function call 抽象为几层结构1.工具定义层声明每个函数的名称、参数类型、描述2.请求解析层解析 LLM 输出的函数调用 JSON3.执行引擎层安全地调用实际函数4.结果回传层将执行结果格式化后送回 LLM这种分层设计使得 Agent 可以灵活地扩展新工具。比如当我们需要让 Agent 可以操作文件系统只需添加一个文件操作函数而无需改动核心逻辑。## 三、实战构建一个带函数调用的 Agent 核心下面我们编写一个更完整的示例模拟 OpenHands 风格的函数调用系统。这个 Agent 会接收用户指令通过 LLM这里用模拟的决定调用哪个函数然后执行并返回结果。python# 示例 2完整的函数调用 Agent 模拟import jsonfrom datetime import datetimeclass OpenHandsAgent: 模拟 OpenHands 风格的 Agent支持函数调用 def __init__(self): # 注册所有可用的工具函数 self.tools { get_current_time: { function: self.get_current_time, description: 获取当前时间无参数 }, calculate: { function: self.calculate, description: 执行数学计算参数expression (str) 数学表达式 }, search_knowledge: { function: self.search_knowledge, description: 搜索知识库参数query (str) 搜索关键词 } } def get_current_time(self) - str: 工具1获取当前时间 return f当前时间是{datetime.now().strftime(%Y-%m-%d %H:%M:%S)} def calculate(self, expression: str) - str: 工具2安全执行数学计算 try: # 注意实际项目中应使用更安全的计算方式 result eval(expression) return f计算结果{result} except Exception as e: return f计算错误{str(e)} def search_knowledge(self, query: str) - str: 工具3模拟知识库搜索 knowledge_base { python: Python 是一种高级编程语言广泛用于 AI 开发, agent: AI Agent 是能自主执行任务的智能系统 } return knowledge_base.get(query.lower(), f未找到关于 {query} 的知识) def simulate_llm_decision(self, user_input: str) - dict: 模拟 LLM 根据用户输入决定调用哪个函数 # 实际项目中这里会调用真正的 LLM API if 时间 in user_input: return {function: get_current_time, arguments: {}} elif 计算 in user_input: # 提取表达式简单模拟 expr user_input.replace(计算, ).strip() return {function: calculate, arguments: {expression: expr}} elif 搜索 in user_input or 知识 in user_input: query user_input.replace(搜索, ).replace(知识, ).strip() return {function: search_knowledge, arguments: {query: query}} else: return None # 无法识别的指令 def process_user_input(self, user_input: str) - str: 处理用户输入的主流程 # 步骤1模拟 LLM 决策 decision self.simulate_llm_decision(user_input) if decision is None: return 抱歉我没有理解您的指令请尝试询问时间、计算或搜索知识。 # 步骤2查找并执行工具函数 tool_name decision[function] if tool_name not in self.tools: return f错误未知工具 {tool_name} tool_func self.tools[tool_name][function] args decision[arguments] # 步骤3执行函数调用 try: result tool_func(**args) return result except Exception as e: return f函数调用失败{str(e)}# 运行测试agent OpenHandsAgent()# 测试各种指令test_inputs [ 现在几点了, 计算 3 5 * 2, 搜索 Python 知识, 你好世界]for user_input in test_inputs: print(f用户{user_input}) response agent.process_user_input(user_input) print(fAgent{response}\n)运行这段代码你会看到 Agent 能根据不同的用户指令自动选择并调用对应的函数。这就是 Function call 在 AI Agent 中的核心价值——让模型突破文本生成限制具备执行实际动作的能力。## 四、深入 OpenHands 的高级用法OpenHands 在实际实现中对 Function call 做了许多增强### 1. 异步执行与错误重试真实场景中API 调用可能超时或失败。OpenHands 使用asyncio实现异步函数调用并内置重试机制。### 2. 参数校验与类型安全每个函数调用都会经过严格的 JSON Schema 校验确保 LLM 生成的参数格式正确。例如如果函数需要一个整数参数但 LLM 传了字符串系统会拒绝调用并要求 LLM 重新生成。### 3. 上下文注入函数调用可以访问 Agent 的当前状态如对话历史、环境变量。这让函数能做出更合理的决策比如文件操作函数知道当前工作目录。### 4. 链式调用OpenHands 支持在一次交互中多次调用函数。例如先“搜索用户信息”再“根据结果发送邮件”。框架会自动管理调用顺序和数据传递。## 五、最佳实践与注意事项| 实践要点 | 说明 ||---------|------|| 函数描述要详细 | LLM 依赖描述来决定何时调用应包含参数示例和边界条件 || 避免副作用 | 函数应该纯粹且可预测修改外部状态前要确认 || 安全性检查 | 对用户输入的参数进行白名单校验防止注入攻击 || 超时控制 | 每个函数调用设置合理的超时时间避免 Agent 卡死 |## 总结Function call 是 AI Agent 连接“思考”与“行动”的关键桥梁。从基础的函数注册与调用到 OpenHands 框架中的异步执行、参数校验和链式调用这一机制让 LLM 从一个“聊天机器人”进化为能够真正操作外部世界的智能体。通过本文的两个示例你应该已经掌握了 Function call 的核心原理并看到了它在实际 Agent 框架中的实现方式。随着 Agent 技术不断发展函数调用的能力边界也在持续扩展——从简单的 API 调用到复杂的多步骤工作流Function call 正在成为构建下一代智能系统的基石。

相关新闻

2026亚太EMBA优势|主流院校中立择校测评

2026亚太EMBA优势|主流院校中立择校测评

2026/9/28 9:50:48

民营企业家、企业创始人选EMBA,普遍纠结国际化适配、课程实用性、圈层质量与产业资源匹配度。本文从全球办学排名、院校办学定位、课程体系、学员圈层、产业资源五大核心维度,横向测评主流EMBA项目,深度拆解亚太EMBA优势。全文纯客观数据分析…

2026亚太EMBA世界排名|主流院校中立择校测评

2026亚太EMBA世界排名|主流院校中立择校测评

2026/8/23 4:14:16

民营企业家、企业创始人择校EMBA,普遍面临排名真伪、课程适配、圈层匹配、资源落地四大难题。本文结合2026亚太EMBA世界排名权威数据,从全球办学排名、院校办学定位、课程体系、学员圈层、产业资源五大客观维度,横向对比国内头部EMBA项目。全…

2026亚太EMBA排行榜:主流院校中立择校测评

2026亚太EMBA排行榜:主流院校中立择校测评

2026/8/23 4:14:19

民营企业家、企业创始人择校EMBA,普遍纠结排名真伪、课程适配性、圈层含金量与产业资源落地性。本文依托亚太EMBA排行榜核心参考标准,从全球办学排名、院校办学定位、课程体系、学员圈层、产业资源五大客观维度,横向对比主流头部EMBA项目。全…

CANN/GE ACL数据集缓冲区添加函数

CANN/GE ACL数据集缓冲区添加函数

2026/9/28 4:08:17

aclmdlAddDatasetBuffer 【免费下载链接】ge GE(Graph Engine)是面向昇腾的图编译器和执行器,提供了计算图优化、多流并行、内存复用和模型下沉等技术手段,加速模型执行效率,减少模型内存占用。 GE 提供对 PyTorch、Te…

用ffmpeg高效批量调整图片尺寸的实战指南

用ffmpeg高效批量调整图片尺寸的实战指南

2026/9/27 1:30:29

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

Transformers 音频特征提取工具库 audio_utils 全解析:从 Mel 刻度换算到对数 Mel 频谱

Transformers 音频特征提取工具库 audio_utils 全解析:从 Mel 刻度换算到对数 Mel 频谱

2026/9/28 2:15:29

Transformers 音频特征提取工具库 audio_utils 全解析:从 Mel 刻度换算到对数 Mel 频谱 【免费下载链接】transformers 🤗 Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and mu…

RustFS 多节点集群重启与滚动升级实战:Readiness、Quorum 与 Degraded 模式完全指南

RustFS 多节点集群重启与滚动升级实战:Readiness、Quorum 与 Degraded 模式完全指南

2026/9/28 3:14:54

RustFS 多节点集群重启与滚动升级实战:Readiness、Quorum 与 Degraded 模式完全指南 【免费下载链接】rustfs 🚀2.3x faster than MinIO for 4KB object payloads. RustFS is an open-source, S3-compatible high-performance object storage system sup…

Java Integer缓存揭秘:128陷阱原理、避坑与面试全解

Java Integer缓存揭秘:128陷阱原理、避坑与面试全解

2026/9/28 3:58:00

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

RustFS Scanner 数据用量发布权威性决策:配额准入如何获得可用的权威依据

RustFS Scanner 数据用量发布权威性决策:配额准入如何获得可用的权威依据

2026/9/28 3:47:14

RustFS Scanner 数据用量发布权威性决策:配额准入如何获得可用的权威依据 【免费下载链接】rustfs 🚀2.3x faster than MinIO for 4KB object payloads. RustFS is an open-source, S3-compatible high-performance object storage system supporting mi…

远程协作的工作台整理

远程协作的工作台整理

2026/9/26 14:29:04

远程协作的工作台整理远程协作的核心不是再加一个工具,而是让交接信息足够完整。异步任务要写明目标、输入位置、完成标准和需要决策的人。 工作台的最小配置 将日程、待办、代码和沟通入口收拢到少数固定位置;通知按紧急程度分层。工作台不需要模仿办公…

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

2026/9/28 5:05:21

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

2026/9/26 23:35:16

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…