3-qism · Ilg'or imkoniyatlar·08-bob
Agent xotirasi va bilimi
RAG asoslaridan agent xotirasigacha. Vektor o'xshashlik qidiruvi, LangChain bilan hujjat bo'lish, xotira turlari (sensor, qisqa, uzoq muddatli, semantik, epizodik) va xotira siqish.
Agent gapira oladi, harakat qila oladi. Lekin topgan narsasini saqlay olmaydi va o'tgan suhbatlarni eslay olmaydi.
Bu bob agentga xotira beradi. RAG asoslarini tez ko'rib o'tamiz (chunki oldingi kitobda chuqur o'rgangansiz), keyin agent xotirasining turlariga o'tamiz — bu kitobning o'ziga xos qismi.
RAG: qisqa takrorlash#
Retrieval-Augmented Generation — modelga javob berishdan oldin kerakli hujjatlarni topib berish.
Vektor o'xshashlik qidiruvi#
Asosini kodda ko'ramiz:
import chromadb
from chromadb.utils import embedding_functions
# Chroma — sodda vektor bazasi
client = chromadb.Client()
# Embedding funksiyasi
embedder = embedding_functions.SentenceTransformerEmbeddingFunction(
model_name="all-MiniLM-L6-v2"
)
kolleksiya = client.create_collection(name="hujjatlar", embedding_function=embedder)
# Hujjatlarni qo'shamiz — Chroma ularni avtomatik vektorga aylantiradi
kolleksiya.add(
documents=[
"Python — sodda sintaksisli dasturlash tili",
"JavaScript brauzerda ishlaydi",
"SQL ma'lumotlar bazasi so'rovlari uchun",
],
ids=["1", "2", "3"],
)
# Qidiruv
natija = kolleksiya.query(query_texts=["veb-dasturlash tili"], n_results=2)
print(natija["documents"])
# [['JavaScript brauzerda ishlaydi', 'Python — sodda sintaksisli...']]"veb-dasturlash" so'zi hech qaysi hujjatda yo'q, lekin model ma'noni tushundi va
JavaScript'ni topdi.
LangChain bilan hujjatlarni bo'lish#
Amalda hujjatlar uzun — ularni bo'lish kerak:
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_community.document_loaders import PyPDFLoader
# PDF yuklaymiz
loader = PyPDFLoader("hujjat.pdf")
sahifalar = loader.load()
# Bo'laklarga bo'lamiz
bolgich = RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=200,
separators=["\n\n", "\n", ". ", " ", ""], # tartib bo'yicha sinaydi
)
bolaklar = bolgich.split_documents(sahifalar)
print(f"{len(sahifalar)} sahifa → {len(bolaklar)} bo'lak")LangChain token bo'yicha ham bo'la oladi:
from langchain_text_splitters import TokenTextSplitter
token_bolgich = TokenTextSplitter(chunk_size=256, chunk_overlap=20)
bolaklar = token_bolgich.split_documents(sahifalar)Agent xotirasi: bilim va xotira farqi#
Bu — kitobning muhim ajratmasi. Bilim va xotira bir xil qidiruv mexanizmini ishlatadi, lekin yangilanishida farq qiladi.
- Statik hujjatlar — PDF, qo'llanma, ma'lumot
- Bir marta indekslanadi
- Bo'laklarga bo'linadi (uzun hujjatlar)
- Kamdan-kam o'zgaradi
- Dinamik — suhbatlar, faktlar, afzalliklar
- Doim yangilanadi va qo'shiladi
- Odatda bo'lish kerak emas (kichik)
- Vaqt o'tishi bilan o'sadi
Ikkalasi ham vektor bazada saqlanadi va o'xshashlik bilan topiladi. Farq — bilim statik, xotira dinamik. Xotira suhbatdan avtomatik to'planadi.
Xotira turlari#
Agent xotirasi inson xotirasidan nusxa oladi. Psixologiya xotirani turlarga ajratadi — bularning har biri agentda o'z o'rniga ega.
Uzoq muddatli xotira yana uch turga bo'linadi:
- 1
- Semantik xotira — faktlarMa'no, tushunchalar, faktlar. «Foydalanuvchi vaqt sayohati filmlarini yoqtiradi». Global yoki lokal bilim.
- 2
- Epizodik xotira — voqealarHayotdagi voqealar, tajribalar. «Foydalanuvchi kecha X film haqida so'ragan edi». Vaqtga bog'liq.
- 3
- Protsedural xotira — jarayonQadamlar, ko'nikmalar. «Buyurtma qanday joylashtiriladi». Agentda bu ko'pincha ASBOB va harakat sifatida ifodalanadi.
Semantik xotira: qanday ishlaydi#
Oddiy xotiradan farqi — kirishni semantik ishlov qadami:
Farq nozik, lekin muhim: oddiy RAG savolni to'g'ridan-to'g'ri qidiradi. Semantik xotira avval savoldan kerakli ma'lumot turini ajratadi, keyin qidiradi.
def semantik_xotira(savol, xotira_bazasi, client):
# 1. Savoldan kerakli xotira savolini ajratamiz
ajrat = client.chat.completions.create(
model="gpt-4-turbo",
messages=[{
"role": "user",
"content": f"Foydalanuvchi so'rovi: '{savol}'. "
f"Bu so'rovga javob berish uchun foydalanuvchi haqida "
f"qanday ma'lumot kerak? Faqat qidiruv so'rovini yoz.",
}],
)
xotira_sorovi = ajrat.choices[0].message.content
# 2. Shu so'rov bilan xotiradan qidiramiz
return xotira_bazasi.query(query_texts=[xotira_sorovi], n_results=3)Xotirani siqish#
Bizning xotira kabi, agent xotirasi ham vaqt o'tishi bilan ortiqcha ma'lumot bilan to'ladi. Bir xil fakt turli so'zlar bilan takrorlanadi.
Yechim — siqish (compression):
from sklearn.cluster import KMeans
import numpy as np
def xotirani_siq(xotiralar, vektorlar, client, klaster_soni=5):
"""O'xshash xotiralarni guruhlab, har guruhni xulosalaydi."""
# 1. Klasterlash
kmeans = KMeans(n_clusters=klaster_soni)
yorliqlar = kmeans.fit_predict(vektorlar)
siqilgan = []
for k in range(klaster_soni):
guruh = [xotiralar[i] for i in range(len(xotiralar)) if yorliqlar[i] == k]
if not guruh:
continue
# 2. Har guruhni xulosalaymiz
xulosa = client.chat.completions.create(
model="gpt-4-turbo",
messages=[{
"role": "user",
"content": f"Quyidagi o'xshash xotiralarni bitta ixcham "
f"faktga birlashtir:\n\n" + "\n".join(guruh),
}],
)
siqilgan.append(xulosa.choices[0].message.content)
return siqilganXotirali chatbot quring
Foydalanuvchini eslab qoladigan chatbot quring.
Talablar:
- Chroma bilan xotira bazasi
- Har suhbatdan keyin fakt ajratish (LLM bilan)
- Faktni bazaga saqlash
- Yangi savolda avval xotiradan qidirib, keyin javob berish
Asosiy sinov:
- 1-suhbat: "Men vaqt sayohati filmlarini yoqtiraman"
- 2-suhbat (yangi sessiya): "Menga film tavsiya qil"
- Agent oldingi afzallikni eslaydimi?
Bonus: 10+ o'xshash xotira yig'ib, k-means bilan siqing. Siqilgan xotira hali ham foydalimi?
Maslahatni ko'rsatish
pip install chromadb openai sentence-transformers Bosqichlar: 1. Chroma bilan xotira bazasi yarating 2. Har suhbatdan keyin fakt ajrating: def fakt_ajrat(suhbat, client): j = client.chat.completions.create( model='gpt-4-turbo', messages=[{'role':'user','content': f'Bu suhbatdan foydalanuvchi haqida eslab qolishga ' f'arziydigan faktlarni ajrat:\n{suhbat}'}]) return j.choices[0].message.content 3. Faktni xotira bazasiga saqlang 4. Yangi savolda avval xotiradan qidiring, keyin javob bering: xotiralar = baza.query(query_texts=[savol], n_results=3) kontekst = 'Eslab qolingan: ' + str(xotiralar) # kontekstni system message'ga qo'shing Sinang: - 1-suhbat: «Men vaqt sayohati filmlarini yoqtiraman» - 2-suhbat (yangi sessiya): «Menga film tavsiya qil» → agent oldingi afzallikni ESLAYDIMI? Bonus: 10+ o'xshash xotira yig'ib, k-means bilan siqing.
Xulosa#
- 01RAG bilim beradi, xotira esa dinamik. Ikkalasi ham vektor bazada, lekin xotira suhbatdan avtomatik to'planadi va o'sadi.
- 02Token bo'yicha bo'lish bo'lak hajmini aniq boshqaradi — o'zbekcha matn uchun ayniqsa muhim, chunki so'z ko'p token yeydi.
- 03Xotira turlari: sensor (lahzalik), qisqa muddatli (sessiya), uzoq muddatli (doimiy). Uzoq muddatli — semantik, epizodik, protsedural.
- 04Semantik xotira savoldan avval kerakli ma'lumot turini ajratadi, keyin qidiradi. Bu oddiy RAG'dan aniqroq natija beradi.
- 05Suhbat xotiraga aylanadi — agent har muloqotdan o'rganadi. Bu shaxsiylashuvning asosi.
- 06Xotirani siqish (k-means + xulosalash) ortiqchalikni tozalaydi. Semantik xotira uchun foydali, epizodik uchun ehtiyotkorlik bilan — detallar yo'qoladi.
Keyingi bobda prompt flow bilan promptlarni tizimli boshqarishni ko'ramiz: profillarni baholash, rubrikalar va grounding — promptlarni "his-tuyg'u" bilan emas, o'lchov bilan yaxshilash.