首页 > 其他分享 >chatgpt tools调用

chatgpt tools调用

时间:2024-06-13 17:56:50浏览次数:22  
标签:function 调用 tool messages message call chatgpt tools model

chatgpt tools 调用

1. 引入 openai, 创建 client

import json
import os
import subprocess

from openai import OpenAI

# api_key 可以填入自己的key
# base_url 可以使用国内的代理,海外可以使用官方地址
client = OpenAI(api_key="", base_url="https://api.openai-proxy.com/v1")

2. 创建一个 tool 的实现

这里定义的是一个执行系统命令的方法, 接受传入的命令,返回运行结果与运行错误

def do_command(command: str):

    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}

3. 创建一个提供给 openai 的 tools 定义集合

在提供给 openai 时会有 schema 的校验,校验不通过时会报错,参数的类型没有 list 或者 array

tools = [{
    "type": "function",
    "function": {
        "name": "do_command",
        "description": "执行linux / windows命令",
        "parameters": {
            "type": "object",
            "properties": {
                "command": {"type": "string", "description": "输入的命令"}
            },
            "required": ["command"]
        }
    }
}]

4. 创建一个运行 tool 的方法

接收参数为 chatgpt 返回的 response 与 message 集合, 将运行完成的结果写入到集合中

如果不需要执行 tool,则将 response 的 message 添加到 message 集合中

这里有几点需要注意:

  1. 如果第一次运行 tool 时返回的是错误信息,openai 可能会让重新运行 tool,但是返回的 tool_call_id 是不变的,这时不能把错误的结果与正确的结果都返回给 openai,不然会出现错误
  2. 需要 tool_call 的场景下,不代表 content 是空的;可能一边有结果返回,一边让你再次运行;方法中没有处理运行 tool 的 message,也没有处理并行 tool 的场景(因为只有一个方法)
def parse_function_call(model_response, messages):
    _messages = messages.copy()
    _messages.append(model_response.choices[0].message.model_dump())

    if model_response.choices[0].message.tool_calls:
        tool_call = model_response.choices[0].message.tool_calls[0]
        model = model_response.model
        args = tool_call.function.arguments
        function_result = {}
        if tool_call.function.name == "do_command":
            function_result = do_command(**json.loads(args))
            _messages.append({
                "role": "tool",
                "content": f"{json.dumps(function_result)}",
                "tool_call_id": tool_call.id
            })

            print(_messages)

            response = client.chat.completions.create(
                model=model,  # 填写需要调用的模型名称
                messages=_messages,
                tools=tools,
            )
            if response.choices[0].message.tool_calls:
                parse_function_call(response, messages)
            else:
                messages.append(response.choices[0].message.model_dump())
    else:
        messages.append(model_response.choices[0].message.model_dump())

5. 运行 chatgpt,并将工具的定义作为参数传入

messages = []

messages.append({"role": "system", "content": "当前的运行环境是{}".format(os.name)})
messages.append({"role": "user", "content": "查询python的版本"})

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

parse_function_call(resp, messages)

print(messages)

运行tool的message 记录

[{'role': 'system', 'content': '当前的运行环境是nt'}, {'role': 'user', 'content': '查询python的版本'}, {'content': None, 'role': 'assistant', 'function_call': None, 'tool_calls': [{'id': 'call_f3OaTCDet0p73o2fPvTRBFIs', 'function': {'arguments': '{"command":"python --version"}', 'name': 'do_command'}, 'type': 'function'}]}, {'role': 'tool', 'content': '{"stdout": "Python 3.11.6\\n", "stderr": ""}', 'tool_call_id': 'call_f3OaTCDet0p73o2fPvTRBFIs'}]

返回结果

[{'role': 'system', 'content': '当前的运行环境是nt'}, {'role': 'user', 'content': '查询python的版本'}, {'content': '当前的Python版本是:**Python 3.11.6**。', 'role': 'assistant', 'function_call': None, 'tool_calls': None}]

6. 总结

tool 确实让chatgpt 的使用变得更加灵活,后续应该扩展为系统命令创建一个稳定的运行环境,现在是单命令的场景;message可以添加一个缓存机制,使读取与写入更加灵活一些

用openai原生的api与langchain的体验不太一样,原生的可以很明显的感受的到是基于一个message的流来进行交流

langchian的LECL也有比较方便的地方,但是对于tool的调用很别扭

标签:function,调用,tool,messages,message,call,chatgpt,tools,model
From: https://www.cnblogs.com/daiwyang/p/18246277

