gptscriptで英語のファイルを翻訳する

毎度、ググっても出てこない小ネタを取り扱っております。
本記事は個人的な見解であり、筆者の所属するいかなる団体にも関係ございません。

# 0. はじめに

以前、書いた「GPTScriptで遊ぶ」の第2弾です。

https://qiita.com/ynott/items/dc53deccba0c67005678

今回は、GPTScriptを使って英語のファイルを翻訳してみたいと思います。

# 1. GPTScriptについて

GPTScriptとは？
以下のGitHubをご確認いただければと思います。
[gptscript\-ai/gptscript: Natural Language Programming](https://github.com/gptscript-ai/gptscript)

# 2. GPTScriptを使うメリット

一般的なChatGPTを使った操作でファイルを翻訳する方法は、以下のようになります。

1. ChatGPT等の生成AIのチャットウィンドウを開く
1. 翻訳したいファイルを開いて、ファイルの中身をクリップボードにコピーする
1. 開いているチャットウィンドウにテキストを翻訳するようなプロンプトを入力する
1. プロンプトの下にクリップボードのコピーされているテキストを貼り付ける
1. プロンプトを実行
1. 出力された結果を選択して、クリップボードへコピーする
1. クリップボードへコピーされた翻訳結果をファイルへ貼り付けて保存する

という段階を経る必要があります。

なんだか、大変ですよね。

GPTScriptを使うと、GPTScriptを実行したマシン上のファイルを読み込ませることができます。そして、出力結果をファイルに書き出すことができます。さらにプロンプトをファイルとして保存しておくことができるので、ファイルを翻訳するには以下のような操作で実行できます。

1. GPTScriptを実行するファイルを作成して、そのファイルにファイルを翻訳するプロンプトを書き込む。
1. プロンプトには、どのファイルを翻訳するか、翻訳した結果をどこに保存するか書いておく。
1. GPTScriptを実行する

これだけで、翻訳ファイルができあがります。

# 3. 実際にやってみる

使っているGPTScriptのバージョンは以下の通りです。
```
$ gptscript -v
gptscript version v0.5.0+5a8a685c
```

gptscriptに読み込ませるスクリプトは以下の通りです。
ファイル名の拡張子は、`.gpt`にしてください。

```io:translate-README.md-to-japanese.gpt
tools: sys.read, sys.write

README.mdファイルを読み込んで日本語に翻訳した内容をtranslated-README.ja.mdというファイル名で保存してください。
ファイルを翻訳するときに、```や```yamlで囲まれたMarkdownの書式のブロッククオートの中の部分は翻訳しないでください。

ファイルを書き出すときに日本語はUTF-8でエンコードしてください。
```

この.gptファイルがある場所に、README.mdファイルを置いて、以下のコマンドを実行します。

```shell
gptscript ./translate-README.md-to-japanese.gpt -o output.txt
```

::: note warn
`-o output.txt`が無いとファイルへ書き込み時に標準出力でエラーが発生して、以下のようにスクリプトが終了します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/15176/2ef733b7-7651-ffeb-5c5e-b04932f6d5d2.png)
:::

# 4. 日本語への変換結果

変換されたGPTScriptのREADME.mdファイルです。

---
# GPTScript

## 概要

GPTScriptは、OpenAIという大規模言語モデル(LLM)とのやり取りを自動化するための新しいスクリプト言語です。最終的な目標は、自然言語プログラミング体験を創出することです。GPTScriptの構文は大部分が自然言語であり、学習しやすく使いやすいです。
自然言語のプロンプトは、bashやpythonのような従来のスクリプトや外部HTTPサービスの呼び出しと混在させることができます。GPTScriptを使えば、[休暇の計画](./examples/travel-agent.gpt)、[ファイルの編集](./examples/add-go-mod-dep.gpt)、[SQLの実行](./examples/sqlite-download.gpt)、[mongodb/flaskアプリの構築](./examples/hacker-news-headlines.gpt)など、ほぼ何でも行うことができます。以下はGPTScriptの一般的な使用例です：

