見出し画像

Local-Novel-LLM-projectのモデルをmlx & Gradioで試してみる

日本語の生成を目指したLocal-Novel-LLM-projectからいくつかモデルが発表されました。#ローカルAIハッカソン  で優勝したプロジェクトです。

プロジェクトリーダーはこの方です。


さて、おそらく、これらのモデルを一番簡単に動かせるのは、下記のものを使うことだと思います。

ただ自分はメインがMacですので、Macのmlx環境とGradioを使って試してみました。

印象は、しっかりした日本語を生成してくれて、なおかつ長文生成をしてくれるという感じを持ちました。

モデル種類には、小説生成向けのNinjaと会話向けのVecteusと、あたらしく小説能力ではなくコードや数学系の知識を持たせたというAssistanceが追加されています。

今回は、Vecteus とNinjaを試してみました。

Chat Templateは Vicuna形式がお勧めということなので、それを使ってみます。(特にこの形式を指定しなくても、最後に掲載するスクリプトでは動きました。また、このスクリプトでいいのか自信がありませんが、動いてるのでヨシとしておきます。)

システムメッセージは、今回は以下としました。Wizradの代わりにモデル名Vecteusに変えただけです。

"A chat between a curious user and an artificial intelligence assistant. The assistant gives helpful, detailed, and polite answers to the user's questions. USER: Hi ASSISTANT: Hello.</s>USER: Who are you? ASSISTANT: I am Vecteus.</s>"

最後に掲載のスクリプトだと適当に書き換えることができるので、書き換えて試してください。
なおモデルカードによると、"あなたはプロの小説家です。\n小説を書いてください\n-------- " プロンプト "\n-------- " が例としてのっています。

生成例

Vecteus

人生の意味を論じて

人生の意味については、多くの人々が一度は考えてみたことがあるかと思います。人生の意味はひとりひとりによって異なりますが、ここでは一般的な視点からお話ししましょう。

人生の意味を探求することは、自分自身を探求することにもつながります。なぜなら、人生とは自分自身であるとも言えるからです。私たちは自分自身の人生を歩んでいます。どのような選択をし、どんな人間関係を築き、どのような経験をするのかはすべて自分次第です。

人生の意味を見出すためには、まず自分自身が何を大切にしているのかを知ることが重要です。何を楽しみとし、何を苦痛と感じるのか。何が自分にとって価値があるのかを探求することが出発点になります。

次に、自分が属する社会やコミュニティの中で、自分は何ができるのかを考えます。人はひとりでは生きていけません。他者との関わりの中で、自分にしかできないことを見つけ出し、それを通じて社会や他者に貢献することができます。

また、他者との比較ではなく、自分自身の中での成長や進歩を目指すことも大切です。自分が少しずつでもより良い人間になっていけば、それは人生における意味の一つとなるでしょう。

さらに、自然や宇宙、世界の仕組みなどを探求することも、人生の意味を見つけ出す方法の一つです。なぜ私たちはここにいるのか、私たちは何処からやってきたのか、私たちはどこに向かっているのか。このような問いを追求することは、自分の人生の意味を探すことにつながります。

最後に、人生には限りがあります。だからこそ、与えられた時間を大切にし、後悔のないように生きることが重要です。自分が本当にやりたいことを見つけ、それに向かって全力を尽くすことで、人生に意味を見出すことができるでしょう。

結論として、人生の意味はひとりひとり違います。自分自身を知り、他者と関わり、成長し続け、自分の中の疑問に答えを見つけること。そして、与えられた時間を大切にしながら、本当にやりたいことに取り組んでいくこと。それが人生の意味を見出すための道なのではないでしょうか。

メタファーやアナロジーを使って説明して

メタファーやアナロジーを使うことで、難しい概念や概要を分かりやすく伝えることができます。例えば、人生を旅に例えて説明することができます。

人生は旅と同じで、目的地がなければ旅立つことはできません。目的地は個人的な欲求や夢、あるいは社会的な使命や役割などです。旅の途中では、さまざまな出来事が起こります。晴れた日もあれば雨の日もあり、風に乗って進める時もあれば、強い流れに逆らわなければならない時もあるでしょう。旅の途中で出会う人々は、私たちに新しい視点や知識を与え、自分自身を成長させてくれます。

