Yoonyoul/fine-tuned-e5-small-drugproduct
๐งฌ Fine-tuned E5-small for Korean Drug Product Semantic Embedding
๐ Model Overview
์ด ๋ชจ๋ธ์ [intfloat/multilingual-e5-small](https://huggingface.co/intfloat/multilingual-e5-small) ๊ธฐ๋ฐ์ผ๋ก, ์์ฝํ ์์ฝยท์์ธ ๋ฐ์ดํฐ(drug_summary, drug_details) ๋ฐ ์ ํ ์ ํ ์ ์(drug_type_definition), DUR ๊ท์ ์ ์(drug_dur_type_definition)๋ฅผ ํ์ฉํ์ฌ ํ๊ตญ์ด ์์ฝํ ๋๋ฉ์ธ์ ๋ง๊ฒ 3๋จ๊ณ ํ์ธํ๋(fine-tuning) ๋ SentenceTransformer ๋ชจ๋ธ์
๋๋ค.
- GitHub Repository: https://github.com/ryukato/fine-tuned-e5-drugmodel
๐งฉ Base Model Selection Rationale
์ด ํ๋ก์ ํธ๋ ๋ค๊ตญ์ด ํ๊ฒฝ์์๋ ์์ฝํ ๋ช
์นญ, ํจ๋ฅ, DUR ๊ท์ ์ ๋ณต์กํ ์๋ฏธ ๊ด๊ณ๋ฅผ ์ ํํ ์๋ฒ ๋ฉํ๊ธฐ ์ํด E5(multilingual-E5) ๊ณ์ด ๋ชจ๋ธ ์ค intfloat/multilingual-e5-small์ ์ ํํ์ต๋๋ค.
์ ์ ์ด์ ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ๋ค๊ตญ์ด ๋ฌธ์ฅ ํํ๋ ฅ
- ์์ด๋ฟ ์๋๋ผ ํ๊ตญ์ด, ์ผ๋ณธ์ด, ์ค๊ตญ์ด, ๋ ์ผ์ด ๋ฑ ๋ค์ํ ์ธ์ด์์ ๊ท ํ ์กํ ์๋ฏธ ํํ ์ฑ๋ฅ์ ๋ณด์ฌ์ค๋๋ค.
- ์์ฝํ ๋ฐ์ดํฐ๋ ์ธ๋์ดยทํ์ ์ฉ์ด๊ฐ ํผํฉ๋ ํํ๊ฐ ๋ง๊ธฐ ๋๋ฌธ์ multilingual encoder๊ฐ ์ ๋ฆฌํฉ๋๋ค.
- ํจ์จ์ ์ฑ๋ฅ ๋๋น ํ๋ผ๋ฏธํฐ ํฌ๊ธฐ (Small Variant)
small๋ชจ๋ธ์ ์ฝ 33M ํ๋ผ๋ฏธํฐ๋ก, M1/M2 ๋งฅ๋ถ ๋ฑ ๋ก์ปฌ ํ๊ฒฝ์์๋ ์์ ์ ์ผ๋ก fine-tuning ๊ฐ๋ฅํ์ต๋๋ค.- FP16 ๋๋ bfloat16 ์ง์์ผ๋ก GPUยทMPS ํ๊ฒฝ์์๋ ํจ์จ์ ์ธ ์ฐ์ฐ์ ์ ๊ณตํฉ๋๋ค.
- ๋ฌธ์ฅ ๋จ์ ์๋ฏธ ๊ฒ์(semantic retrieval)์ ์ต์ ํ
- E5 ๋ชจ๋ธ์ โ๋ฌธ์ฅ ๋จ์ ์๋ฏธ ์๋ฒ ๋ฉ(Sentence Embedding)โ์ ์ํด ํ์ต๋์ด ์์ด, ๋จ์ ์ง์(
"๊ธฐ์นจ์ฝ","์ด ๋ด๋ฆฌ๋ ์ฝ")์ ์ ํ๋ช ("ํ์ฝ์์ด","ํ์ด๋ ๋") ๊ฐ ์๋ฏธ ๋งค์นญ์ ๋ฐ์ด๋ ์ฑ๋ฅ์ ๋ณด์ ๋๋ค.
- Sentence-Transformers์ ์๋ฒฝํ ํธํ์ฑ
SentenceTransformer์ธํฐํ์ด์ค์ 100% ํธํ๋์ด, PyTorch ๊ธฐ๋ฐ pipeline ํตํฉ์ด ์ฉ์ดํ์ต๋๋ค.
๐น Step 1: Drug Type Semantic Alignment
- ๋ฐ์ดํฐ์
:
drug_type_def_list.csv - ๋ชฉํ:
"ํด์ด์ " โ "์ฒด์จ์ ๋ฎ์ถ๋ ์ฝ"๊ณผ ๊ฐ์ ๊ฐ๋ ๋งคํ ํ์ต - ๋ชจ๋ธ ๊ฒฐ๊ณผ:
/model/fine_tuned_e5_small_drugtype
๐น Step 2: DUR Type Semantic Alignment
- ๋ฐ์ดํฐ์
:
drug_dur_type_similarity_train.csv - ๋ชฉํ:
"์๋ถ๊ธ๊ธฐ","๋ ธ์ธ์ฃผ์","๋ณ์ฉ๊ธ๊ธฐ"๋ฑ DUR ํ์ ๊ณผ ์ ๋ฌธ์ ์ค๋ช ๊ฐ ์๋ฏธ ๋งคํ ํ์ต - ๋ชจ๋ธ ๊ฒฐ๊ณผ:
/model/fine_tuned_e5_small_drugdurtype
๐น Step 3: Drug Product Semantic Alignment
- ๋ฐ์ดํฐ์
:
drug_product_similarity_train.csv(์ฝ 3,000๊ฑด ์ํ) - ๋ชฉํ:
"ํ์ฝ์์ด๋ด๋ณต์ก"๊ฐ์ ์ค์ ์ ํ๊ณผ"์ด์ ๋ด๋ฆฌ๋ ์ฝ"๊ฐ์ ์ง์ ๊ฐ ์๋ฏธ ๋งค์นญ ๊ฐํ - ๋ชจ๋ธ ๊ฒฐ๊ณผ:
/model/fine_tuned_e5_small_drugproduct_accum
๐น Experimental: Drug Ingredient + Product Type Fine-tuning
fine_tuned_e5_small_drugdurtype ๋ชจ๋ธ์ ๊ธฐ๋ฐ์ผ๋ก, ์์ฝํ ์ฑ๋ถ(ingredient_name)๊ณผ ์ ํ ์ ํ(product_type)์ ๊ฒฐํฉํ ์๋ฒ ๋ฉ ํ์ต(fine_tuned_e5_small_drug_ptype_ingredients)์ ์ถ๊ฐ๋ก ์ํํ์์ต๋๋ค.
โ๏ธ ์ ์ฉ ๋ด์ฉ
๐ ๊ด์ฐฐ ๋ด์ฉ
- ๋ชจ๋ธ์ ์์ ์ ์ผ๋ก ์๋ ดํ์์ผ๋, ๋ฌธ์ฅ ํจํด์ ๋ฐ๋ณต์ฑ๊ณผ Positive-only ๋ฐ์ดํฐ ๊ตฌ์ฑ์ผ๋ก ์ธํด ํจ๋ฅ๊ตฐ ๊ฐ ์๋ฏธ์ ๊ฒฝ๊ณ๊ฐ ์ ๋๋ก ํ์ฑ๋์ง ์์์.
- ์ ์ฒด ์ ์ฌ๋ ๋ถํฌ๊ฐ ๊ณผ๋ํ๊ฒ ๋๊ฒ ์๋ ดํ์ฌ, ์๋ฏธ๋ณด๋ค ๋ฌธ์ฒด ํจํด์ ์ค์ฌ์ผ๋ก ํ์ต๋ ๊ฒ์ผ๋ก ๊ด์ฐฐ๋จ.
- ๊ฒฐ๋ก ์ ์ผ๋ก ๋ณธ ๋ชจ๋ธ์ ์ฑ๋ถ-์ ํ์ ํ ๊ฒฐํฉ ํ์ต์ด ์๋ฏธ ๊ฒ์ ํ์ง ๊ฐ์ ์ ์ค์ง์ ์ด์ ์ ์ ๊ณตํ์ง ์์์ ํ์ธํ์์ผ๋ฉฐ, ํ์ฌ ํ์ดํ๋ผ์ธ์๋ ์ ์ฉํ์ง ์๊ธฐ๋ก ๊ฒฐ์ ํจ.
๐ง Use Case Example
from sentence_transformers import SentenceTransformer, util
model = SentenceTransformer("Yoonyoul/fine-tuned-e5-small-drugproduct")
query = "์ด์ ๋ด๋ฆฌ๋ ์ฝ์?"
docs = [
"ํ์ฝ์์ด๋ด๋ณต์ก์ ํด์ด์งํต์ ์
๋๋ค.",
"๋ง์ด์๋ถํจ์ ์ ํญ๊ฒฐํต์ ์
๋๋ค.",
"์ง๋ฅดํ
์ ์ ํญํ์คํ๋ฏผ์ ์
๋๋ค."
]
emb_q = model.encode(query, convert_to_tensor=True)
emb_d = model.encode(docs, convert_to_tensor=True)
scores = util.cos_sim(emb_q, emb_d)[0]
for doc, score in zip(docs, scores):
print(f"{doc} โ ์ ์ฌ๋: {score.item():.4f}")โ๏ธ Training Environment
๐ Release Info
- Author: @Yoonyoul
- Base Model:
intfloat/multilingual-e5-small - Fine-tuned Model:
Yoonyoul/fine-tuned-e5-small-drugproduct - Repository: https://github.com/ryukato/fine-tuned-e5-drugmodel
- Last Updated: 2025-10-27
