Python: деректен өз есебіңізге дейін 48-сабақ (барлығы 56)
Өз компьютеріңіздегі тілдік модель: Ollama және алғашқы жергілікті сұраныс
Python курсының қырық жетінші сабағы. Ollama орнатып, API кілтінсіз алғашқы жауапты аламыз және сұраныстың бүкіл жолын талдаймыз: бағдарлама JSON-ды localhost мекенжайына жібереді, HTTP жауабын тексереді, содан кейін ғана модель мәтінін алады. Жергілікті портты сыртқа өзіңіз ашпасаңыз, дерек компьютеріңізде қалады.
Бұл не үшін керек
Осы уақытқа дейін курстағы модель формула болды: сандар кіріп, сан шықты. Тілдік модель мәтін қабылдап, мәтін қайтарады. Сондықтан оны сұхбаттасушыдай қабылдап, алдымызда кірісі, шығысы және қатесі бар бағдарлама тұрғанын ұмыту оңай.
Бұл сабақта модель Ollama арқылы жергілікті түрде жұмыс істейді. API кілті қажет емес. Бағдарлама мен модель файлын жүктеу үшін интернет бір рет керек; содан кейін жергілікті модель желісіз жауап бере алады.
Жергілікті деген сөз автоматты түрде қауіпсіз дегенді білдірмейді. Әдепкіде Ollama localhost:11434 мекенжайын тыңдайды. Бұл — өз компьютеріңіздің мекенжайы. Портты интернетке жарияламаңыз және кәдімгі файлға сақтамайтын құпияны модельге бермеңіз.
Дайындау
- Windows, macOS немесе Linux үшін Ollama-ны ресми беттен орнатыңыз.
- Терминалда
ollamaпәрменін орындаңыз — Ollama-ның қазіргі нұсқаулығы осыны ұсынады. - Бұлттық емес, жергілікті модель таңдаңыз. Сабақ жазылған сәттегі ресми мысалда
gemma4қолданылады; қолжетімді модельдер мен олардың өлшемін Ollama каталогынан қараңыз. Модель компьютер жады мен дискіге сыюға тиіс. - Алғашқы іске қосу модельді жүктейді. Енгізу шақыруы шыққанша терминалды жаппаңыз.
ollama run gemma4
Қысқа сұрақ қойып, /bye пәрменімен шығыңыз. Компьютер таңдалған модельді көтермесе, қазіргі каталогтан кішірегін таңдап, төмендегі мысалдардың бәрінде оның дәл атауын қолданыңыз.
Бірден толығымен
local_model.py файлы. Басқа модель орнатсаңыз, MODEL мәнін өзгертіңіз.
"""47-сабақ: Ollama HTTP API арқылы жергілікті тілдік модель."""
import json
from urllib.error import HTTPError, URLError
from urllib.request import Request, urlopen
OLLAMA_CHAT = "http://localhost:11434/api/chat"
MODEL = "gemma4"
def ask(prompt, *, model=MODEL, timeout=120):
"""Бір сұрақ жіберіп, тексерілген жауап мәтінін ғана қайтару."""
payload = {
"model": model,
"messages": [{"role": "user", "content": prompt}],
"stream": False,
}
request = Request(
OLLAMA_CHAT,
data=json.dumps(payload).encode("utf-8"),
headers={"Content-Type": "application/json"},
method="POST",
)
try:
with urlopen(request, timeout=timeout) as response:
data = json.load(response)
except HTTPError as error:
raise RuntimeError(f"Ollama HTTP {error.code} жауабын берді") from error
except URLError as error:
raise RuntimeError(
"Ollama қолжетімсіз: оны іске қосып, localhost:11434 мекенжайын тексеріңіз"
) from error
message = data.get("message")
if not isinstance(message, dict) or not isinstance(message.get("content"), str):
raise ValueError("Ollama жауабында message.content жоқ")
content = message["content"].strip()
if not content:
raise ValueError("Ollama бос message.content қайтарды")
return content
print(ask("Медиананың орташадан айырмасын бір сөйлеммен түсіндір."))
Сіздегі мәтін өзгеше болады: тілдік модель дайын бір жолды алмайды, жауапты тудырады. Алғашқы іске қосудың дұрыс нәтижесі — бос емес мағыналы жауап және ерекше жағдайдың болмауы.
Талдау
Сервер компьютеріңізде жұмыс істеп тұр
ollama run қажет болса модель файлын алады да, диалогты бастайды. Python модельді қайта іске қоспайды — ол http://localhost:11434/api мекенжайындағы жұмыс істеп тұрған HTTP API-ге жүгінеді.
localhost — дәл осы компьютер. Бұл бұлт мекенжайы емес. Ал модель атауындағы :cloud жұрнағы бұлтта іске қосуды білдіреді және бұл сабаққа жарамайды.
Сұраныс — кәдімгі JSON
/api/chat үшін екі міндетті өріс бар: model атауы және messages тізімі. Әр хабардың рөлі мен мазмұны бар. Әзірге тарихта пайдаланушының бір хабары ғана тұр.
stream: False бір JSON нысанын сұрайды. Әдепкіде API жауап бөліктерінің ағынын береді; интерфейс үшін бұл пайдалы, бірақ жаңа тақырып қосады. Сондықтан алғашқы клиентте ағынды әдейі өшіреміз.
json.dumps(...).encode("utf-8") сөздікті байтқа айналдырады. Content-Type серверге ішіндегі пішімнің JSON екенін айтады. Бұл JSON және HTTP сабақтарындағы жолдың өзі, тек сервер енді сіздікі.
Жергілікті шақыруға да таймаут керек
Алғашқы жауап баяу болуы мүмкін: модель жадқа жүктеледі. Бірақ шексіз күту бәрібір қате. Сондықтан шақыруда анық timeout=120 бар, ал желі мен HTTP қатесі оқушыға нені тексеру керегін айтады.
Жауап алдымен тексеріледі
Мәтін message.content ішінде, бірақ бағдарлама жауапты соқыр түрде индекстемейді. Сервердің басқа нұсқасы, қате не күтпеген JSON пішіні түсініксіз KeyError бермеуге тиіс. Шекарадағы тексеру нақты ValueError береді.
Бұл мәтіннің растығын тексеру емес. Қазір жауаптың тек пішіні тексерілді. Деректерді 49–51-сабақтарда тексереміз.
«Интернетсіз» нені білдіреді
Жергілікті модель жүктелгеннен кейін сұраныс localhost мекенжайына барады; мәтін компьютерден шығуға міндетті емес. Бірақ сабақ өзі бақыламайтын нәрсені уәде етпейді:
- орнатқыш пен модель файлы алдымен желіден жүктеледі;
- бұлттық модель жергілікті жұмыс істемейді;
- компьютердегі басқа бағдарламалар мен журналдар — бөлек сенім аймағы;
- жергілікті жұмыс жауапты дұрыс етпейді.
Сабақ картасы
Мәтінді жауып, жолды карта бойынша қалпына келтіріңіз: сұрақ → JSON → localhost → JSON → тексеру → мәтін.
Өз сөзіңізбен айтыңыз
- Жергілікті модельге API кілті неге керек емес?
- Алғашқы оқу клиентінде
stream: Falseне үшін қойылады? message.contentшарты нені тексереді, нені тексермейді?- 11434 портын бүкіл интернетке неге ашуға болмайды?
Жаттығу
1. Болжаңыз. Дайын жауапты талдау не басып шығарады?
import json
raw = '{"message": {"role": "assistant", "content": " Жергілікті. "}}'
data = json.loads(raw)
print(data["message"]["content"].strip())
2. Бос орынды толтырыңыз. ... орнына ағынды өшіретін өрісті жазыңыз.
payload = {
"model": "gemma4",
"messages": [{"role": "user", "content": "Бір дерек"}],
...: False,
}
3. Жөндеңіз. Бұл код бос жауапты үнсіз қабылдайды:
data = {"message": {"content": " "}}
answer = data["message"]["content"].strip()
print(answer)
Тапсырма
Міндетті. Талданған Ollama жауабын қабылдайтын answer_text(data) функциясын жазыңыз. Ол шеттеріндегі бос орындары алынған, бос емес message.content мәнін қайтарсын. message болмаса, content түрі қате болса немесе жол бос болса, функция ValueError("модель мәтіні жоқ") ерекше жағдайын көтеруге тиіс. Оны төрт дайын жауаппен тексеріп, нәтижені басып шығарыңыз.
1: жауап: 42
2: қате: модель мәтіні жоқ
3: қате: модель мәтіні жоқ
4: қате: модель мәтіні жоқ
тексерілген жауап: 4
Дайын нәтиже: шығыс жолма-жол сәйкес келеді; функция Ollama-ға жүгінбейді және әр қате пішінді бірдей түсінікті түрде қабылдамайды.
Өз дерегіңізбен. ask функциясына өз жиынтығыңыздағы бір жол туралы сұрақ қойыңыз. Себебін түсіндіруді сұрамаңыз; берілген санды ғана қайталауды өтініп, мән, өлшем бірлігі және жыл сақталғанын қолмен тексеріңіз.
Қалауыңызша. Әдепкі мәні OLLAMA_CHAT болатын url аргументін қосыңыз, ал тест кезінде өзіңіздің жергілікті жалған HTTP серверіңіздің мекенжайын беріңіз. Желілік клиентті нағыз модельсіз осылай тексереді.
Бұл жобаға қайда кіреді
Әзірге ешқайда кірмейді, әрі бұл — әдейі жасалған үзіліс. Бір сәтті жауапты есепке бірден қоюға болмайды: ол өзгереді және ойдан шығарылған нәрсе қамтуы мүмкін. 48 және 49-сабақтарда параметрлерді бекітіп, құрылымды жауап талап етеміз; тек 50-сабақта тілдік модель жиынтыққа қосылады. Жақсы архитектура сыртқы компонентті алғашқы әсерлі іске қосудан кейін емес, оның келісімшарты анықталғаннан кейін қосады.
Жауаптар
Жауаптарды көрсету
Сұрақтарға
- Сұраныс өз компьютеріңіздегі серверге барады; бағдарлама мен модель арасында бөлек қашықтағы есептік жазба жоқ.
- Бір JSON алып, келісімшартты жауап бөліктерінің ағынымен араластырмай меңгеру үшін.
- Күтілген орында бос емес жолдың барын ғана тексереді. Мазмұнның растығын, толықтығын және қауіпсіздігін дәлелдемейді.
- Жергілікті API жалпыға ашық кіру нүктесі болмауға тиіс: бөтен адам компьютер ресурсын жұмсап, модельге дерек жібере алады.
Жаттығуға
Жергілікті.
- Өріс атауы —
"stream".
payload = {
"model": "gemma4",
"messages": [{"role": "user", "content": "Бір дерек"}],
"stream": False,
}
print(payload["stream"])
False
strip()әдісінен кейін жолдың бос еместігін тексеріп, түсінікті ерекше жағдай көтеру керек.
data = {"message": {"content": " "}}
answer = data["message"]["content"].strip()
if not answer:
raise ValueError("модель мәтіні жоқ")
Дереккөздер
- Ollama Quickstart — қазіргі орнату және алғашқы жергілікті іске қосу.
- Ollama API introduction —
localhost:11434/apiнегізгі мекенжайы және API үйлесімділігі. - Ollama
/api/chat— сұраныс өрістері,stream, хабарлар және жауап пішіні.
Пікірлер (0)
Пікір қалдыру үшін кіріңіз →
Әзірге пікір жоқ. Бірінші болыңыз.