- Streamlit, özel yapay zeka sohbet robotu kullanıcı arayüzleri oluşturmanın hızlı bir yoludur, ancak yerleşik sohbet bileşenlerinin ötesinde esnekliğe ihtiyaç duyar.
- Botpress Chat API, özel bir Python istemcisi aracılığıyla sunulan chatbot mantığını, alımını ve iş akışlarını güçlendirir.
- Streamlit uygulaması konuşmaları yönetir, yanıtları yayınlar ve dinamik kullanıcı oturumlarıyla entegre olur.
Bildiğim kadarıyla Streamlit, özelleştirilebilir bir web uygulamasını yerden kaldırmanın en hızlı yoludur. Bir AI sohbet robotu oluşturup kendi ön ucunuzda dağıtmayı düşünüyorsanız, daha iyi bir seçenek düşünemedim.
Tek engel sohbet öğeleri kütüphanesidir. OpenAI'nin API'sine ve Python istemcisine oldukça özel olarak ayarlanmışlardır
Bu harika bir şey - mevcut en prestijli teknolojilerden bazılarıyla etkileşim kurmak için birkaç satır kod... harika.
Ama her şey bu değil.
Peki ya botunuz üzerinde biraz daha fazla kontrol istiyorsanız? Örneğin, çok adımlı bir iş akışı veya erişimle artırılmış üretim (RAG) isteyebilirsiniz. Bu ek işlevsellik katmanları genellikle her türlü bağımlılığa sahip kütüphaneleri bir araya getirmek anlamına gelir.
Yoksa öyle mi?
Bu eğitimde Streamlit tarafından barındırılan bir chatbot istemcisi oluşturacağım. Size hızlı yineleme ve son derece özelleştirilebilir sohbet botları için bir arayüz göstereceğim. Ardından, özel olarak oluşturulmuş OpenAI bir Python istemcisi kullanarak sohbet botunu nasıl entegre edeceğinizi öğreneceksiniz.
Prototip oluşturuyorsanız, bağımlılıklar ve teknik özellikler sizi engellememelidir.
Ve hızlı prototip oluşturma ruhuyla, öğreticiyi atlamak ve kurcalamaya başlamak istiyorsanız, kod GitHub'da.
Bombalar uzakta 💣
Adım 1: Chatbot Mantığını Oluşturun
İster iş akışı otomasyonu ister randevu alma sohbet robotu için olsun, burada dünya gerçekten sizin istiridyenizdir.
İlham arıyorsanız, GenAI sohbet robotlarının kullanım alanlarının genişliğini keşfetmenizi tavsiye ederim. Basitlik adına, umarım artık ünlü olan sommelier'im Winona ile size geri döneceğim.
Sofistike, yardımsever küçük botumuz sadece birkaç adımda elde edilebilir. Kısa keseceğim, ancak göz atabileceğiniz birçok uzun, son derece yararlı eğitim var.
1. Talimatlar Verin
Stüdyoda, sol taraftaki kenar çubuğunda Ana Sayfa'ya gideceğiz.

Talimatlar bölümünü önde ve ortada görmelisiniz. Talimatları düz metin olarak eklemek veya değiştirmek için üzerine tıklayın.

Bu, botumuza direktifler, kişilik ve korkuluklar verir. Düz bir dil kullanarak botunuzu istediğiniz davranışa doğru oldukça etkili bir şekilde yönlendirebilirsiniz. Daha insani görünmesini sağlayın ve
2. Akışı Oluşturun
Burası botun kişiliğinin temel unsurlarının bulunduğu yerdir: belirli bilgilere erişim, adım adım katı adımlar, kod yürütme vb.
Basitliğin gücünü hafife almayın. Tek bir otonom düğüm , muhakeme ajanlarının işlevselliğine rakiptir. Bilgi Tabanıma (KB) bağlı bir tane var.

3. Bilgi Tabanını Ekleyin
Eğer talimatlar hislerle ilgiliyse, KB soğuk ve katı gerçeklerle ilgilidir. Benim durumumda, söz konusu gerçekler Wine Reviews veri kümesindeki şaraplar, şarapların bir listesi, açıklamaları ve fiyatlarıdır. Bunu, botumuzun Sommelier-ize etmesi için fiili bir şarap envanteri olarak ele alacağım.
Sol paneldeki Tablolar 'a tıklayacağım ve sayfanın sol üst köşesindeki Yeni Tablo 'ya tıklayıp açıklayıcı bir isim vereceğim.

