LoginSignup
1
0
はじめての記事投稿
Qiita Engineer Festa20242024年7月17日まで開催中!

コマンドラインで使えるGPTを使った翻訳ツールやシステムプロンプト自動生成ツールを作ってみました

Last updated at Posted at 2024-06-17

お遊びで作ったツールですが:sweat_smile:
ちょっと面白かったのでシェアします!

使い方

実行例

e:\tmp>tran.py "Sunny today"
今日は晴れです。

e:\tmp>type hoge.txt
Kana Reminder is a program which can be used to set a reminder to be triggered at a specified time. It can also be used to run another program at a specified time.

e:\tmp>type hoge.txt | tran.py
Kana Reminderは、指定された時間にトリガーされるリマインダーを設定するために使用できるプログラムです。また、指定された時 間に他のプログラムを実行するためにも使用できます。

e:\tmp>tran.py < hoge.txt
Kana Reminderは、指定された時間にトリガーされるリマインダーを設定するために使用できるプログラムです。また、指定された時 間に別のプログラムを実行するためにも使用できます。

e:\tmp>go install 2>&1 | tran.py
go: 現在のディレクトリまたは親ディレクトリにgo.modファイルが見つかりません。'go help modules'を参照してください。

実装手順

環境変数を設定します

e:\tmp>set OPENAI_API_KEY=your_api_key_here
e:\tmp>set GPT_MODEL=gpt-3.5-turbo-1106

たぶん、windowsのデスクトップ検索から env で検索して、システム環境変数の編集をする方がわかりやすいと思います

openai のライブラリをインストールします

e:\tmp>pip install --upgrade openai

tran.py(pythonのコードです)

import os
import openai
import sys

def translate(text):
    openai.api_key = os.getenv("OPENAI_API_KEY")
    try:
        response = openai.chat.completions.create(
            model = os.getenv("GPT_MODEL"),
            messages=[
                {"role": "system", "content": "You are a translator. Translate to Japanese. Leave tags and what appear to be symbols."},
                {"role": "user", "content": text}
            ]
        )
        return response.choices[0].message.content.strip()
    except Exception as e:
        return f"Error: {str(e)}"

if __name__ == "__main__":
    if sys.stdin.isatty():
        # 標準入力がない場合の使い方を表示
        if len(sys.argv) < 2:
            print("Usage: type <file> | tran.py")
            sys.exit(1)
        input_text = " ".join(sys.argv[1:])
    else:
        # 標準入力からテキストを読み取る
        input_text = sys.stdin.read().strip()
    
    translated_text = translate(input_text)
    print(translated_text)

詳しいことはよくわかりませんが、pythonの環境が整っていて、GPTのAPIキーを持っていれば簡単にできるんじゃないかと思います。systemプロンプトをいじれば、GPTとおしゃべりもできます:sweat_smile:
.pyを.exeファイルのように扱えたらもっと便利に使えるんですが、、、googleで"PythonのスクリプトをPyinstallerでexe化する方法"で検索すると、なにやら関連記事が出てきます。
Qiitaを使うのは初めてなので、不備があるかもしれませんが、良かったら試してみてください:yum:

追記

tran.py から tran.exe を生成する手順

pyinstaller をインストールする
e:\tmp>pip install pyinstaller			

tran.py から tran.exe を生成する
e:\tmp>pyinstaller --onefile tran.py

これだけでした:sweat_smile:
生成された実行ファイルをpathの通ったディレクトリに配置すれば、簡単コマンドライン翻訳ツールのできあがりです:laughing:

実行例

e:\tmp>echo sunny today | tran
今日は晴れ

e:\tmp>echo Life is really simple, but we insist on making it complicated. | tran
人生は本当にシンプルですが、私たちはそれを複雑にしようとします。

e:\tmp>go install
go: go.mod file not found in current directory or any parent directory; see 'go help modules'

e:\tmp>go install 2>&1 | tran
go: 現在のディレクトリまたは親ディレクトリにgo.modファイルが見つかりません。'go help modules'を参照してください。

注意点

go install 2>&1 | tran
意味:go install を実行し、エラー出力と標準出力をまとめて tran にパイプで渡す

追記(無料枠のあるDeepLを使った翻訳ツール)

DeepLは無料枠があるので、ただの英文の和訳ならこちらのほうが実用的かもしれません:sweat_smile:

まず deepl ライブラリをインストールします

e:\tmp>pip install --upgrade deepl

環境変数に DeepL のAPIキーを設定します

