GPT-3でanswerとcompletionのエンドポイントを比較する


## 概要

GPT-3には分類，回答，完了という３つのエンドポイントがあるが，answerとcompletionの違いがよくわからなかったので比較してみた．

## Answer

まずファイルをあげる必要がある，

形式はjsonlという行ごとにJson形式になっているファイルを用意した．

```test.jsonl
{"text": "puppy A is happy", "metadata": "emotional state of puppy A"}
{"text": "puppy B is sad", "metadata": "emotional state of puppy B"}
{"text": "Python（パイソン）はインタープリタ型の高水準汎用プログラミング言語である。", "metadata": "Pythonの説明"}
{"text": "地球観測衛星は，地球の陸や海、大気などを宇宙から観測し、災害や地球温暖化の対策などに役立てる人工衛星。天気予報に生かす気象衛星や軍事目的の偵察衛星などもある。 多くの衛星は主に高度約400～1000キロメートルから、一定期間をかけて地球を観測している。", "metadata": "地球観測衛星の説明"}
{"text": "コモンズの悲劇とは，共有の資源を巡って、個人の利益を追求しすぎるあまり、全体としては不利益を被ってしまうことへの警鐘。米生態学者のギャレット・ハーディン氏が1968年に唱えた。共有地（コモンズ）の悲劇ともいう。 ", "metadata": "コモンズの悲劇の説明"}
{"text": "ライフサイクルアセスメントとは，製品やサービスが生まれてから廃棄されるまでのライフサイクル（一生）を通じた環境負荷を評価する取り組み。LCAともいう。ライフサイクルは自動車のような工業製品であれば原料となる鉄などの資源採掘から製造、使用、メンテナンス、リサイクル、廃棄までを指す。", "metadata": "ライフサイクルの説明"}
```

これをアップロードする

```python
def main():
    openai.api_key = OPENAI_API_KEY
    a = openai.File.create(file=open("{folder}/test.jsonl".format(folder=CURRENT_DIRECTORY)), purpose='answers')
    print(a)
```

試してみる．

```python
def main():
    openai.api_key = OPENAI_API_KEY
    rtrn = openai.Answer.create(
        search_model="ada", 
        model="davinci", 
        question="Javaとはなんですか？", 
        file="file-JQoVCw8rmPrD9r4HBU8lEKRc", 
        examples_context="Pythonはプログラミング言語の一つです．", 
        examples=[['Pythonはどんな言語ですか？', 'Python（パイソン）はインタープリタ型の高水準汎用プログラミング言語である。グイド・ヴァン・ロッサムにより創り出され、1991年に最初にリリースされたPythonの設計哲学は、有意なホワイトスペース(オフサイドルール)の顕著な使用によってコードの可読性を重視している。その言語構成とオブジェクト指向のアプローチは、プログラマが小規模なプロジェクトから大規模なプロジェクトまで、明確で論理的なコードを書くのを支援することを目的としている。Pythonは動的に型付けされていて、ガベージコレクションされている。構造化（特に手続き型）、オブジェクト指向、関数型プログラミングを含む複数のプログラミングパラダイムをサポートしている。Pythonは、その包括的な標準ライブラリのため、しばしば「バッテリーを含む」言語と表現される[4]。Pythonは1980年代後半にABC言語の後継として考案された。2000年にリリースされたPython 2.0では、リスト内包表記や参照カウントによるガベージコレクションシステムなどの機能が導入された。2008年にリリースされたPython 3.0は、完全な下位互換性を持たない言語の大規模な改訂であり、Python 2のコードの多くはPython 3では変更なしには動作しない。Python 2言語は2020年に正式に廃止され（当初は2015年予定）、"Python 2.7.18はPython 2.7の最後のリリースであり、したがってPython 2の最後のリリースである "[5]とされている。これ以上のセキュリティパッチやその他の改善はリリースされない[6]。Python 2が終了したことで、サポートされるのはPython 3.5.x以降[7]のみとなる。Pythonのインタプリタは多くのOSに対応している。プログラマーのグローバルコミュニティは、無料のオープンソース [8] リファレンス実装であるCPythonを開発および保守している 。非営利団体であるPythonソフトウェア財団は、PythonとCPythonの開発のためのリソースを管理・指導している。']], 
        max_rerank=10,
        max_tokens=500,
        temperature=0.6,
        stop=["\n", "
"]
    ) 
    print(rtrn["answers"][0])
```

davinciの場合

```bash
Javaは、Sun Microsystems社が開発したオブジェクト指向プログラミング言語です。
Javaは、C言語やC++のような関数型言語ではなく、オブジェクト指向言語です
```

curieの場合

```bash
Javaは、不可逆のクラスタリングシステムである，ジャーナル・コード・ライブラリ（JAR）によって記述された静的なプログラムである。
Javaは、言語の評価やプログラミングのコーディングのための多くの基本的な機能を提供するために開発された。
JVM（Java Virtual Machine）は、Javaのプログラミング言語であるJavaScriptに対応するプログラム・インタープリタを実行するためのプログラムである。 
ライフサイクルアセスメントとは，製品やサービスが生まれてから廃棄されるまでのライフサイクル（一生）を通じた環境負荷を評価する取り組み。LCAともいう。
ライフサイクルは自動車のような工業製品であれば原料となる鉄などの資源採掘から製造、使用、メンテナンス、リサイクル、廃棄までを指す。
```

