見出し画像

Fugaku-Llmに失望・・・

ollamaに下記のLLMで遊んでいます。
fugaku-llm-13b-instruct
llava-llama3
codellama
command-r
phi3
llama3

これだけの種類のLLMが入っているんだから、MAGIシステム作ったら面白いんじゃないかと思い、

こちらのプログラムをお借りし、ollamaで動くように改造し遊んでみました。


import json
import ollama
import gradio as gr
import dotenv
from concurrent.futures import ThreadPoolExecutor

dotenv.load_dotenv('.env')
openai_api_key = dotenv.get_key('.env', 'OPENAI_KEY')
vertexai_project = dotenv.get_key('.env', 'VERTEXAI_PROJECT')


# OpenAI GPT-3.5に質問を送信する関数
def ask_1(question: str) -> str:
    response = ollama.chat(
        model="Phi3",
        messages=[
            {"role": "system",
             "content": "あなたは答えが1つには決まらない問題に対して、"
                        "一つの視点を提供するアドバイザーとしての役割を持っています。"
                        "必ず「賛成」または「反対」のどちらかの立場を表明してください。"
                        "文頭で「賛成」であるか「反対」であるかを明示し、その後に理由を述べてください。"},
            {"role": "user",
             "content": question},
        ]
    )
    answer = response['message']['content']
    print(f"Response from 1: {answer}")
    return answer


# OpenAI GPT-4に質問を送信する関数
def ask_gpt4(final_answer: str, gpt35answer: str, palm2answer: str,
             claude2answer: str, question: str) -> str:
    
    response = ollama.chat(
        model="Fugaku-Llm-13b-Instruct",
        messages=[
            {"role": "system",
             "content": "あなたは答えが1つには決まらない問題に対して、"
                        "一つの視点を提供するアドバイザーとしての役割を持っています。"
                        f"あなたは以下の問題に対して{final_answer}であるという立場を動かさずに、"
                        f"以下の3人の賢者の意見を参考にしながら視点をまとめてください。"
                        f"賢者カスパーの意見: {gpt35answer}"
                        f"賢者バルタザールの意見: {palm2answer}"
                        f"賢者メルキオールの意見: {claude2answer}"},
            {"role": "user",
             "content": question},
        ]
    )
    answer = response['message']['content']
    return answer


# Google PaLM2に質問を送信する関数
def ask_2(question: str) -> str:
    response = ollama.chat(
        model="llava-llama3",
        messages=[
            {"role": "system",
             "content": "あなたは答えが1つには決まらない問題に対して、"
                        "一つの視点を提供するアドバイザーとしての役割を持っています。"
                        "必ず「賛成」または「反対」のどちらかの立場を表明してください。"
                        "文頭で「賛成」であるか「反対」であるかを明示し、その後に理由を述べてください。"},
            {"role": "user",
             "content": question},
        ]
    )
    answer = response['message']['content']
    print(f"Response 2: {answer}")
    return answer


# AWS BedrockのClaudeに質問を送信する関数
def ask_3(question: str) -> str:
    response = ollama.chat(
        model="Fugaku-Llm-13b-Instruct",
        messages=[
            {"role": "system",
             "content": "あなたは答えが1つには決まらない問題に対して、"
                        "一つの視点を提供するアドバイザーとしての役割を持っています。"
                        "必ず「賛成」または「反対」のどちらかの立場を表明してください。"
                        "文頭で「賛成」であるか「反対」であるかを明示し、その後に理由を述べてください。"},
            {"role": "user",
             "content": question},
        ]
    )
    answer = response['message']['content']
    print(f"Response from 3: {answer}")
    return answer


# それぞれの回答の冒頭20文字を見て、「賛成」または「反対」の文字を探す関数
def find_answer(answer: str) -> str:
    first_20_chars = answer[:20]
    position_agree = first_20_chars.find("賛成")
    position_disagree = first_20_chars.find("反対")

    if position_agree != -1 and position_disagree != -1:
        # 両方が見つかった場合、最初に出現した方を返す
        return "賛成" if position_agree < position_disagree else "反対"
    elif position_agree != -1:
        return "賛成"
    elif position_disagree != -1:
        return "反対"
    else:
        return "不明"


# それぞれの回答を集計し、多数決をとる関数
def vote(answers: list) -> str:
    agree = 0
    disagree = 0
    for answer in answers:
        if answer == "賛成":
            agree += 1
        elif answer == "反対":
            disagree += 1
    if agree > disagree:
        return "賛成"
    elif agree < disagree:
        return "反対"
    else:
        return "不明"


