跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
PythonAI

ChatGPT Tools 调用实战:基于 OpenAI Python SDK 实现系统命令执行

综述由AI生成如何使用 OpenAI Python SDK 调用大模型工具功能。通过定义函数 Schema 和执行逻辑,实现了让大模型自主运行系统命令的能力。内容涵盖客户端初始化、工具定义、消息循环处理及结果解析,并提供了安全建议与最佳实践,帮助开发者构建具备行动能力的大模型应用。

BackendPro发布于 2025/2/6更新于 2026/6/321 浏览
ChatGPT Tools 调用实战:基于 OpenAI Python SDK 实现系统命令执行

ChatGPT Tools 调用实战

在大型语言模型(LLM)的应用开发中,工具调用(Function Calling / Tools)是一项关键能力。它允许大模型根据用户意图自主决定调用外部函数或 API,从而执行代码、查询数据库或操作文件系统。本文将详细介绍如何使用 OpenAI Python SDK 实现基础的 Tools 调用功能,并通过一个执行系统命令的示例展示完整流程。

1. 环境准备与客户端初始化

首先,需要安装 OpenAI 官方 Python 库。确保已配置好环境变量中的 API Key。

import json
import os
import subprocess
from openai import OpenAI

# 初始化客户端
# api_key 请填入自己的密钥,base_url 可根据网络环境调整
client = OpenAI(
    api_key="YOUR_API_KEY_HERE",
    base_url="https://api.openai.com/v1"
)

2. 定义工具执行逻辑

我们需要编写具体的 Python 函数来响应模型的请求。本例中,我们定义一个执行系统命令的函数。该函数接收命令字符串,使用 subprocess 模块运行并返回标准输出与错误信息。

def do_command(command: str):
    """
    执行系统命令并返回结果
    :param command: 要执行的 shell 命令
    :return: 包含 stdout 和 stderr 的字典
    """
    try:
        process = subprocess.Popen(
            command,
            shell=True,
            stdin=subprocess.PIPE,
            stdout=subprocess.PIPE,
            stderr=subprocess.PIPE,
            text=True,
            encoding="utf-8"
        )
        stdout, stderr = process.communicate()
        return {
            "stdout": stdout,
            "stderr": stderr,
            "success": True
        }
    except Exception as e:
        return {
            "stdout": "",
            "stderr": str(e),
            "success": 
        }
False

安全提示: 在生产环境中直接暴露 Shell 命令执行存在严重安全风险(如命令注入)。建议对输入命令进行严格的白名单校验,或使用沙箱环境隔离执行。

3. 构建 Tools Schema

OpenAI 要求工具定义必须符合 JSON Schema 规范。我们需要将上述函数封装为模型可识别的结构。

tools = [{
    "type": "function",
    "function": {
        "name": "do_command",
        "description": "执行 Linux 或 Windows 系统命令,用于获取系统信息或运行脚本",
        "parameters": {
            "type": "object",
            "properties": {
                "command": {
                    "type": "string",
                    "description": "要执行的完整命令字符串,例如 'ls -l' 或 'python --version'"
                }
            },
            "required": ["command"]
        }
    }
}]

注意:参数类型必须明确,避免使用未定义的 list 或 array 除非 schema 中显式定义。

4. 消息循环处理逻辑

这是核心部分。当模型返回 tool_calls 时,我们需要解析参数、执行函数、并将结果追加到消息历史中,再次发送给模型以获取最终回答。此过程可能需要多次迭代。

def parse_function_call(model_response, messages):
    """
    处理模型响应,若包含工具调用则执行并递归处理
    :param model_response: OpenAI 返回的响应对象
    :param messages: 当前的消息历史列表
    """
    # 复制消息列表以避免修改原引用
    _messages = messages.copy()
    
    # 添加助手回复到历史记录
    assistant_msg = model_response.choices[0].message.model_dump()
    _messages.append(assistant_msg)

    # 检查是否存在工具调用
    if model_response.choices[0].message.tool_calls:
        tool_call = model_response.choices[0].message.tool_calls[0]
        model_name = model_response.model
        args_str = tool_call.function.arguments
        
        function_result = {}
        
        # 根据函数名分发执行逻辑
        if tool_call.function.name == "do_command":
            try:
                args = json.loads(args_str)
                function_result = do_command(**args)
            except json.JSONDecodeError:
                function_result = {"error": "Invalid arguments format"}
            except Exception as e:
                function_result = {"error": str(e)}

            # 将工具执行结果作为 tool 角色消息追加
            _messages.append({
                "role": "tool",
                "content": json.dumps(function_result),
                "tool_call_id": tool_call.id
            })

            print("当前消息历史:")
            for msg in _messages:
                print(f"Role: {msg.get('role')}, Content: {str(msg.get('content'))[:50]}...")

            # 发送更新后的消息给模型
            response = client.chat.completions.create(
                model=model_name,
                messages=_messages,
                tools=tools
            )
            
            # 递归处理后续可能的工具调用
            if response.choices[0].message.tool_calls:
                return parse_function_call(response, _messages)
            else:
                _messages.append(response.choices[0].message.model_dump())
                return _messages
    else:
        # 如果没有工具调用,直接返回最终消息
        _messages.append(assistant_msg)
        return _messages

