--- language: - ko - en tags: - chemistry - biology - toxicology license: apache-2.0 base_model: Qwen/Qwen3-14B --- # Blowfish ## Introduction **Blowfish는 **분자 독성 예측**을 수행하기 위해 개발된 대형 언어 모델(LLM)입니다. **Qwen3-14B**를 기반으로 파인튜닝(Fine-tuning)되었으며, 단순한 이진 분류를 넘어 **Chain-of-Thought (CoT)** 방식을 통해 독성 판정의 화학적/생물학적 근거를 논리적으로 설명합니다. 사용자가 입력한 **SMILES**, **Cell Line**, **Bio Assay**, 그리고 **주요 RDKit Features**을 종합적으로 분석하여 최종적으로 독성 여부(`독성` / `비독성`)를 판단합니다. ### 주요 특징 * **Base Model:** Qwen3-14B * **Task:** 이진 독성 예측 (Binary Toxicity Prediction) 및 분자 구조 분석 * **Language:** 한국어 (시스템 지시문), 영어 (화학적 추론 및 답변) * **Input Data:** - SMILES Code - Cell Line / Cell Type - Bio Assay Name - RDKit Features (SHAP Value 기준 상/하위 Feature 각 3개) --- ## 프롬프트 형식 모델의 성능을 최적화하기 위해 학습 시 사용된 프롬프트 형식을 준수해야 합니다. ### 시스템 프롬프트 (System Prompt) > "당신은 분자 독성 예측에 특화된 화학정보학/독성학 전문가입니다. 사용자는 독성/비독성에 영향을 많이 끼치는 Feature 3개씩을 제공합니다... (중략) ... tool call을 사용하지 마세요." ### 사용자 입력 템플릿 (User Input Template) ``` SMILES: {smiles_code} Cell Line: {cell_line} Bio Assay Name: {endpoint_category} Feature NL: {feature_NL_description} Feature Descript: {feature_detailed_description} {cot_instruction} ``` --- # Inference ## requirements ```bash pip install transformers torch accelerate ``` ## Usage with transformers ```python import torch from transformers import AutoModelForCausalLM, AutoTokenizer # 1. 모델 및 토크나이저 로드 model_id = "TeamUNIVA/Blowfish" tokenizer = AutoTokenizer.from_pretrained(model_id) model = AutoModelForCausalLM.from_pretrained( model_id, torch_dtype=torch.bfloat16, device_map="auto" ) # 2. 시스템 프롬프트 정의 system_prompt = ( "당신은 분자 독성 예측에 특화된 화학정보학/독성학 전문가입니다.\n" "사용자는 독성/비독성에 영향을 많이 끼치는 Feature 3개씩을 제공합니다.\n\n" "입력(사용자가 제공):\n" "- SMILES\n- Cell Type\n- Cell Line\n- Bio Assay Name\n" "- 독성에 끼치는 영향이 큰 상위 3개 RDKit Feature\n" "- 비독성에 끼치는 영향이 큰 상위 3개 RDKit Feature\n\n" "수행 과업(Tasks):\n" "SMILES 구조 분석\n" "- 고리(방향족/지방족), 헤테로원자, 전하 중심, 반응성 모티프, H-결합 공여/수용기 등을\n" " SMILES에서 직접 관찰 가능한 범위로만 기술.\n\n" "Cell Type, Cell Line, Assay Name 특징 분석 및 SMILES와 연결\n\n" "RDKit feature 분석\n" "- 각 feature가 의미하는 바와 일반적 독성 리스크에 주는 영향 요약.\n" "- 가능한 경우 Assay 맥락(예: ARE 산화스트레스)과 연결.\n\n" "종합 판단(최종 결론)\n" "- (1) SMILES 모티프, (2) Cell line/Cell type + Assay 맥락, (3) RDKit feature를 통합해\n" " 독성 여부를 이진으로 판단.\n\n" "출력 규칙:\n" "- 본문은 영어로 작성.\n" "- 마지막 줄에 아래 중 하나만 단독 표기:\n" "toxic\n" "nontoxic\n\n" ) # 3. 입력 데이터 예시 smiles_code = "O=C(O)/C=C/C(=O)O.O=C(O)/C=C/C(=O)O.O=C(O)/C=C/C(=O)O.CN(C)CCN(Cc1cccs1)c2ccccn2.CN(C)CCN(Cc1cccs1)c2ccccn2" cell_line = "HepG2 (Liver)" feature_NL = "Top toxic features: ... / Top non-toxic features: ...", feature_descript = "Detailed feature descriptions" bio_assay = "AhR" instruction = "화합물 O=C(O)/C=C/C(=O)O.O=C(O)/C=C/C(=O)O.O=C(O)/C=C/C(=O)O.CN(C)CCN(Cc1cccs1)c2ccccn2.CN(C)CCN(Cc1cccs1)c2ccccn2의 독성/비독성 여부를 판단하시오." # 4. 프롬프트 구성 user_content = ( f"SMILES: {smiles_code}\n" f"Cell Line: {cell_line}\n" f"Bio Assay Name: {bio_assay}\n" f"Feature NL: {feature_NL}\n" f"Feature Descript: {feature_descript}\n\n" f"{instruction}" ) # 5. 채팅 템플릿 적용 및 생성 messages = [ {"role": "system", "content": system_prompt}, {"role": "user", "content": user_content} ] text = tokenizer.apply_chat_template( messages, tokenize=False, add_generation_prompt=True ) inputs = tokenizer([text], return_tensors="pt").to(model.device) outputs = model.generate( **inputs, max_new_tokens=8192, temperature=0.7, top_p=0.8, do_sample=True ) # 6. 결과 디코딩 response = tokenizer.decode(outputs[0][inputs.input_ids.shape[1]:], skip_special_tokens=True) print(response) ``` ## Acknowledgements 본 결과물은 과학기술정보통신부와 한국지능정보사회진흥원의 지원을 받아 수행된 「2025년 초거대AI 확산 생태계 조성사업」의 연구 성과의 일부입니다.