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优势|主流院校中立择校测评

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

2026/7/24 1:00:47 阅读更多 →
鸿蒙 ArkTS 实战:回收物预约分类的状态驱动界面与业务计算

鸿蒙 ArkTS 实战:回收物预约分类的状态驱动界面与业务计算

鸿蒙 ArkTS 实战:回收物预约分类的状态驱动界面与业务计算 前言 回收物名称、重量、纸塑金属分类和预约记录,是一个围绕日常生活场景设计的鸿蒙单页工具。 本文以 entry/src/main/ets/pages/Index.ets 为入口,按照页面真实代码展开&#xff0…

2026/7/24 0:59:47 阅读更多 →
LangChain Runnable 完整深度解读

LangChain Runnable 完整深度解读

LangChain Runnable 完整深度解读适配:LangChain 0.1.x/ 0.2.x 新版体系,LCEL(LangChain Expression Language)的底层基石 前置认知:所有你写的 prompt | llm | parser | retriever,每一环都是 Runnable一、…

2026/7/24 0:58:46 阅读更多 →

最新新闻

AI大模型记忆系统:原理、实现与优化指南

AI大模型记忆系统:原理、实现与优化指南

1. 为什么程序员需要关注AI大模型的记忆系统?作为一名从传统开发转向AI领域的程序员,我最初接触大模型时最困惑的就是这个"记忆系统"概念。和人类大脑不同,AI的记忆并非简单的数据存储,而是一套复杂的上下文管理机制。举…

2026/7/24 1:08:49 阅读更多 →
AI小分子链接生成器:药物设计的核心技术解析

AI小分子链接生成器:药物设计的核心技术解析

1. AI辅助药物设计中的小分子链接生成器概述药物研发领域正在经历一场由人工智能技术驱动的革命性变革。传统药物发现过程通常需要耗费数年时间、数亿美元资金,而AI技术的引入正在大幅缩短这一周期。小分子链接生成器作为AI辅助药物设计的核心工具之一,专…

2026/7/24 1:08:49 阅读更多 →
嵌入式系统事件管理器:硬件级事件触发与响应网络详解

嵌入式系统事件管理器:硬件级事件触发与响应网络详解

1. 事件管理器:嵌入式系统高效响应的“神经中枢”在嵌入式系统开发里,尤其是面对实时性要求高、外设交互复杂的应用场景,如何让各个硬件模块高效、有序地“对话”,同时又不让CPU(中央处理器)疲于奔命&#…

2026/7/24 1:08:49 阅读更多 →
OpenClaw集成第三方大语言模型实战指南

OpenClaw集成第三方大语言模型实战指南

1. OpenClaw与第三方模型集成概述 OpenClaw作为一款新兴的开源AI代理框架,其核心价值在于能够灵活集成各类第三方大语言模型。最近在开发者社区中,如何将自定义模型接入OpenClaw并实现可视化监控成为了热门话题。这不仅仅是简单的API调用,而是…

2026/7/24 1:08:49 阅读更多 →
TVP5154A视频解码芯片硬件设计:电气规格、时序与热设计实战解析

TVP5154A视频解码芯片硬件设计:电气规格、时序与热设计实战解析

1. TVP5154A:多通道视频解码的基石与设计挑战在视频处理系统的前端,模拟视频信号的数字化是一个看似基础却至关重要的环节。无论是安防监控中的多路摄像头接入,还是视频会议系统需要同时处理多个与会者的画面,亦或是车载环视系统整…

2026/7/24 1:08:49 阅读更多 →
【OpenHarmony/HarmonyOS】ArkUI 科幻星空动效:Canvas 粒子、流星与声明式多层动画

【OpenHarmony/HarmonyOS】ArkUI 科幻星空动效:Canvas 粒子、流星与声明式多层动画

【OpenHarmony/HarmonyOS】ArkUI 科幻星空动效:Canvas 粒子、流星与声明式多层动画如何不依赖视频背景,在 HarmonyOS 页面中实现具有空间感的动态星空?本文拆解一个由 Canvas 星粒子、流星、渐变背景和 ArkUI 几何动画共同组成的可复用组件。…

2026/7/24 1:07:49 阅读更多 →

日新闻

用Highcharts 创建可拖拽三维散点立方体3D图表

用Highcharts 创建可拖拽三维散点立方体3D图表

该案例基于Highcharts scatter3d 三维散点图实现空间立方体散点可视化,核心特色:三维 X/Y/Z 三轴空间,所有散点分布在 0~10 立方体空间内;散点使用径向渐变实现立体 3D 圆球质感;支持鼠标 / 触屏拖拽画布,…

2026/7/24 0:00:29 阅读更多 →
AppCertDlls:进程创建路径上的 DLL 入口

AppCertDlls:进程创建路径上的 DLL 入口

AppCertDlls:进程创建路径上的 DLL 入口 AppCertDlls 位于 HKLM\System\CurrentControlSet\Control\Session Manager\AppCertDlls。本文的程序功能是只读列出这个键在 64 位和 32 位注册表视图中的全部值,并显示每条值的来源、名称、类型和可安全显示的数…

2026/7/24 0:00:29 阅读更多 →
我的编程之路:第一篇博客

我的编程之路:第一篇博客

大家好,我是一名编程初学者,同时这也是我编程学习之路上的第一篇博客。在这里,我想要向大家介绍我的一些想法和规划。a.自我介绍我是一个刚刚接触编程的新手,目前在学习c语言,我对编程世界充满了强烈的好奇。当然&…

2026/7/24 0:00:29 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/22 8:58:19 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/22 19:43:43 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/23 17:49:47 阅读更多 →

月新闻