-
Notifications
You must be signed in to change notification settings - Fork 0
/
app.py
96 lines (86 loc) · 3.83 KB
/
app.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
import nest_asyncio
import uvicorn
from fastapi import FastAPI, Request
from pydantic import BaseModel
from fastapi.responses import StreamingResponse
import openai
from fastapi.middleware.cors import CORSMiddleware
import json
# OpenAI API 키 설정
openai.api_key = OPENAI_API_KEY # 여기에 자신의 OpenAI API 키 입력
# FastAPI 앱 초기화
app = FastAPI()
app.add_middleware(
CORSMiddleware,
allow_origins=['*'],
allow_credentials=True,
allow_methods=['*'],
allow_headers=['*'],
)
# 입력 데이터 모델
class InputData(BaseModel):
context: str
input: str
# LLM 판별 시스템 프롬프트
CLASSIFICATION_PROMPT = """
You are an expert in identifying the intent of user queries based on a context and a question.
Categorize the question into one of the following categories:
1. performance: Questions related to analyzing academic performance and trends, and suggesting learning strategies.
2. summary: Questions requiring a summary opinion based on volunteer activities, creative activities, and detailed skills.
3. counseling: Questions requesting counseling plans or strategies for parent-student discussions.
4. recommendation: Questions recommending suitable academic majors or career paths based on student records.
5. unknown: For questions that do not fit into the above categories.
Respond with the category name only.
"""
# 각 작업의 시스템 프롬프트
TASK_PROMPTS = {
"performance": """
Context를 바탕으로 학생의 학업 성취도를 분석해 주세요:
- 과목별 성적이 상위 몇%에 해당하는지 분석해 주세요.
- 성적 추세(상승 또는 하락)를 판단해 주세요.
- 분석 결과를 바탕으로 학습 방안을 제시해 주세요.
답변은 반드시 한국어로 작성해 주세요.
""",
"summary": """
Context를 바탕으로 학생의 봉사활동, 창의적 체험활동, 세부능력 및 특기사항을 분석해 주세요:
- 학생의 학업 태도, 강점, 개선점을 포함한 종합 의견을 작성해 주세요.
- 종합 의견은 10문장 이내로 작성해 주세요.
- 답변은 반드시 한국어로 작성해 주세요.
""",
"counseling": """
Context를 바탕으로 학생 상담을 위한 계획과 방향성을 제시해 주세요:
- 학부모와의 상담 시 효과적인 소통 방안을 포함해 주세요.
답변은 반드시 한국어로 작성해 주세요.
""",
"recommendation": """
Context를 바탕으로 학생의 성적, 독서기록, 체험활동을 종합적으로 분석해 주세요:
- 학생에게 적합한 학과와 진로를 추천해 주세요.
- 추천 이유를 간단히 설명해 주세요.
답변은 반드시 한국어로 작성해 주세요.
"""
}
@app.post("/generate/")
async def answer_generate(data: InputData):
# 판별 단계
classification_response = openai.chat.completions.create(
model="gpt-4o-mini",
messages=[
{"role": "system", "content": CLASSIFICATION_PROMPT},
{"role": "user", "content": f"Context: {data.context}\nQuestion: {data.input}"}
]
)
category = classification_response.choices[0].message.content
# 알 수 없음 처리
if category == "unknown":
return {"message": "학업 성취도, 종합 의견 작성, 상담, 학과 추천에 관한 질문에만 답변할 수 있습니다! 궁금하신 사항이 있으면 다시 질문해주세요~"}
# 작업 수행 및 스트리밍 응답
task_prompt = TASK_PROMPTS[category]
response = openai.chat.completions.create(
model="gpt-4o-mini",
messages=[
{"role": "system", "content": task_prompt},
{"role": "user", "content": f"Context: {data.context}\nQuestion: {data.input}"}
]
)
result = response.choices[0].message.content
return result