Python: деректен өз есебіңізге дейін 49-сабақ (барлығы 56)
Промпт — код: параметрлер және қайталанымдылық
Python курсының қырық сегізінші сабағы. Модельге сұранысты кездейсоқ бір жолмен жазуды тоқтатамыз: рөлді, міндетті, деректі және шектеуді бөлеміз, temperature, seed пен жауап шегін бекітеміз, содан кейін бүкіл сұранысты нәтижемен бірге сақтаймыз. Бірдей сұраныс тексерілетін тәжірибеге айналады, бірақ мәтіннің байтқа дейін бірдей болуына уәде бермейді.
Бұл не үшін керек
Өткен сабақта бағдарлама алғашқы жергілікті жауапты алды. Сол сұрақты қайталағанда сөздер өзгеруі мүмкін. Модельді не оның нұсқасын ауыстырсаңыз, айырма одан да көп болады. Сұраныс чат терезесінде ғана қалса, бір аптадан кейін қорытындының неден шыққанын дәлелдей алмайсыз.
Бағдарламалауда конфигурация — бағдарламаның бір бөлігі. Тілдік модель үшін оған мәтін ғана емес, модель атауы, рөлдерге бөлінген хабарлар, temperature, seed, жауап шегі және ағын режимі кіреді.
Сабақтың мақсаты — модельді әрдайым бірдей жазуға мәжбүрлеу емес. Мақсат — іске қосуды қайталанатын әрі түсіндірілетін ету: барлық кірісті сақтау, деректі нұсқаудан бөлу және нақты не өзгергенін көру.
Бірден толығымен
prompt.py файлы. Ол Ollama-ға жүгінбей сұраныс құрады, сондықтан тез әрі модельсіз тексеріледі.
"""48-сабақ: промпт пен параметрлер — бағдарламаның бір бөлігі."""
import hashlib
import json
MODEL = "gemma4"
SYSTEM = "Сіз дерек редакторысыз. Кіріс деректе жоқ фактіні қоспаңыз."
def build_request(data, *, temperature=0.0, seed=42):
"""Толық анықталған және сақталатын Ollama сұранысын құру."""
prompt = """МІНДЕТ
Дерек бойынша бір сөйлем құрыңыз.
ДЕРЕК
<data>
{data}
</data>
ШЕКТЕУЛЕР
- санды, жылды және өлшем бірлігін сақтаңыз;
- себепті түсіндірмеңіз;
- басқа сан қоспаңыз.
""".format(data=data)
return {
"model": MODEL,
"messages": [
{"role": "system", "content": SYSTEM},
{"role": "user", "content": prompt},
],
"stream": False,
"options": {
"temperature": temperature,
"seed": seed,
"num_predict": 120,
},
}
def canonical(payload):
"""Бірдей өрістерді журнал мен салыстыру үшін бірдей байтқа айналдыру."""
return json.dumps(
payload, ensure_ascii=False, sort_keys=True, separators=(",", ":")
).encode("utf-8")
request = build_request("Қазақстан, 2025 жылғы инфляция: 11.4 %")
again = build_request("Қазақстан, 2025 жылғы инфляция: 11.4 %")
fingerprint = hashlib.sha256(canonical(request)).hexdigest()[:12]
print("модель:", request["model"])
print("рөлдер:", [message["role"] for message in request["messages"]])
print("temperature:", request["options"]["temperature"])
print("seed:", request["options"]["seed"])
print("шек:", request["options"]["num_predict"])
print("сол сұраныс:", canonical(request) == canonical(again))
print("таңба:", fingerprint)
Шығыс:
модель: gemma4
рөлдер: ['system', 'user']
temperature: 0.0
seed: 42
шек: 120
сол сұраныс: True
таңба: 94d687ed7f1a
Сиқырлы сөз емес, төрт бөлік
Рөл (system) тұрақты жұмыс ережесін береді. Міндет қазір не істеу керегін айтады. Дерек анық <data> шекарасында жатыр. Шектеулер жауапта не болмауға тиіс екенін атайды.
Бөлгіштер қорғаныс қабырғасы емес: дерек ішіндегі мәтінде де пәрмен болуы мүмкін. Тегтер адам мен модельге құрылымды көруге көмектеседі; қауіпсіздік нәтиже кодпен тексерілгенде ғана пайда болады.
Промптты функция сияқты жазыңыз: бір кіріс, түсінікті нәтиже, жасырын күйі аз. Бүгінгі күнді, кездейсоқ нөмірді не файл мазмұнын міндетке қажет болмаса қоспаңыз — әйтпесе екі іске қосу бірдей болмайды.
Генерация параметрлері
temperature келесі токенді таңдаудағы шашырауды басқарады: жоғары мән әдетте нұсқаны көбейтеді. Санды алу мен қайта айтуда 0.0 мәнінен бастаймыз; шығармашылық мәтінге көбірек мән керек болуы мүмкін.
seed кездейсоқ сандар генераторының бастапқы күйін бекітеді. Бірдей модель, сұраныс және параметрлермен ол кездейсоқ айырманы азайтады. Бірақ Ollama нұсқасы, модель файлы, драйвер және құрылғы өзгерсе, бұл байтқа дейінгі бірдей нәтижеге кепілдік бермейді.
num_predict жауаптың ең үлкен ұзындығын шектейді. Бұл уақыт пен жад сақтандырғышы; модель дәл 120 токен жазуға міндетті емес.
stream: False өткен сабақтан қалды: бір аяқталған нысанды сақтаймыз. Ағын мағынаны өзгерту үшін емес, интерфейс қажет болғанда қосылады.
Канондық жазба мен таңба
Сөздік өрістерінің реті мағынаны өзгертпеуге тиіс. sort_keys=True және ықшам бөлгіштер бірдей сұранысты бірдей байтқа айналдырады. SHA-256 мұнда деректі жасырмайды: қысқа таңба журнал жолын сақталған сұраныспен байланыстырады.
Таңбамен бірге сұраныстың өзін не құпиясы алынған қауіпсіз көшірмесін сақтау керек. Хештен кірісті қайта қалпына келтіре алмайсыз.
Жауаптың қасына мынаны сақтаңыз:
- модельдің дәл атауы мен қолжетімді болса нұсқасы;
- барлық хабар мен параметр;
- іске қосылған уақыт;
- бастапқы дерек не оның өзгермейтін нұсқасына сілтеме;
- жауап және автоматты тексеру нәтижесі.
Ортақ журналға жеке дерек пен құпия жазбаңыз. Қайталанымдылық деректі аз жинау қағидасын жоймайды.
Сабақ картасы
Опорлық сигналды қалпына келтіріңіз: рөл + міндет + дерек + шектеу + параметр → сақталған сұраныс.
Өз сөзіңізбен айтыңыз
temperature=0неге абсолют бірдей мәтінге кепілдік емес?- Сұраныс таңбасы мен сақталған сұраныстың айырмасы қандай?
- Тегтер қорғаныс болмаса да, деректі нұсқаудан неге бөлеміз?
- Екі температураны салыстырғанда тәжірибеде тек не өзгеруге тиіс?
Жаттығу
1. Болжаңыз. Канондық жолдар бірдей ме?
import json
a = {"seed": 42, "temperature": 0}
b = {"temperature": 0, "seed": 42}
canon = lambda value: json.dumps(value, sort_keys=True, separators=(",", ":"))
print(canon(a) == canon(b))
2. Бос орынды толтырыңыз. Генератордың бастапқы күйін бекітіңіз.
options = {"temperature": 0.0, ...: 42, "num_predict": 120}
3. Жөндеңіз. Бұл тәжірибеде дерек пен температура қатар өзгерген, сондықтан айырманың себебі белгісіз.
first = build_request("2024: 8.7 %", temperature=0.0)
second = build_request("2025: 11.4 %", temperature=0.7)
Тапсырма
Міндетті. validate_request(payload) функциясын жазыңыз. Ол модельдің дәл атауын, system және user рөлдерін, stream is False, temperature, seed, оң num_predict және <data>...</data> шекарасын тексерсін. Параметрлер сөздігін қайтарыңыз. Содан кейін JSON арқылы сұраныс көшірмесін жасап, тек температураны өзгертіңіз және бастапқы сұраныстың өзгермегенін дәлелдеңіз.
модель: gemma4
рөлдер: system,user
temperature: 0.0
seed: 42
шек: 120
көшірме тәуелсіз: True
бір өріс өзгерді: True
Өз дерегіңізбен. Жиынтықтың бір кестесіне сұраныс құрып, бірдей параметрмен үш рет орындаңыз. Жауаптарды бірге сақтап, нақты айырманы ғана белгілеңіз.
Қалауыңызша. Тек бір өрісті өзгертіп, temperature=0.0 пен 0.7 мәндерін салыстырыңыз. Іске қоспай тұрып критерий жазыңыз: сан, жыл, өлшем және себепке тыйым сақталды ма?
Бұл жобаға қайда кіреді
Модель жұмыс жиынтығына әлі кірмейді. Бұл сабақтың нәтижесі — сақталатын сұраныс. Келесі сабақта JSON Schema қосып, жауаптың бір жолы есепке түспей тұрып тексереміз.
Жауаптар
Жауаптарды көрсету
- Іске асыру, модель нұсқасы және әр құрылғыдағы есептеу өзгеше болуы мүмкін; seed кездейсоқтықты басқарады, бүкіл жүйені бекітпейді.
- Таңба кірісті салыстырады, бірақ кірістің өзін қамтымайды. Қайталау үшін сұраныс керек.
- Құрылымды көрсету және деректі автор нұсқауымен араластырмау үшін; қауіпсіздік нәтиже тексеруін бәрібір қажет етеді.
- Тек
temperature; әйтпесе жауап айырмасын бір себеппен байланыстыра алмайсыз.
True
- Кілт —
"seed".
options = {"temperature": 0.0, "seed": 42, "num_predict": 120}
print(options["seed"])
42
- Деректі бірдей қалдырып, тек температураны өзгертіңіз.
def build_request(data, *, temperature):
return {"data": data, "temperature": temperature}
first = build_request("2025: 11.4 %", temperature=0.0)
second = build_request("2025: 11.4 %", temperature=0.7)
print(first["data"] == second["data"])
True
Дереккөздер
- Ollama
/api/chat—messages,stream,temperature,seed,num_predict. - Ollama Modelfile — жүйелік хабар мен модель параметрлері.
- Python
hashlib— SHA-256 таңбасы.
Пікірлер (0)
Пікір қалдыру үшін кіріңіз →
Әзірге пікір жоқ. Бірінші болыңыз.