Python: деректен өз есебіңізге дейін 51-сабақ (барлығы 56)
Модель өз дерегімізде: әр санды салыстыру
Python курсының елуінші сабағы. Модельге тұрақты дереккөз идентификаторлары бар шағын кесте береміз, құрылымды тұжырым қабылдап, әр санды бастапқы жазбамен салыстырамыз. Модель сөзбен атауды ұсынады, ал тексерілген мәнді, бірлікті және жылды қорытынды мәтінге код қояды.
Бұл не үшін керек
49-сабақта JSON құрылымын тексердік. {"value": 17.9} жауабы схемаға толық сай болып, бәрібір ойдан шығарылуы мүмкін. Схема санның түрін біледі, біздің кестені білмейді.
Сондықтан әр фактіге тұрақты source_id береміз. Модель оны мәнмен бірге қайтарады. Код бастапқы жолды тауып, мәнді, жылды және бірлікті салыстырады. Бір өріс сәйкес келмесе, тұжырым жарияланбайды.
Модельге дайын сөйлем ішінде цифр жаздырмау одан да сенімді. Ол тек сөздік атауды береді, ал бағдарлама тексерілген сандарды пішімдейді.
Бірден толығымен
grounded.py файлы алдыңғы сабақтағы келісімді жалғастырады.
"""50-сабақ: модель жауабын бастапқы дерекпен салыстыру."""
import json
from decimal import Decimal
from jsonschema import Draft202012Validator
SOURCES = {
"inflation-kz-2025": {
"year": 2025,
"value": Decimal("11.4"),
"unit": "percent",
}
}
CLAIM_SCHEMA = {
"type": "object",
"properties": {
"source_id": {"type": "string"},
"year": {"type": "integer"},
"value": {"type": "number"},
"unit": {"type": "string"},
"label": {"type": "string", "minLength": 1},
},
"required": ["source_id", "year", "value", "unit", "label"],
"additionalProperties": False,
}
VALIDATOR = Draft202012Validator(CLAIM_SCHEMA)
def verify_claim(raw):
"""Құрылымды, дереккөзді және әр сандық өрісті тексеру."""
claim = json.loads(raw, parse_float=Decimal)
VALIDATOR.validate(claim)
source = SOURCES.get(claim["source_id"])
if source is None:
raise ValueError("белгісіз дереккөз")
for field in ("year", "value", "unit"):
if claim[field] != source[field]:
raise ValueError(f"{field} дереккөзге сәйкес емес")
if any(char.isdigit() for char in claim["label"]):
raise ValueError("модель атауға сан қосты")
return claim, source
raw = json.dumps({
"source_id": "inflation-kz-2025",
"year": 2025,
"value": 11.4,
"unit": "percent",
"label": "Қазақстандағы инфляция",
})
claim, source = verify_claim(raw)
text = f'{claim["label"]}: {source["value"]} % ({source["year"]}).'
print("дереккөз:", claim["source_id"])
print("сан салыстырылды:", claim["value"] == source["value"])
print("бірлік салыстырылды:", claim["unit"] == source["unit"])
print("қорытынды:", text)
Шығыс:
дереккөз: inflation-kz-2025
сан салыстырылды: True
бірлік салыстырылды: True
қорытынды: Қазақстандағы инфляция: 11.4 % (2025).
Дерекке тұрақты мекенжай беру
source_id — бүкіл сайтқа сілтеме де, сұрыптаудан кейін өзгеретін жол нөмірі де емес. Бұл бір жазбаның тұрақты идентификаторы. Ол деректер жиынының нұсқасына, бақылау күніне және өлшем бірлігіне апаруға тиіс.
Модельге міндетке қажет жолдарды ғана беріңіз. Бұл шуды, жад шығынын және қате мән таңдау мүмкіндігін азайтады. Сұраныспен бірге жиын нұсқасын не оның цифрлық таңбасын сақтаңыз.
Decimal не үшін керек
JSON бөлшекті әдетте float етеді. Екілік бөлшек ақша мен дәл салыстыруға қолайсыз. json.loads(..., parse_float=Decimal) ішіндегі 11.4 мәнін Decimal("11.4") мәнімен дәл салыстырылатын ондық сан етіп оқиды.
Бұл санды шын етпейді, тек ұсыну қатесін жояды. Дереккөзбен сәйкестік оның қайдан алынғанын дәлелдейді.
Сөз бен санның міндеті бөлек
Модель label="Инфляция 15 пайызға өсті" десе, мәтінге жаңа сан жасырды. Әдейі қатаң isdigit() ережесі мұндай атауды қабылдамайды. Модель көрсеткішті атайды, код мәнді шығарады.
Цифрды тексеру редакциялық мәтінге жеткіліксіз: «инфляция төмендеді» деген қате сөйлемде сан жоқ. Сондықтан бұл сабақта тек бейтарап атауға рұқсат береміз. Өсу не төмендеуді бағдарлама екі тексерілген мәннен өзі есептеуі керек.
Үндемей түзетпеңіз
Модельдің қате мәнін дұрысына білдірмей алмастырмаңыз. Бас тарту себебін сақтап, жаңа жауап сұраңыз немесе адамға жіберіңіз. Әйтпесе журналдағы жауап пен жарияланған мәтін екі бөлек болады.
Негізгі себептер: белгісіз source_id; мән, жыл не бірлік сәйкес емес; атауда цифр бар; JSON құрылымы қате.
Сабақ картасы
Опорлық сигналды қалпына келтіріңіз: дереккөз → source_id → схема → өрістерді салыстыру → санды код қояды.
Өз сөзіңізбен айтыңыз
- Дұрыс JSON Schema фактіні тексеруге неге жеткіліксіз?
- Жауапта мән болса да,
source_idне үшін керек? - Қорытынды санды неге модель емес, код жазады?
- Мәні сәйкес келмеген жауаппен не істеу керек?
Жаттығу
1. Болжаңыз. Кәдімгі float нәтижелері тең бе?
print(0.1 + 0.2 == 0.3)
2. Бос орынды толтырыңыз. JSON бөлшегін Decimal ретінде оқыңыз.
claim = json.loads(raw, ...=Decimal)
3. Жөндеңіз. Код дереккөзді таппай, модель санына сенеді.
claim = json.loads(raw)
text = f'Инфляция: {claim["value"]} %'
Тапсырма
Міндетті. accept_many(raw_items, sources) функциясын жазыңыз. source_id табылып, year, value, unit толық сәйкес келген тұжырымды ғана қабылдаңыз; атауда цифр болмасын. Қабылданған идентификаторлар мен себеп бойынша бас тарту санын қайтарыңыз.
қабылданды: ['inflation-kz-2025']
белгісіз дереккөз: 1
мән сәйкес емес: 1
атауда сан бар: 1
Өз дерегіңізбен. Жиынтықтың екі жолына тұрақты идентификатор беріп, модельден бейтарап атау сұраңыз. Бір қате жауап қосып, оның қабылданбағанын көрсетіңіз.
Қалауыңызша. Дереккөзге dataset_version және файлдың SHA-256 таңбасын қосыңыз. Басқа нұсқаға сілтеген жауаптан бас тартыңыз.
Бұл жобаға қайда кіреді
Модель енді санға атау ұсына алады, бірақ санның өзін байқатпай ауыстыра алмайды. 51-сабақта қиынырақ шекараны тексереміз: деректе жоқ, бірақ сенімді естілетін себептер.
Жауаптар
Жауаптарды көрсету
- Схема пішін мен түрді тексереді, біздің кестемен салыстырмайды.
- Ол салыстырылатын нақты жазба мен нұсқаны көрсетеді.
- Жарияланымға модель терген көшірме емес, сенімді дереккөз мәні түседі.
- Қабылдамау, нақты себебін жазу және келесі кезеңге жібермеу керек.
False
- Аргумент —
parse_float.
import json
from decimal import Decimal
raw = '{"value": 11.4}'
claim = json.loads(raw, parse_float=Decimal)
print(claim["value"] == Decimal("11.4"))
True
- Дереккөзді тауып, өрісті салыстырып, сол мәнді шығарыңыз.
claim = {"source_id": "cpi-2025", "value": 11.4}
sources = {"cpi-2025": {"value": 11.4}}
source = sources[claim["source_id"]]
assert claim["value"] == source["value"]
print(f'Инфляция: {source["value"]} %')
Инфляция: 11.4 %
Дереккөздер
- Python
json—parse_floatжәне JSON талдау. - Python
decimal— дәл ондық арифметика. - OWASP: LLM жауабын тексеру — жауапты басқа бөлікке берер алдындағы тексеру.
Пікірлер (0)
Пікір қалдыру үшін кіріңіз →
Әзірге пікір жоқ. Бірінші болыңыз.