見出し画像

ChatGPT API入門~にゃんたさんのudemyを受けてみた感想~

初めまして、みずぺーといいます。
このnoteを機に初めて私を知った方のために、箇条書きで自己紹介を記述します。

  • 年齢:28歳

  • 出身:長崎

  • 大学:中堅国立大学

  • 専門:河川、河川計画、河道計画、河川環境

  • IT系の資格:R5.4基本情報技術者試験合格💮、R5.5G資格

本日はChatGPTの全般について解説します。


ChatGPT使用時の注意点

ChatGPTは以下の三点に気を付けて使用することが必要です。

  • 存在しない事実や関係を生成することがある(ハルシネーション問題)

  • 学習した期間までの情報しか参照できない

  • 情報漏洩リスク

プロンプトとは

プロンプトとは、以下の画像の赤枠で囲った部分に入力する文章のことです。

ChatGPTはプロンプトによって回答する精度も異なってきます。

以下は過去の記事でプロンプトの方法を解説してます。是非参考にしてください。

APIに入力するパラメータ

temperture

出力のランダム性を調整するもの(0~2の間で設定)

温度が低い:確率値の差分が大きくなり出力のランダム性が減る
温度が高い:確率値の差分が小さくなり出力のランダム性が増える

top_p

出力の候補の絞り込みに使用(0~1の間で設定)

top_p=0.15とすれば確率が上位15%までのトークンのみが候補となる
tempertureと同時に調整することは非推奨(OpenAi API documentより)

上位の15%のみが参照

OpenAI APIを使用したChatGPTによる返答

それでは例として以下のレスポンスの関数を作成してChatGPTに答えさせてみましょう。

APIキーの設定

まずはOpenAIのAPIキーを入力します。
APIキーの取得に関しては、以下のリンクのCreate new sercre keyから発行できます。↓

Create new secret keyを押していただき

OpenAI API画面

適当な名前を付けていただいて

OpenAI APIキー名を入力

以下のSercretkeyをコピーしていただいて、忘れないように!

ただ、もし忘れた場合には削除していただいて、再発行することも可能ですので!無料でできますのでご安心を。。。

Open AI APIキーの発行

Google clobでのキーの入力

本noteではGoogle clobを用いて解説します。

driveの左上のnewから作成しましょう

%%capture
!pip install openai==1.3.5
import getpass
import json

from openai import OpenAI
from IPython.display import Markdown, display

apikey = getpass.getpass(prompt="OpenAIのAPIキーを入力してください")
client = OpenAI(api_key=apikey)

ChatGPTに読み込ませる関数の定義

def get_chatgpt_response(
    user_input: str,
    template: str,
    model: str = "gpt-3.5-turbo-1106",
    temperature: float = 0,
    max_tokens: int = 500,
) -> str:
    """
    ChatGPTに対して対話を投げかけ、返答を取得する
    """
    prompt = template.format(user_input=user_input)
    messages = [{"role": "user", "content": prompt}]
    response = client.chat.completions.create(
        model=model,
        messages=messages,
        temperature=temperature,
        max_tokens=max_tokens,
        seed=0
    )
    return response.choices[0].message.content

入力する文章に関しては後程user_inputを入力すると見越して以下のような文章としております

テンプレート文の定義

PROMPT_TEMPLATE = """
    下記の文章を関西弁にしてください。
    {user_input}
    """

今回は「がむしゃらにやれ!」をuser_inputとしてPROMPT_TEMPLATEに渡し、それを引数としたget_chatgpt_response関数に渡して、最終的にプリント文で出力します。

入力文の記載

print(get_chatgpt_response("がむしゃらにやれ!", PROMPT_TEMPLATE))

その結果返ってくるのは
「がんばってやりなさいやで!」

FunctionCallingを使用した文章回答生成

続いてはFunctionsCallingを使用した文章回答生成を行いたいと思います。

今回は商品名と特徴が記載された前情報を読み取り、補助知識として読み込ませてから回答を生成させてみたいと思います。

前情報の入力(本セクションでNEW)

以下のデータを読み込ませてみます。

商品名と特徴が記述されたファイル

前情報を抽出する関数の定義(本セクションでNEW)

