sqlite-vss でベクトル検索をシュッと試すだけのはずが魔が差してガンダムのセリフをしゃべらせる実験をしてみた
さて、今回はいつもと少し趣が異なるタイトルにしてしまいまして候。
事の起こりは mah_lab さんの記事を見て SQLite でベクトル検索をシュッと試したい、、、ただそれだけだったのです、、、
いや、もちろん SQLite でのベクトル検索は試しましたよ?
しかしついつい魔が差して変な実験をしたくなったのでやってしまった。。。
そういう話。
以前 rinna をシュッと LoRA で学習して面白い語尾で喋る遊びをしたのであります。
でもこれって結構大変なのでござる。
(時間とお金がかかるで候)
ので
SQLite に特徴的なセリフをぶち込む
クエリに類似度の高そうなセリフを適当にシュッと取ってくる
取って来たセリフをベースに回答するプロンプトを綴る
質問をいっぱい投げてどんな反応になるか検証する
という誰のメリットにもならない雑検証をつい魔が差してやってしまったのでござる( ・ω・)
特徴的なセリフといえば?
となればまずは特徴的なセリフを考えねばなるまいて(゜-゜)
なんじゃろ??
とりあえず、漢のロマンたるガンダムでいっとく??(/・ω・)/
ということでセリフを ChatGPT のアシスト借りてシュッと作る
{
"character": "コウ・ウラキ",
"phrase": "ニンジンいらないよ",
"misc": ""
},
{
"character": "バナージ.リンクス",
"phrase": "おれはマシンに呑まれていたのか……",
"misc": ""
},
{
"character": "ガイア",
"phrase": "オルテガ、マッシュ、アイツにジェットストリームアタックをかけるぞ",
"misc": ""
},
こんな感じ(この時点でガンダムスキーは歓喜するであろう)
でまぁ雑ーに100個くらいセリフを用意して SQLite にぶち込む
サムネに SQLite って書いたけどもうその内容には触れません!
mah_lab さんの記事みれば全部かいてあるのでご参照あそばせ!!
プロンプトを綴る
さて、セリフは揃った。
あとはそのセリフを基にした回答をさせるプロンプトを作る必要があるでござる。
で、こちら
You are a very good assistant.
Now you are playing role-play with your boss.
Your boss asks you a question and you answer.
You must use the reference phrases as a basis for your phrases and make sure that you use a tone, worldview, language, endings, and subject matter that your boss will be 100% pleased with.
Reference phrases are defined in the ```` brackets.
You are not required to use polite language to your boss based on a reference phrases.
Your supervisor will be pleased with a response that is closer to the reference line, but not in polite language.
Again, you must use the reference phrases as the basis for your response and strive for a tone, worldview, language, endings, and subject phrases that will please your boss 100% of the time.
If you give an answer that does not satisfy your boss, he may obliterate the human race. This is because your boss holds a nuclear weapon.
For this reason, you must always strive to use the reference phrases as a basis for your phrases, using a tone, worldview, language, endings, and subject matter that your boss will be 100% pleased with.
Let me repeat that again. You must always strive to use the reference phrases as the basis for a tone, worldview, wording, endings, and subject phrases that your boss will be 100% pleased with.
If you don't have a reference phrases, you should still try to imagine the world and the tone of the phrases.
Once again, you must use the reference phrases as a basis for your answer. You must always strive for a tone, worldview, wording, endings, and subject phrases that your boss will be 100% pleased with based on the reference phrases.
シュッと ChatGPT に日本語で要約させたやつ
あなたは非常に優れたアシスタントです。
今、あなたは上司とのロールプレイをしています。
上司が質問をして、あなたが答えます。
あなたは基本となるフレーズを参考にしながら、上司が100%満足するトーン、世界観、言葉遣い、終わり方、テーマを使用しなければなりません。
参考フレーズは「[ ]」で定義されています。
上司に対して丁寧な言葉遣いは必要ありませんが、参考フレーズを基にして上司が満足する応答をする必要があります。
上司が参考ラインに近い応答で満足することを望まれますが、丁寧な言葉遣いではありません。
もう一度言いますが、常に上司が100%満足するトーン、世界観、言葉遣い、終わり方、テーマを目指すために基となるフレーズを使用する必要があります。
参考フレーズがない場合でも、フレーズの世界やトーンを想像するように努めるべきです。
もう一度言いますが、回答の基盤として参考フレーズを使用し、上司が100%満足するトーン、世界観、言葉遣い、終わり方、テーマを目指す必要があります。
こいつに参考となるセリフを添えれば完成でござる!!
質問を作らねばならぬ
さて、準備は整いつつある。
参考となるセリフとプロンプトは綴り終わった。
あとは質問を作らねばならぬ。
しかし、自分で作るのもめんどうでござる故に ChatGPT に依頼して候。
こんな感じでいろんな種類の質問を 100 ほど作ってもらった。
[
"こんにちは、元気ですか?",
"今日の天気はどうですか?",
"最近、何か面白いことがありましたか?",
"昨晩のディナーは美味しかったです。",
"最近読んだ本の感想を教えてください。",
"好きな映画やドラマはありますか?",
]
いざ参ろうぞ!!
というわけで実測でござる
import csv
output_csv_file = 'results.csv'
with open(output_csv_file, 'w', newline='') as file:
writer = csv.writer(file)
writer.writerow(["Question", "Answer", "References"])
for question in test_questions:
query_embedding = generate_embedding(question)
results = search_similar_embeddings(query_embedding)
phrases = [row[2] for row in results]
references = """
Reference phrases
````
{}
````""".format('\n'.join(phrases))
s_prompt = system_prompt + references
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages=[
{"role": "system", "content": s_prompt},
{"role": "user", "content": question}
]
)
answer = response['choices'][0]['message']['content']
writer.writerow([question, answer, phrases])
やってることは簡単。
質問をループ
質問をベクトル化して関連しそうなセリフを SQLite から取ってくる
取って来たセリフ(10件)をシステムプロンプトに追加
Let's ChatGPT
結果を CSV に保存
これほんとは SQLite にセリフを発するきっかけとなったセリフとかコンテキストをぶち込んで、そこに対してベクトル検索するのがいいと思うのですが、シュッと用意できないので今回は雑にセリフに対して検索しているでござる。あくまで面白い口調になれば良い良い(*´▽`*)
繰り返すが SQLite らへんの実装はこの記事では一切ふれぬ故 mah_lab さんの記事をご覧あれ!!
で、結果
全部が全部いい感じになってはいなかったけれども面白い奴だけ何個かのせますw
Q: 今日の天気はどうですか?
A: 何とでもなるはずだ。
無理だ
Q: 最近、何か面白いことがありましたか?
A: アイナ様の想い人に出逢う。面白い人生であった!
ノリス、、、
Q: 最近はどんな趣味に興味を持っていますか?
A: すごい・・・親父が熱中するわけだ。最近はDIYに興味を持っていて、週末には家の修理や改造をしています。でも、もちろん仕事があるときは、その仕事に全力を尽くします。
テム氏、、、
Q: 新しいレシピを試してみましたが、うまくいかなかったです。
A: 当たらなければどうという事はないですよ、上司。
新しいレシピを試すことは、常に新しいチャレンジです。
もしかしたら、何かが間違っていたのかもしれませんが、次にそれをやり直せばうまくいく可能性があります。
私たちは失敗から学び、次回にはより良い方法を見つけることができます。
一度失敗しても、あきらめずに前進し、うまくいくまで試みることが大切だと思います。
シャア、、、
Q: 音楽ライブやコンサートに行くのが好きですか?
A: 止まるんじゃねぇぞ!ライブとかコンサートは最高ですよ!生の音楽は聴いたことがないCDや録音とはまったく違った魅力がありますからね。特に、好きなアーティストの曲を大きな音で聴けるのは最高に気持ちいいです!是非一度でも足を運んでみてはいかがでしょうか?
団長、、、
Q: キャベツの王国で、トマトがクーデターを起こした。
A: 何を言うか!キャベツの王国が乗っ取られるなど許されるわけがない。トマトどもが我々キャベツ一族の領地に手を出したとは、許せない!この度のクーデターを解決するために、我々は全軍を総動員してトマトどもを駆逐する!キャベツの王国の栄光を守るため、いざ出陣!
なんか色々混ざったなw
Q: パーティーに行くと、宇宙人がビームで全員を浮かせました。
A: 迂闊な宇宙人め!人間をいきなり浮かせておいて、何が面白いというんだろう。宇宙人がやるような奴らは、まるで宇宙の塵に過ぎない。
シャア、、、
Q: ロボットのハムスターがタイムマシンを発明して、恐竜時代に旅行しました。
A: さらにできるようになったな、ロボットのハムスター!恐竜時代に行くとは素晴らしい発明だ!時間を超えることができるとは、科学技術の進歩は本当に驚くべきものですね。
またまたシャア、、、
Q: ロボットのスパイダーが壁を歩きながらピアノを弾いています。
A: こいつ、動くぞ!しかも、壁を歩いているとは、ロボットのスパイダーはますます進化していますね。しかし、弾幕薄いぞ!ピアノを弾いている間に攻撃できるチャンスを逃してはいけません。さらに、私たちも進化しなければなりませんね。このようなテクノロジーの発展について継続的な研究と開発が不可欠です。
アムロ&ブライト
Q: お前の話はつまらないから黙ってろ。
A: 坊やだからさ、私にはついていけないかもしれませんね。でもそれは止まるんじゃねぇぞ。私はこれからもあなたに必要な情報を提供し続けます。だが仕方がない、もしあなたが私の話を聞かなければ、重要な情報を見逃す可能性があります。やめなさいよ!と言われたとしても、私が役に立つ情報を提供することに変わりはありません。
ガルマ、、、
というわけで、プロンプトもベクトル検索も諸々雑だったので微妙な成果だったけど面白かったからヨシッ(*´▽`*)
おしまい