본문 바로가기

스타트업 투자/데이터 + 테크

패스트캠퍼스 환급챌린지 40일차 : 모델 호출

by Sungwook Choi 2025. 5. 10.

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.

*_1. 학습 인증샷 4장 이상 포함
*_① 오늘자 날짜, 공부 시작 시각 포함 사진 1장

② 오늘자 날짜, 공부 종료 시각 포함 사진 1장

③ 1개 클립 수강 인증 사진 (강의장 목록 캡쳐, 강의 내용이 담긴 수강화면이 보이지 않도록) 1장

④ 학습 인증샷 1장 이상 (ex. 필기 촬영, 작업물, 등)

2. 학습 후기 700자 이상 (공백 제외)

  • 모델 호출
import json
from transformers import AutoTokenizer
from vllm import LLM, SamplingParams

llm = LLM(model="iamjoon/llama3-8b-finance-analyzer")

tokenizer = AutoTokenizer.from_pretrained("iamjoon/llama3-8b-finance-analyzer")

with open("/workspace/LLaMA-Factory/data/finance_news_summarizer_test.json", "r", encoding="utf-8") as f:
    test_data = json.load(f)

input_label_pairs = []

# 샘플 순회하면서 템플릿 적용 및 분리
for sample in test_data:
    system = sample.get("system", "")
    instruction = sample["instruction"]
    output = sample["output"]

    # chat template용 메시지 구성
    messages = []
    if system:
        messages.append({"role": "system", "content": system})
    messages.append({"role": "user", "content": instruction})
    messages.append({"role": "assistant", "content": output})  # 전체 메시지 (full_text용)

    # assistant 전까지만 prompt로 구성
    prompt_only = tokenizer.apply_chat_template(
        messages[:-1],  # assistant 제거
        tokenize=False,
        add_generation_prompt=True  # <|start|>assistant\n 추가됨
    )

    # label에는 절대 template 적용 안 함
    input_label_pairs.append({
        "input": prompt_only,     # 템플릿 적용된 prompt
        "label": output.strip()   # 순수 응답만 (앞뒤 공백 제거만)
    })

print(input_label_pairs[0]['input'])
print(input_label_pairs[0]['label'])
  • 샘플 json 추출
    from vllm import SamplingParams
    import json
    

sampling_params = SamplingParams(
temperature=0,
max_tokens=1024,
stop=["<|eot_id|>"]
)

20번부터 30번까지 반복

for i in range(20, 31):
prompt = input_label_pairs[i]["input"]
label_text = input_label_pairs[i]["label"]

print(f"\n\n======= 샘플 {i} =======")

# LLM 생성
outputs = llm.generate(prompt, sampling_params)

# 생성된 텍스트 가져오기
generated_text = outputs[0].outputs[0].text.strip()

# JSON 파싱
try:
    label_json = json.loads(label_text)
    generated_json = json.loads(generated_text)
except json.JSONDecodeError:
    print("[⚠️ JSON 파싱 실패]")
    print("[Generated Output]\n", generated_text)
    print("\n[정답 Label]\n", label_text)
    continue

# 비교 키 설정
if label_json.get("is_stock_related") is True:
    keys_to_check = [
        "is_stock_related",
        "positive_impact_stocks",
        "reason_for_positive_impact",
        "positive_keywords",
        "negative_impact_stocks",
        "reason_for_negative_impact",
        "negative_keywords",
        "summary"
    ]
else:
    keys_to_check = ["is_stock_related", "summary"]

# 결과 출력
print("[Generated Output]")
for key in keys_to_check:
    print(f"{key}:\n{generated_json.get(key)}\n")

print('--' * 30)

print("[정답 Label]")
for key in keys_to_check:
    print(f"{key}:\n{label_json.get(key)}\n")

~

url : https://abit.ly/lisbva

댓글