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/10/16 7:41:26 阅读更多 →
鸿蒙 ArkTS 实战:回收物预约分类的状态驱动界面与业务计算

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

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

2026/10/16 22:24:00 阅读更多 →
LangChain Runnable 完整深度解读

LangChain Runnable 完整深度解读

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

2026/10/17 7:15:36 阅读更多 →

最新新闻

储能电池主动均衡方案:MP2642GR-Z与STM32L081CB设计实战

储能电池主动均衡方案:MP2642GR-Z与STM32L081CB设计实战

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

2026/10/17 10:10:58 阅读更多 →
Superpowers与Codex深度联动:AI辅助编码实战指南

Superpowers与Codex深度联动:AI辅助编码实战指南

1. Superpowers 到底是个什么工具我第一次听到 Superpowers 这个词,是在一次社区分享里。当时主讲人边说边敲键盘,屏幕上代码刷刷地生成,台下一片惊叹。会后我专门去查了下,才发现它不是某个游戏里的技能点,而是一套真…

2026/10/17 10:10:58 阅读更多 →
word自用技巧

word自用技巧

去掉空白页:ctrl删除键。或者右键段落,行距改为固定值1磅。目录:按ctrl和目录,会自动跳转wps中插入图片:在插入位置右键 段落 ,选择 单倍行距。

2026/10/17 10:10:58 阅读更多 →
Postman Tests断言实战:自动校验接口返回结果与状态码

Postman Tests断言实战:自动校验接口返回结果与状态码

1. 先搞清楚为什么要写断言:Postman的Tests到底改变了什么很多测试同学用Postman,其实只用了它三成功力:输入URL、选个方法、点Send,然后盯着Response看。接口少的时候还行,接口一多,几十上百个返回JSON堆在…

2026/10/17 10:10:58 阅读更多 →
Windows C++开发中用已编译jsoncpp库的集成与避坑

Windows C++开发中用已编译jsoncpp库的集成与避坑

简介:一份已编译的jsoncpp库压缩包,专为Visual Studio环境下的C开发者打造,省去源码编译的繁琐步骤,开箱即可接入项目。包内共10个文件,包含8个头文件与2个lib库文件,整体约1023KB;头文件提供Js…

2026/10/17 10:10:58 阅读更多 →
K个一组翻转链表:递归+迭代模板与边界避坑指南

K个一组翻转链表:递归+迭代模板与边界避坑指南

第一次在热题榜上看到“K 个一组翻转链表”的时候,我是有点发怵的。反转链表是 easy,区间反转是 medium,怎么加了一个“K 个一组”直接蹦到 hard 了?等我真的把它做明白才反应过来:这道题根本不是在考什么高深的算法思…

2026/10/17 10:09:58 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/16 21:35:51 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/17 1:44:59 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/16 21:54:38 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

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

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/16 14:23:36 阅读更多 →