旅の終わりには、目的地に到着することができた喜びを感じるでしょう。しかし、それだけではありません。旅の中での経験や学び、そして出会った人々との交流が、旅行者をより豊かにしてくれるのです。

また、人生を木に例えることもできます。人生の始まりは、小さな種です。その種が土壌に落ち、水を吸い、太陽の光を受けて成長し、やがて大樹となるのです。大樹は太く頑丈な幹を持ち、枝葉を広げ、多くの実をつけます。人生も同じで、幼少期から成長し、職業や家庭、地位など、人生の各段階で枝分かれしながら、自分自身の大樹を形作っていくのです。

さらに、人生を楽器に例えることもできます。人生とは、演奏会のようなものだと考えるのです。多種多様な楽器が揃い、それぞれの役割を果たし合いながら、美しいハーモニーを奏でます。個々の楽器が調和を取り合うことによって、全体の演奏が成り立つように、私たち一人ひとりが調和を取り合うことによって、より良い人生を奏でることができるのです。

このようにメタファーやアナロジーを使うことで、抽象的な概念や理解しにくい事柄を、具体的でイメージしやすいものに変換することができます。それによって、より深く理解することが可能になるのです。

猫視点で、猫の一生の意味を、猫の語り口調で語って

にゃん。僕ら猫ってのは生まれてきた時から、楽しいこと求める生き物なのにゃ。生まれたばっかりの時は、おっぱい吸ってあったかい毛布でくるっと丸まって、ふわふわした気持ちのまま育つのにゃ。

ママやパパ猫と一緒にいる時間は、本当に幸せにゃ。兄弟とじゃれ合ったり、遊んだり、追いかけっこしたりして、毎日が新しくてワクワクするのにゃ。でも、ある日突然僕らは新しいお家に連れて行かれるのにゃ。

新しい家には、いろんな匂いがするし、知らない人間がいるし、最初はドキドキするけど、すぐにその家に慣れるのにゃ。ごはんもいっぱいもらえて、居心地も良くなるにゃ。

そんなこんなで、僕らは成長していくのにゃ。体も大きくなって、追いかけっこもするけど、もう子猫じゃないって感じるのにゃ。そして、いつの間にか恋を知って、メス猫は出産をするのにゃ。

子猫たちが生まれると、僕らはまた一段と幸せになるのにゃ。子猫たちはみんなかわいくて、ちっちゃくて、世界中の全ての幸せがここにあるみたいに感じるのにゃ。

子猫たちが大きくなって、お別れする時はちょっと寂しいけど、僕らにはまだまだ人生が続くのにゃ。

そのうち僕らも年を取って、のんびりと暮らすようになるのにゃ。日向ぼっこしながらお昼寝したり、散歩しながら虫を見つけたり、美味しいごはんを食べたりするのにゃ。それが僕らの幸せなのにゃ。

でも、僕らもいつかは旅立ちの時を迎えるのにゃ。それがいつなのかはわからないけど、旅立ちの時は静かにやってくるのにゃ。最期の時まで、僕らは猫らしくあり続けるのにゃ。

僕ら猫の一生の意味ってのは、幸せを見つけて、それを最大限に楽しむことなのにゃ。もちろん、楽しいことばっかりじゃないけど、それも含めて人生なのにゃ。

だから、僕らは思うのにゃ。生まれてきてよかったって。猫に生まれて、本当によかったって。

にゃん。みんなも、自分の人生を楽しく過ごして、幸せになってほしいにゃ。それが、僕ら猫からのささやかな願いにゃ。

なかなか優れた生成がでてきますね!

Ninja

人生の意味を論じて

箇条書きででたのでそのままベタで貼り付けます。

