e329d3398a
Add FastAPI/React app with Docker deployment, Ubuntu one-click install, and docs for junior/senior high score tracking and mistake bank. Co-authored-by: Cursor <cursoragent@cursor.com>
48 lines
1.6 KiB
Python
48 lines
1.6 KiB
Python
import httpx
|
|
|
|
from app.core.config import settings
|
|
from app.services.school_level import school_level_label
|
|
|
|
QUESTION_PROMPT = """你是一位{stage}老师。以下是从试卷 OCR 识别出的文字,可能含有噪声。
|
|
科目:{subject}
|
|
请整理出清晰的题目内容(保留题号、选项、公式),只输出题目正文,不要解释。
|
|
|
|
OCR 原文:
|
|
{ocr_text}
|
|
"""
|
|
|
|
SOLUTION_PROMPT = """你是一位耐心的{stage}{subject}老师。请为以下题目给出详细解法。
|
|
要求:步骤清晰,语言适合{stage}学生理解,指出考点和易错点。
|
|
|
|
题目:
|
|
{question_text}
|
|
"""
|
|
|
|
|
|
async def ollama_generate(prompt: str) -> str:
|
|
url = f"{settings.OLLAMA_BASE_URL.rstrip('/')}/api/generate"
|
|
payload = {
|
|
"model": settings.OLLAMA_MODEL,
|
|
"prompt": prompt,
|
|
"stream": False,
|
|
}
|
|
async with httpx.AsyncClient(timeout=120.0) as client:
|
|
response = await client.post(url, json=payload)
|
|
response.raise_for_status()
|
|
data = response.json()
|
|
return (data.get("response") or "").strip()
|
|
|
|
|
|
async def format_question(subject: str, ocr_text: str, school_level=None) -> str:
|
|
stage = school_level_label(school_level)
|
|
prompt = QUESTION_PROMPT.format(stage=stage, subject=subject, ocr_text=ocr_text)
|
|
return await ollama_generate(prompt)
|
|
|
|
|
|
async def generate_solution(subject: str, question_text: str, school_level=None) -> str:
|
|
stage = school_level_label(school_level)
|
|
prompt = SOLUTION_PROMPT.format(
|
|
stage=stage, subject=subject, question_text=question_text
|
|
)
|
|
return await ollama_generate(prompt)
|