生成系AIのモデルとChatGPT
“機械学習による自動生成“でも述べている生成系のAIは、コンピュータがデータのパターンや規則性を学習し、それに基づいて新しいデータを生成するものとなる。自動生成の手法には、いくつかの異なるアプローチがある。今回はそれらの中で、最も成功しているGPT等の大規模言語モデル(LLM:Large Language Model)について述べる。
“GPTの概要とアルゴリズム及び実装例について“でも述べているGPTは”Transformerモデルの概要とアルゴリズム及び実装例について“でも述べているTransformerモデルや、”BERTの概要とアルゴリズム及び実装例について“で述べているBERTモデルの発展系であり、”深層学習におけるattentionについて“で述べているattentionメカニズムを深層学習に適用することで高い機能を発揮したモデルとなる。
これらのモデルのうちオープンソースになっているものは”Huggingfaceを使った文自動生成の概要“で述べているHuggingfaceより利用可能であり、さらに”text-generation-webuiとAUTOMATIC1111を用いたコードレス生成モジュール“で述べているtext-generation-webuiとAUTOMATIC1111等によりコードレスで活用できる。
これらのモデルを用いたシステムで最も成功しているものがChatGPTとなる。ChatGPTはOpenAIが開発したるGPT3.5等のLLMをベースとして構築された対話に特化したもので、チャット形式でAIと会話ができ、自然な文章が返ってくるシステムとなっている。ChatGPTは、テキスト生成だけではなく、要約、翻訳、質疑応答、プログラミング、様々なコンテンツの生成など多くのシーンで活用されている。
これらの機能を用いることで”プロンプトエンジニアリングの概要とその利用について“で述べているプロンプトエンジニアリング(自然言語処理や機械学習モデルの開発において、与えられたテキストプロンプト(指示文)を工夫し、特定のタスクや目的に最適な応答を引き出す技術や手法)が可能となり、例えば自然言語処理のような従来多くのライブラリを組み合わせてしか実現できなかった機能が、モデルに対して適切な質問や指示を与えるだけで実現できるようになる。
ChatGPT自体は無料で利用できるが、APIを介した有料版のサービスを用いることで、様々な機能を持ったシステムを独自に構築することができる。
有料版のAPIサービスを利用するには、まずOpenAIにアクセスし、[sign up]をクリックし、emailを入力するか、Googleなどのアカウントを利用してアカウントを作成する。
アカウントを作成できたら、[OpenAI API]を選択し、”Welcome to the OpenAI developer platform”のページに行き、左上のマークをクリックすると”API Keys”がいくつかの選択肢の中に現れるので選択するとAPI KEYのページに行くことができる。
そのページの中で、[create new secret key]のボタンをクリックするとウィンドウが開き、任意の名前をつけて[create secret key]をクリックすると、”sk-“から始まるAPI KEYが生成される。
一般的なシステム構築の場合には、キー情報の漏洩を防ぐために、OpenAI APIを環境変数に格納することで利用される。windowsの場合はPowerShellを用いて[System.Enviroment]::SetEnviromentVariableコマンドを用いて行う。具体的には[スタート]メニューで「PowerShell」を選択し以下のように設定する。
[System.Enviroment]::SetEnviromentVariable('OPENAI_API_KEY','取得したAPIキー","User')
上記コマンドを実行しただけでは、環境変数は反映されないので、一度PowerShellを終了し、以下のコマンドを実行して設定したAPIキーが表示されれば完了となる。
echo &env:OPENAI_API_KEY
macOSでは一般的に使われているzshの環境変数は、.zshrcファイルに記述して設定するものとなる。(もし.zshrcファイルが無い場合は”touch ~/.zshrc”コマンドで作成する)
echo 'export OPENAI_API_KEY="取得したAPIキー"' >> ~/.zshrc ← .zshrcファイルに書き込み source ~/.zshrc ←.zshrcファイルの設定の読み込みのコマンド
以下のコマンドでAPIキーが表示されれば設定完了となる。
echo $OPENAI_API_KEY
pythonでOpenAIのChatGPTを操作するには、OpenAIが提供するPythonライブラリをインストールし
pip install openai
以下のようなコードを実装することで実行できる。
import os
import openai
openai.api.key = os.environ["OPENAI_API_KEY"] #環境変数に設定したAPIキー
response = openai.ChatCompletion.create{
model="gpt-3.5-turbo",
message=[
{"role": "user", "content": "Pythonについて教えてください"},
],
}
print(response.choices[0]["message"]["content"]}
上記のようにpythonのコードを用いることでChatGPTに接続し、それらをハンドリングすることができる。
このようにOPENAI_APIを用いることで、pythonでソリューションを組むことはできるが、複雑なシステムを組もうとするとコードや変数の体系が複雑になってきて生産性が低下する。それらを改善する手段の一つがLangChainとなる。
LangChainの概要
LangChainは、言語モデルを使ったアプリケーションを開発するのを助けるライブラリであり、ChatGPTやその他の生成モデルを使った様々なアプリケーションを構築することが可能なプラットフォームとなる。
LangChainの目的の一つは、ChatGPTのような言語モデルではできないタスク、例えば言語モデルが学習した知識の範囲外の情報についての回答や、論理的に複雑なタスク、あるいは計算が必要なタスクなどに対応できるようにすることであり、もう一つは、フレームワークとして整備することで、”RAG(Retrieval-Augmented Generation)の概要とその実装例について“で述べているRAGや、”ReAct(Reasoning and Acting)の概要とその実装例について“で述べているReActのような複雑なアプリケーションを効率よく開発できるようにすることにある。
LangChainを用いることで、自然言語を理解し、特定の問題に対する回答を生成したり、特定の環境下で動作したりするアプリケーションを開発するなど、従来の手続き型プログラミングでは困難だった作業を効率的に行うことが可能となる。
LangChainには以下の6つのモジュールが含まれている。それぞれのモジュールは単体でも利用することができるが、複数組み合わせることで複雑なLLMアプリケーションを効率よく作成することができる。
Model I/O (言語モデルを扱いやすくする): 言語モデルを使ったアプリケーションを開発するには、言語モデルを呼び出す必要がある。言語モデルを呼び出すためには入力である「プロンプトの準備」、「言語モデルの呼び出し」、「結果の受け取り」という3つのステップが必要になり、Model I/Oモジュールは、この3つのステップを簡単にするための機能を提供している。
Retrieval (未知のデータを見えるようにする): Retrievalモジュールを使うことで、言語モデルにはない未知の情報に対するアクセスを可能とする。このモジュールを使うことで手元のPDFファイルについて質問したり、数百万件のQ&Aが保存されたCSVファイルに基づいてカスタマーサポートできるチャットボットが作成できる。”RAG(Retrieval-Augmented Generation)の概要とその実装例について“で述べているRAGはこのモジュールにより実現できる。
Memory (過去の対話を短期・長期で記憶する): 文脈を踏まえた対話形式で言語モデルに回答させるには、それまでの対話をすべてAPIへ返信する必要がある。これを実現するために、過去の対話をデーターベースに保存し、言語モデルを呼び出すときに読み込む必要があり、Memoryモジュールはそれらを実現する機能を提供している。
Chains (複数の処理をまとめる): 多数のモジュールや別の機能を組み合わせて一つのアプリケーションとする機能を提供する。
Agent (自律的に外部と干渉して言語モデルの限界を超える): Agentモデルでは主に”ReAct(Reasoning and Acting)の概要とその実装例について“で述べているReAct機能や、OpenAI Function Callingという手法を用いて、言語モデルの呼び出しでは対応できないタスクを実行する機能を提供している。Agentモジュールの詳細は”LangChainにおけるAgentとCallbackについて“も参照のこと。
Callback (さまざまなイベント発生時に処理を行う): Callbackモジュールでは、LamgChainを使って作成したアプリケーションのイベント発生時に処理を実行する機能を提供している。これは主にログ出力や外部ライブラリとの連携で用いられている。
LangChainの実装例
以下にModel I/Oモジュールを使った実装例について述べる。LangChainを実装するには、前述のopensiライブラリとlangchainライブラリをインストールする必要がある。
pip install openai
pip install langchain
pip install -U langchain-community
まず最もシンプルなコードは以下のようになる。
from langchain_community.chat_models import ChatOpenAI
from langchain.schema import HumanMessage #ユーザーからのメッセージであるHumanMessageをインポート
chat = ChatOpenAI(
model="gpt-3.5-turbo", #呼び出すモデルを指定
)
result = chat(
[
HumanMessage(content="こんにちは!"),
]
)
print(result.content)
このコードを実行すると、ChatGPTにアクセスし以下のような答えが返ってくる。
こんにちは! お元気ですか?何かお手伝いすることがありますか
Model I/Oでは対話形式のやり取りを表現するために、AIMessageを使って言語モデルからの返答を表すことができる。これは最初にユーザーからのメッセージを受け取り、その返答を使って別の回答を作るときに使われる。以下のコードは上記のコードのresult部分のみを表したものとなる。
result = chat(
[
HumanMessage(content="茶碗蒸しの作り方を教えて"),
AIMessages(content="{ChatModelからの返答である茶碗蒸しの作り方}"),
HumanMessages(content="英語に翻訳して"),
]
)
さらに対話機能をカスタマイズするSystemMessageも用意されている。
result = chat(
[
SystemMessage(content="あなたは親しい友人です。返答は敬語を使わずに、フランクに会話してください"),
HumanMessages(content="こんにちは"),
]
)
用意してあるPromptとpythonからの入力を組み合わせ、Language modelと共に使うこともできる。
from langchain import PromptTemplate
from langchain.chat_models import ChatOpenAI
from langchain.schema import HumanMessage
chat = ChatOpenAI(
model="gpt-3.5-turbo",
)
prompt = PromptTemplate( #← PromptTemplateを作成する
template="{product}はどこの会社が開発した製品ですか?", #← {product}という変数を含むプロンプトを作成する
input_variables=[
"product" #← productに入力する変数を指定する
]
)
result = chat(
[
HumanMessage(content=prompt.format(product="iPhone")),
]
)
print(result.content)
さらに出力形式を指定することもできる。
from langchain.chat_models import ChatOpenAI
from langchain.output_parsers import \
CommaSeparatedListOutputParser #← Output ParserであるCommaSeparatedListOutputParserをインポート
from langchain.schema import HumanMessage
output_parser = CommaSeparatedListOutputParser() #← CommaSeparatedListOutputParserを初期化
chat = ChatOpenAI(model="gpt-3.5-turbo", )
result = chat(
[
HumanMessage(content="Appleが開発した代表的な製品を3つ教えてください"),
HumanMessage(content=output_parser.get_format_instructions()), #← output_parser.get_format_instructions()を実行し、言語モデルへの指示を追加する
]
)
output = output_parser.parse(result.content) #← 出力結果を解析してリスト形式に変換する
for item in output: #← リストを一つずつ取り出す
print("代表的な製品 => " + item)
Templateの使い方の一つとして、言語モデルに例を提示しながら目的のタスクを実行させるものがある。(Few-shot-prompt)
from langchain.llms import OpenAI
from langchain.prompts import FewShotPromptTemplate, PromptTemplate
examples = [
{
"input": "LangChainはChatGPT・Large Language Model (LLM)の実利用をより柔軟に簡易に行うためのツール群です", #← 入力例
"output": "LangChainは、ChatGPT・Large Language Model (LLM)の実利用をより柔軟に、簡易に行うためのツール群です。" #← 出力例
}
]
prompt = PromptTemplate( #← PromptTemplateの準備
input_variables=["input", "output"], #← inputとoutputを入力変数として設定
template="入力: {input}\n出力: {output}", #← テンプレート
)
few_shot_prompt = FewShotPromptTemplate( #← FewShotPromptTemplateの準備
examples=examples, #← 入力例と出力例を定義
example_prompt=prompt, #← FewShotPromptTemplateにPromptTemplateを渡す
prefix="以下の句読点の抜けた入力に句読点を追加してください。追加して良い句読点は「、」「。」のみです。他の句読点は追加しないでください。", #← 指示を追加する
suffix="入力: {input_string}\n出力:", #← 出力例の入力変数を定義
input_variables=["input_string"], #← FewShotPromptTemplateの入力変数を設定
)
llm = OpenAI()
formatted_prompt = few_shot_prompt.format( #← FewShotPromptTemplateを使ってプロンプトを作成
input_string="私はさまざまな機能がモジュールとして提供されているLangChainを使ってアプリケーションを開発しています"
)
result = llm.predict(formatted_prompt)
print("formatted_prompt: ", formatted_prompt)
print("result: ", result)
この応答をchatbot上でやりとりする方法としては、”Node.jsとReactを使ったチャットボットシステムの実装“や、”ClojureとJavascriptを使ったチャットボットの実装とAI機能の統合“で述べているシンプルなJavascriptライブラリを使ったものがある。
次回は、このLangChainをより汎用的に利用するためのフレームワークであるAgentとToolについて述べる。参考情報と参考図書
“
コメント
[…] ChatGPTとLangChainの概要及びその利用について […]
[…] ChatGPTとLangChainの概要及びその利用について […]
[…] を通じて直接利用できる。Playgroundは対話型で、様々なプロンプトを試すことが可能となる。Open AIのAPI利用に関しては”ChatGPTとLangChainの概要及びその利用について“も参照のこと。 […]
[…] デルが構築されている。これらを統合ツールの代表的なものとして”ChatGPTとLangChainの概要及びその利用について“や”LangChainにおけるAgentとToolについて“に述べているLamgChain […]
[…] ルDBを用いるものとなる。それらの機能の中で、生成系AIに関しては”ChatGPTとLangChainの概要及びその利用について“に述べているように、ChatGPTのAPIを用いるかLanChainを用い、データ […]
[…] “ChatGPTとLangChainの概要及びその利用について“で述べたLangChainについて引き続き述べる。前回は、ChatGPTとそれを利用するフレームワークであるLangChainの概要について述べた。今回は、自律的に外部と干渉して言語モデルの限界を超える機能を持つAgentについて述べたいと思う。 […]