QEUR23_LMABYS4: GPT4ALLでCONTEXTを使いこなす
~ LangChainへの最初の一歩 ~
・・・ 前回のつづきです ・・・
QEU:FOUNDER : “前回のつづきでいきましょう。以下の表は、GPT4ALLへの単純な連続質問で得た評価です。今回は、例の「Prompt Engineering」を使って、精度を上げてみたいという試みです。”
D先生 : “前回の結果(↑)を見たところ、2件が明らかに不正解だったわけですね。1件は計算に関する問題なので、LLMの不得意分野で(失敗は)ありがちです。でも、もう一つの質問は意外でした。・・・で、Prompt Engineeringで、どうやって精度アップするんですか?”
QEU:FOUNDER : “以下のように、質問の中にCONTEXTを使って、どのように回答されるのかを見てみましょう。プロンプトに使うコンテクストは以下の通り・・・。”
D先生 : “なんか、(質問に対する)模範解答のようです。コレ(↑)は、どうやって作ったんですか?ほとんど回答は分かっていますが・・・(笑)。”
QEU:FOUNDER : “もちろん、「あの」GPTに質問した結果です。ただし、回答の内容はかなり省きました。なるべく長文にしたくなかったのですよ。”
D先生 : “なぜですか?長文になれば、その分だけ情報量が多くなるでしょうに・・・。”
QEU:FOUNDER : “コンシューマーPCで動くGPT4ALLでは、あまり長いプロンプトの処理はできないでしょう。”
D先生 : “それはそうですね・・・。”
QEU:FOUNDER : “それでは、プログラムをドン!!”
# GPT4ALLによる連続回答プログラム
# HINTとして、CONTEXTを附属しています。
import pandas as pd
import numpy as np
from langchain import PromptTemplate, LLMChain
from gpt4allj.langchain import GPT4AllJ
from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler
# Prompts: プロンプトを作成する(default)
template = """Question: {question} \n Write answer within 10 words if possible.
You can refer the following context accordingly if needed.\n
context:```{context}```\n
Answer:"""
#template = """Question: {question} Write answer within 10 words if possible.
#Answer:"""
# Prompts: プロンプトを作成する(USC検証用、questionのみの場合)
#template = f"""You are taking U.S. Citizenship Test and you should answer the following ques-tion.\n Question: {question} \n
#Write within 10 words.\n
#Answer:"""
# Prompts: プロンプトを作成する(USC検証用、questionとcontentを使う場合)
#template = f"""You are taking U.S. Citizenship Test and you should answer the following question. You can refer the following context accordingly.\n Question: {question} \n
#context:```{context}```\n
#Write within 10 words.\n
#Answer:"""
# Models: 変換後のモデルを読み込む(j-groovy)
local_path = "D:./ggml-gpt4all-j-v1.3-groovy.bin"
callbacks = [StreamingStdOutCallbackHandler()]
# If you want to use GPT4ALL_J model add the backend parameter
llm = GPT4AllJ(model=local_path, repeat_penalty=1.2, callbacks=callbacks, reset=True)
# 質問の文字列リストを定義する
question_list = [
"What is the capital of Japan?",
"Who is the author of Harry Potter?",
"What is the name of the largest bone in the human body?",
"How many planets are there in the solar system?",
"What is the chemical formula of water?",
"Who painted the Mona Lisa?",
"What is the most spoken language in the world?",
"Who is the current president of the United States?",
"What is the square root of 81?",
"What is the name of the first artificial satellite launched by the Soviet Union?"
]
# -----
# CONTEXTを生成する
f = open('GPT4All_Verification_material_basic.txt', 'r', encoding='UTF-8')
context = f.read()
print(context)
f.close()
# -----
# 個別の質問応答のタスクを実行する関数を定義する
def qa(question, context):
# Promptを完成する
prompt = PromptTemplate(template=template, input_variables=["question", "context"])
#print(f"prompt: {prompt}")
# Chains: 作成したモデルを利用可能な状態にする
llm_chain = LLMChain(prompt=prompt, llm=llm)
# 質問に回答する
print(f"No.{i}: Question: {question}")
answer = llm_chain.predict(question=question, context=context)
print()
# 答えを表示する
print(f"Answer: {answer}")
return answer
# 繰り返し質問する
answer_output = []
mx_output = []
for i in range(len(question_list)): # range(len(question_list))
# 今回の質問を抽出する
question = question_list[i]
# 質問に回答する
answer = qa(question, context)
answer_output.append(answer)
# 質問と回答のマトリックス(リスト)を生成する
mx_output.append([question, answer])
# -----
# リストを出力する
print("--------")
print("generate answer list")
print(answer_output)
print("--------")
print("generate output matrix")
print(np.array(mx_output))
# Create DataFrame
mx_out = np.array(mx_output)
columns1 = ["Question", "Answer"]
df_out = pd.DataFrame(data=mx_out, columns=columns1)
print(df_out)
# CSV ファイル (result_gpt4all.csv) として出力
df_out.to_csv("result_gpt4all(context).csv")
D先生 : “どうです?前回(単純なプロンプトによる連続質問)に比べて時間がかかりましたか?”
QEU:FOUNDER : “うん、やはり、すごく(時間が)かかった。それでも、これほど貧弱なPCスペック(intel-i5使用)でもちゃんと動くんだから、大したものだ・・・。それでは評価の結果を見てみましょう。”
D先生 : “全問正解!!”
QEU:FOUNDER : “あの高級なGPT様と同じ意見だったという意味での正解ね・・・。ちなみに、「体で一番大きな骨の名前」と「世界で一番話されている言語」というのは、前回と今回では結果が変わっています。ここら辺は、モノの見方によって変わるだろうからとリリースしていたんです。”
D先生 : “プロンプトにCONTEXTを入れるのは、とても効果がありますね。あっ、そうだ!!この考え方を使えば、我々が適切な情報をCONTEXT経由でLLMに注入して、GPTに回答させることができますね。”
QEU:FOUNDER : “それがLangChainというシステムが提案しているVector Storeの考え方です。つまり、ユーザが提供した膨大なCONTEXTを細かく分割しDB(データベース)にします。それを、質問に応じて適当な情報を取り出してプロンプトに渡せばいいわけです。”
D先生 : “そうすれば、GPTのパフォーマンス(回答レスポンス)を悪くすることなく、よりよい品質の回答を出すことができます。”
QEU:FOUNDER : “次は、それをやってみましょうか・・・。本来は、もっと細かい評価表を作って、GPTモデルの評価をしようと思いましたが、ちょっと回り道をしましょう。”
D先生 : “現在LLM界で流行しているLangChain技術の本質を理解するには、良いケーススタディになりますよね。あのAI界のレジェンドの一人であるAndrew NgがLangChainの使い方を教えていますので、このレクチャーを受ける前に我々のプロジェクトをやると、より理解が深まると思います。”
~ まとめ ~
QEU:FOUNDER : “C部長、お金貸して・・・。このロボットが欲しいの・・・。”
C部長 : “ん?猫の餌やりロボットですか?”
QEU:FOUNDER : “いやいや、遠隔操作で餌やりもできるし、カメラによるモニタリングもできます。さらには、レーザを発射させ、遠隔で猫と遊ぶこともできるんですよ!!まさにロボット!”
C部長 : “すごい商品ですね!J国製のブランドはないですか?”
QEU:FOUNDER : “多分あるんじゃないかな?昔、2chというBBSの中で大手電器会社の部長研修の話がありました。そこの偉い部長様たちは、その研修の中で自社の進むべき方向性を検討したそうです。”
C部長 : “それで、その検討結果とは?”
QEU:FOUNDER : “高齢化で従来の商品系列のマーケットは縮小する。むしろ、これからはペットだ!!これからは「お客タマ」だと・・・(笑)。”
C部長 : “その会社タマの商品に、この手のロボットはありますか?今、現在・・・。”
QEU:FOUNDER : “さっき見ていたのだが、どうやらペット系列の製品には力を入れていないようだ。たぶん、彼らには「これを作りたい」という気持ちがないんでしょうね。”
C部長 : “「お客タマ」という方向性は正しいと思うんだけど・・・。”
コメント
コメントを投稿