专栏/小脚本,大道理:Bash脚本调OpenAI的GPT-3.5-Turbo模型解读

小脚本,大道理:Bash脚本调OpenAI的GPT-3.5-Turbo模型解读

2024年04月18日 11:16--浏览 · --点赞 · --评论
粉丝:4987文章:511

#!/bin/bash


api_key='xyzzy'

input="$@"

output=`curl --silent --location --request POST 'https://api.openai.com/v1/chat/completions' \
--header "Authorization: Bearer ${api_key}" \
--header 'Content-Type: application/json' \
--data-raw '{
"model": "gpt-3.5-turbo",
"messages": [{"role": "user", "content": "'"${input}"'"}]
}'`

error=`echo ${output} | jq -r .error.message`

if [[ "${error}" != "null" ]];
then
echo "Error: ${error}"
else
echo "${output}" | jq -r '.choices[]'.message.content
fi

这是一个 Bash 脚本,用于调用 OpenAI 的 GPT-3.5-Turbo 模型进行文本补全。以下是对这段代码的详细解释:


#!/bin/bash


这是一个 shebang,它告诉系统该脚本应由哪个解释器执行。在这里,脚本将由 /bin/bash 解释器执行。

api_key='xyzzy'


这定义了一个变量 api_key,其值为 'xyzzy'。这只是一个占位符,真正的 API 密钥应该替换 'xyzzy'。

input="$@"


$@ 是一个特殊的 Bash 变量,表示传递给脚本的所有参数。这里,input 变量被设置为这些参数。

以下的 curl 命令用于向 OpenAI 的 API 发送 POST 请求:


--silent:不输出任何东西。

--location:如果服务器报告了重定向,curl 将自动遵循它。

--request POST:指定 HTTP 请求方法为 POST。

--header:设置请求头。这里,它设置了授权和内容类型头。

--data-raw:指定要发送的原始 POST 数据。这里,它发送了一个 JSON 对象,其中包含模型名称和要补全的消息。

error=...``jq命令用于解析 JSON 数据。它从curl` 的输出中提取错误信息。


if [[ "${error}" != "null" ]]; then ... fi


这是一个条件语句,检查 error 变量是否不等于 "null"。

如果 error 不为 "null",则输出错误消息。

否则,从 curl 的输出中提取并输出所有选择的消息内容。


这段代码 echo ${output} | jq -r .error.message 是一个在 Bash 脚本中常见的命令组合,用于解析 JSON 数据。我会逐步解释这个命令:


echo ${output}:


echo 是一个命令,用于在终端输出字符串或变量的值。

${output} 是一个变量,它包含了之前 curl 命令的输出结果,即 JSON 格式的响应数据。

|:


这是一个管道符号,在 Unix 和类 Unix 系统中,它用于将一个命令的输出作为另一个命令的输入。在这里,它将 echo 命令的输出(即 JSON 数据)传递给 jq 命令。

jq -r .error.message:


jq 是一个轻量级且灵活的命令行 JSON 处理器。它可以从 JSON 数据中提取信息、过滤数据,并输出处理后的结果。

-r 或 --raw-output 选项表示输出原始字符串,而不是 JSON 格式的字符串。这通常用于提取单个标量值(如字符串、数字等)。

.error.message 是一个 JSON 路径表达式,它告诉 jq 从 JSON 数据中提取 error 对象下的 message 字段的值。

综合起来,echo ${output} | jq -r .error.message 这行命令的作用是:输出变量 output(即 JSON 格式的响应数据),然后使用 jq 从这些数据中提取 error 字段下的 message 字段的值,并以原始字符串的形式输出。


如果 JSON 数据中没有 error 字段或其下没有 message 字段,jq 命令将不会输出任何内容。如果 error 字段存在且包含 message 字段,那么 jq 将输出该字段的值。这通常用于错误处理和调试,以获取来自 API 或其他服务的错误信息。


这段代码 echo "${output}" | jq -r '.choices[].message.content' 是一个用于处理 JSON 数据的 Bash 命令组合。这里,echo 命令用于输出变量 ${output} 的内容(即之前 curl 命令的响应数据,这是一个 JSON 格式的字符串),然后通过管道 | 将这个 JSON 字符串传递给 jq 命令进行解析。


jq 是一个强大的命令行 JSON 处理器,它允许你提取、过滤、转换和查询 JSON 数据。在这个例子中,jq 命令使用了 -r 参数,这意味着它将以原始字符串形式(而不是 JSON 编码)输出结果。


'.choices[].message.content' 是一个 JSONPath 表达式,用于告诉 jq 如何从 JSON 数据中提取信息。这里:


.choices[] 表示选择 JSON 对象中名为 choices 的数组,并迭代其所有元素。


.message 表示从每个 choices 数组元素中选择名为 message 的子对象。


.content 表示从 message 子对象中选择名为 content 的属性。


因此,echo "${output}" | jq -r '.choices[].message.content' 这个命令将输出 JSON 响应中 choices 数组里每个元素的 message 对象下的 content 属性的值,每个值占一行。


如果 JSON 数据中不存在 choices 数组或者某个元素下没有 message 对象,或者 message 对象下没有 content 属性,那么 jq 命令将不会为那些缺失的部分输出任何内容。


这个命令通常用于解析来自 API 或其他服务的 JSON 响应,以便从中提取感兴趣的数据部分。在这里,它似乎用于提取 GPT-3.5-Turbo 模型补全结果中的各个选择(choices)的消息内容。







投诉或建议