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.
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_readBarcha komponentlarni birlashtirish#
Endi 1-bobdagi besh komponent qanday birlashishini ko'ramiz:
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.
O'z chat platformangizni quring
Streamlit bilan to'liq chat platformasi quring. Bosqichma-bosqich:
- Oddiy chat — session state bilan suhbat tarixi
- Oqim —
stream=Truebilan jonli javob - Profil tanlash — sidebar'da bir necha persona (dasturchi, o'qituvchi, tarjimon)
- Tozalash tugmasi — suhbatni qayta boshlash
Talablar:
- Tanlangan profil
systemxabariga 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#
- 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.