相关文章

  • 如何利用ChatGPT辅助下处理:ENVI、GEE、Python等遥感数据
    遥感技术主要通过卫星和飞机从远处观察和测量我们的环境,是理解和监测地球物理、化学和生物系统的基石。ChatGPT是由OpenAI开发的最先进的语言模型,在理解和生成人类语言方面表现出了非凡的能力。重点介绍ChatGPT在遥感中的应用,人工智能在解释复杂数据、提供见解和帮助决策过程方......
  • Linux上12个最佳开源ChatGPT替代方案
    ​ChatGPT是OpenAI开发的流行聊天机器人和虚拟助手,自2022年11月30日起上市。此图表模型可让您对对话进行微调并引导其达到理想的持续时间、结构、语气、细节程度和语言。幸运的是,随着人工智能的不断进步,开源ChartGPT替代品已经成为强大的工具,可以提供相同的对话技巧以及定......
  • python-11-def函数 好比是sop 调用函数可以让程序听令
    学习内容:《python编程:从入门到实践》第二版知识点:定义函数、调用函数、形参、实参练习内容:练习8-1:消息编写一个名为display_message()的函数,它打印一个句子,指出你在本章学的是什么。调用这个函数,确认显示的消息正确无误。练习8-2:喜欢的图书编写一个名为favorite_book()......
  • D-Bus——session bus调用机制
            当D-Bus会话总线(sessionbus)客户端拿到环境变量DBUS_SESSION_BUS_ADDRESS的值后,它会按照以下步骤来连接和与会话总线进行通信:1.获取环境变量        首先,D-Bus客户端程序会读取环境变量DBUS_SESSION_BUS_ADDRESS。这个环境变量包含了会话总线的......
  • D-Bus——system bus调用机制
            在D-Bus中,系统总线(systembus)和会话总线(sessionbus)的工作方式有所不同。会话总线主要依赖环境变量来找到总线地址,而系统总线则依赖于标准的系统路径和配置。系统总线的服务查找机制系统总线的启动:        系统总线守护进程(dbus-daemon--syste......
  • golang执行语句操作与map结构体变量调用函数
    本文记录利用golang调用exe文件。需要用到包os/exec,本文重点介绍如何利用golang执行带参数的可执行文件以及踩过的坑。首先c:=exec.Command(cmd)语句不会执行cmd命令,而是做好要执行的准备,当接下来调用c.Run()时才会执行cmd命令,注意到此时是会阻塞进程的,等待执行完成才会进行下一......
  • Qwen2 阿里最强开源大模型(Qwen2-7B)本地部署、API调用和WebUI对话机器人
    阿里巴巴通义千问团队发布了Qwen2系列开源模型,该系列模型包括5个尺寸的预训练和指令微调模型:Qwen2-0.5B、Qwen2-1.5B、Qwen2-7B、Qwen2-57B-A14B以及Qwen2-72B。对比当前最优的开源模型,Qwen2-72B在包括自然语言理解、知识、代码、数学及多语言等多项能力上均显著超越当前领先的Lla......
  • 使用Wesky.Net.OpenTools包来快速实现嵌套型结构体数据转换功能
    今天遇到有人提到结构体和byte数组互转的问题,我就顺便拿来水一篇。这是一个冷门的问题,估计使用的人不多。既然有需求,应该就有使用场景,那就顺便整一波。为了达到效果,结构体、复杂结构体嵌套等都能实现转换,我就顺便做了个包更新来提供使用和下面的说明。首先引入nuget包Wesky.Net......
  • 借助ChatGPT“从0到1”高效完成优质论文写作,4大关键步骤(技巧+实例),小白轻松上手
    最近很多朋友找我咨询ChatGPT写论文的事,说他们虽然知道GPT很厉害,但是却不知道怎么上手使用,有的是使用了但并没有那么理想,对于AI输出的结果并不满意,从零开始撰写论文似乎是一项艰巨的工作。我将通过这篇文章介绍如何借助ChatGPT从0到1一步一步完成从文献调研到论文发表的全过......
  • 借助ChatGPT快速仿写一篇优质论文,无痛仿写、完美创作
    大家好,感谢关注。我是七哥,一个在高校里不务正业,折腾学术科研AI实操的学术人。可以添加我(yida985)交流学术写作或ChatGPT等AI领域相关问题,多多交流,相互成就,共同进步在学术写作中,最有效的方法就是从前人优秀作品中汲取精华进行仿写。适当的模仿有助于理解相关研究方向,并可以借鉴......