LoginSignup
20
16

More than 1 year has passed since last update.

LangChain + GPT-NEOX-Japanese-2.7b で日本語 LLM やりとり整備するメモ

Last updated at Posted at 2023-01-01

背景

何やら流行りの 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.
ボクは何食べたい?」

昼も夜も, 質問に質問で返されてしまいました... :cry:

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 必要になりつらたにえん :cry: であるが! デフォルトのパラメータでそこそこいいかんじの応答してくれる感があります)

TODO

20
16
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20
16