1. [検索拡張生成(RAG)](./docs/README-USECASES.md#retrieval)
2. [タスク自動化](./docs/README-USECASES.md#task-automation)
3. [エージェントとアシスタント](./docs/README-USECASES.md#agents-and-assistants)
4. [データ分析](./docs/README-USECASES.md#data-analysis)
5. [ビジョン、画像、およびオーディオ](./docs/README-USECASES.md#vision-image-and-audio)
6. [メモリ管理](./docs/README-USECASES.md#memory-management)
7. [チャットボット](./docs/README-USECASES.md#chatbots)

| :memo: | 現在、GPTScriptを使ってローカルモデルとのやり取りを行うオプションを探索中です。 |
| ------ | :------------------------------------------------------------------------------------ |

以下の例は、英語での指示を書くことで複雑なタスクを達成できる方法を示しています：

```yaml
# example.gpt

Tools: sys.download, sys.exec, sys.remove

Download https://www.sqlitetutorial.net/wp-content/uploads/2018/03/chinook.zip to a
random file. Then expand the archive to a temporary location as there is a sqlite
database in it.

First inspect the schema of the database to understand the table structure.

Form and run a SQL query to find the artist with the most number of albums and output
the result of that.

When done remove the database file and the downloaded content.
```

```shell
$ gptscript ./example.gpt
```

```
OUTPUT:

The artist with the most number of albums in the database is Iron Maiden, with a total
of 21 albums.
```

## クイックスタート

### 1. 最新リリースをインストール

#### Homebrew (macOSとLinux)

```shell
brew install gptscript-ai/tap/gptscript
```

#### インストールスクリプト (macOSとLinux):

```shell
curl https://get.gptscript.ai/install.sh | sh
```

### Scoop (Windows)

```shell
scoop bucket add extras # If 'extras' is not already enabled
scoop install gptscript
```

#### WinGet (Windows)

```shell
winget install gptscript-ai.gptscript
```

#### 手動で

[リリースページ](https://github.com/gptscript-ai/gptscript/releases)からプラットフォームとアーキテクチャに合ったアーカイブをダウンロードしてインストールします。

### 2. [OpenAI](https://platform.openai.com/api-keys)からAPIキーを取得します。

#### macOSとLinux

```shell
export OPENAI_API_KEY="your-api-key"
```

代わりにAzure OpenAIを利用することもできます。[Azureデプロイメント名が使用しているモデルと異なる場合](https://learn.microsoft.com/en-us/azure/ai-services/openai/how-to/switching-endpoints#keyword-argument-for-model)は、`OPENAI_AZURE_DEPLOYMENT`引数を含めることを忘れないでください。

```shell
export OPENAI_API_KEY="your-api-key"
export OPENAI_BASE_URL="https://<your-endpoint>.openai.azure.com/"
export OPENAI_API_TYPE="AZURE"
export OPENAI_AZURE_DEPLOYMENT="<your-deployment-name>"
```

#### Windows

```powershell
$env:OPENAI_API_KEY = 'your-api-key'
```

### 3. Hello Worldを実行

```shell
gptscript https://get.gptscript.ai/echo.gpt --input 'Hello, World!'
```

```
OUTPUT:

Hello, World!
```

デフォルトで使用されるモデルは`gpt-4-turbo-preview`であり、OpenAIアカウントでそのモデルへのアクセス権を持っている必要があります。

Azure OpenAIを使用する場合は、`--default-model`引数でサポートされているバージョンのモデルを設定することを確認してください。

### 4. 追加クレジット: 例とデバッグUIの実行

例をクローンしてデバッグUIを実行します

```shell
git clone https://github.com/gptscript-ai/gptscript
cd gptscript/examples

# Run the debugging UI
gptscript --server
```

## 仕組み

**_GPTScriptはツールで構成されています。_** 各ツールは、関数のような一連のアクションを実行します。ツールは、関数呼び出しのように他のツールを呼び出すことができます。関数に似ていますが、ツールは主に自然言語のプロンプトで実装されます。**_ツールの相互作用はAIモデルによって決定されます_**、モデルはツールを呼び出す必要があるかどうか、何を引数として渡すかを決定します。ツールは自然言語のプロンプトで実装されることが意図されていますが、コマンドやHTTP呼び出しで実装することもできます。

### 例

以下は、`---`で区切られた2つのツール定義です。最初のツールは名前や説明を必要としませんが、その後のすべてのツールでは名前と説明が必要です。最初のツールには`tools: bob`というパラメータがあり、必要に応じて`bob`という名前のツールを呼び出すことができます。

```yaml
tools: bob

Ask Bob how he is doing and let me know exactly what he said.

---
name: bob
description: I'm Bob, a friendly guy.
args: question: The question to ask Bob.

When asked how I am doing, respond with "Thanks for asking \"${question}\", I'm doing great fellow friendly AI tool!"
```

上記の内容を`bob.gpt`というファイル名で保存し、次のコマンドを実行します：

```shell
$ gptscript bob.gpt
```

```
OUTPUT:

Bob said, "Thanks for asking 'How are you doing?', I'm doing great fellow friendly AI tool!"
```

ツールは、自然言語のプロンプトではなくプログラムを呼び出すことによって実装することができます。以下の例は、前の例と同じですが、Bobをpythonを使って実装しています。

```yaml
Tools: bob

Ask Bob how he is doing and let me know exactly what he said.

---
Name: bob
Description: I'm Bob, a friendly guy.
Args: question: The question to ask Bob.

#!python3

import os

print(f"Thanks for asking {os.environ['question']}, I'm doing great fellow friendly AI tool!")
```

これらの基本的な構成要素を使って、AIがAI、ローカルシステム、データ、または外部サービスと対話する複雑なスクリプトを作成できます。

## GPTファイルリファレンス

### 拡張子

GPTScriptファイルは、慣例により`.gpt`拡張子を使用します。

### ファイル構造

GPTScriptファイルには、1つ以上のツールがファイル内にあります。各ツールは、行単位で3つのダッシュ`---`によって区切られます。

```yaml
Name: tool1
Description: This is tool1

Do sample tool stuff.

---
Name: tool2
Description: This is tool2

Do more sample tool stuff.
```

### ツール定義

ツールは、ツールの名前、説明、引数、利用可能なツール、および追加のパラメータを定義する前文で始まります。前文に続いて、ツールの本体があり、ツールの指示が含まれます。前文のコメントは`#`で始まる行であり、パーサーによって無視されます。コメントは通常、説明、引数の説明、または指示の中でテキストがより有用であるため、推奨されません。

```yaml
Name: tool-name
# This is a comment in the preamble.
Description: Tool description
# This tool can invoke tool1 or tool2 if needed
Tools: tool1, tool2
Args: arg1: The description of arg1

Tool instructions go here.
```

#### ツールパラメータ

ツールパラメータは、指示のテキストの前に定義されるキーと値のペアです。`key: value`の形式で指定されます。パーサーは、次のキーを認識します（大文字小文字は区別されず、スペースは無視されます）：


| キー            | 説明                                                                                                                             |
|------------------|-----------------------------------------------------------------------------------------------------------------------------------------|
| `Name`           | ツールの名前。                                                                                                                   |
| `Model Name`     | 使用するOpenAIモデル。デフォルトでは"gpt-4-turbo-preview"を使用します。                                                                         |
| `Description`    | ツールの説明。これは、ツールの目的を適切に説明することが重要です。LLMによって使用されます。     |
| `Internal Prompt`| これを`false`に設定すると、このツールの組み込みシステムプロンプトが無効になります。                                                          |
| `Tools`          | このツールによって呼び出されるツールのコンマ区切りリスト。                                                            |
| `Args`           | ツールの引数。各引数は`arg-name: description`の形式で定義されます。                                                  |
| `Max Tokens`     | LLMによって生成されるトークンの最大数を制限したい場合は、数値を設定します。                                      |
| `JSON Response`  | これを`true`に設定すると、LLMがJSON形式で応答します。trueに設定する場合は、ツールに指示を含める必要があります。        |
| `Temperature`    | 創造性を高めるためにより高い数値に設定された浮動小数点数を表す温度パラメータ。デフォルトでは温度は0です。 |


#### ツール本体

ツール本体には、ツールの指示が含まれています。これは自然言語のプロンプトまたは実行するコマンドである可能性があります。コマンドは`#!`で始まり、インタープリタ（例：`#!/bin/bash`, `#!python3`）に続きます。引数は指示の中で`${arg1}`の形式で参照できます。

```yaml
name: echo-ai
description: 入力をエコーするツール
args: input: 入力

Just return only "${input}"

---
name: echo-command
description: 入力をエコーするツール
args: input: 入力

#!/bin/bash

echo "${input}"
```

## 組み込みツール

基本的なことを行うためのいくつかの組み込みツールがあります。ファイルの読み書き、HTTPコンテンツのダウンロード、コマンドの実行などができます。
`gptscript --list-tools`を実行して、すべての組み込みツールをリストアップします。

## 例

より多くの例については、[examples](examples)ディレクトリをチェックしてください。

## コミュニティ

Discordで参加しましょう：

## ライセンス

Copyright (c) 2024 [Acorn Labs, Inc.](http://acorn.io)

Apache License, Version 2.0（"License"）の下でライセンスされています；
このファイルをLicenseに従って以外で使用することはできません。
Licenseは以下から入手できます

[http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0)

適用される法律または書面による合意が必要な場合を除き、ライセンスの下で配布されるソフトウェアは、いかなる種類の保証も条件もなしに"AS IS"ベースで配布されます。
ライセンスの下での権利と制限に関する規定を参照してください。


# 5. まとめ

GPTScriptを使ってプロンプトのチャットウィンドウからおさらばしましょう