qwen3 vs nomic: эмбеддингтерді нақты сандармен ауыстыру
Бұл алдыңғы мақаланың жалғасы, онда мен сайттағы чатботқа Hybrid RAG енгіздім. RAG жұмыс істеді, токендер үнемделді, бірақ бір мәселе мазалады: орысша сұраулар қажетті чанктерді таба алмады.

Мәселе
RAG іске қосылғаннан кейін боттың «Hybrid RAG туралы мақаланы айтып бер» деген сұраққа қалай жауап беретінін тексердім. Бот: «Hybrid RAG: Agile мен Waterfall-дың ең жақсысы». Токендерді оңтайландыру туралы мақала жобаны басқару әдіснамасына айналды.
Логтарды қарадым. blog_hybrid_rag чанкі дұрыс мәтінмен Qdrant-та жатыр. Бірақ «Hybrid RAG оптимизация токенов» сұрауы бойынша іздегенде ол 48-ден 44-ші орында 0.583 score-мен тұрды. Алғашқы 7 орынды IT-трансформация мен BPM туралы кездейсоқ мақалалар алды.
Мәселе nomic-embed-text-те. Модель негізінен ағылшын тілінде оқытылған. Орысша мәтін векторға айналады, бірақ семантика жоғалады: «оптимизация токенов» мен «эволюция управления» ол үшін шамамен бірдей.
Ауыстыруды таңдау
Критерийлер:
- Орыс, ағылшын және қазақ тілдерін тума қолдау
- Ollama-да жұмыс істейді (бізде бәрі жергілікті, сыртқы API жоқ)
- Серверде Qdrant пен ботпен бірге 4 GB RAM-ға сияды
qwen3-embedding тамаша сәйкес келді: MTEB multilingual leaderboard-та #1, үш өлшем (0.6B / 4B / 8B), Ollama-да бар. 0.6B алдым - 639 MB, nomic-тен (274 MB) онша ауыр емес.
Көшіру
Эмбеддинг моделін ауыстыру - жай атауды өзгерту емес. Вектордың өлшемі өзгереді (768 -> 1024), демек Qdrant-тағы барлық коллекцияларды қайта құру және деректерді қайта индекстеу керек.
Кодты бірден env vars арқылы жаздым:
EMBED_MODEL = os.environ.get("EMBED_MODEL", "nomic-embed-text")
VECTOR_DIM = int(os.environ.get("VECTOR_DIM", "768"))
Өлшем өзгергенде коллекцияны автоматты қайта құруды қостым:
def ensure_collection():
client = get_client()
collections = [c.name for c in client.get_collections().collections]
if COLLECTION in collections:
info = client.get_collection(COLLECTION)
existing_dim = info.config.params.vectors.size
if existing_dim != VECTOR_DIM:
logger.info("Dimension changed %d -> %d, recreating",
existing_dim, VECTOR_DIM)
client.delete_collection(COLLECTION)
else:
return
client.create_collection(
COLLECTION,
VectorParams(size=VECTOR_DIM, distance=Distance.COSINE),
)
Деплой:
# Серверде
docker exec ollama ollama pull qwen3-embedding:0.6b
# .env ішінде
EMBED_MODEL=qwen3-embedding:0.6b
VECTOR_DIM=1024
# Қайта іске қосу (CI/CD немесе қолмен)
docker compose up -d --build chatbot
Іске қосу кезінде логтарда:
Vector dimension changed 768 -> 1024, recreating collection
Created Qdrant collection: knowledge (dim=1024)
Knowledge ingestion complete: 48/48 chunks
Барлық 48 чанк автоматты түрде қайта индексленді. Даунтайм - бірнеше секунд.
Бенчмарк
Үш тілде 12 сұрау. Әр сұрау үшін - күтілетін чанк және Qdrant-тан нақты rank/score. Бірдей 48 чанк, бірдей search_text, тек эмбеддинг моделі басқа.
Орысша
| Сұрау | Күтілетін чанк | nomic | qwen3 |
|---|---|---|---|
| Расскажи про опыт в банке | career_bank_head | #5 0.636 | #1 0.658 |
| опыт работы в крупном банке | career_bank_head | #1 0.715 | #1 0.683 |
| какие услуги предлагает | services_overview | #2 0.688 | #1 0.612 |
| где учился Ильяс | education_certs | #2 0.666 | #1 0.561 |
| Hybrid RAG оптимизация | blog_hybrid_rag | #44 0.583 | #1 0.719 |
| как устроен чатбот | blog_hybrid_rag | #14 0.613 | #5 0.636 |
| где работал Ильяс | career_overview | #11 0.661 | #1 0.663 |
| статья про 4 бага | blog_four_bugs | #19 0.599 | #3 0.553 |
Негізгі жол: «Hybrid RAG оптимизация». nomic қажетті чанкті 44-ші орынға қойды. qwen3 - 1-ші орынға.
Ағылшынша
| Сұрау | Күтілетін чанк | nomic | qwen3 |
|---|---|---|---|
| What services does Ilyas offer | services_overview | #1 0.719 | #1 0.825 |
| banking career experience | career_bank_head | #2 0.589 | #1 0.733 |
| AI agents and LLM | service_ai_agents | #1 0.715 | #1 0.823 |
Ағылшынша екі модель де қажеттісін табады. Бірақ qwen3 score 0.82-0.83 береді, ал nomic - 0.59-0.72. Score жоғары болған сайын шуылдан қашықтық көбейеді, қажетсіз чанктің араласу мүмкіндігі азаяды.
Қазақша
| Сұрау | Күтілетін чанк | nomic | qwen3 |
|---|---|---|---|
| Ильястың банктегі тәжірибесі | career_bank_head | #14 0.575 | #6 0.503 |
Қазақ тілі екі модель үшін де ең қиын болып қала береді. Бірақ qwen3 кем дегенде top-7-ге (біздің retrieve_top_k) түседі, ал nomic - жоқ.
Қорытынды
nomic қажетті чанкті retrieval терезесінде жағдайлардың 42%-ында тапты. qwen3 - 100%-ында.
Жылдамдық
Сұрауға latency - шамамен бірдей, qwen3 тіпті сәл жылдамырақ. Ingestion баяуырақ (9.5 vs 5.4 сек), бірақ бұл контейнер іске қосылғандағы бір реттік операция.
Неліктен nomic орысшада жоғалтады
nomic-embed-text ағылшын деректерінде оқытылған. Ол орысша сөздерді «түсінеді», бірақ семантиканы ажыратпайды. Ол үшін «оптимизация токенов» мен «эволюция управления» - шамамен бір нәрсе: құрылымы ұқсас кириллица таңбаларының жиынтығы.
qwen3-embedding 100+ тілде оқытылған, оның ішінде орыс тілінде. Ол «оптимизация токенов» сөзі «token cost reduction»-ге жақынырақ екенін түсінеді, «project management evolution»-ге емес.
Визуалды түрде: nomic барлық 48 чанкке 0.58-0.72 score береді - тар дәліз, сигнал шуылда жоғалады. qwen3 0.50-0.83 береді - таралым кеңірек, қажетті чанк анық ерекшеленеді.
Не өлшенбеді
Бұл бенчмарк - MTEB емес. 48 чанк, 12 сұрау, бір use case. Нәтижелер нақты өнім үшін нақты жақсартуды көрсетеді: орысша, ағылшынша және қазақша сұраулары бар жеке сайттағы көптілді чатбот.
Тек ағылшынша RAG үшін nomic жеткілікті болуы мүмкін. Орыс тілі немесе басқа ағылшын тілді емес тілдері бар кез келген жоба үшін - qwen3-embedding бірмәнді жақсырақ.
Өзіңізде қалай қолдануға болады
Егер сізде Ollama + Qdrant-та RAG бар болса (немесе оны алдыңғы мақала бойынша құрсаңыз):
# Моделді жүктеу
docker exec ollama ollama pull qwen3-embedding:0.6b
# .env-ке қосу
EMBED_MODEL=qwen3-embedding:0.6b
VECTOR_DIM=1024
# Қайта іске қосу
docker compose up -d --build
Егер сіздің кодыңыз өлшем өзгергенде коллекцияны қайта құрса - деректер автоматты түрде қайта индексленеді. Олай болмаса - коллекцияны Qdrant API арқылы қолмен жойыңыз.
Бот қазір qwen3-embedding-те жұмыс істейді - оң жақ төменгі бұрыштағы чат батырмасы. Орысша бірдеңе сұрап көріңіз және бұрын қалай жұмыс істегенімен салыстырыңыз. Немесе өз өніміңіз үшін осындай жүйе қаласаңыз хабарласыңыз.


