Казахский язык в NLP считается малоресурсным. Открытых текстов на нём немного, а размеченных параллельных данных про здоровье почти нет. При этом люди ищут про здоровье постоянно, и ищут вперемешку: «қалқанша без», «щитовидка», «ттг» в одном запросе.
У меня есть сайт, где больше сотни страниц про женское здоровье и психосоматику написаны по‑русски и переведены на казахский и английский. Я собрала из них небольшой открытый словарь и выложила на Hugging Face. Заодно расскажу про второй проект на том же сайте: MCP‑сервер для ChatGPT и Claude, внутри которого нет языковой модели.
Что в словаре
Датасет называется kazakh‑body‑wellbeing‑lexicon, лицензия CC BY 4.0, DOI 10.5281/zenodo.23961719.
Внутри:
terms(83 строки): тема на трёх языках, короткая жизненная тема к ней и ссылка на исходную страницу на каждом языке;keywords(1 913 строк): поисковые фразы в длинном форматеslug, lang, keyword, из них казахских 636, русских 587, английских 690;terms.jsonl: те же 83 темы, где ключевые слова лежат списками внутри объекта;who5/who5.{kk,ru,en}.json: вопросы индекса благополучия ВОЗ-5, варианты ответов и тексты результата.
Так выглядит одна тема:
slug: shchitovidnaya-zheleza name_kk: Қалқанша без name_ru: Щитовидная железа name_en: Thyroid gland theme_kk: Өмір қарқыны және «үлгермеймін» сезімі theme_ru: Темп жизни и чувство «я не успеваю» theme_en: The pace of life and the feeling “I can't keep up”
А так её казахские ключевые слова: қалқанша без, жемсау, қалқанша без түйіні, тиреоидит, гипертиреоз, ттг, щитовидка.
Последнее слово русское, и это не ошибка. Многие казахоязычные люди так и пишут в поиске, поэтому в казахских списках такие слова оставлены специально.
Как загрузить
from datasets import load_dataset terms = load_dataset("liaizhan/kazakh-body-wellbeing-lexicon", "terms", split="train") keywords = load_dataset("liaizhan/kazakh-body-wellbeing-lexicon", "keywords", split="train") kk = keywords.filter(lambda r: r["lang"] == "kk") print(terms[0]["name_kk"], terms[0]["name_ru"], terms[0]["name_en"])
Если нужен только казахский без русских вставок, проще всего оставить фразы, где есть хотя бы одна чисто казахская буква:
KK_LETTERS = set("әғқңөұүһіӘҒҚҢӨҰҮҺІ") pure_kk = kk.filter(lambda r: any(ch in KK_LETTERS for ch in r["keyword"]))
Фильтр грубый. Он выкинет заодно «ттг» и «тиреоидит», которые пишутся одинаково в обоих языках, так что для точной работы список лучше просмотреть руками.
Откуда данные
Каждая тема взята с опубликованной страницы раздела о психосоматике у женщин на 108 psy.com. Оригинал у каждой страницы русский, казахская и английская версии переведены с него. В каждой строке датасета есть ссылки на все три страницы, поэтому любое слово можно проверить в контексте.
Ключевые слова писались для этих страниц как поисковые фразы: как человек мог бы набрать запрос, когда ищет про свою проблему.
Из 140 русских тем сайта в словарь попали только те 83, у которых уже есть все три языковые версии.
Ограничения
Об этом лучше сказать прямо, чтобы никто не взял словарь не для того.
Казахский текст не проверял профессиональный переводчик. Носитель языка найдёт неточности, и я буду рада исправлениям в issues на GitHub.
Казахская и русская версии ВОЗ-5 здесь рабочие переводы, а не валидированные. Для исследования с людьми их брать нельзя, нужна официальная версия.
Жизненные темы («темп жизни и чувство „я не успеваю“») взяты из методики и не являются медицинскими утверждениями. Причину болезни они не объясняют. На самих страницах сайта сначала идут данные клинических рекомендаций и признаки, с которыми нужно к врачу, и только потом вопросы к себе.
Словарь маленький. Это 83 темы, а не корпус.
Для чего он, по‑моему, годится: как тестовый набор для поиска и классификации запросов на казахском, для проверки того, как модель переводит бытовые слова о здоровье, для расширения поисковых запросов в смешанном казахско‑русском поиске. Для обучения медицинских моделей и всего, что похоже на постановку диагноза, он не годится.
Вторая часть: MCP‑сервер без LLM
На том же сайте есть бесплатная диагностика по методике «Лестница», которую я придумала в 2019 году. Идея простая: наверху цель, внизу «я», то есть где человек сейчас, а между ними преграды. Преграды здесь не обстоятельства, а чужие фразы, в которые человек поверил: «Мама: кому это нужно». Над целью иногда стоят страхи того, что будет после неё.
Эту же самопроверку я сделала доступной из ChatGPT и Claude через Model Context Protocol. Сервер живёт по адресу https://108psy.com/mcp, работает на Cloudflare Workers и даёт два инструмента:
get_ladder_questionsвозвращает вопросы самопроверки на казахском, русском или английском;analyze_ladderпринимает цель, «я», от 3 до 5 преград и до 5 страхов и возвращает разбор: строки лестницы по зонам, ближнюю преграду, короткие выводы, два вопроса к себе и ссылку на полную диагностику.
Оба инструмента помечены как только для чтения.
Почему внутри нет модели
Языковая модель уже есть у клиента. ChatGPT или Claude сам поговорит с человеком на его языке, задаст вопросы и перескажет ответ. От сервера нужна структура: какая фраза к какой зоне относится, что ближе всего к человеку, сколько страхов над целью. Это считается правилами методики, без генерации текста.
Отсюда несколько удобств. Ответ на одни и те же данные всегда одинаковый. Сервер ничего не стоит в токенах. Проверяющему из OpenAI или Anthropic проще понять, что инструмент делает, потому что он не сочиняет.
Транспорт
Streamable HTTP без сессий и без входа. Каждый запрос отдельный, сервер ничего не помнит между ними. Отвечаем обычным JSON, спецификация MCP это разрешает, поток SSE не открываем, и на GET сервер отвечает 405. Тело запроса больше 32 КБ не читаем: запросы от ChatGPT весят несколько сотен байт. Поддерживаются версии протокола 2025-11-25, 2025-06-18 и 2025-03-26.
Проверить можно обычным curl:
curl -s -X POST https://108psy.com/mcp \ -H 'Content-Type: application/json' \ -d '{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{ "name":"analyze_ladder", "arguments":{ "language":"ru", "goal":"Открыть студию маникюра до 1 марта", "me":"Работаю мастером по найму", "blocks":["Мама: кому это нужно","Нет денег на аренду","Муж против"], "fears":["Подруги отвернутся"]}}}'
В ответе (сокращённо):
{ "kind": "reading", "steps": [ {"number": 1, "zone": "current", "text": "Работаю мастером по найму"}, {"number": 2, "zone": "block", "text": "Мама: кому это нужно"}, {"number": 3, "zone": "block", "text": "Нет денег на аренду"}, {"number": 4, "zone": "block", "text": "Муж против"}, {"number": 5, "zone": "goal", "text": "Открыть студию маникюра до 1 марта"}, {"number": 6, "zone": "fear", "text": "Подруги отвернутся"} ], "nearestBlock": "Мама: кому это нужно", "fearsAboveGoal": 1, "questions": [ "Чей голос звучит во фразе «Мама: кому это нужно»? Кто сказал её первым?", "Что ты сделаешь в ближайшие 24 часа, если перестанешь верить этой фразе?" ] }
Что сервер не принимает
Правила OpenAI для приложений запрещают собирать медицинские данные, да и разбирать болезни методика не берётся. Поэтому перед разбором текст проверяется на слова о болезнях, диагнозах, симптомах и лекарствах сразу на трёх языках. Если они есть, вместо разбора приходит kind: "health" с просьбой написать цель без медицинских подробностей.
С казахским тут была своя тонкость. Слово «ауру» (болезнь) легко найти внутри другого слова, например «тауру». Помогла проверка начала слова через \p{L}:
// (?<!\p{L}): начало слова: «ауру» не ловится в «тауру». const HEALTH_WORDS_KK = /(?<!\p{L})(ауру(ым|ың|ы|лар)?(?!\p{L})|ауырады|ауырып|дәрі-дәрмек|диагноз|симптом)/iu;
Регулярное выражение, конечно, пропустит часть случаев. Поэтому то же правило продублировано в описании инструмента: модель на стороне клиента просят не передавать диагнозы, симптомы и лекарства.
Если в словах есть признаки кризиса или насилия, сервер возвращает kind: "crisis" с номерами телефонов помощи, и в описании инструмента сказано показать человеку только это сообщение, без разбора.
Ответы человека не пишутся ни в базу, ни в журнал. В логи попадает только текст неожиданной ошибки.
Где это сейчас
Приложение «Ladder by Aizhan Li» опубликовано в каталоге ChatGPT 4 ноября 2026 года. Для Claude коннектор и плагин отправлены в каталог Anthropic 7 ноября и ждут проверки. Подключить сервер вручную по адресу можно уже сейчас в любом клиенте MCP, например в Claude Code:
claude mcp add --transport http ladder https://108psy.com/mcp
Код плагина для Claude открыт: ladder‑claude‑plugin.
Ссылки
Словарь на Hugging Face: liaizhan/kazakh‑body‑wellbeing‑lexicon
Он же на GitHub, туда исправления: kazakh‑body‑wellbeing‑lexicon
DOI на Zenodo: 10.5281/zenodo.23961719
Приложение в ChatGPT: Ladder by Aizhan Li
MCP‑сервер:
https://108psy.com/mcpСама диагностика на сайте: 108 psy.com/diagnostika
Если вы говорите по‑казахски и видите в словаре ошибку, напишите в issues или в комментариях. Каждое исправление попадёт в следующую версию.
Айжан Ли, автор методики «Лестница»
