OpenAI Embeddingで日本語処理
前回書いたチャットボットのkintoneポータルへの実装ですが、一つ問題がありました。
それは、過去の問い合わせとの類似度比較の精度問題。
今回やっていることとしては
①kinotoneのポータル画面から投げられた質問をWENHOOKで受け取る
②質問をベクトル化し、kintoneアプリの過去の質問(1500レコードほど)と突き合わせし、最も類似度の高い質問と回答の組み合わせをopenAIのモデルにクエリとして渡す
③生成された回答をブラウザで表示
なのですが、この類似度の測定方法を当初はTF-IDFを使っていました。
テキストの前処理が下手だったのか、ほぼほぼ完全一致するような質問のテキストでないと選抜されないという問題があり、この類似度比較部分を調整しました。
openAI Embeddingを採用
同僚に相談したところ、同じopenAIのEmbeddings APIの存在を知り、「ChatGPTを作っているopenAIが出しているAPIなんだから、何か凄そう」と思い早速実装してみました。
OPENAI_API_KEY = 'your_openAI_API_KEY'
os.environ['OPENAI_API_KEY'] = OPENAI_API_KEY
client = openai.OpenAI(api_key=OPENAI_API_KEY)
def get_embedding(text, model="text-embedding-3-small"):
text = text.replace("\n", " ")
response = client.embeddings.create(input=[text],model=model)
return response.data[0].embedding
モデルは最新のモデルtext-embedding-3-smallを利用。
これがなかなか精度が良い感じです。
類似度のチェックはコサイン類似度が0.6以上と設定しています。このあたりも色々と試しましたが、閾値0.6くらいがちょうど良さそう。(微調整は必要かも)
デメリットとしては、text-embedding-3-smallでは利用トークンにより料金がかかります。
1000トークンで約0.0028円
大体日本語の場合1文字が1〜3トークンなので、一回のテキスト処理に300文字かかったとして、約0.003円
まあほぼ考慮しなくても良いくらいの金額ですかね?
まとめ
生成AIが汎用化されるにつれ、kintone上でも機械学習や自然言語処理の利用頻度が高まっていくと思います。その際に必要になる文章や画像データのベクトル化には様々な手法があり、何を選定するか迷ってしまいがちです。
Embeddingは実際使ってみると、手軽なだけでなく今回のようなユースケースでは“良い感じに”文章を読解してくれた印象があります。
使ったことがない方はぜひ使ってみてください。
さいごに、完成したカエルくんに「今後言語処理の技術のニーズは高まりますかね?」と聞いてみました。
カエルくんも同感のようです。
この記事が気に入ったらサポートをしてみませんか?