AI без LLM: создаем свою модель ИИ Урок 20 из 30
Урок 20. Останавливаемся при конфликте и истёкшем сроке
Если на доске два разных объявления об одном занятии, выбирать первое наугад нельзя. Если срок объявления истёк, прошлое расписание тоже нельзя выдавать за сегодняшнее. Соберём вопрос, поиск и эти два предохранителя.
Зачем это нужно
Если на доске два разных объявления об одном занятии, выбирать первое наугад нельзя. Если срок объявления истёк, прошлое расписание тоже нельзя выдавать за сегодняшнее. Соберём вопрос, поиск и эти два предохранителя.
Перед запуском
В facts.json появилось valid_until — последняя допустимая календарная дата записи, включительно. Формат год-месяц-день прежний. from datetime import date берёт из стандартной библиотеки тип календарной даты. date.fromisoformat(...) превращает текст даты в дату для сравнения. В упражнении закрепляем дату 2026-09-24, чтобы результат оставался одинаковым в любой год; итоговая программа позже получит дату от пользователя. != значит «не равно», or — достаточно истинности одного из двух условий.
[
{"club": "шахмат", "kind": "уақыт", "value": "бейсенбі, 15:00", "source": "club-sheet-01", "checked_on": "2026-09-01", "valid_until": "2026-12-31"},
{"club": "шахмат", "kind": "орын", "value": "203-бөлме", "source": "club-sheet-01", "checked_on": "2026-09-01", "valid_until": "2026-12-31"}
]
Из корня проекта перейдите в папку шага и запустите программу:
cd course/kazakh-ai/step-20
python3 model.py
В Windows вместо последней команды выполните py model.py.
import json
from datetime import date
with open("facts.json", encoding="utf-8") as file:
facts = json.load(file)
question = input("Сұрақ: ").lower().replace("?", "").replace(",", "")
words = question.split()
entities = []
intents = []
for word in words:
if word in ["шахмат", "сурет"]:
entities.append(word)
if word == "қашан":
intents.append("уақыт")
if word == "қайда":
intents.append("орын")
if len(entities) != 1 or len(intents) != 1:
print("нақтылаңыз: бір үйірме және бір сұрақ түрі керек")
else:
club = entities[0]
kind = intents[0]
matches = []
for fact in facts:
if fact["club"] == club and fact["kind"] == kind:
matches.append(fact)
if len(matches) == 0:
print("білмеймін: дерек жоқ")
elif len(matches) > 1:
print("тоқта: бірнеше дерек табылды")
else:
fact = matches[0]
today = date.fromisoformat("2026-09-24")
until = date.fromisoformat(fact["valid_until"])
if today > until:
print("білмеймін: дерек ескірген")
elif kind == "уақыт":
print(fact["club"], "үйірмесінің уақыты:", fact["value"])
print("Дереккөз:", fact["source"], "| тексерілген күні:", fact["checked_on"])
else:
print(fact["club"], "үйірмесінің орны:", fact["value"])
print("Дереккөз:", fact["source"], "| тексерілген күні:", fact["checked_on"])
Что делает программа
Сначала код урока 15 получает из вопроса ровно один кружок и один вид сведений. Затем мы просматриваем весь каталог. Ноль записей означает нехватку данных; две и больше означают конфликт или дубликат, который человек должен проверить. Только у единственной карточки сравниваем дату: today > until истинно начиная со следующего дня после valid_until. Лишь затем печатаем ответ и источник. checked_on сообщает историю проверки, valid_until задаёт срок действия; это разные даты. Ошибочный исходный лист и неполный словарь всё ещё возможны — модель не гарантирует абсолютную истинность.
Опорная карта
Вопрос → ровно два ключа → 0/1/много записей → срок одной записи → ответ с источником или понятная остановка.
Вспомните и проверьте
Запустите Шахмат қашан?, затем Сурет қайда?. Эталон первого ответа: шахмат үйірмесінің уақыты: бейсенбі, 15:00 и строка источника. Второй ответ: білмеймін: дерек жоқ. Для проверки конфликта добавьте вторую карточку шахмат / уақыт с иным значением: ожидается тоқта: бірнеше дерек табылды. Для проверки срока замените учебную дату в коде на 2027-01-01: ожидается білмеймін: дерек ескірген. Частая ошибка: удалить старую запись без выяснения причины конфликта.
Рубеж 4: ответ только по карточке
Покажите четыре исхода: одна действующая карточка, ни одной карточки, две совпавшие по ключу карточки и одна просроченная. Для каждого укажите первую проверку, которая разрешает ответ или останавливает его. Рубеж пройден, если фактический ответ появляется только в первом случае и содержит источник. После ошибки восстановите порядок число карточек → срок → ответ и повторите.
Если вы нашли ошибку или опечатку в тексте статьи, то сообщите нам об этом
Комментарии (0)
Войдите, чтобы оставить комментарий →
Пока нет комментариев. Будьте первым.