Shanraq.org Shanraq.org
IT

Үлкен тілдік үлгісіз ЖИ: өз үлгімізді жасаймыз 20-сабақ (барлығы 30)

20-сабақ. Қайшылық пен мерзім өткенде тоқтаймыз

Тақтада бір үйірме туралы екі түрлі хабарландыру болса, алғашқысын кездейсоқ таңдау дұрыс емес. Хабарландыру мерзімі өтсе, ескі кестені бүгінгі деп айтуға да болмайды. Сұрақты талдауды, іздеуді және осы екі тексеруді біріктіреміз.

Бұл не үшін керек?

Тақтада бір үйірме туралы екі түрлі хабарландыру болса, алғашқысын кездейсоқ таңдау дұрыс емес. Хабарландыру мерзімі өтсе, ескі кестені бүгінгі деп айтуға да болмайды. Сұрақты талдауды, іздеуді және осы екі тексеруді біріктіреміз.

Іске қоспас бұрын

facts.json ішінде valid_until пайда болды: жазба жарамды болатын соңғы күн, сол күннің өзі де кіреді. Бұрынғы жыл-ай-күн пішімін қолданамыз. from datetime import date Python-ның дайын күн құралын алады. 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 шектегі күн өткеннен кейін ғана дұрыс болады. Содан соң жауап пен дереккөзді шығарамыз. checked_on бұрынғы тексеруді, valid_until жарамдылық шегін білдіреді. Бастапқы парақтағы қате мен сөздіктің шектеулілігі әлі де ықтимал; үлгі толық ақиқатқа кепілдік бермейді.

Тірек сызба

Сұрақ → дәл екі кілт → 0/1/көп жазба → жалғыз жазбаның мерзімі → дереккөзі бар жауап не түсінікті тоқтау.

20-сабақтың тірек сызбасы

Еске түсіріп, тексеріңіз

Шахмат қашан?, кейін Сурет қайда? деп тексеріңіз. Бірінші сұрақтың үлгі жауабы: шахмат үйірмесінің уақыты: бейсенбі, 15:00 және дереккөз жолы. Екіншісінің жауабы: білмеймін: дерек жоқ. Қайшылықты тексеру үшін шахмат / уақыт бойынша басқа мәні бар екінші карточка қосыңыз: тоқта: бірнеше дерек табылды. Мерзімді тексеру үшін кодтағы оқу күнін 2027-01-01 деп өзгертіңіз: білмеймін: дерек ескірген шығуы керек. Жиі қате: қайшылықтың себебін анықтамай, ескі карточканы өшіру.

4-меже: жауап тек карточкадан

Төрт нәтижені көрсетіңіз: бір жарамды карточка, карточка жоқ, кілті бірдей екі карточка және мерзімі өткен бір карточка. Әрқайсысында жауапқа рұқсат берген не оны тоқтатқан алғашқы тексеруді атаңыз. Нақты жауап тек бірінші жағдайда шығып, дереккөзді көрсетсе, межеден өттіңіз. Қателессеңіз, карточка саны → мерзім → жауап ретін қалпына келтіріп, қайталаңыз.

Мәтінде қате не теру қатесі кездессе, бізге айтыңыз

Пікірлер (0)

Әзірге пікір жоқ. Бірінші болыңыз.