aidoc.uz

2-qism · Agentlarni qurish·07-bob

Agent platformasini yig'ish

Streamlit bilan chat ilovasi qurish, oqim (streaming), sessiya holati, profil va persona tizimi. Butun agent platformasini komponentlardan yig'ish.

Endi hamma narsani birlashtiramiz. Bu bobda to'liq agent platformasi quramiz — foydalanuvchi bilan gaplashadigan, profillar tanlanadigan, asboblarga ega ishlaydigan ilova.

Buning uchun Streamlit ishlatamiz — Python bilan tez veb-interfeys quradigan vosita.

Streamlit: Python'da veb-interfeys#

Streamlit — mashina o'rganish dashboardlari va prototiplar uchun. U ilovani to'liq Pythonda yozish imkonini beradi va zamonaviy React interfeysini yaratadi.

Chat ilovasi#

Sessiya holati#

Muhim tushuncha: Streamlit ilova holatsiz (stateless). Foydalanuvchi biror narsani bosganda butun skript qaytadan ishlaydi.

Suhbat tarixini saqlash uchun session state kerak:

import streamlit as st
from dotenv import load_dotenv
from openai import OpenAI
 
load_dotenv()
st.title("ChatGPT klonu")
 
client = OpenAI()
 
# Model sozlamasini session state'da saqlaymiz
if "model" not in st.session_state:
    st.session_state["model"] = "gpt-4-turbo"
 
# Xabarlar tarixi
if "messages" not in st.session_state:
    st.session_state["messages"] = []
 
# Mavjud xabarlarni ko'rsatamiz
for message in st.session_state["messages"]:
    with st.chat_message(message["role"]):
        st.markdown(message["content"])

Foydalanuvchi kiritishi#

# Walrus operatori (:=) — kiritilgan matnni bir vaqtda o'zgaruvchiga oladi va tekshiradi
if prompt := st.chat_input("Nima kerak?"):
    # Foydalanuvchi xabarini saqlaymiz va ko'rsatamiz
    st.session_state.messages.append({"role": "user", "content": prompt})
    with st.chat_message("user"):
        st.markdown(prompt)
 
    # Model javobini olamiz
    with st.spinner("Assistant o'ylayapti..."):
        with st.chat_message("assistant"):
            javob = client.chat.completions.create(
                model=st.session_state["model"],
                messages=[
                    {"role": m["role"], "content": m["content"]}
                    for m in st.session_state.messages     # BUTUN tarix
                ],
            )
            matn = javob.choices[0].message.content
            st.markdown(matn)
 
    # Javobni tarixga qo'shamiz
    st.session_state.messages.append({"role": "assistant", "content": matn})

Oqim (streaming)#

Uzun javoblarni jonli ko'rsatish — foydalanuvchi tajribasini sezilarli yaxshilaydi:

if prompt := st.chat_input("Nima kerak?"):
    st.session_state.messages.append({"role": "user", "content": prompt})
 
    with st.chat_message("assistant"):
        oqim = client.chat.completions.create(
            model=st.session_state["model"],
            messages=[{"role": m["role"], "content": m["content"]}
                      for m in st.session_state.messages],
            stream=True,                              # OQIM yoqildi
        )
        # st.write_stream oqimni avtomatik jonli ko'rsatadi
        matn = st.write_stream(oqim)
 
    st.session_state.messages.append({"role": "assistant", "content": matn})

st.write_stream — Streamlit'ning tayyor funksiyasi, oqimni jonli chiqaradi. Foydalanuvchi javobni yozilayotgandek ko'radi.


Platforma arxitekturasi#

Kitob Nexus degan agent platformasini quradi. Uning tuzilishi — bizga muhim, chunki u 1-bobdagi besh komponentni amalda birlashtiradi.

Streamlit interfeys
foydalanuvchi bilan chat
Chat tizimi
suhbatni boshqaradi
Agent Manager
agent profillari (YAML fayllar)
Action Manager
semantik va tabiiy funksiyalar
Profile Manager
persona va profillar
Ma'lumotlar bazasi
suhbatlar, foydalanuvchilar, tarix
Agent platformasi arxitekturasi: komponentlar plaginlar sifatida

Muhim g'oya: komponentlar plagin sifatida dinamik topiladi. Ya'ni yangi agent, yangi harakat qo'shish uchun kodni o'zgartirish shart emas — faqat yangi YAML fayl yoki funksiya qo'shiladi.

