ChatGPT の API が公開されたので遊んでみよう!

FacebooktwitterredditpinterestlinkedinmailFacebooktwitterredditpinterestlinkedinmail

ChatGPT のお陰で毎日が楽しい楽介です。できるだけ仕事はいろいろな AI にお手伝いしてもらい、お仕事以外では AI の研究をするのが日常ですね。ちょっと何を言っているか分からないですね。

昨年は画像系のジェネレーティブ AI の話題が多かったですが、 ChatGPT 登場以降、LLM(大規模言語モデル)周辺の話題が過熱していますね。当サイト的に言うと、これまで生産性を劇的に改善することが難しかった顧客体験(CX)の提供において大規模な地殻変動レベルの変動が起きる可能性があるためです。

検索エンジンと比較されがちだった、Webサービスとしての ChatGPT では使い方を研究しても質疑応答レベルでいえば一般的なことしか回答が得られません。参考資料などを読み込ませて希望する回答を得られるようにしてもそれを他者と共有して利用することはできませんでした。

ところが、今回の API の公開で何が変わるかというと、「自分(自社)の情報を優先して回答するChatGPT」を作成・提供が可能になるのです(現時点では、ChatGPTに相当するGPT-3.5-turbo ではファインチューニングが行えないので限定的ではあります)。

しかも、 API なので自社で大規模なインフラを整える必要がありませんし、利用料金が前バージョン Davinci と比較して 驚きの 1/1000 です。

サービスとして外部に提供するのが難しくても自分向け・自社向けにテスト開発を行い、ノウハウを蓄積しておくことで確実に将来役に立つでしょう(もちろん、テスト開発で不安定であることを呑める環境であれば、大幅な生産性の向上に寄与すると考えられます)。

ということで、遊んでみましょう。

開発環境

  • Windows11 Python 3.11.1 64bit
  • Visual Studio Code
  • LangChain、OpenAI API 利用

環境については、本当に楽しむだけであれば Google Colaboratory を利用するという考え方もあります。ただこの方法だと同じく、言語モデルでちょっと話題の GitHub Copilot を利用しようとすると大分大変らしいので、今回は今後の活用の可能性を考えて使いやすい Visual Studio Code を選択しています。

また、ただ実験するだけならともかく、アプリケーションやボットを開発しようと思うと OpenAI API は直接叩くと大変そうです。何故なら、実際には複数の API やらデータベースやらを組み合わせて実装することになると思われるからです。また、文脈を把握するためのメモリー機能なども必要となります。そのため、今回は LangChain を利用します。

LangChain を使えば、上述したような組み合わせの他、例えば別の団体や企業がより優れたモデル・API を出してきたときに乗り換えるのも楽だからというのも理由です(もっとも、より優れたライブラリが出て来て乗り換えたい、ということもあるでしょうが……)。

優れた研究者や最先端のエンジニアリングを実装する企業に勤めているといった場合はともかく、今後の開発環境はいかに「AI を利用しやすい」ということが重要になってくると思われます。それはエディタもしかり、 AI に蓄積されている(されていく)ベストプラクティスの多い言語やライブラリもしかりです。

ライブラリのインストール

本当はvenv(仮想環境)なんかを作るのが正道なんでしょうが、今回は省きます。

py -m pip install langchain
py -m pip install openai

として必要なライブラリをインストールします(windows 以外の環境の方は pip -m install)。

OpenAI API の取得

https://platform.openai.com/

ユーザー登録・またはログインして左メニューの API Keys から生成。

 

使用量の確認などは Usage から。ChatGPT Plus を契約していても、無料トークンが増えたりはしませんが、$18 分の無料トークンがつきます。さらにカード情報などを登録しなくても使える良心的な仕様。

注意点として、 API キーにはドメイン指定などのアクセス制御ができないため、 GitHub やこういった blog などで間違えて公開しないようにしましょう。

使いすぎないするためには、 Billing → Usage limits から月間の使用量制限ができますので、 Paid Plan に移行した場合は設定しておくといいでしょう。会社や研究室、同好会など向けに Bot を公開する場合はもちろん、API Key の流出の他、自分のプログラムのバグ(暴走)で破産することを防げます。

とはいえ、個人で試したりする程度であれば18の無料トークンを期限内に使いきるのも難しいと思いますが……。

(いい感じの実装が出来たら、ChatGPT Plus を契約するよりこちらの方がコストは安そうですね…)

最低限のコードを書いてみる

# OpenAIの自然言語処理APIを使用して、質問に対する回答を生成するためのコード

# langchainパッケージから必要なクラスをインポート
from langchain.llms import OpenAIChat
from langchain import PromptTemplate, LLMChain

# 環境変数にAPIキーを設定
import os
os.environ["OPENAI_API_KEY"] = "APIキー"

# OpenAIChatオブジェクトを作成
llm = OpenAIChat(temperature=0)

# 質問と回答のテンプレートを定義
template = """Question: {question}
Answer:"""

# PromptTemplateオブジェクトを作成
prompt = PromptTemplate(template=template, input_variables=["question"])

# LLMChainオブジェクトを作成
llm_chain = LLMChain(prompt=prompt, llm=llm)

# 回答を生成するための質問文を定義
question = "中小企業診断士とは?"

# LLMChainオブジェクトのrun()メソッドを使用して回答を生成
answer = llm_chain.run(question)

# 生成された回答を出力
print(answer)

出力:

中小企業診断士とは、中小企業の経営改善や事業再生などの支援を行う専門家のことです。国家資格であり、経営
コンサルタントやファイナンシャルプランナーなどと同様に、企業の経営課題を解決するためのアドバイスや支援 を提供します。中小企業診断士は、中小企業の経営者や経営幹部、または経営に関する専門家として活躍していま す。

