- BrainTools - https://www.braintools.ru -
Казахский язык в NLP считается малоресурсным. Открытых текстов на нём немного, а размеченных параллельных данных про здоровье почти нет. При этом люди ищут про здоровье постоянно, и ищут вперемешку: «қалқанша без», «щитовидка», «ттг» в одном запросе.
У меня есть сайт, где больше сотни страниц про женское здоровье и психосоматику написаны по‑русски и переведены на казахский и английский. Я собрала из них небольшой открытый словарь и выложила на Hugging Face. Заодно расскажу про второй проект на том же сайте: MCP‑сервер для ChatGPT и Claude, внутри которого нет языковой модели.
Датасет называется kazakh‑body‑wellbeing‑lexicon [1], лицензия CC BY 4.0, DOI 10.5281/zenodo.23961719 [2].
Внутри:
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”
А так её казахские ключевые слова: қалқанша без, жемсау, қалқанша без түйіні, тиреоидит, гипертиреоз, ттг, щитовидка.
Последнее слово русское, и это не ошибка [3]. Многие казахоязычные люди так и пишут в поиске, поэтому в казахских списках такие слова оставлены специально.
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 [4]. Оригинал у каждой страницы русский, казахская и английская версии переведены с него. В каждой строке датасета есть ссылки на все три страницы, поэтому любое слово можно проверить в контексте.
Ключевые слова писались для этих страниц как поисковые фразы: как человек мог бы набрать запрос, когда ищет про свою проблему.
Из 140 русских тем сайта в словарь попали только те 83, у которых уже есть все три языковые версии.
Об этом лучше сказать прямо, чтобы никто не взял словарь не для того.
Казахский текст не проверял профессиональный переводчик. Носитель языка найдёт неточности, и я буду рада исправлениям в issues на GitHub [5].
Казахская и русская версии ВОЗ-5 здесь рабочие переводы, а не валидированные. Для исследования с людьми их брать нельзя, нужна официальная версия.
Жизненные темы («темп жизни и чувство „я не успеваю“») взяты из методики и не являются медицинскими утверждениями. Причину болезни они не объясняют. На самих страницах сайта сначала идут данные клинических рекомендаций и признаки, с которыми нужно к врачу, и только потом вопросы к себе.
Словарь маленький. Это 83 темы, а не корпус.
Для чего он, по‑моему, годится: как тестовый набор для поиска и классификации запросов на казахском, для проверки того, как модель переводит бытовые слова о здоровье, для расширения поисковых запросов в смешанном казахско‑русском поиске. Для обучения [6] медицинских моделей и всего, что похоже на постановку диагноза, он не годится.
На том же сайте есть бесплатная диагностика по методике «Лестница», которую я придумала в 2019 году. Идея простая: наверху цель, внизу «я», то есть где человек сейчас, а между ними преграды. Преграды здесь не обстоятельства, а чужие фразы, в которые человек поверил: «Мама: кому это нужно». Над целью иногда стоят страхи того, что будет после неё.
Эту же самопроверку я сделала доступной из ChatGPT и Claude через Model Context Protocol [7]. Сервер живёт по адресу 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 [8].
Словарь на Hugging Face: liaizhan/kazakh‑body‑wellbeing‑lexicon [1]
Он же на GitHub, туда исправления: kazakh‑body‑wellbeing‑lexicon [5]
DOI на Zenodo: 10.5281/zenodo.23961719 [2]
Приложение в ChatGPT: Ladder by Aizhan Li [9]
MCP‑сервер: https://108psy.com/mcp
Сама диагностика на сайте: 108 psy.com/diagnostika [10]
Если вы говорите по‑казахски и видите в словаре ошибку, напишите в issues или в комментариях. Каждое исправление попадёт в следующую версию.
Айжан Ли, автор методики «Лестница»
Автор: liaizhan
Источник [11]
Сайт-источник BrainTools: https://www.braintools.ru
Путь до страницы источника: https://www.braintools.ru/article/38419
URLs in this post:
[1] kazakh‑body‑wellbeing‑lexicon: https://huggingface.co/datasets/liaizhan/kazakh-body-wellbeing-lexicon
[2] 10.5281/zenodo.23961719: https://doi.org/10.5281/zenodo.23961719
[3] ошибка: http://www.braintools.ru/article/4192
[4] 108 psy.com: https://108psy.com/psihosomatika
[5] issues на GitHub: https://github.com/liaizhan/kazakh-body-wellbeing-lexicon
[6] обучения: http://www.braintools.ru/article/5125
[7] Model Context Protocol: https://modelcontextprotocol.io
[8] ladder‑claude‑plugin: https://github.com/liaizhan/ladder-claude-plugin
[9] Ladder by Aizhan Li: https://chatgpt.com/plugins/plugin_asdk_app_6ada41b9737081919d0b0cd3b582b3c4
[10] 108 psy.com/diagnostika: https://108psy.com/diagnostika
[11] Источник: https://habr.com/ru/articles/1106732/?utm_campaign=1106732&utm_source=habrahabr&utm_medium=rss
Нажмите здесь для печати.