Quiz 생성 Feedback LLM API 제작

TIL Day 104

By polaris0208

LLM을 이용하여 퀴즈 결과에 대해 피드백하는 API 제작

LLM

  • 퀴즈 성적에 대한 피드백 부여
  • 퀴즈 문제 및 사용자 답변을 분석하여 피드백 부여
    • 어떤 내용을 알고 모르는지 분석 후 결과 제공

Prompt

    """
    must use **korean**
    Create feedback about user result.
    include feedback about score, result
    **return only json**
    **remove any space
    **do not include```json```**

    <quiz title>
    {title}
    </quiz title>

    <quiz description>
    {description}
    </quiz description>

    <result>
    {result}
    </result>

    <questions>
    {questions}
    </questions>

    <example>
    "total_feedback" : ""
    </example>
    """

Langchain

  • 퀴즈 결과에 대한 내용을 담은 json 파일을 입력값으로 받음
def total_feedback_chain():
    prompt = PromptTemplate.from_template(
    ...
    )

    llm = ChatOpenAI(model="gpt-4o-mini", api_key=openai.api_key, temperature=0.3)
    chain = (
        RunnableMap(
            {
                "title": itemgetter("title"),
                "description": itemgetter("description"),
                "result": itemgetter("result"),
                "questions": itemgetter("questions"),
            }
        )
        | prompt
        | llm
        | StrOutputParser()
    )
    return chain

API

  • DB에서 퀴즈 결과(채점결과) 호출
  • 문제 및 사용자 답변 호출
  • 결과를 LLM에 전달하고 답변을 API 응답에 전달
class TotalFeedabckView(APIView):
    def get(self, request, quiz_id):
        try:
            feedback_input = {}
            questions = []
            quiz_result = QuizResult.objects.prefetch_related("result_questions").get(
                id=quiz_id
            )
            result_questions = quiz_result.result_questions.all()

            for result_question in result_questions:
                data = {
                    "question": result_question.question,
                    "choice": result_question.choice,
                    "user_answer": result_question.answer,
                }
                questions.append(data)

            feedback_input["title"] = quiz_result.title
            feedback_input["description"] = quiz_result.description
            feedback_input["result"] = quiz_result.result
            feedback_input["questions"] = questions
            
            chain = llm.total_feedback_chain()
            feedback = json.loads(chain.invoke(feedback_input))

            return Response(
                feedback,
                status=status.HTTP_200_OK,
            )
        except QuizResult.DoesNotExist:
            return Response(
                {"error": "Quiz result not found"}, status=status.HTTP_404_NOT_FOUND
            )
Tags: TIL LLM Tools