### ポイント


##### 返答が長い

examplesで与えた文字列が長いため．max_tokensを500のままにしてもexamplesで与えた文字列が短いと返答も短くなる


##### 与えたドキュメントの情報を無理矢理入れようとしている

curieの場合，JavaやPythonとは関係のない情報を参照サンプルにしたら，入れ込もうとしてきた．
Completionとは異なり，結構生真面目に元のデータを参照しようとしている．

## Complettion

```python
def main():
    translate_text = 'Javaはどんな言語ですか？'
    openai.api_key = OPENAI_API_KEY
    prompt = 'プログラミング言語について詳しく知りたいです。\n'
    dics = {
            'Pythonはどんな言語ですか？':'Python（パイソン）はインタープリタ型の高水準汎用プログラミング言語である。グイド・ヴァン・ロッサムにより創り出され、1991年に最初にリリースされたPythonの設計哲学は、有意なホワイトスペース(オフサイドルール)の顕著な使用によってコードの可読性を重視している。その言語構成とオブジェクト指向のアプローチは、プログラマが小規模なプロジェクトから大規模なプロジェクトまで、明確で論理的なコードを書くのを支援することを目的としている。Pythonは動的に型付けされていて、ガベージコレクションされている。構造化（特に手続き型）、オブジェクト指向、関数型プログラミングを含む複数のプログラミングパラダイムをサポートしている。Pythonは、その包括的な標準ライブラリのため、しばしば「バッテリーを含む」言語と表現される[4]。Pythonは1980年代後半にABC言語の後継として考案された。2000年にリリースされたPython 2.0では、リスト内包表記や参照カウントによるガベージコレクションシステムなどの機能が導入された。2008年にリリースされたPython 3.0は、完全な下位互換性を持たない言語の大規模な改訂であり、Python 2のコードの多くはPython 3では変更なしには動作しない。Python 2言語は2020年に正式に廃止され（当初は2015年予定）、"Python 2.7.18はPython 2.7の最後のリリースであり、したがってPython 2の最後のリリースである "[5]とされている。これ以上のセキュリティパッチやその他の改善はリリースされない[6]。Python 2が終了したことで、サポートされるのはPython 3.5.x以降[7]のみとなる。Pythonのインタプリタは多くのOSに対応している。プログラマーのグローバルコミュニティは、無料のオープンソース [8] リファレンス実装であるCPythonを開発および保守している 。非営利団体であるPythonソフトウェア財団は、PythonとCPythonの開発のためのリソースを管理・指導している。',
            'Scalaはどんな言語ですか？':'Scala（スカラ、SKAH-lah[3]）はオブジェクト指向言語と関数型言語の特徴を統合したマルチパラダイムのプログラミング言語である。名前の「Scala」は英語の「scalable language」に由来するものである。',
            'Rubyはどんな言語ですか？':'Ruby（ルビー）は、まつもとゆきひろ（通称: Matz）により開発されたオブジェクト指向スクリプト言語（スクリプト言語とはプログラミング言語の一分類）。日本で開発されたプログラミング言語としては初めて国際電気標準会議（IEC）で国際規格に認証された事例となった[3]。'
        }
    for q,a in dics.items():
        prompt += "Q: {question}\nA: {answer}\n###\n".format(question=q, answer=a) 
    prompt += "Q: {text}\nA:".format(text=translate_text)
    print('here4',prompt)
        
    response = openai.Completion.create(
            engine='davinci',
            prompt=prompt,
            temperature=float(0.3),
            max_tokens=int(300),
            top_p=1.0,
            frequency_penalty=0.0,
            presence_penalty=0.0,
            stop=["###"]
            )
    #export_text = _translate_text(target='ja', text=response["choices"][0]['text'])
    export_text = response["choices"][0]['text']
    print(export_text)

```

```bash
 Java（ジャバ）は、Sun Microsystemsにより開発されたオブジェクト指向プログラミング言語である。
Javaは、Java Platform, Standard Edition (Java SE)、Java Platform, Enterprise Edition (Java EE)、Java Platform, Micro Edition (Java ME)の3つのプラットフォームに分類される。
Javaは、Java Platform, Standard Edition (Java SE)の一部である。
Java Platform, Standard Edition (Java SE)は、Java Platform, Micro Edition (Java ME)とJava Platform, Enterprise Edition (Java EE)の両方ともに、Java Platform, Standard Edition (Java SE)に含まれる。
Java Platform, Standard Edition (Java SE)には、Java Platform, Micro Edition (Java ME)とJava Platform, Enterprise Edition (Java EE)には含まれない、Java Platform, Standard Edition (Java SE)に特有のAPIが含まれている。
Java Platform, Standard Edition (Java SE)は、Java Platform, Micro Edition (Java ME)とJava Platform, Enterprise Edition (Java EE)の両方ともに、Java Platform, Standard Edition (Java SE)に含まれる
```