動作しました。オブジェクトの生成が多い以外は特別難しいこともないコードですね。というか、お約束ごととして覚えれば初めて Python を触る人でも楽しめるコードです(すごい時代だ……)

回答の精度を高めてみる

Step by Step, 一歩一歩考えて見る、と指示することで回答の精度が高まるそうです。

https://self-development.info/%E3%80%90python%E3%80%91langchain%E3%81%8B%E3%82%89chatgpt%E3%81%AEapi%E3%82%92%E5%88%A9%E7%94%A8%E3%81%99%E3%82%8B/

参考にして、template の内容を

template = """Question: {question}
Answer: Let's think step by step."""

としてみます。すると、

1. 中小企業 (Chuushou Kigyou) means small and medium-sized enterprises (SMEs) in Japan.
2. 診断士 (Shindanshi) means a diagnostician or an expert who diagnoses and analyzes a particular field or industry.
3. Therefore, 中小企業診断士 (Chuushou Kigyou Shindanshi) refers to a professional who specializes in diagnosing and analyzing the management, finance, and other aspects of SMEs in Japan.
4. They provide advice and support to SMEs to improve their business operations, increase profitability, and overcome challenges.
5. To become a certified 中小企業診断士, one needs to pass a rigorous examination and meet certain qualifications and experience requirements set by the Japanese government.

英語になりましたが、 ChatGPTっぽい、網羅的な箇条書きの回答になりましたね。

中小企業診断士は、日本の国家資格であり、中小企業という概念も割と日本っぽいところがあるので日本語混じりの英語として出力されました。面白いですね。では日本語にしてもらいます。

template = """Question: {question}
Answer: Let's think step by step. 日本語で"""

これは、

中小企業診断士とは、中小企業の経営に関する専門的な知識や技術を持ち、経営改善や事業再生などの支援を行う 資格を持った人のことを指します。彼らは、企業の経営課題を分析し、問題点を特定して解決策を提案することが できます。また、経営計画の策定や財務分析、人事制度の改善など、幅広い業務に対応することができます。中小 企業診断士は、中小企業の発展に貢献することが期待されています。

と出力されます。

step by step 感もなくなりましたね。とは? という語尾がよくないのかもしれません。

role を与えてみる

前の節では質問のテンプレートを利用しました。これは、 ChatGPT の GUI を使うのに近い動作と考えられます。これとは別に、 GPT-3.5-turbo に事前の「会話」を参考資料として提示することができます。

https://platform.openai.com/docs/guides/chat/introduction

メッセージの他に、role (役割)が存在し、

  • system: 通常、メッセージ群の先頭に配置される。AIに期待する役割を規定する。例として「あなたは親切なアシスタントです」「あなたは親切な英仏翻訳家です」など。
  • user: ユーザー、つまり使用者のメッセージ
  • assistant: AI が過去に発言したメッセージを記憶として設定する。

といった機能があるようです。これをLangGhainから使うには、

https://note.com/npaka/n/n7c32abbeca08

こちらを参考に……

# OpenAIの自然言語処理APIを使用して、質問に対する回答を生成するためのコード

# langchainパッケージから必要なクラスをインポート
from langchain.llms import OpenAIChat
from langchain import PromptTemplate, LLMChain

# 環境変数にAPIキーを設定
import os
os.environ["OPENAI_API_KEY"] = "APIキー"

# 事前に振る舞いを指示
prefix_messages = [
    {"role": "system", "content": "あなたは一歩一歩考えて、親切に問題を解決するアシスタントです"}
]

# prefixを含めてLLMの準備
llm = OpenAIChat(
    temperature=0, 
    prefix_messages=prefix_messages
)

# 振る舞いを定義したので質問だけのテンプレートに
template = """Question: {question}
"""

# PromptTemplateオブジェクトを作成
prompt = PromptTemplate(template=template, input_variables=["question"])

# LLMChainオブジェクトを作成
llm_chain = LLMChain(prompt=prompt, llm=llm)

# 回答を生成するための質問文を定義
question = "中小企業診断士とは?"

# LLMChainオブジェクトのrun()メソッドを使用して回答を生成
answer = llm_chain.run(question)

print(answer)

これに対する応答は、

中小企業診断士とは、中小企業の経営改善や事業承継、海外進出などの課題解決を支援する専門家です。中小企業
診断士は、国家資格であり、厳しい試験に合格した者が取得することができます。中小企業診断士は、経営者や経 営幹部と密に連携し、経営戦略の策定や財務分析、人材育成などのアドバイスを行い、中小企業の成長や発展を支 援します。また、中小企業診断士は、中小企業の経営者や従業員に対して、経営に関する知識やスキルを教育する こともあります。

step by step と指示したときに近くなった……ような気がします。「親切な」を加えたことが効果があったのでしょうか?

ともあれ、role: system でも、テンプレートと同様の効果が得られることが分かりました。

終わりに

楽しいですね!!! 少しのコードで、安く、最新の AI 研究の成果に触れつつ実験ができるなんて凄い時代になりました。

筆者も直接 OpenAI のAPIを叩くのは初めてなので、step by step で実験していろいろ遊んでいきたいと思います。

# Twitter とか見ているとレベルの高いエンジニアさんが凄い例を出しているので、どうやったらできるだろう? と頭をひねっております……

FacebooktwitterredditpinterestlinkedinmailFacebooktwitterredditpinterestlinkedinmail

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

最新の記事