【Django技】formの内容にオリジナルの命令を自動追加して、GPT-3 APIを呼び出す方法！

# 課題
　Djangoを使ってウェブサービスを作成するときに、GPT-3 APIを使い、高度で柔軟性のあるサービスを作ろうと思いました。
　しかし以下のことをするための方法を見つけるのが難しく、苦労したところがあるので、それを共有します。
①フォームから内容を取得
↓
②オリジナルの命令を自動的に付加してGPT-3 APIを呼び出す
↓
③その結果をテンプレートに表示する

# 結論
結論となるコードを載せます。
最初に、解説をしておきます。
①`TranslationForm`はオリジナルのフォームです。ご自身のサイトに合わせて、変更してください。
ここに`sentence`という名前の枠を作っていて、そこをフォームの内容としています。このフォームの内容を取得する部分が、`form.cleaned_data['sentence']`です。

②`"ここにオリジナルの命令を記述"`のところに、自動追加してほしいオリジナルの命令を記述します。
例えばフォームの内容を50文字程度に要約してほしいなら、ここに`"以下の文章を50文字ほどに要約してください："`と記述します。

③オリジナルの命令を追加したフォームの内容を基に、GPT-3 APIを呼び出し、その結果を`results`に入れています。

```python:views.py
from .forms import TranslationForm

#事前に、pip install openaiなどでインストールしておく。
#openaiのインポート
import openai

# openaiの認証コード
openai.api_key = "ご自身のOPENAIのAPIキー"


def call_chat_gpt_api(request):
    # 結果を入れる変数を準備
    results = ""

    if request.method == "POST":
        # POSTされたときの、フォームの内容を取得
        form = TranslationForm(request.POST)

        # バリデーションチェック
        if form.is_valid():
            # フォームの内容を取得
            sentence = form.cleaned_data['sentence']
            orderMessage = "ここにオリジナルの命令を記述"
            sendingMessage = orderMessage + sentence
            response = openai.Completion.create(
                model="text-davinci-003",
                prompt=sendingMessage,
                temperature=0.9,
                max_tokens=150,
                top_p=1,
                frequency_penalty=1,
                presence_penalty=0.6,
            )
            #GPT-3 APIからの結果を、文字列として取得
            results = response['choices'][0]['text']
    else:
        form = TranslationForm()

    #テンプレートをレンダリング
    template = loader.get_template('translation/index.html')

    context = {
        'form': form,
        'results': results,
    }
    return HttpResponse(template.render(context, request))
```


```python:forms.py
from django import forms


class TranslationForm(forms.Form):

    sentence = forms.CharField(
        label='', widget=forms.Textarea(attrs={'cols': '70', 'rows': '20'}), required=True)

```

# パラメータの説明
上記の`views.py`の`response`に、GPT-3 APIからの結果が入っています。
その際の`prompt`などのパラメータについて、説明させていただきます。
詳しくは、[公式ドキュメント](https://beta.openai.com/docs/api-reference/completion/gpt-2 "公式ドキュメント")に載っています。

| 名前| 内容 |
|:-:|:-:|
|temperature|パラメータの範囲は、0から1までです。<br> このパラメータを使用すると、生成される文章の抽象的さや多様性を制御することができます。temperatureを1にすると、より多様な文章が生成される傾向があります。<br> 一方、temperatureを0にすると、より保守的な文章が生成される傾向があります。|
|max_tokens|生成する文章の最大トークン数を表します。トークンとは、単語や文字の単位で、文章を構成する基本的な単位のことを指します。|
|top_p|0から1までの小数値を指定することができます。<br> GPT-3モデルが返す文章の品質を制御するものです。<br> top_pの値を小さくすると、より自然で文法的に正しい文章を生成することができますが、あまり人工的な文章を生成することもあります。<br> 一方で、top_pの値を大きくすると、より人間らしい文章を生成することができますが、文法的に正しいとは限らない文章を生成することもあります。<br> つまり、top_pは、GPT-3モデルが返す文章が、より自然で正しいものか、より人間らしいものかを制御するものです。|
|frequency_penalty|生成される文章中に出現するトークンの使用頻度を調整するものです。<br> 範囲は-2.0から2.0までで、0を指定すると無効になります。<br>例えば、負の値を指定すると、通常よりもレアな単語や表現が生成される可能性があります。正の値を指定すると、通常よりも頻出する単語や表現が生成される可能性があります。|
|presence_penalty|0から1までの値を取ります。<br> このパラメータは、生成される文章中に含まれる単語の出現頻度を調整するために使用されます。<br> 例えばpresence_penaltyを0に設定すると、生成される文章中で頻繁に使われる単語が多く含まれるようになり、1に設定すると、生成される文章中で頻繁に使われる単語が少なく含まれるようになります。|

# 最後に
　今回はフォームの内容にオリジナルの命令を自動追加して、GPT-3 APIを呼び出す方法を紹介しました。オリジナルの命令を自動追加できるようになることで、サービスとしての幅や利便性が大幅に上がると思うので、ぜひ試してみてください！
　また、「いいね」や「ストック」をしていただけると励みになりますので、よろしければよろしくお願いします！
　最後までお読みいただき、ありがとうございました！

参考になった動画：

https://www.youtube.com/watch?v=d_J52nbwHZI