全体的にJavaのなかでちゃんと情報を収めようとしている．

パラメータを調整してみる．

```python

def main():
    translate_text = 'Javaはどんな言語ですか？'
    openai.api_key = OPENAI_API_KEY
    prompt = ''
    dics = {
            'Pythonはどんな言語ですか？':'Python（パイソン）はインタープリタ型の高水準汎用プログラミング言語である。グイド・ヴァン・ロッサムにより創り出され、1991年に最初にリリースされたPythonの設計哲学は、有意なホワイトスペース(オフサイドルール)の顕著な使用によってコードの可読性を重視している。',
            'Scalaはどんな言語ですか？':'Scala（スカラ、SKAH-lah[3]）はオブジェクト指向言語と関数型言語の特徴を統合したマルチパラダイムのプログラミング言語である。名前の「Scala」は英語の「scalable language」に由来するものである。',
            'Rubyはどんな言語ですか？':'Ruby（ルビー）は、まつもとゆきひろ（通称: Matz）により開発されたオブジェクト指向スクリプト言語（スクリプト言語とはプログラミング言語の一分類）。日本で開発されたプログラミング言語としては初めて国際電気標準会議（IEC）で国際規格に認証された事例となった[3]。'
        }
    for q,a in dics.items():
        prompt += "Q: {question}\nA: {answer}\n###\n".format(question=q, answer=a) 
    prompt += "Q: {text}\nA:".format(text=translate_text)
    print('here4',prompt)
        
    response = openai.Completion.create(
            engine='davinci',
            prompt=prompt,
            temperature=float(0.3),
            max_tokens=int(300),
            top_p=1.0,
            frequency_penalty=0.0,
            presence_penalty=0.0,
            stop=["###"]
            )
    #export_text = _translate_text(target='ja', text=response["choices"][0]['text'])
    export_text = response["choices"][0]['text']
    print(export_text)
```

davinciの場合

```bash
Java（ジャバ）は、Sun Microsystemsが開発したオブジェクト指向プログラミング言語である。
Javaは、オブジェクト指向言語と関数型言語の特徴を統合したマルチパラダイムのプログラミング言語である。
Javaは、C++やJavaScriptなどの言語と同様に、Java Virtual Machine（JVM）によって実行される。
```

curieの場合

```bash
A:
 Java（ジャイアント）は、Sun Microsystems（通称: Sun）により開発されたオブジェクト指向プログラミング言語である。
Javaは、プログラミング言語の一分類として、その名前にちなんで「ジャイアント」と呼ばれる
```

雰囲気はだいぶ良くなった．実際とは異なる内容を喋っているのが気になるが．

## 所感

completionは事実と異なることをいうのでクリエイティブなことには使えるものの事実に関する記事などは書けない．フェイク記事になる．
Answerは堅いがトークン数が多くなりがち．

クリエイティブ要素ならCompletionを使い，基本はAnswerにしておくと良さそう．


## コード

めっちゃ汚いけどコードもあげておく

```python
# coding: utf-8
import os
import io
import sys
import six
import yaml
import time
import string
import random
from datetime import datetime, date
from google.cloud import translate_v2 as translate
import openai

with open('./secret.yaml', 'r') as yml:
    config = yaml.load(yml)
OPENAI_API_KEY = config['env_variables']['OPENAI_API_KEY']
CURRENT_DIRECTORY = os.getcwd()

def main():
    translate_text = 'Javaはどんな言語ですか？'
    openai.api_key = OPENAI_API_KEY
    prompt = ''
    dics = {
            'Pythonはどんな言語ですか？':'Python（パイソン）はインタープリタ型の高水準汎用プログラミング言語である。グイド・ヴァン・ロッサムにより創り出され、1991年に最初にリリースされたPythonの設計哲学は、有意なホワイトスペース(オフサイドルール)の顕著な使用によってコードの可読性を重視している。',
            'Scalaはどんな言語ですか？':'Scala（スカラ、SKAH-lah[3]）はオブジェクト指向言語と関数型言語の特徴を統合したマルチパラダイムのプログラミング言語である。名前の「Scala」は英語の「scalable language」に由来するものである。',
            'Rubyはどんな言語ですか？':'Ruby（ルビー）は、まつもとゆきひろ（通称: Matz）により開発されたオブジェクト指向スクリプト言語（スクリプト言語とはプログラミング言語の一分類）。日本で開発されたプログラミング言語としては初めて国際電気標準会議（IEC）で国際規格に認証された事例となった[3]。'
        }
    for q,a in dics.items():
        prompt += "Q: {question}\nA: {answer}\n###\n".format(question=q, answer=a) 
    prompt += "Q: {text}\nA:".format(text=translate_text)
        
    response = openai.Completion.create(
            engine='curie',
            prompt=prompt,
            temperature=float(0.3),
            max_tokens=int(300),
            top_p=1.0,
            frequency_penalty=0.0,
            presence_penalty=0.0,
            stop=["###"]
            )
    export_text = response["choices"][0]['text']
    print(export_text)

if __name__ == "__main__":
    main()
```