import google.generativeai as genai 
import json

genai.configure(api_key="AIzaSyDszjDvADxJQ3UPBHMNlguWw8axL-IuCrM")

model = genai.GenerativeModel('gemini-pro')

keyword = "키워드"

prompt = f"""다음 조건에 맞춰 "{keyword}" 에 대해 퀴즈를 JSON 형식으로 5개 출제하시오.
- 주어진 주제에 대해 5개 보기가 있는 객관식 문제 5개 생성
- 문제와 보기는 한국어로 작성
- 정답은 한 개만 있고, 보기 앞에 숫자는 없어야 함
- JSON 형태로 문제, 보기 5개(리스트), 정답, 해설을 생성. key 이름은 각각 
question, options, answer, comment라고 하기
- 출력은 "["부터 시작"""

response = model.generate_content(prompt)

# 문제 생성(json 형식을 파이썬 개체로)

questions = json.loads(response.text)

# 퀴즈 풀기

score = 0

for idx, question in enumerate(questions, start=1): # 1번부터 문제 출력
    print(f"Questions {idx}: {question['question']}")
    print("Options: ")
    
    for i, option in enumerate(question['options'], start=1): # 선택지 출력 
        print(f"{i}. {option}")
    
    user_answer = input("Your answer (1-5): ")
    user_answer_index = int(user_answer) - 1

    if question['options'][user_answer_index] == question['answer']: # 사용자가 선택한 선택지가 정답지와 같으면
        print("Correct!") # Correct
        print('')
        score += 1
    else: # 다르면 
        print("Wrong answer") # Wrong
        print('')
        print(f"정답: {question['answer']}")
        print(f"풀이: {question['comment']}")
    
    print('')

print("당신의 점수는", score, "점 입니다.")

 

광합성이라는 키워드를 넣으면 다음과 같은 JSON 파일이 나온다.
(실행할 때마다 내용은 조금씩 달라짐)

'''
<생성된 questions json 파일>
[{'question': '광합성을 하는 유기체로 다음 중 올바른 것은?', 
'options': ['식물', '동물', '미생물', '버섯', '박테리아'], 
'answer': '식물', 
'comment': '광합성은 식물의 녹색 엽록체에서 일어나는 과정입니다.'}, 
{'question': '광합성 반응식에서 소비되는 물질로 다음 중 올바른 것은?', 
'options': ['산소', '이산화탄소', '물', '글루코스', '질소'], 
'answer': '물', 
'comment': '광합성은 물 분자를 분해하여 산소를 방출하는 과정입니다.'}, 
{'question': '광합성에 필요한 원소로 다음 중 올바른 것은?', 
'options': ['탄소', '수소', '질소', '마그네슘', '아연'], 
'answer': '마그네슘', 
'comment': '마그네슘은 엽록체에서 엽록소의 중심 이온으로 역할을 합니다.'}]
'''

 
새롭게 배운 점
import json 으로 python에서 json 파일에 접근할 수 있는데
무쟈게 편리하다 세상에
 
데이터를 카테고리화하고 싶을 때가 많은데 
C에서 사용하는 구조체를 파이썬에서 구현하기 애매해서 고민이었다
그래서 친구 과제 도와줄 때 그냥 class 사용했었는데
 
사용자가 실시간으로 입력하는 데이터가 아닌 정적인 데이터를 카테고리화 하고 싶으면
그냥 json 형태로 주어지는 것도 괜찮은 방법인 것 같다
 
f string도 뭔가 복잡해 보여서 잘 안썼는데
한번 쓰니까 와ㅋㅋㅋㅋ 이렇게 편할수가
일명 pythonic 한 프로그래밍...완전 직관적이고 편리하다
 
프로그램 잘 돌아가긴 하는데 퀴즈 생성에 가끔 오류가 있다 
우리나라 국화가 뭐냐는 질문에 option 중 무궁화가 없다던가..
문제에 따라 풀이가 생성되기도 하고 생성되지 않기도 함
그냥 언어모델 공통의 오류인건가...
 
이미 만들어진 모델을 쓰는거다보니까 모델을 불러올 때 자체의 오류는 어케 해결해야 하는 건지
고민이 된당. 
지금 말러팔삼 님 LLM 강의 보고 있는데
이분 말고는 우리나라에서 google ai모델 사용해서 실습하는 분이
....없나?
쓰기 진짜 편리한데 왜지?
암튼 더 공부해보고 돌아오겠슴. 