人生の意味とは何か。これは永遠の命題であり、人類共通の関心事の一つです。人生の意味を見出すことは、多くの人々にとって重要な意義を持ちます。また、人生の意味は人によって異なり、一つの答えがあるわけではありません。ここでは、人生の意味についていくつかの視点や考え方を紹介します。

  1. 人生は生まれる前から決まっているという視点
    この考え方では、人生は神や運命によって事前に定められており、その道筋に沿って生きることが幸せへの近道だとされています。つまり、自分の意志や努力よりも、与えられた運命を受け入れることが重要だという考え方です。

  2. 人生は自分で決めることができるという視点
    この考え方では、人生は自己決定によって豊かになることができるとされます。自分の選択や努力によって、人生はいくらでも変えることができ、自己実現や成長を目指すことができるという考え方です。

  3. 人生は他者との関わり合いによって生じるという視点
    人生において他者とのつながりは非常に重要です。家族、友人、恋人、同僚など周囲の人々との関わり合いが、自分を形成し、成長させ、幸せをもたらします。人生の意味は、他者との関わり合いを通して見出されるという考え方です。

  4. 人生は社会や世界への貢献によって発見されるという視点
    自分が社会や世界に対してなすことができる貢献を見つけ、それを実現することが人生の意味だという考え方です。社会的使命を見出すことで、生きる意味や目的を見出すことができます。

  5. 人生は楽しむことにあるという視点
    人生は楽しむためにあるという考え方です。人生には限りがあります。だからこそ、自分の好きなことや楽しいことを追求し、充実した時間を過ごすことが大切だという考え方です。

  6. 人生は冒険であるという視点
    人生は予測不可能な冒険であり、未知の体験をすることが人生の醍醐味だという考え方です。新しいことに挑戦し、未知の世界に飛び込むことで、人生には無限の可能性が広がっているという視点です。
    これらの視点を踏まえつつ、人生の意味を探求してみてください。そこには、あなただけの人生の意味が見つかるはずです。重要なのは、他者の視点や価値観を受け入れつつも、自分の心に従って生きることです。自分自身に問いかけ、自らの心と対話を続けることで、人生の意味を見出すことができるでしょう。

メタファーやアナロジーを使って説明して

メタファーやアナロジーを使うことは、抽象的な概念や複雑な事柄を、より理解しやすく伝えるのに非常に有効な手法です。以下では、人生の意味に関するいくつかのメタファーやアナロジーを用いて説明します。

  1. 旅路に例える
    人生を旅に例えると、私たちは生まれた瞬間から旅路につきます。旅路では、いくつもの分岐点があり、選択肢が与えられます。道中には美しい景色もあれば、困難な山や試練の谷もあります。旅を続ける中で出会う人々や経験は、私たちに新しい視点や知恵をもたらします。最終的に目指す場所、つまりゴールが人生の意味と考えることができます。

  2. 料理に例える
    人生を料理に例える場合、様々な食材があります。それぞれの食材は、人生における個性や才能、経験や知識に似ています。料理人である自分は、それらの食材を選び、調理することで美味しい料理を作り出します。そして、その料理を食べる人々が幸せになることが、料理人である自分の目的、つまり人生の意味となるのです。

  3. 樹木に例える
    人生を大きな樹木に例えると、幹が自分自身のコアな部分、つまり自分の価値観や信念、人生哲学にあたります。枝葉は、人生におけるさまざまな経験や関係、功績、成果などです。強く太い幹があってこそ、たくさんの枝葉を茂らせることができ、大きく成長した樹木は周囲に影響を与え、環境を改善します。人生の意味とは、このような樹木になることではないでしょうか。

  4. 楽器演奏に例える
    人生を楽器演奏に例えると、自分は楽器であり、音楽は自分の人生です。楽譜は人生の目標や計画に当たり、演奏は日々の行動や経験に対応します。楽器を上手に演奏するには、正しい楽譜の読み方を覚え、基礎練習を重ね、実際に演奏して経験を積むことが必要です。人生の意味とは、自分自身の楽器を完璧に演奏し、美しい音楽を奏でることかもしれません。
    これらのメタファーやアナロジーは、抽象的な概念を具体的なイメージに置き換えることで、より理解しやすくしてくれます。自分がどのような人生を送りたいのか、どのような自分でありたいのか、これらの例えを通して考えてみると良いでしょう。

猫視点で、猫の一生の意味を、猫の語り口調で語って

