[AI] 파인튜닝 - 질문, 답변 데이터셋 만드는게 너무 힘들다! (작성중)

늘 공부하는 괴짜·2025년 5월 12일
0

AI : Fine Tuning

목록 보기
4/15

1. google-adk를 이용해 보자.

참고하면 좋겠다.
https://velog.io/@exoluse/AI-google-adk-%EB%A5%BC-%EC%8D%A8%EB%B3%B4%EC%9E%90

import json
from typing import List, Dict, Set, Tuple
from google.adk.agents import Agent

def generate_qa_prompt(context: str, batch_index: int, batch_size: int = 10) -> str:
    return (
        f"[문장]: {context}\n\n"
        f"이 문장을 바탕으로 **반드시 {batch_size}개의 서로 다른 질문과 그에 대한 답변**을 생성해 주세요.\n"
        "각 질문과 답변은 중복되지 않아야 하며, 표현 방식도 다양해야 합니다.\n"
        "형식은 JSONL이며, 각 줄은 아래 형식과 완전히 일치해야 합니다:\n"
        '{"instruction": "질문", "input": "", "output": "답변"}\n\n'
        "예시:\n"
        '{"instruction": "삼성은 언제 창립되었나요?", "input": "", "output": "1938년 3월입니다."}\n\n'
        f"{batch_index * batch_size + 1}번부터 {batch_index * batch_size + batch_size}번까지 생성해 주세요.\n"
        "※ 반드시 정확히 10개를 생성해 주세요. 누락 없이 모두 포함되어야 합니다."
    )

# JSONL 파서
def parse_jsonl(text: str) -> List[Dict[str, str]]:
    return [json.loads(line) for line in text.strip().splitlines() if line.strip()]

# 중복 제거
def remove_duplicates(qa_list: List[Dict[str, str]]) -> List[Dict[str, str]]:
    seen: Set[Tuple[str, str]] = set()
    unique = []
    for qa in qa_list:
        key = (qa['instruction'].strip(), qa['output'].strip())
        if key not in seen:
            seen.add(key)
            unique.append(qa)
    return unique

# Q&A 생성 툴
def get_qa(context: str) -> Dict:
    try:
        total_needed = 300
        batch_size = 100
        max_batches = 100

        all_qa: List[Dict[str, str]] = []

        for i in range(max_batches):
            prompt = generate_qa_prompt(context, i, batch_size)
            response = qa_generator_agent.run(prompt)  # 🔥 핵심 수정!
            batch_qa = parse_jsonl(response)
            all_qa.extend(batch_qa)
            all_qa = remove_duplicates(all_qa)

            if len(all_qa) >= total_needed:
                break

        final_qa = all_qa[:total_needed]
        jsonl_str = "\n".join(json.dumps(qa, ensure_ascii=False) for qa in final_qa)
        return {"status": "success", "report": jsonl_str}

    except Exception as e:
        return {"status": "error", "error_message": str(e)}


# 하위 LLM 호출용 에이전트 (직접 실행 전용)
qa_generator_agent = Agent(
    name="qa_gen",
    model="gemini-2.0-flash",
    description="Generates batches of Q&A pairs based on a sentence.",
    instruction="Generate non-redundant Q&A pairs in JSONL format from a sentence. Avoid duplication in questions and answers.",
)

# 실제 호출 가능한 상위 Agent
root_agent = Agent(
    name="qa_agent",
    model="gemini-2.0-flash",
    description="Expert in parsing sentences and creating unique Q&A pairs as JSONL.",
    instruction="You are a professional assistant that generates large numbers of diverse and unique question-answer pairs.",
    tools=[get_qa],
)
  • 질문과 대답의 품질은 뛰어난데... 너무 조금 나오네...
profile
인공지능이라는 옷을 입었습니다. 뭔가 멋지면서도 잘 맞습니다.

0개의 댓글