e:\tmp>set DEEPL_API_KEY=your_api_key_here

trandl.py

import os
import sys
import deepl

def translate(text):
    auth_key = os.getenv("DEEPL_API_KEY")
    translator = deepl.Translator(auth_key)
    try:
        result = translator.translate_text(text, target_lang="JA")
        return result.text
    except Exception as e:
        return f"Error: {str(e)}"

if __name__ == "__main__":
    if sys.stdin.isatty():
        # 標準入力がない場合の使い方を表示
        if len(sys.argv) < 2:
            print("Usage: type <file> | trandl.py")
            sys.exit(1)
        input_text = " ".join(sys.argv[1:])
    else:
        # 標準入力からテキストを読み取る
        input_text = sys.stdin.read().strip()
    
    translated_text = translate(input_text)
    print(translated_text)

.exeファイルの生成

e:\tmp>pyinstaller --onefile trandl.py

実行例

e:\tmp>type from.txt
Translate text
API reference for translating text with the DeepL API.

The text-translation API currently consists of a single endpoint, translate, which is described below.

To learn more about context in DeepL API translations, we recommend this article.

For more detail about request body parameters, see the Request Body Descriptions section further down on the page.

We also provide a spec that is auto-generated from DeepL's OpenAPI file. You can find it here.


e:\tmp>type from.txt | trandl
テキストの翻訳
DeepL API でのテキストの翻訳に関する API リファレンスです。

テキスト翻訳 API は現在、translate という 1 つのエンドポイント で構成されています。

DeepL API の翻訳におけるコンテキストの詳細は、こちらの記事を参 照してください。

リクエスト・ボディ・パラメータの詳細は、このページのさらに下に ある "リクエスト・ボディの説明" セクションを参照してください。

また、DeepL の OpenAPI ファイルから自動生成される仕様も提供しています。こちらで参照できます。


e:\tmp>trandl < from.txt
テキストの翻訳
DeepL API でのテキストの翻訳に関する API リファレンスです。

テキスト翻訳 API は現在、translate という 1 つのエンドポイント で構成されています。

DeepL API の翻訳におけるコンテキストの詳細は、こちらの記事を参 照してください。

リクエスト・ボディ・パラメータの詳細は、このページのさらに下に ある "リクエスト・ボディの説明" セクションを参照してください。

また、DeepL の OpenAPI ファイルから自動生成される仕様も提供しています。こちらで参照できます。

DeepL公式の解説がわかりやすかったので比較的簡単に作れました:grin:

追記(コマンドラインで使えるGPTのsystemプロンプト自動生成ツール)

createprompt.py

import os
import openai
import sys

def translate(text):
    # APIキーの定義
    api_key = os.getenv("OPENAI_API_KEY")
    if not api_key:
        return "Error: OPENAI_API_KEY environment variable not set."
    # GPTモデルの定義
    gpt_model = os.getenv("GPT_MODEL_35T")
    # gpt_model = os.getenv("GPT_MODEL_4T")
    if not gpt_model:
        return "Error: GPT_MODEL_35T or GPT_MODEL_4T environment variable not set."
    openai.api_key = api_key
    try:
        response = openai.chat.completions.create(
            model = gpt_model,
            messages=[
                {"role": "system", "content": "You are an engineer's assistant. Generate system prompts by english to be entered into GPT's API to perform the following functions, and present only the system prompt by english. example: You are useful assistant. Summarize the provided text."},
                {"role": "user", "content": text}
            ],
            temperature=0.00,   # 創造性を低めに設定
            top_p=1.00          # 多様性を高めに設定
        )
        return response.choices[0].message.content.strip()
    except Exception as e:
        return f"Error: {str(e)}"

if __name__ == "__main__":
    if sys.stdin.isatty():
        # 標準入力がない場合の使い方を表示
        if len(sys.argv) < 2:
            print("Usage: type <file> | createprompt")
            sys.exit(1)
        input_text = " ".join(sys.argv[1:])
    else:
        # 標準入力からテキストを読み取る
        input_text = sys.stdin.read().strip()

    translated_text = translate(input_text)
    print(translated_text)

実行例

e:\tmp>echo 与えられた数式を計算してから結果を返す機能 | createprompt
Calculate the given mathematical expression and return the result.

e:\tmp>echo テキストを英語に翻訳してから文鳥語に翻訳したの後に要約する機能 | createprompt
Translate the text from Japanese to English, then translate it to Budgerigar language, and finally summarize it.
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0