뭔가 조회수가 생겨서 혹시나 문제생길까봐 코드 출처 달음
https://youtu.be/guEazrQS_So?si=7sRWgc9UsIHgdKrc

진짜 넘 좋은 강의에여. 강추강추
트위터에서 팔로우하다가 보게됏는데 실습하기 매우 편리하고 재밌습니당 ^.^

'Coding > Python' 카테고리의 다른 글

(야매)유전 알고리즘  (0) 2024.05.07
import random
import string

#비밀번호 생성 
def generation_pass(length):
    password = []
    password.extend(random.sample(string.digits, k = length))
    return password

#1세대 생성 
def test_generation(count):
    parent_generation = [0]*count
    global length
    for i in range(count):
        length = random.randint(3, 6)
        password = ''.join(random.sample(string.digits, k = length))
        parent_generation[i] = password
    return parent_generation

#적합도 함수 
def fitness(target, parent_generation):
    score = [0]*count
    #print('1세대:', parent_generation)
    for i in range(len(parent_generation)):
        if len(target) == len(parent_generation[i]):
            #리스트 길이가 같으면 기본점수 2점 
            score[i] = int(score[i]) + 2
            #리스트 길이가 같은 애들에 대하여 
            for j in range(len(target)):
                if target[j] == parent_generation[i][j]:
                    score[i] = int(score[i]) + 7
                else:
                    for k in range(len(target)):
                        if target[j] == parent_generation[i][k]:
                            score[i] = int(score[i]) + 4
        else:
            score
    return score

#고득점 후보 골라내기 
def high_score(score, parent_generation):
    High = []
    for i in range(len(score)):
        if score[i] == max(score):
            High.append(parent_generation[i])
    return High
        
#부모세대 선택_룰렛휠
def select_survivors(fitness, sum_fit, parent_generation):
    selected_generation = []
    probability = [0]*count
    
    for i in range(count):
        probability[i] = round(fitness[i] + 0.1 / sum_fit, 3)
    #생존확률이 높은 유전자를 살린다 
    for i in range(count):
        x = random.uniform(0, 0.1)
        if probability[i] >= x:
            selected_generation.append(parent_generation[i])
    #운이 좋은 유전자를 20개 살린다 
    lucky_survivors = random.sample(parent_generation, k = 10)
    for I in lucky_survivors:
        selected_generation.append(I)
    
    random.shuffle(selected_generation)
    return selected_generation

#살아남은 아이들로 다음세대 만들기
def selected_generation(surv_generation, parent_generation):
    child_generation = []
    #살아남은 아이들끼리 세번째 원소를 교환한다 
    for i in range(0, len(surv_generation)-1):
        changed = surv_generation[i]
        child_generation.append(changed.replace(surv_generation[i][2], surv_generation[i+1][2]))
    while len(child_generation) < len(parent_generation):
        #1세대에서 임의로 불러와서 부족한 수를 채운다  
        child_generation.append(test_generation(count)[random.randint(0, count-1)])
    random.shuffle(child_generation)
    return child_generation

#성능 향상을 위한 돌연변이 생성
def mutation(child_generation):
    new_generation = []
    for i in range(len(child_generation)):
        change = child_generation[i]
        if random.random() * 100 < 10:
            new_generation.append(change.replace(child_generation[i][0], chr(random.randint(0, 9))))
    return new_generation

generation = 100
count = 300
target = '1234'

print('비밀번호:', target)

for g in range(generation):
    gene_set = test_generation(count)
    Fitness = fitness(target, gene_set)
    Selected = select_survivors(Fitness, sum(Fitness), gene_set)
    Next_generation = selected_generation(Selected, gene_set)
    New_generation = mutation(Next_generation)
    High_score = high_score(Fitness, gene_set)
    for i in range(len(High_score)):
        if High_score[i] == target:
            print('정답:', High_score[i])
            break
    print('%s세대-----------------------------------------' %(g+1))
    print('정답 후보 유전자:', High_score)
    print('최대 적합도:', max(Fitness))
    print('적합도 총합:', sum(Fitness))
    print('')

 

지금 보면 변수 이름도 너무 길고 줄바꿈도 빽빽해서 눈에 하나도 안 들어오는 최악의 코드인데

코드 짤때 너무 재밌었다

내가 좋아하는 내 코드ㅋㅋㅋ

다시 리메이크 꼭 해봐야지

'Coding > Python' 카테고리의 다른 글

google-generativeai 언어모델 실습(퀴즈 생성)  (0) 2024.07.15

+ Recent posts