LangGraph 工具 calculator_tool 计算器工具完整逐行详解
calculator_tool 计算器工具完整逐行详解整体作用这是一个LangChain 标准结构化工具Structured Tool专门给大模型调用用来安全计算数学表达式。 通过严格限制eval执行权限杜绝代码注入风险只允许基础四则运算与简单数值函数。1. 装饰器toolpython运行tool def calculator_tool(expression: str) - str:来源from langchain.tools import tool功能自动把普通 Python 函数转换成 LLM 可识别工具自动读取函数文档字符串docstring生成工具描述自动解析参数类型expression: str生成 JSON SchemaLLM 在需要计算时会自动生成 tool_call 调用这个函数约束大模型会严格按照expression传一段纯数学表达式如35 * (10 - 2)2. 文档字符串 docstringpython运行 Evaluates basic mathematical expressions. Args: expression: A mathematical expression like 25 17 or 100 / 4 Returns: The calculated result as a string 这段内容会完整传给 LLM让模型明白工具用途计算数学式子需要传入什么格式参数返回什么类型结果3. 函数入参与返回值标注expression: str必须传入字符串格式数学表达式不能直接传数字- str计算完成后统一转为字符串返回方便大模型拼接回答4. try-except 异常捕获块python运行try: # 计算逻辑 except Exception as e: return fError calculating: {str(e)}捕获所有计算异常常见报错场景语法错误5 3、(102括号不匹配除零错误10 / 0包含未授权函数 / 变量 不会直接抛出程序崩溃而是返回可读错误文本给 LLM模型可以修正表达式重新计算。5. 安全白名单allowed_namespython运行allowed_names { abs: abs, round: round, min: min, max: max, sum: sum, len: len, int: int, float: float }eval默认能执行任意 Python 代码极度危险这里手动只放行安全数值函数abs绝对值round四舍五入min/max取最小最大值sum求和int/float类型转换 不在这个字典里的函数如open、__import__、os、exec一律无法调用。6. 核心安全执行语句 evalpython运行result eval(expression, {__builtins__: {}}, allowed_names)eval(待执行字符串, 全局作用域, 局部作用域)三层安全隔离第二个参数{__builtins__: {}}清空 Python 所有默认内置函数彻底屏蔽系统操作、文件读写、导入模块等高危能力。 没有这一行攻击者写__import__(os).system(rm -rf /)会直接破坏服务器。第三个参数allowed_names局部作用域仅提供我们手动允许的数学工具表达式里只能使用字典里定义的函数。示例对比允许python运行eval(abs(-10), {}, allowed_names) # 返回 10 eval(round(3.1415, 2), {}, allowed_names) # 返回3.14 eval(20 * 5 - 8 / 2, {}, allowed_names)禁止直接报错python运行eval(open(secret.txt), {}, allowed_names) eval(__import__(os), {}, allowed_names)7. 结果处理python运行return str(result)计算结果可能是 int /float统一转字符串输出LLM 更容易解析、拼接进回答。完整运行测试示例python运行from langchain.tools import tool tool def calculator_tool(expression: str) - str: Evaluates basic mathematical expressions. Args: expression: A mathematical expression like 25 17 or 100 / 4 Returns: The calculated result as a string try: # For safety, only allow basic math operations allowed_names { abs: abs, round: round, min: min, max: max, sum: sum, len: len, int: int, float: float } # Evaluate the expression safely result eval(expression, {__builtins__: {}}, allowed_names) return str(result) except Exception as e: return fError calculating: {str(e)} # 测试正常计算 print(calculator_tool.run(100 / (5 15))) # 5.0 print(calculator_tool.run(abs(-99))) # 99 # 测试错误表达式 print(calculator_tool.run(10 / 0)) # Error calculating: division by zero现有工具优缺点优点eval双层隔离极大降低代码注入风险可在线上环境安全使用自带异常兜底不会中断 Agent 流程LangChain 标准工具可直接llm.bind_tools()给大模型调用支持括号、四则运算、基础数值函数局限不支持幂运算**、开方、三角函数可手动补充进 allowed_names不支持中文数字、中文运算符只能接收英文符号表达式仅拦截函数调用无法屏蔽复杂无限循环表达式极少场景风险len被放进白名单表达式中写len([1,2,3])会生效不需要可以删除

相关新闻