RAG gamit ang hy4: pag-uugnay ng 4B model sa knowledge base at vector search
RAG gamit ang hy4: pag-uugnay ng 4B model sa knowledge base at vector search
Ang tanong na "kaya bang mag-RAG ang 4B model" ay may tunay na sagot lamang kung malinaw kung ano ang gagampanan ng 4B model. Ang sagot: sa magaang bahagi ng pipeline, sapat na; sa pagsasama-sama ng mahabang teksto, madaling matumbok. Ang hy4 ay angkop nang lubos sa unang papel: dense model na 4.22 bilyong parameter, native na 256K na konteksto, at 2.6GB lang ang Q4_K_M, kaya tumatakbo ito sa karamihan ng makina. Ang artikulong ito ay nag-aalok ng kumpletong setup: lokal na vector store, bge-m3 na embedding, at ang hy4 na nagpapalawig ng query at lumilikha ng sagot, kasama ang limang pagkakamalikmang na talagang maaari mong magap.
Buod sa 30 segundo
Ang hy4 ay may tatlong mataas na halagang papel sa RAG: pagpapalawig ng query (pagbabago ng casual na tanong tungo sa mga retrieval term), routing ng intensyon (pagpapasya kung saang knowledge base pupunta), at paglikha ng maikling sagot (sagot na wala pang 300 salita mula sa mga fragment na nakuha). Ang pagsasama-sama ng maraming dokumento at multi-hop reasoning ay ibigay sa mas malaking modelo sa cloud. Ang panig na vector ay gumagamit ng bukas na embedding tulad ng bge-m3, dahil ang EXAIV cloud catalog ay wala pang anumang uri ng embedding model.
Tukuyin muna ang papel: ano ang dapat at hindi dapat gawin ng 4B
Ang RAG pipeline ay may hindi bababa sa dalawang papel: ang panig ng retrieval na "naghahanap ng materyal" at ang panig ng generation na "nag-aayos ng sagot". Ang dalawa ay nangangailangan ng napakaibang bagay mula sa isang modelo:
| Yugto | Ang kailangan mula sa modelo | Angkop ba ang hy4 |
|---|---|---|
| Pagpapalawig at pagpapalawak ng query | kailangan lang intindihin ang tanong at maglabas ng keyword | napakaangkop |
| Pag-uuri ng intensyon at routing | kailangan lang ilabas ang isang label | napakaangkop, kahit ang 0.5B ay kaya |
| Pagbubuod at pagbubuod | kailangang masaklaw ang mga pangunahing punto ng pinagmulan | angkop |
| Maikling sagot na may batayan | kailangang tapat at hindi mag-imbento | angkop kasama ang mahigpit na prompt |
| Pagsasama-sama ng mahabong teksto mula sa maraming dokumento | kailangan ng malayuang pag-iisip at pagkakapareho | hindi angkop, pumili ng mas malaking modelo |
| Multi-hop reasoning | kailangan ng mga intermediate na hakbang | hindi angkop |
Bakit ang maliit na modelo ay bagay sa unang kalahati ng pipeline
Ang unang kalahati ay lumilikha ng maikling teksto o label, kung saan ang mali ay mura at madaling mapatunayan; ang huling kalahati ay lumilikha ng mahabang teksto, kung saan ang mali ay mamahalin at mahirap balingan. Ang paglalagay ng 4B sa harap ay nangangahulugang ang hindi gaanong magandang pagpapalawig ay mayroong recall na pambawi; ang paglalagay nito sa likuran ay nangangahulugang ang bawat pangungusap ng imbensyon ay diretso nang humaharap sa user.
Isang kumpletong setup na tumatakbo
Hakbang 1: patakbuhin ang lokal na inference server
./llama-server -m ./hunyuan4b/Q4_K_M.gguf \
--host 127.0.0.1 --port 8080 \
--ctx-size 32768 --jinja
Ang binubukas na endpoint ay isang karaniwang OpenAI-compatible na API, at ang lahat ng code sa ibaba ay tumuturo sa http://127.0.0.1:8080/v1.
Hakbang 2: paghahati sa dokumento
from pathlib import Path
import re
def load_docs(folder: str) -> list[str]:
chunks = []
for p in sorted(Path(folder).glob("**/*.md")):
text = p.read_text(encoding="utf-8")
sections = re.split(r"\n(?=#{1,3} )", text)
for sec in sections:
if len(sec) < 200:
continue
for i in range(0, len(sec), 1200):
piece = sec[i:i + 1200]
if len(piece.strip()) > 50:
chunks.append(sec.split("\n")[0] + "\n" + piece)
return chunks
chunks = load_docs("./docs")
print(len(chunks))
Unang prinsipyo ng paghahati: huwag sirain ang yunit ng kahulugan
Ang paghahati ayon sa takdang bilang ng character ay maghihiwa sa dalawang bahagi ang isang talahanayan o isang paglalarawan ng API, kaya ang fragment na nakuha ay magmumukhang hindi kumpleto at ang modelo ay mapipilitang manghula. Hatiin muna ayon sa hierarchy ng heading, pagkatapos ay ayon sa haba, at panatilihin ang heading bilang prefix na muling ipagkakabit, dahil ang heading ang pinakamahusay na anchor ng retrieval na mayroon ka.
Hakbang 3: pag-embed (lokal na embedding)
from sentence_transformers import SentenceTransformer
embed_model = SentenceTransformer("BAAI/bge-m3")
vectors = embed_model.encode(chunks, normalize_embeddings=True, batch_size=32)
Ang bge-m3 ay isa sa mga pinakaming downloaded na bukas na multilingual embedding model sa komunidad, at sumusuporta sa halo-halong Chinese at English gayundin ang mahabang teksto.
Bakit hindi gumamit ng cloud embedding
Una, ang EXAIV cloud catalog ay wala pang anumang modelo ng embedding. Pangalawa, ang dami ng embedding requests ay malaki ngunit maliit ang halaga bawat isa, kaya ang paghahatid nito sa cloud ay nagiging pinakamahal na bahagi ng gastos. Pangatlo, ang mga embedding modelo ay ilang daang MB lamang hanggang bahagyang lampas sa isang GB, kaya ang pagpapatakbo nito nang lokal ay halos walang gastusing operasyon at kadalasang mas mabilis.
Hakbang 4: pag-recall at pag-rerank
import numpy as np
query_vec = embed_model.encode([query], normalize_embeddings=True)[0]
scores = np.dot(vectors, query_vec)
top_idx = np.argsort(-scores)[:20]
from sentence_transformers import CrossEncoder
reranker = CrossEncoder("BAAI/bge-reranker-v2-m3")
pairs = [[query, chunks[i]] for i in top_idx]
rerank_scores = reranker.predict(pairs)
final_idx = [top_idx[i] for i in np.argsort(-rerank_scores)[:4]]
Ang reranking ang pinakamataas na leverage na hakbang
Ang vector recall ay isang magaspas na pansala (mura, mabilis, malawak ang saklaw), habang ang cross-encoder reranker ay isang mas pakinsay na pansala (medyo mas mabagal, medyo mas mahal, ngunit mas tumpak nang malaki ang pagkakasunud-sunod). Maraming RAG system ang natatali sa pagkakasunud-sunod ng recall, hindi sa generator model. Ang paggawa ng malinis na top-4 mula sa top-20 ay madalas na mas epektibo kaysa sa pagpapalaki ng generator mula 4B hanggang 7B.
Hakbang 5: pagpapalawig ng query at paglikha ng sagot gamit ang hy4
from openai import OpenAI
client = OpenAI(base_url="http://127.0.0.1:8080/v1", api_key="local")
def rewrite(query: str) -> str:
r = client.chat.completions.create(
model="local-model",
messages=[
{"role": "system", "content": "Isulat muli ang tanong ng user bilang 3 keyword phrase para sa vector search, isa kada linya, walang paliwanag."},
{"role": "user", "content": query},
],
temperature=0.1,
)
return r.choices[0].message.content
def answer(query: str, context_chunks: list[str]) -> str:
context = "\n\n---\n\n".join(context_chunks)
r = client.chat.completions.create(
model="local-model",
messages=[
{"role": "system", "content":
"Ikaw ang knowledge base assistant. Sumagot lamang batay sa ibinigay na materyal. "
"Kung ang materyal ay hindi sumasaklaw dito, sabihin nang malinaw na wala itong binanggit, huwag maghula. "
"Sumagot nang wala pang 300 salita at tandaan ang pinagmulan sa dulo ng pangungusap gamit ang [fragment N]."},
{"role": "user", "content": f"Materyal:\n{context}\n\nTanong: {query}"},
],
temperature=0.2,
)
return r.choices[0].message.content
rewritten = rewrite(query)
print(answer(query, [chunks[i] for i in final_idx]))
Ikandado ang tatlong pananakop sa prompt
Sumagot lamang batay sa materyal, sabihin nang malinaw kapag ang materyal ay hindi sumasaklaw dito, at tandaan ang numero ng fragment. Ang tatlong linya na ito ay makakapagbawas nang malaki sa rate ng pag-imbento ng 4B model. Ang 4B model ay hindi nagdedesisyon kung siya ay dapat mag-imbento, ngunit maaaring saklupan siya ng tagubilin.
Limang pagkakamaling mahaharap mo
Pagkakamali uno: ang paghahati ay sumisira ng kahulugan
Ang sintomas ay ang nakuha na fragment ay walang kabuuan at ang sagot ay naglalaman ng kalahati ng pangungusap. Ayusin sa pamamagitan ng paghahati ayon sa hierarchy ng heading at pagpapanatili ng heading bilang prefix, at pagkatapos ay muling hatiin ayon sa mga hangganan ng pangungusap.
Pagkakamali dalawa: recall lamang na walang reranking
Ang sintomas ay ang tamang dokumento ay nakuha ngunit nasa posisyon 12 at natangay ng top-4 na pansala. Ayusin sa pamamagitan ng pagpapataas ng dami ng recall at pagdaragdag ng reranker, o ang paggamit ng maraming bersyon ng pagpapalawig ng query at pagsasama ng mga resulta.
Pagkakamali tatlo: prompt na walang pananakop
Ang sintomas ay ang modelo ay pinupuno ng training knowledge at patuloy na maging matapang kahit wala sa materyal. Ayusin sa pamamagitan ng explicit na tagubilin na "sabihin lamang kung wala sa materyal", pagtukoy sa numero ng fragment, at pagpapababa ng temperature sa ilalim ng 0.2.
Pagkakamali apat: itinuturing ang recall bilang question answering
Ang sintomas ay ang user ay nagtatanong kung paano gamitin ang isang feature at sumasagot ang modelo ng isang product intro na nagpapaliwanag kung ano ang ginagawa nito. Ayusin sa pamamagitan ng pag-uuri muna ng tanong (fact lookup, how-to, troubleshooting) at paggamit ng magkakaibang prompt template para sa bawat uri.
Pagkakamali lima: sobrang pagpapuno ng konteksto
Ang sintomas ay ang hy4 ay hindi mahanap ang pangunahing pangungusap sa gitna ng malaking dami ng materyal at nagsisimulang ulitin. Sinusuportahan ng hy4 ang 256K na konteksto nang native, ngunit ang pagkakapasuk ay hindi katumbas ng magandang paggamit. Ang isang tawag ay dapat na lamang ay tumanggap ng 4 hanggang 8 na fragment, at ikompres muna kung lumampas doon.
Kailan hindi dapat gamitin ang 4B para sa paglikha
| Sitwasyon | Mas mainam na piliin |
|---|---|
| Kailangan ng pagsasama-sama sa mahigit 5 na pinagmulan | Mas malaking cloud model |
| Ang resulta ay mahabang ulat o sanaysay | Mas malaking cloud model |
| Masamang retrieval at hindi lumilitaw ang materyal | Ayusin ang retrieval, huwag palitan ang generator |
| Maraming tanong-sagot na may mababang latency na kailangan | hy4 o katulad na magaan na modelo |
| Mahabang dokumentong pinagmulan na nangangailangan ng mahabang buod | Mas malakas na long-context model, o unahing buoin nang paahon |
Catatan tambahan bago talaga gamitin
Tatlong bagay na madaling makalimutan kapag lumilipat mula sa pagsubok patungo sa pang-araw-araw na paggamit:
- Magtala ng sukat ng recall. Patakbuhin ang isang set ng mga tanong na pangsubok tuwing magbabago ka ng paraan ng paghahati sa dokumento o pagpapalit ng embedding, dahil ang recall@k ang nagsasabi kung ano ang gumagana.
- Panatilihing masusubaybayan ang mga fragment. Itabi ang heading at landas ng dokumento para sa bawat fragment, upang ang maling sagot ay masubaybayan pabalik sa pinagmulan nito.
- Maglaan ng backup na landas. Para sa panloob na serbisyo, maghanda ng ibang magaan na modelo bilang kapalit kapag abala ang hy4 o nagkakarga muli.
Sa tatlo, ang paglalakbay mula sa pagsubok patungo sa pang-araw-araw na paggamit ay nagiging mas maikli nang malaki.
FAQ
Sapat ba ang 4B model para sa RAG?
Gaano karaming konteksto ang sinusuportahan ng hy4?
Aling embedding model ang dapat gamitin?
Kailangan ba ng reranker?
Paano bawasan ang pag-imbento ng modelo?
Paano iugnay ang lokal na hy4 endpoint sa umiiral na app?
Karagdagang pagbabasa
- Pahina ng modelong hy4 β ispesipikasyon, quantization matrix at kalkulasyon ng memorya
- Tala sa channel na hy4-preview β ang channel na may 1M na konteksto
- Pag-deploy ng hy4 gamit ang GGUF β ang buong mga hakbang para tumakbo ang server
- Pagpapatakbo ng hy4 gamit ang Ollama β pag-uugnay ng lokal na endpoint sa mga development tool
- Open WebUI gamit ang lokal na Hunyuan β self-hosted na interface ng pakikipag-usap
- Gabay sa context engineering β pag-aayos ng impormasyon sa loob ng badyet ng bintana
- Gabay sa pagpili ng embedding model β paano nagkakaiba ang bge, gte, jina, at e5
- Gabay sa pagpili ng hy4 β mga laki at paghahati sa A13B
Mga pinagmulan
Ang bilang ng download at ispesipikasyon ay sumusunod sa mga opisyal na imbakin na may bisa sa kasalukuyan, nakuha noong Nobyembre 2026.