以下のコードで商品名から特徴を返す関数を定義します。

def get_product_description(product_name: str) -> str:
    """
    商品名から特徴を返す関数
    """
    description = dict_description.get(product_name)
    if not description:
        description = "該当データがありません"
    return description

ChatGPTに読み込ませる関数の定義

さらに以下のコードより対象の商品に対する商品の特徴を返しChatGPTに入力するところを記載します。

def get_chatgpt_response_with_description(user_input: str) -> str:
    # 与えた関数の説明を記載
    my_functions = [
        {
            "name": "get_product_description",
            "description": "商品名から特徴を返す関数",
            "parameters": {
                "type": "object",
                "properties": {
                    "product_name": {
                        "type": "string",
                        "description": "商品名を抽出する。例:商品A",
                    },
                },
                "required": ["product_name"],
            },
        }
    ]

    response = client.chat.completions.create(
        model="gpt-3.5-turbo-1106",
        messages=[{"role": "user", "content": user_input}],
        functions=my_functions,
        function_call={"name": "get_product_description"},
        seed=0
    )

    message = response.choices[0].message

入力文の記載

最終的にuser_inputによる文章と事前にChatGPTに与えられた、get_product_descriptionにより回答が補正されて文章が答えられます。

response = get_chatgpt_response_with_description("商品Bについて教えてください")
商品Bは独自のテクノロジーにより、効率的な性能を発揮する商品です。充電一回で長時間使用することができ、直感的な操作性を誇り、誰でも簡単に使いこなすことができます。忙しい日々にピッタリな商品です。

PDFからQ&Aで回答を行う仕組み

以下のようなPDF文章から自分が欲しい情報を抽出したい場合にスクロールしながら該当文章を見つけ出すことは一苦労です。

そのためこの文章から該当情報を抽出させてChatGPTに読み込ませ、回答を生成させてみましょう。

東京都防災知っておきたい災害知識

ステップとしては以下の通りです。

まずはPDFを分割して整理するベクトル化を行います。

ベクトル化とは??と思われた方もいると思いますので、こちらの記事を参考までに。

イラストで表すと以下になります。

文章分割(ベクトル化)

ベクトル化に関する概要や、やり方は以下の記事で解説してますので参考にしてください。

さらにベクトル化した文章から該当する箇所を検索し、回答を生成します。

文章検索(ベクトル検索)

ベクトル検索に関しては以下の記事で解説してますので参考にしてください。

PDFからQ&Aで回答実装

キーの入力

import getpass
import json
import os
from pathlib import Path

from IPython.display import Markdown, display
from langchain.chat_models import ChatOpenAI
from llama_index import (GPTVectorStoreIndex, LLMPredictor, ServiceContext,
                         StorageContext, VectorStoreIndex, download_loader,
                         load_index_from_storage)

apikey = getpass.getpass(prompt="OpenAIのAPIキーを入力してください")
os.environ["OPENAI_API_KEY"] = apikey # llama indexは環境変数じゃないとエラーがでる?

PDFの読み込み

PDFReader = download_loader("PDFReader")

loader = PDFReader()
documents = loader.load_data(file=Path("コンプライアンスのすべて.pdf"))

ベクトル化手法の設定

service_context = ServiceContext.from_defaults(
    llm_predictor=LLMPredictor(
        llm=ChatOpenAI(model_name="gpt-3.5-turbo-1106", temperature=0, model_kwargs={"seed": 0})
    )
)

ベクトル生成(index生成)

# indexを作成
index = VectorStoreIndex.from_documents(documents, service_context=service_context)
index.storage_context.persist(persist_dir="./storage/")

検索エンジン生成

query_engine = index.as_query_engine()

処理実行

response = query_engine.query("AIとコンプライアンスについて教えて")

最後に

本内容はにゃんたさんの講義を元に作成しております。一部自分が変えたところや飛ばしているところが多々あります。

  1. PDFからQ&A

  2. 回答の高速化技術

  3. FuctionCallingの分岐の方法

等々解説してます。詳細はにゃんたさんのudemyをご覧いただければと思います。

最後までお読みいただきましてありがとうございました!

この記事が気に入ったらサポートをしてみませんか?