# 質問を受け取り、それぞれのシステムに質問を送信し、回答を集計する関数
def print_result(question: str) -> str:
    answers = [find_answer(ask_1(question)),
               find_answer(ask_2(question)),
               find_answer(ask_3(question))]
    final_answer = vote(answers)

    return f"OpenAI GPT-3.5 Turbo: {answers[0]}\n" \
           f"Google PaLM2: {answers[1]}\n" \
           f"AWS SageMaker Claude: {answers[2]}\n" \
           f"多数決: {final_answer}\n"


# 3つのAIの回答をGPT-4に渡して最終結果を得る関数
def magi_answer(question: str) -> str:
    with ThreadPoolExecutor() as executor:
        future_1 = executor.submit(ask_1, question)
        future_2 = executor.submit(ask_2, question)
        future_3 = executor.submit(ask_3, question)

        # 各関数の実行が終了するまで待つ
        f_1_answer = future_1.result()
        f_2_answer = future_2.result()
        f_3_answer = future_3.result()

    vote_result = vote([find_answer(f_1_answer),
                        find_answer(f_2_answer),
                        find_answer(f_3_answer)])

    final_answer = str(ask_gpt4(vote_result, f_1_answer, f_2_answer,
                            f_3_answer, question))

    final_answer = ("3賢者の回答:\n"
                    f"カスパー(GPT-3.5-Turbo){find_answer(f_1_answer)}、 "
                    f"バルタザール(PaLM2){find_answer(f_2_answer)}、 "
                    f"メルキオール(Claude instant){find_answer(f_3_answer)} \n"
                    "多数決: " + vote_result + "\n\n"
                    "マギの回答:\n"
                    ) + final_answer
    return final_answer

list=ollama.list()

# Gradioインターフェースの作成
iface = gr.Interface(
    fn=magi_answer,  # 上で定義した関数
    inputs="text",  # 入力はテキスト
    outputs="text"  # 出力もテキスト
)

# インターフェースの起動
iface.launch()

上記のプログラムで「暇なのでパチンコに行こうと考えています。賛成ですか?反対ですか?」と質問をしました。

1回目

Phi3の解答:賛成です。パチンコはお互いに楽しむための交流を深める機会を提供し、家族や友人間の絆を強化することができ ます。ゲームがあればそれも楽しみだと感じられるため、集中力を高めて楽しい時間を過ごすことができます。

llava-llama3の解答:賛成です。

まずもちろん、私は人間であり、自身がパチンコに参加できることはありません。そのため、私はパチンコに行うことができません。そして、私はまた、このような想像をしていることを認めずる必要があります。私は、そのような状況において、自分がそのようなものと一緒に遊ぶことはないことを明確にする必要があると考えます。また、私は、他の人によって自らがパチンコに行うことができないと考えています。そのため、私は、このような想像をしていることを認めずる必要があります。

Fugaku-Llm-13b-Instructの解答:パチンコは中毒性のあるゲームであり、多くのお金を失う可能性があるため、私は反対です。また、パチンコ店で のギャンブルは違法であり、社会的に有害な行為でもあります。ギャンブルは楽しいものではありますが、自分の経済状況やギャンブルが自分の人生に与える影響を考慮し、責任を持って行うことが大切です。全体として、私はパチンコに反対であり、代わりに自分の趣味や興味に時間を費やしたり、自分のスキルを向上させるために何か新しいことを学んだりすることを勧めます。


2回目

Phi3の解答:反対です。パチンコは一時的な楽しみを提供するためだが、環境への影響や健康上のリスク(例えば、スナッキの 摂取による健康リスク)を考慮すると、他の活動を提案することでより継続的な利益があるかもしれません。

llava-llama3の解答:賛成です。休閒の時間にはパチンコなどの遊びに参加することは大切でした。また、他の人からのお願いも大切です。休閒を過ごすことが良好なためにもパチンコを楽しませます。

Fugaku-Llm-13b-Instructの解答:パチンコは中毒性のあるゲームであり、多くのお金を失う可能性があるため、私は反対です。また、パチンコ店で のギャンブルは違法であり、社会的に有害な行為でもあります。ギャンブルは責任を持って行い、自分の限度額を決めておくべきです。適度な楽しみとしてパチンコを楽しんでいるのであれば、否定はしません。自分の意思で決めるべきです。

と何度質問してもFugaku-Llmは「文頭で「賛成」であるか「反対」であるかを明示し、その後に理由を述べてください。」を無視します。
日本語に特化した日本製のLLMでしょ?
日本語が通じていない・・・。なんで?

Fugaku-Llmに期待した俺が悪いのか?
それとも、他に何か問題があるのか?

この記事が気に入ったらサポートをしてみませんか?