Отлично. Ниже приведён пример кода (backend-логика) для реализации такого ассистента, а затем пример решения задачи с объяснениями. Так как параметры предмет и класс не указаны, код ориентирован на общий подход средней школы и на цель «Понять».
- Пример кода backend (Python)
import re
from typing import Optional
# Примечание: Для обработки изображений можно пользоваться pytesseract:
# from PIL import Image
# import pytesseract
# def extract_text_from_image(path: str) -> str:
# return pytesseract.image_to_string(Image.open(path))
class HomeworkSolver:
def __init__(self, problem_text: str,
goal: str = "Понять",
subject: Optional[str] = None,
klass: Optional[str] = None):
self.problem_text = problem_text
self.goal = goal or "Понять"
self.subject = subject
self.klass = klass
def _extract_text_from_problem(self) -> str:
# Здесь можно добавить логику OCR, если задача пришла как изображение.
# Пока problem_text предполагается строкой.
return self.problem_text
def _detect_linear_equation(self, text: str) -> Optional[str]:
"""
Попытка найти линейное уравнение вида a*x + b = c
Возвращает найденное выражение вида "2x + 3 = 7" или None
"""
# Поддерживаем простые случаи: 2x+3=7, 2*x+3=7, 2x=4, x/2+3=5 и т.д.
# Простейшая регулярка: что-то с x слева или справа, равенство
if "=" not in text:
return None
# Убираем пробелы для упрощения
s = text.replace(" ", "")
# Мы ищем что-то вроде: (число)?x(+-число)?=(число/число+x и т.д.))
# Примитивная попытка: оставить весь уравнение, чтобы решить далее
# Здесь просто вернём часть вокруг '='
return s.split("=")[0] + "=" + s.split("=")[1]
def _solve_linear_equation(self, eq: str) -> Optional[dict]:
"""
Пример простого решения линейного уравнения вида a*x + b = c.
Реализация ограниченная, чтобы быть надёжной для примера.
Возвращает словарь: { 'x': значение, 'steps': [list шагов] }
"""
# Пример упрощённой обработки: пытаемся распознать ax + b = c
# Приведём к простому случаю: ax = c - b, затем x = (c - b)/a
# Утилиты по перестановке
text = eq.replace(" ", "")
# Попытка распознавания a*x
m = re.match(r"(-?\d*)x([+-]\d+)?=(-?\d+)", text)
if m:
a_str, b_str, c_str = m.groups()
a = int(a_str) if a_str not in ("", "+", "-") else (1 if a_str in ("", "+") else -1)
b = int(b_str) if b_str else 0
c = int(c_str)
# x = (c - b) / a
x_val = (c - b) / a
steps = []
steps.append(f"Для уравнения {text}, рассмотрим левую часть: a*x + b = c.")
steps.append(f"Переставим свободный член: a*x = c - b.")
steps.append(f"Подставим значения: {a}*x = {c} - {b} = {c - b}.")
steps.append(f"Разделим обе стороны на коэффициент при x: x = ({c - b}) / {a} = {x_val}.")
return {"x": x_val, "steps": steps}
# Более сложные случаи можно расширять по мере необходимости
return None
def generate_explanation(self) -> str:
"""
Генерирует подробное объяснение (шаги решения) в зависимости от распознанной задачи.
Если задача не распознана как линейное уравнение, возвращает общую схему решения.
"""
problem = self._extract_text_from_problem()
# Простейшая попытка найти линейное уравнение
eq = self._detect_linear_equation(problem)
solution = ""
if eq:
solved = self._solve_linear_equation(eq)
if solved:
# Формируем вывод
solution_lines = []
solution_lines.append("Разбираем уравнение:")
solution_lines.append(eq)
solution_lines.extend([""] + solved["steps"])
solution_lines.append("")
solution_lines.append(f"Ответ: x = {solved['x']}")
solution = "\n".join(solution_lines)
return solution
# Если не распознано конкретное уравнение, даём общую схему для «понимания» задачи
general_steps = [
"Шаг 1. Прочитайте задачу внимательно и выпишите, что известно и что требуется найти.",
"Шаг 2. Определите тип задачи (алгебра, геометрия, арифметика и т.д.).",
"Шаг 3. Запишите данную формулировку в виде математических отношений (уравнение, неравенство, формула).",
"Шаг 4. Приложите правило/формулу и постепенно преобразуйте согласно логике задачи.",
"Шаг 5. Получите решение и проверьте его на корректность."
]
if self.goal.lower() == "понять":
explanation = "Общая инструкция для понимания задачи:\n" + "\n".join(general_steps)
else:
explanation = "Готово. Ниже приведено общее решение в виде шагов:\n" + "\n".join(general_steps)
return explanation
# Пример использования
if __name__ == "__main__":
# Пример входной задачи (для демонстрации)
problem_text = "Найдите x: 2x + 3 = 7"
solver = HomeworkSolver(problem_text, goal="Понять")
print(solver.generate_explanation())
- Как это работает и как адаптировать под параметры
Цель: "Понять" задаёт требование детального объяснения. Код возвращает подробные шаги по шагам решения.
Предмет и класс: если эти параметры заданы, можно адаптировать стиль:
- Для 8–9 класса: упрощать язык, приводить больше пояснений, избегать сложной символики без объяснения.
- Для старших классов: добавлять более короткие формулы и компактные шаги, но сохранять математическую точность.
Отсутствие параметров: если предмет и класс не указаны, код работает на общий подход средней школе, как в примере выше.
Задача как изображение: если задача приходит как изображение, добавьте OCR-подсистему:
- Установите pytesseract, PIL.
- В методе _extract_text_from_problem можно вызвать OCR и затем продолжить обработку текста так же, как выше.
Пример входной задачи и объяснения (для иллюстрации): Ввод: "Найдите x: 2x + 3 = 7" Вывод объяснения:
- Разбираем уравнение: 2x + 3 = 7
- Переставим свободный член: 2x = 7 - 3
- Вычисляем: 2x = 4
- Делим на 2: x = 4 / 2
- Ответ: x = 2
- Пример результата для заданной ученику задачи
- Ваш запрос: “Задача: покажи код в этому заднию”
- По умолчанию мы считаем цель Понять и используем общий подход средней школы.
- Пример вывода (для уравнения 2x + 3 = 7): Разбираем уравнение: 2x + 3 = 7 Шаг 1: Переставим свободный член: 2x = 7 - 3 Шаг 2: Вычислим: 2x = 4 Шаг 3: Разделим на 2: x = 4 / 2 = 2 Ответ: x = 2
Если хотите, могу адаптировать код под конкретный предмет/класс (например, добавить разбор геометрических задач, решений по сравнению функций, или задачи на проценты для 7–8 классов) или добавить обработку изображений с помощью OCR. Также могу привести другой пример задачи и подробное решение в формате, удобном для вашего учебного плана.
