0.0.2
openAI requests for categories and questions
This commit is contained in:
0
GPTgeneratorAPI/__init__.py
Normal file
0
GPTgeneratorAPI/__init__.py
Normal file
3
GPTgeneratorAPI/admin.py
Normal file
3
GPTgeneratorAPI/admin.py
Normal file
@@ -0,0 +1,3 @@
|
||||
from django.contrib import admin
|
||||
|
||||
# Register your models here.
|
||||
6
GPTgeneratorAPI/apps.py
Normal file
6
GPTgeneratorAPI/apps.py
Normal file
@@ -0,0 +1,6 @@
|
||||
from django.apps import AppConfig
|
||||
|
||||
|
||||
class GptgeneratorapiConfig(AppConfig):
|
||||
default_auto_field = 'django.db.models.BigAutoField'
|
||||
name = 'GPTgeneratorAPI'
|
||||
0
GPTgeneratorAPI/migrations/__init__.py
Normal file
0
GPTgeneratorAPI/migrations/__init__.py
Normal file
3
GPTgeneratorAPI/models.py
Normal file
3
GPTgeneratorAPI/models.py
Normal file
@@ -0,0 +1,3 @@
|
||||
from django.db import models
|
||||
|
||||
# Create your models here.
|
||||
3
GPTgeneratorAPI/tests.py
Normal file
3
GPTgeneratorAPI/tests.py
Normal file
@@ -0,0 +1,3 @@
|
||||
from django.test import TestCase
|
||||
|
||||
# Create your tests here.
|
||||
195
GPTgeneratorAPI/views.py
Normal file
195
GPTgeneratorAPI/views.py
Normal file
@@ -0,0 +1,195 @@
|
||||
import time
|
||||
|
||||
from django.shortcuts import render
|
||||
from BaseModels.openAI.openAI_funcs import send_request
|
||||
|
||||
def get_questions_for_category(category, quest_count, level):
|
||||
# if level == 1:
|
||||
name_level = 'простой'
|
||||
if level == 2:
|
||||
name_level = 'средний'
|
||||
if level == 3:
|
||||
name_level = 'сложный'
|
||||
|
||||
|
||||
# msg = f'создай список (в одну строку, без нумерации) из {quest_count} вопросов уровня сложности "{name_level}" по 3 ответа на каждый из них по теме ' \
|
||||
# f'"{category.name}", ответы выведи в одну строку с разделителем "|", перед правильным ответом поставь символ "~", перед строкой каждого вопроса ставь символ "#"'
|
||||
msg = f'Cоздай список (в одну строку, без нумерации) из {quest_count} вопросов по теме "{category.name}", уровень сложности вопросов - "{name_level}", к каждому вопросу подготовь 2 неверных ответа и 1 верный (без нумерации, с разделителем "|"), перед верным ответом поставь символ "~", перед каждым вопросом поставь символ "#"'
|
||||
# print(msg)
|
||||
res = send_request(msg)
|
||||
return res
|
||||
|
||||
def get_questions():
|
||||
from QuestionsApp.models import Question, QuestionCategory, Answer
|
||||
|
||||
answers_count = 3
|
||||
request_questions_count = 2
|
||||
|
||||
from django.db.models import Count, F
|
||||
cats = QuestionCategory.objects.filter(enable=True).exclude(parent_category=None).annotate(
|
||||
quest_count=Count('rel_questions_for_category')
|
||||
).order_by('quest_count')
|
||||
for cat in cats:
|
||||
for level in [1, 2, 3]:
|
||||
res = get_questions_for_category(cat, request_questions_count, level)
|
||||
|
||||
data = res['choices'][0]['message']['content']
|
||||
print(data)
|
||||
res_quests = data.split('#')
|
||||
for res_quest in res_quests:
|
||||
if not res_quest:
|
||||
continue
|
||||
|
||||
check_right_answer_count = 0
|
||||
|
||||
try:
|
||||
|
||||
res_quest_struct_list = res_quest.split('|')
|
||||
if len(res_quest_struct_list) < 2:
|
||||
continue
|
||||
|
||||
quest_for_add = prepare_phrase(res_quest_struct_list[0])
|
||||
if not quest_for_add:
|
||||
continue
|
||||
|
||||
print(quest_for_add)
|
||||
|
||||
quest_dublicate = Question.objects.filter(name=quest_for_add).count()
|
||||
if quest_dublicate:
|
||||
msg = f'! - дубликат вопроса "{quest_for_add}" > пропускаем'
|
||||
print(msg)
|
||||
continue
|
||||
|
||||
quest_obj = Question.objects.create(
|
||||
name=quest_for_add,
|
||||
category=cat,
|
||||
game_level=level,
|
||||
)
|
||||
|
||||
answer_objs_list = []
|
||||
|
||||
answers_list = res_quest_struct_list[1:]#.split('|')
|
||||
|
||||
for answer in answers_list:
|
||||
if not answer:
|
||||
continue
|
||||
|
||||
right_answer = False
|
||||
|
||||
answer = answer.strip()
|
||||
if answer[0] == '~':
|
||||
right_answer = True
|
||||
check_right_answer_count += 1
|
||||
|
||||
answer_for_add = prepare_phrase(answer)
|
||||
if not answer_for_add:
|
||||
continue
|
||||
|
||||
answer_obj = Answer(
|
||||
name=answer_for_add,
|
||||
right_answer=right_answer,
|
||||
question=quest_obj
|
||||
)
|
||||
answer_objs_list.append(answer_obj)
|
||||
print(f' - {answer_for_add} > {right_answer}')
|
||||
|
||||
if len(answer_objs_list) != answers_count or check_right_answer_count != 1:
|
||||
Question.objects.filter(id=quest_obj.id).delete()
|
||||
msg = f'!!! - неверное количество ответов или правильных ответов'
|
||||
print(msg)
|
||||
continue
|
||||
|
||||
Answer.objects.bulk_create(answer_objs_list)
|
||||
|
||||
|
||||
except Exception as e:
|
||||
msg = f'!!! --- get_questions question {res_quest} > processed ERROR = {str(e)}'
|
||||
print(msg)
|
||||
|
||||
# максимум 3 запроса в минуту
|
||||
time.sleep(30)
|
||||
|
||||
return True
|
||||
|
||||
|
||||
def get_sub_categories_for_category(category):
|
||||
msg = f'создай 500 подтематик для тематики {category.name} и выведи с разделителем ^ в одну строку без нумерации'
|
||||
print(msg)
|
||||
res = send_request(msg)
|
||||
return res
|
||||
|
||||
def prepare_phrase(phrase):
|
||||
|
||||
try:
|
||||
name = phrase.replace('\n', '')
|
||||
while name and name[-1] in (',', '.', ':', ';', '-', ' '):
|
||||
name = name[:-1]
|
||||
|
||||
while name and name[0] in (',', '.', ':', ';', '-', ' ', '~'):
|
||||
name = name[1:]
|
||||
|
||||
if len(name) > 3 and name[1] == '.':
|
||||
name = name[2:]
|
||||
|
||||
if len(name) > 3 and name[1] == ' ':
|
||||
try:
|
||||
i = int(name[0])
|
||||
name = name[2:]
|
||||
except:
|
||||
pass
|
||||
|
||||
name = name[2:]
|
||||
|
||||
# убираем маркировку подпунктов
|
||||
if name and name[1] == ')':
|
||||
name = name[2:]
|
||||
|
||||
name = name.strip()
|
||||
except Exception as e:
|
||||
msg = f'prepare_phrase "{phrase}" error = {str(e)}'
|
||||
print(msg)
|
||||
name = ''
|
||||
|
||||
return name
|
||||
|
||||
|
||||
def get_subcategories():
|
||||
from QuestionsApp.models import QuestionCategory
|
||||
categories = QuestionCategory.objects.all()
|
||||
|
||||
cats_names_list = list(categories.values_list('name', flat=True))
|
||||
|
||||
|
||||
for cat in categories:
|
||||
sub_cats_objs = []
|
||||
|
||||
res = get_sub_categories_for_category(cat)
|
||||
|
||||
data = res['choices'][0]['message']['content']
|
||||
# data = data.replace('-', '')
|
||||
|
||||
sub_cats_list = data.split('^')
|
||||
for sub_cat in sub_cats_list:
|
||||
name = prepare_phrase(sub_cat)
|
||||
if not name:
|
||||
msg = f'! - {sub_cat} > проблема в строке, пропускаем'
|
||||
print(msg)
|
||||
continue
|
||||
|
||||
if name in cats_names_list:
|
||||
msg = f'! - {name} > пропускаем, дубликат'
|
||||
print(msg)
|
||||
continue
|
||||
|
||||
print(name)
|
||||
sub_cat_obj = QuestionCategory(
|
||||
name=name,
|
||||
parent_category=cat
|
||||
)
|
||||
sub_cats_objs.append(sub_cat_obj)
|
||||
cats_names_list.append(name)
|
||||
|
||||
QuestionCategory.objects.bulk_create(sub_cats_objs)
|
||||
# cat.parsed = True
|
||||
|
||||
return True
|
||||
Reference in New Issue
Block a user