Skip to content
imarch.dev
Блогқа оралу
· 6 мин оқу

qwen3 vs nomic: эмбеддингтерді нақты сандармен ауыстыру

ai RAG архитектура өнім

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

qwen3 vs nomic: эмбеддингтерді нақты сандармен ауыстыру

Мәселе

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) онша ауыр емес.

nomic-embed-text274 MB · 768 dim
qwen3-embedding:0.6b639 MB · 1024 dim
qwen3-embedding:4b2.5 GB · 2560 dim
qwen3-embedding:8b4.7 GB · 4096 dim

Көшіру

Эмбеддинг моделін ауыстыру - жай атауды өзгерту емес. Вектордың өлшемі өзгереді (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: чанк top-1-де12-ден 3
qwen3: чанк top-1-де12-ден 9
nomic: чанк top-7-де (retrieval window)12-ден 5
qwen3: чанк top-7-де (retrieval window)12-ден 12

nomic қажетті чанкті retrieval терезесінде жағдайлардың 42%-ында тапты. qwen3 - 100%-ында.

Жылдамдық

Embedding latency (5 сұраудың орташасы)
nomic-embed-text144 ms
qwen3-embedding:0.6b134 ms
Ingestion (48 чанк)
nomic-embed-text5.4 сек
qwen3-embedding:0.6b9.5 сек
Модель өлшемі
nomic-embed-text274 MB
qwen3-embedding:0.6b639 MB

Сұрауға 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-те жұмыс істейді - оң жақ төменгі бұрыштағы чат батырмасы. Орысша бірдеңе сұрап көріңіз және бұрын қалай жұмыс істегенімен салыстырыңыз. Немесе өз өніміңіз үшін осындай жүйе қаласаңыз хабарласыңыз.

Бөлісу:

Ұқсас мақалалар