Profil YAML sifatida#

Agent profili YAML faylda saqlanadi — persona, maqsad, asboblar:

# python_coder.yaml
name: "Python dasturchisi"
persona: |
  Siz tajribali Python dasturchisiz.
  Toza, PEP 8 uslubidagi kod yozasiz.
  Har funksiyaga docstring qo'shasiz.
goal: "Foydalanuvchi so'roviga ishlaydigan Python kodi yozish"
actions:
  - code_execution
  - file_read

Barcha komponentlarni birlashtirish#

Endi 1-bobdagi besh komponent qanday birlashishini ko'ramiz:

PROFIL — agent kim?
YAML fayl: persona, maqsad
HARAKAT — nima qila oladi?
semantik + tabiiy funksiyalar (5-bob)
XOTIRA — nimani eslaydi?
ma'lumotlar bazasi + RAG (8-bob)
FIKRLASH — qanday qaror qiladi?
prompt strategiyalari (10-bob)
REJA — qanday o'rganadi?
rejalashtirish (11-bob)
Platforma: besh komponent bir tizimda

Platformaning kuchi — bu komponentlarni erkin birlashtirish. Foydalanuvchi:

  • Turli profillarni tanlaydi
  • Turli harakatlar qo'shadi
  • Turli kombinatsiyalarni sinaydi

Bu — 1-bobdagi "AI interfeys" g'oyasining amaliy timsoli: hamma narsa modulli, tabiiy til orqali bog'langan.

Amaliy topshiriq

O'z chat platformangizni quring

Streamlit bilan to'liq chat platformasi quring. Bosqichma-bosqich:

  1. Oddiy chat — session state bilan suhbat tarixi
  2. Oqim — stream=True bilan jonli javob
  3. Profil tanlash — sidebar'da bir necha persona (dasturchi, o'qituvchi, tarjimon)
  4. Tozalash tugmasi — suhbatni qayta boshlash

Talablar:

  • Tanlangan profil system xabariga aylansin
  • Profil o'zgarsa, agent xatti-harakati o'zgarsin
  • Suhbat tarixi saqlanib qolsin

Bonus: profillarni YAML fayllardan yuklang — yangi agent qo'shish uchun faqat yangi fayl kerak bo'lsin, kod emas.

Maslahatni ko'rsatish

pip install streamlit openai python-dotenv Bosqichma-bosqich: 1. Oddiy chat (yuqoridagi kod) — session state bilan 2. Oqim qo'shing (stream=True + st.write_stream) 3. Sidebar'da profil tanlash: with st.sidebar: profil = st.selectbox('Profil', ['Dasturchi', 'O'qituvchi', 'Tarjimon']) PERSONALAR = { 'Dasturchi': 'Siz Python dasturchisiz...', 'O'qituvchi': 'Siz sabrli o'qituvchisiz...', 'Tarjimon': 'Siz professional tarjimonsiz...', } 4. Tanlangan personani system message qiling 5. 'Tozalash' tugmasi: st.session_state.messages = [] Ishga tushirish: streamlit run app.py Bonus: profillarni YAML fayllardan yuklang (koddan ajrating). Yangi profil qo'shish uchun faqat yangi YAML fayl kerak bo'lsin.


Xulosa#

Yodda saqlang
  • 01Streamlit Python'da tez veb-interfeys quradi — prototip uchun ajoyib. Jiddiy mahsulot uchun FastAPI'ga o'ting.
  • 02Streamlit ilova holatsiz — har o'zgarishda skript qayta ishlaydi. session_state yagona saqlanadigan joy, lekin faqat sessiya davomida.
  • 03Oqim (stream=True + st.write_stream) foydalanuvchi tajribasini sezilarli yaxshilaydi — javob jonli yoziladi.
  • 04Profillarni YAML fayllarda saqlang, koddan ajrating. Yangi agent qo'shish uchun kod o'zgartirilmaydi.
  • 05Komponentlar plagin sifatida dinamik topilishi kerak — modulli arxitektura yangi agent va harakatlarni oson qo'shish imkonini beradi.
  • 06Platforma 1-bobdagi besh komponentni birlashtiradi. Kuch — ularni erkin kombinatsiya qilishda.

Keyingi bobda agentning eng muhim qismiga o'tamiz: xotira va bilim. RAG, vektor qidiruv, hujjat indekslash va agent xotirasining turlari — hammasi kod bilan.