Қарапайым RAG енгізу: қадамдық нұсқаулық
Жаңадан бастаушыларға арналған бұл нұсқаулық қарапайым RAG енгізуінің қалай жұмыс істейтінін түсіндіреді, үздік тәжірибелерді қарастырады және Python, ChromaDB, сондай-ақ Perplexity-нің эмбеддинг және тілдік модельдерін пайдаланып, жұмыс істейтін командалық жол RAG жүйесін құру жолын көрсетеді.

RAG — LLM негізіндегі заманауи инфрақұрылымның маңызды құрамдас бөлігі. Ол AI модельдеріне сыртқы деректерге қол жеткізуге мүмкіндік беріп, галлюцинациялар мен оқыту деректерінің толық болмауы сияқты мәселелерді шешуге көмектеседі. Сондай-ақ компаниялар құпия немесе меншікті ақпараты бар ішкі білім базаларын пайдалана алады.
RAG енгізу өте күрделі болуы мүмкін. Дегенмен қарапайым RAG жүйесін құру таңғаларлықтай оңай. Жаңадан бастаушылар үшін қарапайым архитектура жасау RAG жүйесінің нақты жағдайда қалай жұмыс істейтінін түсінуге көмектеседі және әрі қарайғы эксперименттерге негіз болады.
Бұл мақалада қарапайым RAG енгізуінің схемасын сипаттап, үздік тәжірибелерді қарастырамыз, содан кейін Python, ChromaDB және эмбеддинг пен жауап генерациялауға арналған екі Perplexity моделін пайдаланып, жұмыс істейтін жүйе құрамыз.
Қарапайым RAG енгізу процесі: жалпы шолу
Қарапайым RAG жүйесі үш негізгі құрамдас бөліктен тұрады: оркестратор, ақпарат көзі және LLM. Әдеттегі жұмыс процесінде пайдаланушы промпт енгізеді, ал оркестратор оны қосылған ақпарат көздерінен іздеу үшін өзгертеді. Содан кейін табылған ақпарат бастапқы кіріс контекстіне қосылып, жауап генерациялау үшін LLM-ге жіберіледі.
RAG енгізуін құру кезінде мына қадамдарды ескеру қажет:
- Индекстеу және эмбеддинг: Бұл кезеңде құжаттарыңыз оркестратор іздей алатын ақпарат көзіне түрлендіріледі. Мұның ең кең таралған тәсілдерінің бірі — іздеуге болатын векторлық индекс құру. Құжат фрагменттерін эмбеддингтерге түрлендіру үшін Perplexity-нің арнайы моделін пайдаланамыз. Содан кейін эмбеддингтерді танымал ашық бастапқы кодты векторлық дерекқор ChromaDB-де сақтаймыз.
- Оркестрлеу: Бұл — сыртқы ақпарат көзі (біздің жағдайда векторлық дерекқор) мен LLM арасында орналасқан қолданба. Оркестратор ретінде жұмыс істейтін қарапайым Python скриптін жасаймыз.
- Іздеп алу және генерациялау: Пайдаланушы чат интерфейсі арқылы сұрақ қойғанда, оркестратор оны қабылдап, векторлық іздеу жүргізеді және кеңейтілген кіріс деректерін LLM-ге береді. Арнайы фронтенд құрудың орнына Python оркестраторымызбен байланысу үшін командалық жолды пайдаланамыз.
Үздік тәжірибелер: RAG енгізуін не тиімді етеді?
RAG архитектурасының бірнеше түрі бар және әр қолдану жағдайы әртүрлі тәсілдерді талап етеді. Дегенмен бірқатар үздік тәжірибелер барлық жағдайда қолданылады және дәл, үнемді, масштабталатын әрі қызмет көрсетуге оңай жүйелерді қамтамасыз етеді.
Төмендегі үздік тәжірибелер RAG енгізуінің барлық түріне қатысты:
- Деректерді жүктеу конвейерінің тазалығын қамтамасыз етіңіз: Бастапқы деректеріңіз индекстеуге дейін барынша таза болуы керек. Сондай-ақ мазмұныңызға сәйкес келетін эмбеддинг моделін пайдаланыңыз.
- Гибридті іздеуді пайдаланыңыз: Ең жақсы іздеп алу әдістері — векторлық дерекқордан іздеу, API негізіндегі веб-іздеу, білім графын шолу, кілт сөздер бойынша іздеу немесе басқа әдістер болсын — қолдану жағдайына қарай өзгереді. Шығындарды азайту үшін дұрыс үйлесімді таңдау маңызды.
- Жүйеңізді бағалаңыз: Енгізгеннен кейін жүйені үш негізгі көрсеткіш бойынша бағалау керек: дәлдік, релеванттылық және кідіріс. Дәлдік — фактілердің дұрыстығы, релеванттылық — табылған ақпараттың пайдаланушы сұрауларына сәйкестігі, ал кідіріс — ақпараттың қаншалықты жылдам іздеп алынатыны.
- Ақпаратты қауіпсіз өңдеңіз: Егер RAG жүйеңіз жеке ішкі ақпаратқа сүйенсе, оның қауіпсіз сақталуын және жүйе интерфейсіне қолжетімділіктің басқарылуын қамтамасыз етіңіз. API кілттерін ешқашан ешкіммен бөліспеу керек.
Қарапайым RAG енгізу: 7 қадамдық нұсқаулық
Бұл нұсқаулықта бір құжат туралы сұрақтарға жауап беретін командалық жол қолданбасын құрамыз. Python, ChromaDB және Perplexity API құралдарын пайдаланамыз.
Мақсат — өндіріске дайын RAG жүйесін құру емес. Керісінше, бұл — қарапайым RAG архитектурасының іс жүзінде қалай жұмыс істейтінін көрсетуге арналған, жаңадан бастаушыларға ыңғайлы нұсқаулық.
1-қадам: Бағдарламалық жасақтаманы орнату
Компьютеріңізде мыналардың орнатылғанына және Perplexity API тіркелгіңіз бар екеніне көз жеткізіңіз:
- Python: Бұл — эмбеддинг моделі, ChromaDB және Perplexity арасындағы деректер ағынын үйлестіретін оркестраторды құру үшін пайдаланатын бағдарламалау тілі.
- Visual Studio: Код редакторы ретінде Visual Studio-ны пайдаланамыз. Орнатқаннан кейін Extensions панелін ашып, Python кеңейтімін жүктеп алыңыз.
- Perplexity API тіркелгісі: Perplexity эмбеддинг моделін (деректеріңізді векторлық эмбеддингтерге түрлендіреді) де, кеңейтілген промптты өңдейтін LLM-ді де ұсынады. Бұл үшін ақылы тіркелгі қажет емес, бірақ аз ғана кредит жұмсалады.
2-қадам: Жоба қалтасын жасау
Алдымен rag-project деп аталатын қалта жасап, оны VS Code-да File > Open Folder тармағын таңдау арқылы ашыңыз. Содан кейін кіріктірілген терминалды Terminal > New Terminal арқылы ашыңыз.
Виртуалды Python ортасын жасау үшін мынаны енгізіңіз:
py -3.12 -m venv .venvЕнді төрт Python кітапханасын орнату керек: perplexityai, chromadb, python-dotenv және numpy. Perplexity SDK Perplexity модельдеріне API арқылы қосылуға мүмкіндік береді. ChromaDB векторлық дерекқорды құрады және жергілікті түрде жұмыс істейді. Python-dotenv API кілттеріңізді жергілікті файлдан қауіпсіз жүктейді, ал NumPy деректерді жүктеу процесінде қажет.
Оларды келесі командамен орнатыңыз:
.\.venv\Scripts\python.exe -m pip install perplexityai chromadb python-dotenv numpy3-қадам: Файлдарды баптау
rag-project (жоба түбірі) қалтасына Explorer бүйірлік тақтасындағы New File… пәрменін таңдау арқылы мына файлдарды қосыңыз:
- index.py: Бұл — құжатыңызды индекстейтін қолданба. Қосымша мәтін қосу үшін оны қайта іске қоса аласыз.
- rag.py: Бұл — оркестратор рөлін атқаратын Python қолданбасы.
- document.txt: Мұнда векторлық дерекқорға түрлендіретін құжаттамаңыз болады.
- .env: Мұнда Perplexity API кілтіңізді сақтайсыз.
.env файлына мынаны енгізіңіз:
PERPLEXITY_API_KEY=your_api_key_hereyour_api_key_here мәнін нақты кілтіңізбен ауыстырыңыз. Ол үшін Perplexity API Console басты бақылау тақтасына өтіп, Create an API key тармағын таңдаңыз. Бұл API кілтін құпия ұстаңыз.
Біз екі модельді пайдаланамыз: құжаттаманы ChromaDB-ге жүктемес бұрын эмбеддинг жасау үшін Perplexity-нің pplx-embed-v1-0.6b моделін және табылған ақпаратты өңдейтін GPT-5.6-Luna моделін (Perplexity API арқылы қолжетімді).
document.txt файлына RAG конвейеріңіз іздеп алатын мәтінді қосыңыз. Егер қолыңызда құжат болмаса, бұл нұсқаулық үшін Project Gutenberg сайтындағы Уильям Блейктің Songs of Innocence and of Experience жинағын пайдаланыңыз. Бұл — қоғамдық игілікке жататын, қысқа әрі түсінуге оңай мәтін.
4-қадам: Индекстеу бағдарламасын жазу
Төмендегі кодты көшіріп, index.py файлына қойыңыз. Әр тақырыпша кодтың келесі бөлігі не істейтінін қысқаша түсіндіреді. Бұл бағдарлама Perplexity-нің pplx-embed-v1-0.6b эмбеддинг моделі мен NumPy кітапханасын пайдаланып, бастапқы материалыңызды векторлық эмбеддингтерге түрлендіреді және оларды ChromaDB дерекқорында сақтайды.
Бағдарлама мыналарды орындайды:
- document.txt файлын ашады.
- Мәтінді бір-бірімен қабаттасатын фрагменттерге бөледі.
- Осы фрагменттерді Perplexity-нің pplx-embed-v1-0.6b эмбеддинг моделіне жібереді.
- Қайтарылған векторларды есептеу функцияларынан тұратын Python кітапханасы NumPy көмегімен декодтап, қалыпқа келтіреді.
- Векторлар мен бастапқы фрагменттерді ChromaDB дерекқорында сақтайды (ол жоба каталогыңызда пайда болады).
Бағдарлама әр іске қосылған сайын құжатыңызды қайта индекстемейтіндей бапталған. Егер document.txt файлына ақпарат қоссаңыз, ол тек жаңа мәтінге эмбеддинг жасайды.
from pathlib import Path
from collections import defaultdict, deque
from hashlib import sha256
import base64
import numpy as np
import chromadb
from dotenv import load_dotenv
from perplexity import Perplexity
# 1. Connect to Perplexity and ChromaDB
load_dotenv()
ai = Perplexity()
db = chromadb.PersistentClient(path="./rag_database_perplexity")
collection = db.get_or_create_collection(
name="documents",
metadata={"hnsw:space": "cosine"}
)
# Convert Perplexity's encoded embeddings into numerical vectors
def decode_embedding(encoded):
vector = np.frombuffer(base64.b64decode(encoded), dtype=np.int8).astype(np.float32)
norm = np.linalg.norm(vector)
if norm == 0:
raise ValueError("Received a zero-length embedding vector.")
return (vector / norm).tolist()
# 2. Read the document and split it into chunks
text = Path("document.txt").read_text(encoding="utf-8")
words = text.split()
chunk_size = 180
overlap = 30
step = chunk_size - overlap
chunks = [" ".join(words[i:i + chunk_size]) for i in range(0, len(words), step)]
if not chunks:
raise ValueError("document.txt is empty.")
# 3. Retrieve the chunks already stored in ChromaDB
existing = collection.get(include=["documents"])
stored_chunks = defaultdict(deque)
existing_ids = set(existing["ids"])
for chunk_id, document in zip(existing["ids"], existing["documents"]):
stored_chunks[document].append(chunk_id)
# 4. Identify unchanged and new chunks
new_chunks = []
new_ids = []
kept_ids = set()
unchanged = 0
for chunk in chunks:
if stored_chunks[chunk]:
chunk_id = stored_chunks[chunk].popleft()
kept_ids.add(chunk_id)
unchanged += 1
else:
chunk_hash = sha256(chunk.encode("utf-8")).hexdigest()
chunk_id = f"chunk-{chunk_hash}"
suffix = 1
while chunk_id in existing_ids or chunk_id in kept_ids or chunk_id in new_ids:
chunk_id = f"chunk-{chunk_hash}-{suffix}"
suffix += 1
new_chunks.append(chunk)
new_ids.append(chunk_id)
kept_ids.add(chunk_id)
# 5. Generate embeddings in batches of up to 100 chunks
batch_size = 100
for i in range(0, len(new_chunks), batch_size):
batch_chunks = new_chunks[i:i + batch_size]
batch_ids = new_ids[i:i + batch_size]
embeddings = ai.embeddings.create(
model="pplx-embed-v1-0.6b",
input=batch_chunks,
encoding_format="base64_int8"
)
vectors = [decode_embedding(item.embedding) for item in embeddings.data]
# 6. Store each batch in ChromaDB
collection.upsert(
ids=batch_ids,
documents=batch_chunks,
embeddings=vectors
)
print(f"Indexed batch {(i // batch_size) + 1}")
# 7. Remove outdated chunks
old_ids = [chunk_id for chunk_id in existing["ids"] if chunk_id not in kept_ids]
if old_ids:
collection.delete(ids=old_ids)
# 8. Display indexing results
print("Indexing complete!")
print("Unchanged chunks:", unchanged)
print("New or modified chunks:", len(new_chunks))
print("Removed chunks:", len(old_ids))
print("Total stored chunks:", collection.count())5-қадам. RAG жүйесіне арналған оркестраторды жазу
Төмендегі кодты көшіріп, rag.py файлына қойыңыз. Бұл — Perplexity SDK мен ChromaDB-нің жергілікті векторлық дерекқор функцияларын пайдаланатын толық, бірақ ең қарапайым RAG енгізуі.
Бағдарламаны іске қосқанда мыналар орындалады:
- Perplexity-ге және жаңа ChromaDB дерекқорыңызға қосылады.
- Дерекқорда индекстелген құжаттардың бар-жоғын тексереді.
- Пайдаланушыдан сұрақ қабылдайды.
- Сұрақты Perplexity-нің эмбеддинг моделіне жібереді.
- Алынған эмбеддингті NumPy көмегімен декодтап, қалыпқа келтіреді.
- ChromaDB-ден ең ұқсас үш құжат фрагментін іздейді.
- Табылған фрагменттер мен пайдаланушы сұрағын қамтитын промпт құрастырады.
- Промптты Perplexity Agent API арқылы GPT-5.6 Luna моделіне жібереді.
- Жауапты көрсетіп, келесі сұрақты күтеді.
import base64
import numpy as np
import chromadb
from dotenv import load_dotenv
from perplexity import Perplexity
# 1. Connect to Perplexity and the existing ChromaDB database
load_dotenv()
ai = Perplexity()
db = chromadb.PersistentClient(path="./rag_database_perplexity")
collection = db.get_collection("documents")
# Convert Perplexity's encoded embeddings into numerical vectors
def decode_embedding(encoded):
vector = np.frombuffer(base64.b64decode(encoded), dtype=np.int8).astype(np.float32)
norm = np.linalg.norm(vector)
if norm == 0:
raise ValueError("Received a zero-length embedding vector.")
return (vector / norm).tolist()
# 2. Check that the database contains indexed documents
count = collection.count()
if count == 0:
raise ValueError("The database is empty. Run index.py first.")
print("Connected to existing ChromaDB database.")
print("Stored chunks:", count)
# 3. Accept questions from the user
while True:
question = input("\nAsk a question (or type exit): ")
if question.lower().strip() == "exit":
break
if not question.strip():
continue
# 4. Convert the question into a Perplexity embedding
question_response = ai.embeddings.create(
model="pplx-embed-v1-0.6b",
input=[question],
encoding_format="base64_int8"
)
question_vector = decode_embedding(question_response.data[0].embedding)
# 5. Retrieve the most similar document chunks from ChromaDB
results = collection.query(
query_embeddings=[question_vector],
n_results=min(3, count)
)
context = "\n\n".join(results["documents"][0])
# 6. Construct a prompt and send it to the fixed LLM
response = ai.responses.create(
model="openai/gpt-5.6-luna",
instructions=(
"Answer using only the supplied document excerpts. "
"Do not use external information. "
"If the answer is not present, say you don't know."
),
input=f"Document excerpts:\n{context}\n\nQuestion: {question}"
)
# 7. Display the answer
print("\nAnswer:\n", response.output_text)6-қадам: Қолданбаларды іске қосу
document.txt ішіндегі мазмұнға эмбеддинг жасау үшін VS Code PowerShell терминалына мынаны енгізіңіз:
.\.venv\Scripts\python.exe index.pyҚұжатыңыз сәтті индекстелсе, мынаған ұқсас нәтижені көресіз:
Indexing complete!
Unchanged chunks: 0
New or modified chunks: 58
Removed chunks: 0
Total stored chunks: 58Енді негізгі оркестратор қолданбасын іске қосатын кез келді. Мына команданы енгізіңіз:
.\.venv\Scripts\python.exe rag.pyСәтті іске қосылса, мынаны көресіз:
Connected to existing ChromaDB database.
Stored chunks: 58
Ask a question (or type exit): Енді өзіңіз жасаған векторлық дерекқорға сүйенетін сұрақтар қоя аласыз, мысалы:
Ask a question (or type exit): What animals does William Blake talk about?
Answer: The excerpts mention sheep, lambs, birds, beasts, wolves, tigers, and a lion.7-қадам: Не құрғаныңызды түсіну
Сіз құрған жүйеде кез келген RAG архитектурасына тән екі негізгі конвейер бар: индекстеу немесе «деректерді жүктеу» конвейері және іздеп алу мен генерациялау конвейері.
Қарапайым RAG енгізуіңіз енді мыналардың барлығын орындайды:
- Векторлық сақтау: Эмбеддингтер білім файлыңыз негізінде жергілікті ортаңыздағы ChromaDB дерекқорында сақталады.
- Инкременттік индекстеу: Өзгермеген құжат фрагменттеріне қайта эмбеддинг жасалмайды, ал құжатты кез келген уақытта жаңарта аласыз.
- Семантикалық іздеп алу: ChromaDB фрагменттерді векторлық ұқсастық бойынша іздеп алады (оны оркестратор бастайды).
- Дереккөзге негізделген жауап генерациялау: LLM табылған үзінділерді контекст ретінде алып, оларды жауапқа енгізеді.
- Индекстеу мен сұрау салудың тәуелсіздігі: Білім файлыңыздағы бүкіл мәтінді қайта өңдемей-ақ сұрақтар қоя аласыз.
- API негізіндегі модель қосылымы: Барлық жауаптар компьютеріңізде жұмыс істейтін модель арқылы емес, Perplexity арқылы GPT-5.6 Luna көмегімен генерацияланады.
Келесі қадамдар: бұл енгізуді қалай дамытуға болады
Бұл нұсқаулықтың мақсаты — қарапайым әрі түсінікті енгізу құру. Ол заманауи жүйелерде кездесетін RAG архитектурасының кейбір негізгі құрамдас бөліктерін қамтиды. Егер әрі қарай барғыңыз келсе, оны дамытудың түрлі жолдары бар.
Енгізуіңіздің ауқымын кеңейтуге арналған бірнеше идея:
- LangChain-мен эксперимент жасаңыз: LangChain — ең танымал ашық бастапқы кодты оркестрлеу фреймворктерінің бірі. Онда күрделі RAG конвейерлерін іске қоса алатын қолданбалар құруға арналған дайын құрамдас бөліктер бар.
- Іздеу функцияларын кеңейтіңіз: Тығыз векторлық іздеуді BM25 сияқты лексикалық (кілт сөздер бойынша) іздеумен біріктіріңіз. Perplexity Search API арқылы веб-іздеуді қосу жауаптарды өзекті деректерге негіздеуге де мүмкіндік береді.
- Қайта рейтингтеу моделін қосыңыз: Табылған үзінділерді бастапқы промптқа қатысты рейтингтеп, LLM-ге берілетін кіріс контекстіне енгізу үшін ең релевантты үзінділерді таңдайтын қайта рейтингтеу моделін біріктіріңіз.
- Бейімделгіш RAG жүйесін құрыңыз: Бейімделгіш RAG модульдік RAG жүйесінде қай іздеп алу әдісін қолдану керектігін анықтау үшін LLM-ді немесе классификаторды (оркестратордың ішіндегі құрамдас бөлік) пайдаланады. Мұндай жүйені құру — күрделірек RAG енгізулерін зерттеудің жақсы тәсілі.
Мұның бәрі күрделі көрінуі мүмкін болса да, Perplexity сияқты кеңінен қолданылатын AI платформалары бағдарламалау бойынша озық көмек көрсете алатынын есте сақтаңыз. Олар жеке жобалар мен эксперименттер үшін тамаша, ал шығындарды салыстырмалы түрде төмен деңгейде ұстауға болады.
Ескертпе: Бұл нұсқаулықта GPT-5.6 Luna пайдаланылады. Модельдердің қолжетімділігі өзгеруі мүмкін, сондықтан API шақыруын жаңарту қажет болуы мүмкін.