背景
何やら流行りの LangChain でいい感じに日本語扱いたい!
とりあえずローカルで動かしたいので, 日本語は gpt-neox-japanese-2.7b 使います.
LangChain 自体はなんかいろいろつなげるための wrapper みたいなものです.
(そのうち huggingface もなんか langchain っぽいの出してきそうですネ)
LLM module
huggingface pipeline 使います.
gpt-neox-japanese-2.7b
デフォルトだと CPU 実行になってしまうので(CPU でも動くが数分くらいかかる), GPU 処理, また fp16 を使います!
また, langchain の(?) デフォルトの max_new_tokens は 20 tokens で, 長い input 与える(下のずんだもんは 220 tokens くらい)と unexpected behavor になるので max_new_tokens
を大き目にとっておきます.
とりあえず動かしてみます.
import torch
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain
from langchain.agents import ZeroShotAgent, Tool, AgentExecutor, load_tools
from langchain.llms.huggingface_pipeline import HuggingFacePipeline
from transformers import AutoModelForCausalLM, AutoTokenizer, pipeline
device_num = -1 # CPU
if torch.cuda.is_available():
device_num = 0 # cuda:0
model_id = "abeja/gpt-neox-japanese-2.7b"
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(model_id)
pipe = pipeline(
"text-generation", model=model, tokenizer=tokenizer,
max_new_tokens=512, device=device_num, torch_dtype=torch.float16
)
hf = HuggingFacePipeline(pipeline=pipe)
print(hf("カラフルな靴下を作る会社の社名にふさわしいのは?"))
」という質問に対して、「靴下屋」と答えた人が多かったそうです。
もうちょっとひねりほしいネ...
を参考にして PromptTemplate 使ってみます!
prompt_temp = """ずんだもんは東北に住む活発でかわいい女の子です。
あなた「きみの名前は?」
ずんだもん「ボクの名前はずんだもんなのだ。」
あなた「今日の天気は?」
ずんだもん「ボクは今日の天気は晴れだと思うのだ」
あなた「今日は何時に起きたの?」
ずんだもん「ボクは7時に起きたのだ」
あなた「年齢は?」
ずんだもん「ボクの年齢は秘密なのだ」
あなた「朝ごはんは何食べたい?」
ずんだもん「ボクはおにぎり食べたいのだ」
あなた「{time}ごはんは何食べたい?」
ずんだもん「"""
prompt = PromptTemplate(
input_variables=["time"],
template=prompt_temp,
)
chain = LLMChain(llm=hf, prompt=prompt)
print(chain.run("昼"))
print(chain.run("夜"))
Setting `pad_token_id` to `eos_token_id`:31999 for open-end generation.
ボクは何食べたい?」
Setting `pad_token_id` to `eos_token_id`:31999 for open-end generation.
ボクは何食べたい?」
昼も夜も, 質問に質問で返されてしまいました...
pipeline で do_sample=True, top_p=0.95, top_k=50
あたり追加や, temperature
調整すると多少よい結果がかえってきます.
とりあえずのまとめ
とりあえずはローカルでいろいろスクリプト組んだりして試して, その後必要であれば OpenAI(ChatGPT) や you.com あたりにつなぐとかがいいかも.
また, GPT-J や, https://huggingface.co/abeja/gpt2-large-japanese を使う手もありそうです.
(後者は protobuf 必要になりつらたにえん であるが! デフォルトのパラメータでそこそこいいかんじの応答してくれる感があります)
TODO
- プロンプトエンジニアリングを頑張る
- 検索エンジンとつなぐ. とりあえずは duckduckgo https://github.com/deedy5/duckduckgo_search がいいでしょうか.