
RAGを開発してみたい!ので簡単なものでもいいので作ってみよう!part3
このpartで目標としていた基本形は作れたことになります。簡単な質問で"タイトル"と"内容"が返ってくるものになります。 前回やったのは 特殊文字の削除 大文字小文字統一 ベクトル変換 今回行ったのは 検索クエリのベクトル化 コサイン類似度の計算 になります。ベクトル化に関しては前回も行ったので同じものになります。 # これが検索用の文字列 QUERY = '保険金が欲しい' # 検索用の文字列をベクトル化 query = openai.embeddings.create( model='text-embedding-3-large', input=QUERY ) # ベクトル取得 query = query.data[0].embedding ちなみにモデルの部分に関しては’text-embedding-3-large’の他に’text-embedding-3-small’もありますのでお好きな方を使ってください。精度はlargeのほうがいいですが料金は下がると思います。 次はコサイン類似度の計算になります。こちらは昔OpenAIでも提供されていたみたいですが、前のバージョンで提供されていたみたいなので他のもので代用します。簡単に自作できますがめんどくさい方はsklearnでも提供されているのでそちらを使ってください。 import numpy as np def cosine_similarity(v1, v2): # ベクトルのドット積 dot_product = np.dot(v1, v2) # ベクトルのノルム norm_v1 = np.linalg.norm(v1) norm_v2 = np.linalg.norm(v2) # コサイン類似度 similarity = dot_product / (norm_v1 * norm_v2) return similarity # 総当りで類似度を計算 results = map( lambda i: { 'title': i['title'], 'body': i['body'], # ここでクエリと各文章のコサイン類似度を計算 'similarity': cosine_similarity(i['embedding'], query) }, vector_database ) # コサイン類似度で降順(大きい順)にソート results = sorted(results, key=lambda i: i['similarity'], reverse=True) これで関連するファイルと内容が取得できます。‘result[0]‘であれば最も関連するもの、‘result[-1]‘であれば関連しないものあるいは反対のものになります。反対かどうかはコサイン類似度の値が負の値になってるかで確認できます。 ...