Sağ üstteki dikey üç noktaya (⋮) tıklayın ve İçe Aktar'a basın.

.csv dosyanızı açılan modala sürükleyin ve ekrandaki adımları izleyin.
Tabloyu botunuz için erişilebilir hale getirmek için sol taraftaki kenar çubuğunuzda Bilgi Tabanları 'na gidin.

Küçük yeşil tablo simgesine tıklayın ve ilgili kaynağı seçin. Tablo ekle'ye tıklayın.

Akışınızın Bilgi Tabanına erişimi olduğundan emin olun ve hazırsınız.

Adım 2: Chat API Entegrasyonunu Ekleyin
Bot ile yerel istemcimiz arasındaki iletişim noktası Chat API'sidir. Bunu botumuza eklemek için İletişim Kanalları'na gideceğim ve ... Daha fazla.

İsterseniz entegrasyonlara göz atın. Peşindeyiz. Chat. Bulmak için biraz kaydırmam gerekti.

Entegrasyona tıklayın ve açılan modalde Entegrasyonu Yükle 'ye basın.

Kurulduktan sonra, webhook URL'sinin sonunda Chat API Kimliğini göreceksiniz. Buna daha sonra ihtiyacınız olacak.
Adım 3: Python İstemcisini Yazın
Chat API'si, kullanıcılar, konuşmalar ve mesajlar üzerinde saçma işlemler gerçekleştirmek için bir dizi uç nokta sunar. Söz verdiğim gibi, bunları bir OpenAI istemcisinin yerini alabilecek bir Python istemcisine saracağım.
1. Kimlik bilgilerinizi ekleyin
class BotpressClient:
def __init__(self, api_id=None, user_key=None):
self.api_id = api_id or os.getenv("CHAT_API_ID")
self.user_key = user_key or os.getenv("USER_KEY")
self.base_url = f"{BASE_URI}/{self.api_id}"
self.headers = {
**HEADERS,
"x-user-key": self.user_key,
}
Chat API kimliğinizi bir .env dosyasına eklemekte özgürsünüz - hata ayıklamaya yardımcı olur, ancak kesinlikle gerekli değildir. Streamlit uygulamasını oluştururken API kimliği ve kullanıcı anahtarı ile ilgileneceğiz.
Devam ediyorum. BASE_URI
ve BAŞLIKLAR
ayrı bir constants.py
dosya, dağınıklık için.
# constants.py
BASE_URI = "https://chat.botpress.cloud"
HEADERS = {
"accept": "application/json",
"Content-Type": "application/json",
}
2. İstek yöntemlerini oluşturun
def _request(self, method, path, json=None):
url = f"{self.base_url}{path}"
try:
response = requests.request(method, url, headers=self.headers, json=json)
response.raise_for_status()
return response.json()
except requests.HTTPError:
return response.status_code, response.text
# --- Core API Methods ---
def get_user(self):
return self._request("GET", "/users/me")
def create_user(self, name, id):
user_data = {"name": name, "id": id}
return self._request("POST", "/users", json=user_data)
def set_user_key(self, key):
self.user_key = key
self.headers["x-user-key"] = key
def create_and_set_user(self, name, id):
new_user = self.create_user(name, id)
self.set_user_key(new_user["key"])
def create_conversation(self):
return self._request("POST", "/conversations", json={"body": {}})
def list_conversations(self):
return self._request("GET", "/conversations")
def get_conversation(self, conversation_id):
return self._request("GET", f"/conversations/{conversation_id}")
def create_message(self, message, conversation_id):
payload = {
"payload": {"type": "text", "text": message},
"conversationId": conversation_id,
}
return self._request("POST", "/messages", json=payload)
def list_messages(self, conversation_id):
return self._request("GET", f"/conversations/{conversation_id}/messages")
Belirtildiği gibi, bunların neredeyse tamamı API'deki bir uç noktaya eşleniyor. Ben sadece onları bir sınıfa sarıyorum.
3. Bir SSE Dinleyicisi Oluşturun
Bu, hacklemenin kapsamıdır. Konuşma güncellemelerini dinlemek ve Streamlit ön ucuna döngü yapmak için, istemcinin botumuzdan sunucu tarafından gönderilen olayları dinlemek ve vermek için bir yönteme ihtiyacı vardır.
def listen_conversation(self, conversation_id):
url = f"{self.base_url}/conversations/{conversation_id}/listen"
for event in sseclient.SSEClient(url, headers=self.headers):
print(event.data)
if event.data == "ping":
continue
data = json.loads(event.data)["data"]
yield {"id": data["id"], "text": data["payload"]["text"]}
Bu fonksiyon (uygulama içinde programlı olarak erişilecek olan) conversation_id'yi alır ve gelen verileri olduğu gibi verir.
Adım 4: Streamlit Uygulamasını Oluşturun
Ördeklerimizi sıraya koyduktan sonra, sohbet robotunu oluşturma zamanı geldi. Streamlit'in LLM sohbet uygulaması oluşturmakılavuzunu bazı ek özelliklerle takip ettiğimi unutmayın.
1. Boilerplate kodunu uyarlayın
Teorik olarak, Streamlit örneğindeki şablon üzerinde çok az değişiklik yaparak uygulamanın çalışmasını sağlayabilirsiniz.
# app.py
from client import BotpressClient
import streamlit as st
from constants import CONVERSATION_ID
st.title("Botpress Front-end for Streamlit")
client = BotpressClient(
api_id=st.secrets["CHAT_API_ID"], user_key=st.secrets["USER_KEY"]
)
if "messages" not in st.session_state:
messages = client.list_messages(CONVERSATION_ID)
next_token = messages["meta"]["nextToken"]
st.session_state.messages = messages["messages"][::-1]
for message in st.session_state.messages:
with st.chat_message(message["userId"]):
st.markdown(message["payload"]["text"])
if prompt := st.chat_input("*wine*-d it up"):
st.session_state.messages.append({"role": "user", "content": prompt})
with st.chat_message("user"):
st.markdown(prompt)
client.create_message(prompt, conversation_id=CONVERSATION_ID)
with st.chat_message("assistant"):
response_box = st.empty()
last_rendered = ""
for message in client.listen_conversation(CONVERSATION_ID):
message_id = message["id"]
message_text = message["text"]
if message_id != last_rendered:
last_rendered = message_id
response_box.markdown(message_text)
st.session_state.messages.append(
{"role": "assistant", "content": message_text}
)
Burada gizli değişkenleri okuyoruz. Bu yüzden bir .streamlit/secrets.toml dosyası oluşturun ve değişkenlerinizi içine yerleştirin:
CHAT_API_ID = "YOUR_API_ID"
USER_KEY = "YOUR_USER_KEY"
Ağır işler içeride gerçekleşiyor:
with st.chat_message("assistant"):
response_box = st.empty()
last_rendered = ""
for message in client.listen_conversation(CONVERSATION_ID):
message_id = message["id"]
message_text = message["text"]
if message_id != last_rendered:
last_rendered = message_id
response_box.markdown(message_text)
st.session_state.messages.append(
{"role": "assistant", "content": message_text}
)
İstemcinin mesaj iletmek ve almak için sohbet öğelerine kilitlendiği yer.
Bu işe yarar, ancak birkaç nedenden dolayı ideal değildir:
- Ayrı olarak yeni bir görüşme oluşturmuş olmanız gerekir.
- Eski mesajlar, rol tanımına (kullanıcı veya asistan) sahip olmadıkları için yenilerinden farklı biçimlendirilecektir.
- Konuşmalar arasında geçiş yapamazsınız.
2. Dinamik olarak konuşmalar oluşturun
Sıfırdan başlayarak, otomatik olarak yeni bir görüşme oluşturacağım veya en son görüşmeyi açacağım:
# app.py
from client import BotpressClient
import streamlit as st
st.title("Botpress Front-end for Streamlit")
client = BotpressClient(
api_id=st.secrets["CHAT_API_ID"], user_key=st.secrets["users"][0]["key"]
)
# user info
user = client.get_user()
user_id = user["user"]["id"]
conversations = client.list_conversations()["conversations"]
conversation_ids = [conv["id"] for conv in conversations]
# conversation
def create_conversation():
res = client.create_conversation()
print(f"Created new conversation: {res}")
conversation_id = res["conversation"]["id"]
st.session_state.active_conversation = conversation_id
st.session_state.messages = []
st.rerun()
if not conversations:
create_conversation()
if "active_conversation" not in st.session_state:
st.session_state["active_conversation"] = conversations[0]["id"]
Birden fazla kullanıcıyı saklayabilmek için gizli anahtarları değiştirdiğimi unutmayın. Siz de kendi gizli anahtarınızı .streamlit/secrets.toml
bunu yansıtmak için dosya:
[[kullanıcılar]]
anahtar = "your_user_key"
Bu bloğu, kullanıcıları bir dizi tablo olarak depolayarak istediğiniz kadar tekrarlayabilirsiniz.
3. Kullanıcıların konuşma oluşturmasına ve konuşmalar arasında geçiş yapmasına izin verin
Başlıkta da belirtildiği gibi bu, konuşmanızı seçmenize izin veren bir düğmeyle birlikte üstte bir açılır menü oluşturur.
col1, col2 = st.columns([5, 1])
with col1:
conversation_id = st.selectbox(
"Select Conversation",
options=[conv["id"] for conv in conversations],
index=conversation_ids.index(st.session_state.active_conversation),
)
with col2:
st.markdown("<div style='height: 1.9em'></div>", unsafe_allow_html=True)
if st.button("➕"):
create_conversation()
selected_conversation = client.get_conversation(conversation_id)
4. Geçmiş mesajlar için doğru rolü atayın
Yukarıdaki biçimlendirme sorununu, geçmiş mesajların her birine kullanıcı veya asistan rolü atayarak çözeceğiz:
if (
"messages" not in st.session_state
or st.session_state.get("active_conversation") != conversation_id
):
st.session_state.active_conversation = conversation_id
st.session_state.messages = []
messages = client.list_messages(conversation_id)
next_token = messages["meta"].get("nextToken")
for message in messages["messages"][::-1]:
role = "user" if message["userId"] == user_id else "assistant"
text = message["payload"]["text"]
st.session_state.messages.append({"role": role, "content": text})
Bu, kodumuzu Streamlit'in beklediği yapıya uygun hale getirir.
5. Mesajlaşma mantığını ekleyin
Bu, yeni yapı için uyarlanmış, daha önce olduğu gibi aşağı yukarı aynıdır.
# display chat history
for message in st.session_state.messages:
with st.chat_message(message["role"]):
st.markdown(message["content"])
if prompt := st.chat_input("*wine*-d it up"):
st.session_state.messages.append({"role": "user", "content": prompt})
client.create_message(prompt, conversation_id=conversation_id)
with st.chat_message("user"):
st.markdown(prompt)
with st.chat_message("assistant"):
stream = client.listen_conversation(conversation_id=conversation_id)
response = st.write_stream(stream)
st.session_state.messages.append({"role": "assistant", "content": response})
5. Bir kullanıcı oluşturun
Mantık hazır, ancak uygulamayı çalıştırmak için bir kullanıcı oluşturmanız gerekecek. Bir hizmete kaydolma deneyimini simüle etmek için bunu ayrıca eklemeyi seçtim. Neyse ki sizin için bir de komut dosyası yazdım:
# create_user.py
import argparse
from pathlib import Path
from client import *
from constants import *
secrets_path = Path(".streamlit") / "secrets.toml"
template = """[[users]]
key="{}"
"""
client = BotpressClient()
def create_user(name, id, add_to_secrets=True):
res = client.create_user(name, id)
if not add_to_secrets:
return res
secrets_path.touch(exist_ok=True)
with open(secrets_path, "a") as f:
f.write(template.format(res["user"]["id"], res["key"]))
return res
if __name__ == "__main__":
parser = argparse.ArgumentParser(
description="Create a Botpress user and optionally store secrets."
)
parser.add_argument("--name", required=True, help="Display name of the user.")
parser.add_argument(
"--id", required=True, help="User ID. If omitted, one is generated by the API."
)
parser.add_argument("--chat_api_id", help="ID for the Botpress Chat API integration. Taken from `.env` file if not provided.")
parser.add_argument(
"--no-secrets",
action="store_true",
help="Do not append to .streamlit/secrets.toml.",
)
args = parser.parse_args()
print(f"Creating user: {args.name} (ID: {args.id or 'auto-generated'})")
result = create_user(name=args.name, id=args.id, add_to_secrets=not args.no_secrets)
print("✅ User created:")
print(result)
Chat API kimliğiniz varsa, çalıştırabilirsiniz:
python create_user.py -name YOUR_NAME -id SOME_USER_ID -chat_api_id YOUR_CHAT_API_ID
Bu, kullanıcıyı oluşturmak ve gizli dosyanıza eklemekle ilgilenecektir.
Adım 5: Uygulamayı çalıştırın
Mantığınızı oluşturduktan ve kullanıcınızı oluşturduktan sonra, bu uygulamayı bir tur atmanın zamanı geldi. Bağımlılıkları yükleyin ve çalıştırın:
streamlit run app.py
Ve işte böyle, botumuzu tüm ihtişamıyla göreceksiniz.

