aidoc.uz

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.

INDEKSLASH — bir marta
hujjatlar → bo'laklar → vektorlar → baza
QIDIRISH + GENERATSIYA — har so'rovda
so'rov → o'xshash bo'laklar → LLM → javob
RAG'ning ikki bosqichi

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.

Bilim (knowledge)
  • Statik hujjatlar — PDF, qo'llanma, ma'lumot
  • Bir marta indekslanadi
  • Bo'laklarga bo'linadi (uzun hujjatlar)
  • Kamdan-kam o'zgaradi
Xotira (memory)
  • 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.

Sensor xotira
kirish ma'lumotini qisqa ushlaydi — rasm, ovoz. Multimodal RAG
lahzalik
Qisqa muddatli (ishchi)
hozirgi suhbat konteksti — LLM oynasida
sessiya
Uzoq muddatli
doimiy bilim va faktlar — tashqi bazada
doimiy
Xotira turlari va ularning agentdagi roli

Uzoq muddatli xotira yana uch turga bo'linadi:

1
Semantik xotira — faktlar
Ma'no, tushunchalar, faktlar. «Foydalanuvchi vaqt sayohati filmlarini yoqtiradi». Global yoki lokal bilim.
2
Epizodik xotira — voqealar
Hayotdagi voqealar, tajribalar. «Foydalanuvchi kecha X film haqida so'ragan edi». Vaqtga bog'liq.
3
Protsedural xotira — jarayon
Qadamlar, 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:

"Qaysi filmni ko'ray?"
foydalanuvchi savoli
Semantik ajratish
«foydalanuvchi qanday film yoqtiradi?» — kerakli savolni chiqaradi
Vektor bazadan qidirish
chiqarilgan savol bilan
«foydalanuvchi vaqt sayohati filmlarini yoqtiradi»
topilgan xotira
LLM javob beradi
shu xotiraga tayanib
Semantik xotira: savoldan kerakli so'rovlarni ajratib, keyin qidiradi

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):

ko'p o'xshash xotira
«vaqt sayohati yoqadi», «Back to the Future ko'rgan»...
k-means klasterlash
o'xshashlar bir guruhga
xulosalash
«foydalanuvchi vaqt sayohati janrini yoqtiradi»
Xotira siqish: o'xshashlarni klasterlab, xulosalash
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 siqilgan
Amaliy topshiriq

Xotirali chatbot quring

Foydalanuvchini eslab qoladigan chatbot quring.

Talablar:

  1. Chroma bilan xotira bazasi
  2. Har suhbatdan keyin fakt ajratish (LLM bilan)
  3. Faktni bazaga saqlash
  4. 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#

Yodda saqlang
  • 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.