Open3

OpenAIのembeddingsを試す

kurehajimekurehajime

※ 自分は勉強中なので浅い理解で書いています。認識が間違っている可能性があります。正しい情報が必要な人は上の記事を読んでください。

概念理解

自分なりに「embeddingsってこういうことかな?」とフワッと理解した内容をメモしておく。

embeddingsってなんぞや

単語や文章をベクトル化すること。
ベクトル化するとn個のパラメータになる。
意味的に近い単語や文章は、パラメータの数字もだいたい近くなる。

embeddingsは何の役に立つのか。どう使うのか

例えば以下のように使う。

  1. Q&Aを1つ1つベクトル化する。
  2. ベクトルをキーにしてQ&Aを保存しておく。
  3. 質問文をベクトル化する。
  4. 質問文のベクトルと最も近いQ&Aを引っ張ってくる。
  5. 引っ張ってきたQ&Aを添えてチャットAIに質問を投げる。

こうすることで、チャットAIは根拠付きで質問に答える事ができる。

なぜファインチューニングじゃだめなのか

まず思いつくのは「Q&Aを全部AIに学習させちゃえば良いじゃん。なんでそんな面倒くさいことするの?」という疑問。

これに対する自分なりの回答。
1000件のQ&Aを学習した次の日に1001件目のQ&Aが追加された場合、ファインチューニングの場合はまた1001件ぶんの学習をやり直さなければならない。これだとQ&Aが毎日追加されると毎日再学習が必要になる。いくらファインチューニングが0からモデルを作るより低コストだと言っても、これはつらい。
embeddingsの場合は新たなQ&Aが追加されても追加ぶんをベクトル化するだけのコストで済む。質問を投げる際に2往復しなければならないというコストがかかるが、それもたかが知れている。
それに不要な情報をたくさん覚えさせるより、質問への回答に必要な知識だけを添える方が返って混乱しないのではないか。
あとembeddingsでは根拠となるQ&Aが明確なので、質問者自身で裏取りすることもできる。

kurehajimekurehajime

試してみた。

根拠付きQ&A

こんな感じかな。

事前に以下のような3つQ&Aを読み込ませて

qa1 = """Q. 2023年2月24日の鹿児島の天気は?
A. 雨のち晴れです。
"""
qa2 = """Q. kurehajimeはうまい棒でどの味が好きですか?
A. 納豆味が好きです。
"""
qa3 = """Q. 2023年02月9日~10日に行われた王将戦第4局ではどちらが勝ちましたか?
A. 羽生善治九段が藤井聡太王将に勝ちました。
"""
2023年の王将戦第4局では誰が誰に負けましたか?

という質問をユーザーが投げると

Q. 2023年02月9日~10日に行われた王将戦第4局ではどちらが勝ちましたか? A. 羽生善治九段が藤井聡太王将に勝ちました。

という一番ベクトルが近いヒントを取ってきて

hint:
Q. 2023年02月9日~10日に行われた王将戦第4局ではどちらが勝ちましたか? A. 羽生善治九段が藤井聡太王将に勝ちました。

---
2023年の王将戦第4局では誰が誰に負けましたか?

という質問を裏で投げる。
すると答えは明白なので

A: 藤井聡太王将が羽生善治九段に負けました。

という答えを返してくれる。

細かい実装方法は参考にした以下の記事の方が詳しい。

https://acro-engineer.hatenablog.com/entry/2023/02/17/100000