🚀 {MODEL_NAME}
このプロジェクトは、GoogleがGoogle Cloudのクレジットを提供することで支援されています。オープンソースへの支援に感謝します!🎉
📚 ドキュメント
これは、FAQ検索用に微調整されたmys/bert-base-turkish-cased-nli-meanのバージョンです。そのモデル自体は、自然言語推論(NLI)用にdbmdz/bert-base-turkish-casedを微調整したものです。このモデルは、質問と回答を768次元のベクトルにマッピングし、FAQ形式のチャットボットや質問応答パイプラインにおける回答検索に使用されます。
このモデルは、clips/mqaデータセットのトルコ語サブセットをクリーニング/フィルタリングした後、Multiple Negatives Symmetric Ranking損失を使用してトレーニングされました。微調整の前に、トークナイザに2つの特殊トークン(質問用の<Q>
と回答用の<A>
)を追加し、モデルの埋め込みをリサイズしました。そのため、シーケンスをモデルに入力する前に、関連するトークンをシーケンスの先頭に付ける必要があります。微調整の方法や推論時の使用方法については、付属のリポジトリを参照してください。以下のコードスニペットは、そのリポジトリの推論コードから抜粋したものです。
💻 使用例
基本的な使用法
questions = [
"Merhaba",
"Nasılsın?",
"Bireysel araç kiralama yapıyor musunuz?",
"Kurumsal araç kiralama yapıyor musunuz?"
]
answers = [
"Merhaba, size nasıl yardımcı olabilirim?",
"İyiyim, teşekkür ederim. Size nasıl yardımcı olabilirim?",
"Hayır, sadece Kurumsal Araç Kiralama operasyonları gerçekleştiriyoruz. Size başka nasıl yardımcı olabilirim?",
"Evet, kurumsal araç kiralama hizmetleri sağlıyoruz. Size nasıl yardımcı olabilirim?"
]
questions = ["<Q>" + q for q in questions]
answers = ["<A>" + a for a in answers]
def answer_faq(model, tokenizer, questions, answers, return_similarities=False):
q_len = len(questions)
tokens = tokenizer(questions + answers, padding=True, return_tensors='tf')
embs = model(**tokens)[0]
attention_masks = tf.cast(tokens['attention_mask'], tf.float32)
sample_length = tf.reduce_sum(attention_masks, axis=-1, keepdims=True)
masked_embs = embs * tf.expand_dims(attention_masks, axis=-1)
masked_embs = tf.reduce_sum(masked_embs, axis=1) / tf.cast(sample_length, tf.float32)
a = tf.math.l2_normalize(masked_embs[:q_len, :], axis=1)
b = tf.math.l2_normalize(masked_embs[q_len:, :], axis=1)
similarities = tf.matmul(a, b, transpose_b=True)
scores = tf.nn.softmax(similarities)
results = list(zip(answers, scores.numpy().squeeze().tolist()))
sorted_results = sorted(results, key=lambda x: x[1], reverse=True)
sorted_results = [{"answer": answer.replace("<A>", ""), "score": f"{score:.4f}"} for answer, score in sorted_results]
return sorted_results
for question in questions:
results = answer_faq(model, tokenizer, [question], answers)
print(question.replace("<Q>", ""))
print(results)
print("---------------------")
出力結果は以下の通りです。
Merhaba
[{'answer': 'Merhaba, size nasıl yardımcı olabilirim?', 'score': '0.2931'}, {'answer': 'İyiyim, teşekkür ederim. Size nasıl yardımcı olabilirim?', 'score': '0.2751'}, {'answer': 'Hayır, sadece Kurumsal Araç Kiralama operasyonları gerçekleştiriyoruz. Size başka nasıl yardımcı olabilirim?', 'score': '0.2200'}, {'answer': 'Evet, kurumsal araç kiralama hizmetleri sağlıyoruz. Size nasıl yardımcı olabilirim?', 'score': '0.2118'}]
---------------------
Nasılsın?
[{'answer': 'İyiyim, teşekkür ederim. Size nasıl yardımcı olabilirim?', 'score': '0.2808'}, {'answer': 'Merhaba, size nasıl yardımcı olabilirim?', 'score': '0.2623'}, {'answer': 'Hayır, sadece Kurumsal Araç Kiralama operasyonları gerçekleştiriyoruz. Size başka nasıl yardımcı olabilirim?', 'score': '0.2320'}, {'answer': 'Evet, kurumsal araç kiralama hizmetleri sağlıyoruz. Size nasıl yardımcı olabilirim?', 'score': '0.2249'}]
---------------------
Bireysel araç kiralama yapıyor musunuz?
[{'answer': 'Hayır, sadece Kurumsal Araç Kiralama operasyonları gerçekleştiriyoruz. Size başka nasıl yardımcı olabilirim?', 'score': '0.2861'}, {'answer': 'Evet, kurumsal araç kiralama hizmetleri sağlıyoruz. Size nasıl yardımcı olabilirim?', 'score': '0.2768'}, {'answer': 'İyiyim, teşekkür ederim. Size nasıl yardımcı olabilirim?', 'score': '0.2215'}, {'answer': 'Merhaba, size nasıl yardımcı olabilirim?', 'score': '0.2156'}]
---------------------
Kurumsal araç kiralama yapıyor musunuz?
[{'answer': 'Evet, kurumsal araç kiralama hizmetleri sağlıyoruz. Size nasıl yardımcı olabilirim?', 'score': '0.3060'}, {'answer': 'Hayır, sadece Kurumsal Araç Kiralama operasyonları gerçekleştiriyoruz. Size başka nasıl yardımcı olabilirim?', 'score': '0.2929'}, {'answer': 'İyiyim, teşekkür ederim. Size nasıl yardımcı olabilirim?', 'score': '0.2066'}, {'answer': 'Merhaba, size nasıl yardımcı olabilirim?', 'score': '0.1945'}]
---------------------