Shanraq.org Shanraq.org
IT

ИИ без LLM: создаем свою модель ИИ Урок 20 из 25

Урок 20. Останавливаемся при конфликте и истёкшем сроке

Если на доске два разных объявления об одном занятии, выбирать первое наугад нельзя. Если срок объявления истёк, прошлое расписание тоже нельзя выдавать за сегодняшнее. Соберём вопрос, поиск и эти два предохранителя.

Текст переведён с помощью ИИ.

Зачем это нужно

Если на доске два разных объявления об одном занятии, выбирать первое наугад нельзя. Если срок объявления истёк, прошлое расписание тоже нельзя выдавать за сегодняшнее. Соберём вопрос, поиск и эти два предохранителя.

Перед запуском

В facts.json появилось valid_until — последняя допустимая календарная дата записи, включительно. Формат год-месяц-день прежний. from datetime import date берёт из стандартной библиотеки тип календарной даты. date.today() читает дату компьютера; date.fromisoformat(...) превращает текст даты в дату для сравнения. Компьютер должен показывать правильный день. != значит «не равно», 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.today()
        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/много записей → срок одной записи → ответ с источником или понятная остановка.

Вспомните и проверьте

Запустите Шахмат қашан?, затем Сурет қайда?. До 31 декабря 2026 года включительно эталон первого ответа: шахмат үйірмесінің уақыты: бейсенбі, 15:00 и строка источника; позже — білмеймін: дерек ескірген. Второй ответ всегда білмеймін: дерек жоқ. Для проверки конфликта добавьте вторую карточку шахмат / уақыт с иным значением: ожидается тоқта: бірнеше дерек табылды. Для проверки срока поставьте valid_until на прошедший день. Частая ошибка: удалить старую запись без выяснения причины конфликта.

Если вы нашли ошибку или опечатку в тексте статьи, то сообщите нам об этом

Комментарии (0)

Пока нет комментариев. Будьте первым.