Bugün bir Streamlit sohbet robotu çalıştırın
Streamlit ile prototip oluşturuyorsanız, özelleştirilebilirliğin kolaylık pahasına olmaması gerektiğini biliyorsunuzdur. Sohbet robotları sorunları çözmek için vardır, sorun yaratmak için değil.
Botpress , görsel bir sürükle ve bırak oluşturucu, düzinelerce resmi entegrasyon ve erişilebilir API uç noktaları ile birlikte gelir. Bu şekilde birçok iletişim kanalında oluşturabilir, yineleyebilir ve dağıtabilirsiniz.
Bugün inşa etmeye başlayın. Ücretsiz.
SSS
Neden bir chatbot oluşturmak için diğer ön uç çerçeveleri yerine Streamlit'i seçmeliyim?
Sohbet bileşenleri ve durum yönetimi gibi kullanıcı arayüzü öğelerini minimum kodla işlediğinden, ön uç uzmanlığına ihtiyaç duymadan etkileşimli uygulamaları hızlı bir şekilde prototiplemenizi sağlayan hızlı, Python tabanlı bir çözüm istiyorsanız, bir sohbet robotu oluşturmak için Streamlit'i seçersiniz.
Streamlit sohbet robotu üretim kullanımı için mi yoksa sadece prototipler için mi uygundur?
Streamlit sohbet robotu prototipler ve dahili araçlar için harikadır, ancak yoğun trafiğe veya gelişmiş stillere sahip halka açık üretim uygulamaları için ters proxy'ler, güvenlik sağlamlaştırma ve muhtemelen ölçeği idare etmek için daha sağlam bir ön uç çerçevesi gibi ek katmanlara ihtiyacınız olabilir.
Streamlit ile oluşturulmuş bir sohbet botunun görünümü ve hissi ne kadar özelleştirilebilir?
Streamlit renkler, yazı tipleri ve düzen gibi temel stilleri ayarlamanıza izin verirken, geleneksel web çerçevelerinden daha az esnektir; gerçekten özel tasarımlar için, özel HTML / CSS veya JavaScript yerleştirmeniz gerekir; bu yapılabilir, ancak Streamlit'in yerleşik widget'larını kullanmaya kıyasla karmaşıklık ekler.
Streamlit sohbet robotunu mevcut bir web sitesine entegre edebilir miyim yoksa bağımsız çalışması mı gerekiyor?
Streamlit sohbet robotu genellikle kendi URL'sinde bağımsız bir web uygulaması olarak çalışır, ancak bunu bir iframe aracılığıyla mevcut bir web sitesine yerleştirebilirsiniz, ancak bu, yerleşik deneyimi kullanıcılar için sorunsuz hale getirmek için stil ve güvenlik hususlarının ele alınmasını gerektirir.
Streamlit sohbet robotunu halka açık kullanım için dağıtmanın maliyeti nedir?
Bir Streamlit chatbot'u dağıtmak, yerel olarak veya daha küçük uygulamalar için Streamlit Community Cloud'da barındırılıyorsa ücretsiz olabilir, ancak büyük ölçekte genel kullanım için maliyetler, trafik ve çalışma süresi gereksinimlerine bağlı olarak Heroku, AWS veya DigitalOcean gibi bulut platformlarında aylık yaklaşık 5-50 $ arasında değişir.