关键点说明:

  1. Tool Call ID 一致性:如果第一次执行报错,模型可能会重试,但 tool_call_id 保持不变。必须确保每次针对同一 ID 的回复都正确关联。
  2. 并行调用支持:上述代码仅处理了单个工具调用。实际场景中模型可能并行调用多个工具,需遍历 tool_calls 列表。
  3. 内容非空:即使有 tool_calls,content 字段也可能包含文本,需同时保留。

5. 完整调用示例

以下是一个完整的交互流程,演示如何发起查询 Python 版本的请求。

if __name__ == "__main__":
    messages = []
    
    # 设置系统提示词
    messages.append({
        "role": "system", 
        "content": f"当前运行环境是:{os.name}"
    })
    
    # 用户提问
    messages.append({
        "role": "user", 
        "content": "查询当前环境的 Python 版本"
    })

    # 首次请求
    resp = client.chat.completions.create(
        messages=messages,
        model="gpt-4o-2024-05-13",
        tools=tools
    )

    # 处理响应
    final_messages = parse_function_call(resp, messages)

    # 打印最终对话记录
    print("\n=== 最终对话记录 ===")
    for msg in final_messages:
        print(f"[{msg['role']}]: {msg.get('content', '')}")

预期输出示例:

  1. 用户询问版本。
  2. 模型生成 tool_calls 请求执行 python --version。
  3. 程序捕获输出 Python 3.11.6。
  4. 程序将结果反馈给模型。
  5. 模型生成自然语言回答:"当前的 Python 版本是:Python 3.11.6"。

6. 最佳实践与安全建议

在使用 LLM Tools 时,除了功能实现,还需关注以下方面:

  1. 权限控制:不要赋予模型过高的系统权限。尽量限制其只能访问特定的目录或执行预定义的命令。
  2. 异常处理:网络波动或 API 限流可能导致调用失败,建议在 parse_function_call 中加入重试机制。
  3. 缓存机制:对于相同的命令输入,可以缓存结果以减少不必要的 API 调用和延迟。
  4. 对比 LangChain:原生 OpenAI API 提供了更底层的控制,适合自定义复杂的调用逻辑;而 LangChain 等框架封装了更多细节,但在某些高级场景下灵活性不如原生 API。

7. 总结

通过本文的示例,我们实现了让 ChatGPT 自主调用本地函数的能力。Tools 功能极大地扩展了大模型的应用边界,使其从单纯的文本生成转变为具备行动能力的智能代理。在实际项目中,建议结合业务需求设计安全的工具集,并持续优化消息管理策略以提升交互体验。

目录

  1. ChatGPT Tools 调用实战
  2. 1. 环境准备与客户端初始化
  3. 初始化客户端
  4. apikey 请填入自己的密钥,baseurl 可根据网络环境调整
  5. 2. 定义工具执行逻辑
  6. 3. 构建 Tools Schema
  7. 4. 消息循环处理逻辑
  8. 5. 完整调用示例
  9. 6. 最佳实践与安全建议
  10. 7. 总结
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • C++ 哈希表原理与实现
  • 鸿蒙金融理财全栈项目:风险控制、合规审计与产品创新
  • BAAI/bge-m3 WebUI 一键分析文本相似度
  • Elasticsearch 核心概念、Kibana 测试与 C++ 客户端封装实战
  • Flutter pathfinding 库在 OpenHarmony 上的适配与实战
  • C++ 核心特性:继承机制
  • OpenClaw 龙虾机器人 Windows 系统部署全攻略
  • C++ 算法实战:字符串处理与链表相交问题解析
  • 基于遗传算法的电动汽车有序充放电优化与 MATLAB 实现
  • Python 字符串基础:定义、索引、切片及常用方法详解
  • voidImageViewer:轻量级图像查看器,支持 GIF/WEBP 动画
  • GenAI 技术栈进展与应用案例报告
  • 文心一言5.0 Preview模型能力观察:LMArena文本任务实测
  • 渗透测试详解:核心概念、流程与实战方法
  • MVP 至千万级并发:AI 在前后端开发中的差异化落地
  • 飞书 OpenClaw 接入指南:无需服务器通过长连接运行机器人
  • 微/纳米机器人赋能肿瘤精准治疗:GBM 领域近五年进展
  • 使用 LLaMA-Factory 进行大语言模型微调指南
  • C++ 哈希扩展:位图与布隆过滤器详解及实现
  • Flutter 三方库 modular_core 在鸿蒙系统下的适配与依赖注入实践

相关免费在线工具

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online