にゃあ、猫のにゃんこだにゃ。猫ってのは基本的に、のんびりまったり、自由気ままに生きる生き物なんだにゃ。そんなに深く考え込むことはないにゃあ。
生まれたばかりのころは、母さん猫のおっぱいを吸って、ふわふわの毛玉みたいにまるくなって、ぬくぬくと過ごす毎日だにゃ。そこから少し大きくなると、自分で食べ物を探したり、小さい兄弟や姉妹と遊んだりするんだにゃ。遊ぶことは、猫の大事なお仕事なんだ。
しばらくすると、自分一人で生きていくための術を学び始めるんだ。狩りの仕方や、危険な場所の見分け方、それに上手なお昼寝の場所探しなんかもね。
成長すると、めぼしい食べ物を見つけたら自分で狩りをするようになるにゃ。時には失敗することもあるけど、それもまたお勉強なんだにゃ。
年をとると、のんびりした場所で日向ぼっこをしたり、一緒に暮らしている人間や他の猫と過ごす時間が増えるにゃ。それでも狩りはできるときにするもんだにゃ。
年を取って動けなくなったら、それが自分の一生なんだと受け入れるんだにゃ。それまで頑張って生きてきたんだから、最後まで自分のペースで生きるんだにゃ。
猫の一生の意味ってのは、生まれてきてから死ぬまで、自由気ままに自分のペースで生きることなんだにゃ。それが、うちら猫にとっての一番の幸せなんだにゃ。
生まれてきたことに意味がある、とか、何かを成し遂げなきゃいけない、とか、そんなのは人間が作った勝手な考え方で、猫には関係ないことなんだにゃ。
大事なのは、今を楽しく生きることなんだにゃ。そうすれば、自然といいことが舞い込んでくるにゃあ。
にゃんこは、そう思うにゃ。人間さんも、難しく考えずに今を楽しく生きればいいんだにゃ。
以上、猫のにゃんこが語った、猫視点の猫の一生の意味だったにゃ。参考になったかにゃ?


とっても日本語が上手な感じです。ロールプレイでのキャラ付けも上手くいくのではという印象です。
7Bですし、gguf量子化もされているモデルもありますので、気楽に楽しめるのではないでしょうか。

スクリプト

(mlx環境:load内でmodel_1か2を選択)

import gradio as gr
import time
from mlx_lm import load, generate

model_1 = "Local-Novel-LLM-project/Vecteus-v1"
model_2 = "Local-Novel-LLM-project/Ninja-v1-NSFW-128k"

model, tokenizer = load(model_1)

vicuna_template = (
  "{% for message in messages %}"
      "{% if message['role'] == 'system' %}"
          "{{ '' + message['content'] + '\n\n' }}"
      "{% else %}"
          "{% if message['role'] == 'user' %}"
              "{{'USER: ' + message['content'] + '\n'}}"
          "{% else %}"
              "{{'ASSISTANT: ' + message['content'] + '</s>\n' }}"
          "{% endif %}"
      "{% endif %}"
  "{% endfor %}"
  "{% if add_generation_prompt %}"
      "{{'ASSISTANT:'}}"
  "{% endif %}"
  )


def predict(message, history, system_message, token, temp_value):
    prompt = []

    for human, assistant in history:
        prompt.append({'role': 'user', 'content': human})
        prompt.append({'role': 'assistant', 'content': assistant})
        
    prompt.append({'role': 'user', 'content': message})
    prompt.insert(0, {'role': 'system', 'content': system_message})
    inputs = tokenizer.apply_chat_template(prompt,
                                           tokenize=False,
                                           chat_template = vicuna_template,
                                           add_generation_prompt=True)
                                           
    full_prompt = inputs
    
    print (f"入力される最終プロンプトはこんな感じ:\n{full_prompt}")
    response = generate(model, tokenizer, prompt=full_prompt, temp = temp_value, max_tokens = token, verbose=False) 
    
    for i in range(len(response)):
            time.sleep(0.05)
            yield response[: i+1]

demo = gr.ChatInterface(predict, 
    title="local novel llm project",
    description="",
    additional_inputs=[
        gr.Textbox("A chat between a curious user and an artificial intelligence assistant. The assistant gives helpful, detailed, and polite answers to the user's questions. USER: Hi ASSISTANT: Hello.</s>USER: Who are you? ASSISTANT: I am Vecteus.</s>", lines=5, max_lines=50, label="System Prompt"),
        gr.Slider(100, 4096, value=2048, label="Tokens"),
        gr.Slider(0, 1, value=0.8, label="Temperture")
                        ]
                       )

if __name__ == "__main__":
        demo.launch()

#AI #AIとやってみた #やってみた #Huggingface #ローカルLLM #mlx #Macbook #大規模言語モデル

この記事が参加している募集

やってみた

AIとやってみた

この記事を最後までご覧いただき、ありがとうございます!もしも私の活動を応援していただけるなら、大変嬉しく思います。