ChatGPTをオープンなモデルで作成したい
どうも、ChatGPT面白いですよね。私もよく遊んでいます。
今回はオープンなモデルであるGPT-NEOX-20Bを用いてChatGPTのクローンを作成していきたいと思います。
簡単に言うとLangChainのCostomLLMでGPT-NEOX-20Bを使えるようにしてやりました。
あと、結構コピペで作成しているので詳しく理解したい方は参考URLを読んでください。非常に参考にしています。
特にColabでのGPT-NEOX-20Bの使い方の部分は一人では難しかったです。ありがとうございました。
colabのリンクだけならこちら
https://colab.research.google.com/drive/1y3Dfv12mmr5O8nwzn4MrvDVKsMQQKwt6?usp=sharing
肝となる部分
class CustomLLM(LLM):
n: int
@property
def _llm_type(self) -> str:
return "custom"
def _call(self, prompt: str, stop: Optional[List[str]] = None) -> str:
if stop is not None:
raise ValueError("stop kwargs are not permitted.")
else:
# 推論
input_ids = tokenizer(prompt, return_tensors="pt").input_ids
input_ids = input_ids.to('cuda')
output_tokens = model.generate(
input_ids,
do_sample=True,
max_length=500, # 最長の文章長
min_length=100, # 最短の文章長
temperature=0.9, # 温度
num_return_sequences=1, # 生成する文章の数
)
output = tokenizer.batch_decode(output_tokens)[0]
return output
LangChainのCustomLLMはCall関数があればいいらしいので、そこにGPT-NEOX-20Bの出力できるようにしています。
あと、意味のないnとかも残ってしまってるんでいい感じに直してください。とりあえず動くものを作りました。
注意事項
参考記事にもありますが、GoogleColab pro+とGoogledriveのスタンダード以上の課金が必須です。
逆に言えばそれだけでOpenAIに依存せずにChatGPTに近いことはできます。
GPT-NEOX-20BはOpenAIのモデルと比べるとCurieとDavinciの線形補完ぐらいの精度があり、本家ChatGPTはDavinciなのでそこそこいけるかなと思っていたのですが、あんまりいい結果が返ってきていません……
そもそも一対一対応の返事がこない(かってにChatで一人芝居を始めてしまう)であったりとか、そもそも返答の質もあんまりよくないように感じます。
参考にした記事
余談
ChatGPTの仕組が実際にクローンを作成してみて少しだけ理解出来ました。本当に文章生成しているだけで、あたかもChatしているように見えるのはプロンプトエンジニアリングの成果ということなのですね。プロンプトによっていい感じに返答を生成できるようにコントロールしつつ、過去のChatをメモリーとして記憶することが出来る。
実際にこうやって動かすとわかることも多いのですね。
今後のタスク
- プロンプトエンジニアリングによって改善するか試す
- CustomLLMの使い方はわかったので他のOpenModelを試す(OPTとかBLOOMとか)