- Streamlit là một cách nhanh chóng để xây dựng giao diện người dùng chatbot AI tùy chỉnh nhưng cần có tính linh hoạt vượt ra ngoài các thành phần trò chuyện tích hợp sẵn.
- Botpress Chat API hỗ trợ logic, truy xuất và quy trình làm việc của chatbot, được thể hiện thông qua một ứng dụng khách Python tùy chỉnh.
- Ứng dụng Streamlit quản lý các cuộc trò chuyện, truyền phát phản hồi và tích hợp với các phiên người dùng động.
Theo như tôi biết, Streamlit là cách nhanh nhất để tạo một ứng dụng web có thể tùy chỉnh. Nếu bạn đang muốn xây dựng một chatbot AI và triển khai nó trên giao diện người dùng của riêng bạn, tôi không thể nghĩ ra lựa chọn nào tốt hơn.
Điểm hạn chế duy nhất là thư viện thành phần trò chuyện. Chúng được điều chỉnh khá cụ thể để OpenAI API và máy khách Python của 's
Thật tuyệt vời – chỉ cần một vài dòng mã để tương tác với một số công nghệ uy tín nhất hiện nay thì thật là… tuyệt vời.
Nhưng đó không phải là tất cả.
Còn nếu bạn muốn kiểm soát bot của mình nhiều hơn thì sao? Ví dụ, bạn có thể muốn một quy trình làm việc nhiều bước hoặc thế hệ tăng cường truy xuất (RAG). Các lớp chức năng bổ sung này thường có nghĩa là sắp xếp các thư viện với đủ loại phụ thuộc.
Hay là có?
Trong hướng dẫn này, tôi sẽ xây dựng một máy khách chatbot được lưu trữ trên Streamlit. Tôi sẽ chỉ cho bạn một giao diện cho các chatbot có khả năng lặp lại nhanh và tùy chỉnh cao. Sau đó, bạn sẽ học cách tích hợp chatbot bằng cách sử dụng một chatbot được xây dựng tùy chỉnh OpenAI -style Python client.
Nếu bạn đang tạo mẫu, các yếu tố phụ thuộc và kỹ thuật sẽ không cản trở bạn.
Và theo tinh thần tạo mẫu nhanh, nếu bạn muốn bỏ qua phần hướng dẫn và bắt đầu mày mò, mã có trên GitHub .
Bom bay đi 💣
Bước 1: Xây dựng Logic Chatbot
Cho dù là tự động hóa quy trình làm việc hay chatbot đặt lịch hẹn , thế giới thực sự nằm trong tầm tay bạn.
Tôi khuyên bạn nên khám phá phạm vi rộng của các trường hợp sử dụng cho chatbot GenAI nếu bạn đang tìm kiếm cảm hứng. Để đơn giản, tôi sẽ quay lại với bạn với người pha chế rượu vang mà tôi hy vọng là giờ đã nổi tiếng, Winona .
Bạn có thể tạo ra con bot nhỏ tinh vi, hữu ích của chúng tôi chỉ trong vài bước. Tôi sẽ tóm tắt, nhưng có rất nhiều hướng dẫn dài dòng, cực kỳ hữu ích mà bạn có thể duyệt qua.
1. Đưa ra hướng dẫn
Trong studio, chúng ta sẽ điều hướng đến Trang chủ ở thanh bên trái.

Bạn sẽ thấy phần Hướng dẫn ở chính giữa. Nhấp vào đó để thêm hoặc sửa đổi hướng dẫn ở dạng văn bản thuần túy.

Điều này cung cấp cho bot các chỉ thị, tính cách và rào chắn. Sử dụng ngôn ngữ đơn giản, bạn có thể điều khiển bot của mình khá hiệu quả theo hướng hành vi mong muốn. Làm cho nó nghe có vẻ giống con người hơn và
2. Xây dựng luồng
Đây chính là nơi chứa đựng những yếu tố cốt lõi của tính cách bot: quyền truy cập vào thông tin cụ thể, các bước thực hiện nghiêm ngặt, thực thi mã, v.v.
Đừng đánh giá thấp sức mạnh của sự đơn giản. Một nút tự động duy nhất có thể sánh ngang với chức năng của các tác nhân suy luận . Tôi có một nút được kết nối với Cơ sở kiến thức (KB) của mình.

3. Thêm Cơ sở kiến thức
Nếu hướng dẫn là về rung cảm, thì KB là về sự thật lạnh lùng, cứng rắn. Trong trường hợp của tôi, sự thật được đề cập là các loại rượu trong bộ dữ liệu Đánh giá rượu , danh sách các loại rượu, mô tả và giá cả. Tôi sẽ coi đây là một kho rượu de facto để bot của chúng tôi Sommelier-ize.
Tôi sẽ nhấp vào Bảng ở bảng bên trái và nhấn vào Bảng mới ở góc trên bên trái của trang, sau đó đặt tên mô tả cho bảng.

Nhấp vào dấu ba chấm dọc (⋮) ở góc trên bên phải và nhấn Nhập.

Kéo tệp .csv của bạn vào hộp thoại bật lên và làm theo các bước trên màn hình.
Để bot của bạn có thể truy cập vào bảng, hãy điều hướng đến Cơ sở kiến thức ở thanh bên trái.

Nhấp vào biểu tượng bảng màu xanh lá cây nhỏ và chọn nguồn có liên quan. Nhấp vào Thêm bảng .

Hãy đảm bảo luồng của bạn có thể truy cập vào Cơ sở kiến thức và bạn đã sẵn sàng.

Bước 2: Thêm Chat Tích hợp API
Điểm tiếp xúc giữa bot và khách hàng địa phương của chúng tôi là Chat API. Để thêm điều đó vào bot của chúng tôi, tôi sẽ cuộn đến Kênh truyền thông và nhấn vào … Thêm .

Hãy xem qua các tích hợp nếu bạn muốn. Chúng tôi đang tìm Chat . Tôi phải cuộn một chút để tìm thấy nó.

Nhấp vào tích hợp và nhấn Cài đặt tích hợp trong hộp thoại bật lên.

Sau khi cài đặt, bạn sẽ thấy ID API Chat ở cuối webhook URL. Bạn sẽ cần nó sau.
Bước 3: Viết Python Client
Các Chat API cung cấp một số điểm cuối để thực hiện các hoạt động crud trên người dùng, cuộc trò chuyện và tin nhắn. Như đã hứa, tôi sẽ gói chúng vào một máy khách Python có thể thay thế OpenAI khách hàng.
1. Thêm thông tin xác thực của bạn
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,
}
Bạn được tự do thêm của bạn Chat API ID vào tệp .env – giúp gỡ lỗi, nhưng không thực sự cần thiết. Chúng ta sẽ xử lý API ID và khóa người dùng khi xây dựng ứng dụng Streamlit.
Tôi giữ CƠ SỞ_URI
Và TIÊU ĐỀ
trong một riêng biệt hằng số.py
tập tin, để tránh lộn xộn.
# constants.py
BASE_URI = "https://chat.botpress.cloud"
HEADERS = {
"accept": "application/json",
"Content-Type": "application/json",
}
2. Tạo các phương thức Yêu cầu
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")
Như đã đề cập, hầu hết những thứ này đều được ánh xạ tới một điểm cuối trong API. Tôi chỉ gói chúng trong một lớp.
3. Tạo một SSE Listener
Đây là mức độ của hackery. Để lắng nghe các bản cập nhật hội thoại và lặp lại vào giao diện Streamlit, máy khách cần một phương pháp để lắng nghe và tạo ra các sự kiện do máy chủ gửi từ bot của chúng tôi.
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"]}
Hàm này lấy conversation_id (sẽ được truy cập theo chương trình trong ứng dụng) và tạo ra dữ liệu đầu vào khi dữ liệu đó xuất hiện.
Bước 4: Tạo ứng dụng Streamlit
Với những con vịt của chúng ta trong hàng, đã đến lúc xây dựng chatbot. Lưu ý rằng tôi đang làm theo hướng dẫn của Streamlit về cách xây dựng ứng dụng trò chuyện LLM – với một số tính năng bổ sung.
1. Điều chỉnh mã mẫu
Về mặt lý thuyết, bạn có thể chạy ứng dụng chỉ với những thay đổi tối thiểu đối với mã mẫu trong ví dụ Streamlit.
# 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}
)
Chúng ta đang đọc các biến bí mật ở đây. Vì vậy, hãy tạo một tệp .streamlit/secrets.toml và đặt các biến của bạn vào bên trong:
ID_API_TRÒ CHUYỆN = “ID_API_CỦA BẠN”
KHÓA NGƯỜI DÙNG = “KHÓA_NGƯỜI_DÙNG_CỦA_BẠN”
Công việc nặng nhọc đang diễn ra ở:
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}
)
nơi khách hàng sử dụng các thành phần trò chuyện để gửi và nhận tin nhắn.
Cách này có hiệu quả, nhưng không lý tưởng vì một số lý do sau:
- Bạn phải tạo một cuộc trò chuyện mới riêng biệt.
- Tin nhắn cũ sẽ được định dạng khác với tin nhắn mới vì chúng không có chức năng chỉ định vai trò (người dùng hoặc trợ lý).
- Bạn không thể chuyển đổi cuộc trò chuyện.
2. Tạo cuộc trò chuyện một cách năng động
Bắt đầu từ đầu, tôi sẽ tự động tạo một cuộc trò chuyện mới hoặc mở cuộc trò chuyện gần đây nhất:
# 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"]
Lưu ý rằng tôi đã sửa đổi các khóa bí mật để có thể lưu trữ nhiều người dùng. Bạn sẽ muốn sửa đổi .streamlit/secrets.toml
tập tin để phản ánh rằng:
[[người dùng]] khóa = "khóa_người_dùng_của_bạn"
Bạn có thể lặp lại khối này nhiều lần tùy thích, lưu trữ người dùng dưới dạng một mảng bảng .
3. Cho phép người dùng tạo và chuyển đổi giữa các cuộc trò chuyện
Như tiêu đề đã nói, thao tác này sẽ tạo ra một menu thả xuống ở trên cùng với một nút cho phép bạn chọn cuộc trò chuyện của mình.
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. Chỉ định vai trò chính xác cho các tin nhắn trước đó
Chúng tôi sẽ giải quyết vấn đề định dạng ở trên bằng cách chỉ định vai trò người dùng hoặc trợ lý cho từng tin nhắn trước đó:
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})
Điều này giúp mã của chúng ta tuân thủ theo cấu trúc mà Streamlit mong đợi.
5. Thêm logic nhắn tin
Về cơ bản thì nó giống như trước đây, chỉ được điều chỉnh cho phù hợp với cấu trúc mới.
# 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. Tạo người dùng
Logic đã sẵn sàng, nhưng bạn sẽ cần tạo người dùng để chạy ứng dụng. Tôi đã chọn thêm phần này riêng để mô phỏng trải nghiệm đăng ký dịch vụ. May mắn cho bạn là tôi cũng đã viết một tập lệnh:
# 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)
Với điều kiện là bạn có Chat ID API, bạn có thể chạy:
python create_user.py –name TÊN CỦA BẠN –id ID NGƯỜI DÙNG MỘT SỐ –chat_api_id ID API TRÒ CHUYỆN CỦA BẠN
Phần này sẽ xử lý việc tạo người dùng và thêm người dùng đó vào tệp bí mật của bạn.
Bước 5: Chạy ứng dụng
Với logic đã xây dựng và người dùng đã tạo, đã đến lúc chạy thử ứng dụng này. Cài đặt các phụ thuộc và chạy:
streamlit chạy ứng dụng.py
Và ngay lúc này, bạn sẽ thấy toàn bộ vẻ đẹp của bot.

Chạy chatbot Streamlit ngay hôm nay
Nếu bạn đang tạo mẫu với Streamlit, bạn biết rằng khả năng tùy chỉnh không nên đánh đổi bằng sự tiện lợi. Chatbot được sử dụng để giải quyết vấn đề chứ không phải tạo ra vấn đề.
Botpress đi kèm với trình xây dựng kéo và thả trực quan, hàng chục tích hợp chính thức và các điểm cuối API có thể truy cập. Theo cách này, bạn có thể xây dựng, lặp lại và triển khai trên nhiều kênh truyền thông.
Bắt đầu xây dựng ngay hôm nay . Hoàn toàn miễn phí.
Câu hỏi thường gặp
Tại sao tôi nên chọn Streamlit thay vì các nền tảng front-end khác để xây dựng chatbot?
Bạn sẽ chọn Streamlit để xây dựng chatbot nếu bạn muốn có một giải pháp nhanh chóng dựa trên Python cho phép bạn tạo nguyên mẫu ứng dụng tương tác một cách nhanh chóng mà không cần chuyên môn về front-end, vì nó xử lý các thành phần UI như thành phần trò chuyện và quản lý trạng thái với mã tối thiểu.
Chatbot Streamlit có phù hợp để sử dụng trong sản xuất hay chỉ để thử nghiệm?
Chatbot Streamlit rất phù hợp cho các nguyên mẫu và công cụ nội bộ, nhưng đối với các ứng dụng sản xuất hướng đến công chúng với lưu lượng truy cập lớn hoặc kiểu dáng nâng cao, bạn có thể cần các lớp bổ sung như proxy ngược, tăng cường bảo mật và có thể là một khuôn khổ giao diện người dùng mạnh mẽ hơn để xử lý quy mô.
Giao diện của chatbot được xây dựng bằng Streamlit có thể tùy chỉnh đến mức nào?
Mặc dù Streamlit cho phép bạn điều chỉnh kiểu dáng cơ bản như màu sắc, phông chữ và bố cục, nhưng nó kém linh hoạt hơn so với các khuôn khổ web truyền thống; đối với các thiết kế thực sự tùy chỉnh, bạn sẽ cần nhúng HTML/CSS hoặc JavaScript tùy chỉnh, điều này có thể thực hiện được nhưng sẽ phức tạp hơn so với việc sử dụng các tiện ích tích hợp của Streamlit.
Tôi có thể tích hợp chatbot Streamlit vào một trang web hiện có không, hay nó phải chạy độc lập?
Chatbot Streamlit thường chạy như một ứng dụng web độc lập trên URL riêng, nhưng bạn có thể nhúng nó vào một trang web hiện có thông qua iframe, mặc dù điều này đòi hỏi phải xử lý các cân nhắc về kiểu dáng và bảo mật để mang lại trải nghiệm nhúng liền mạch cho người dùng.
Chi phí triển khai chatbot Streamlit cho mục đích công cộng là bao nhiêu?
Việc triển khai chatbot Streamlit có thể miễn phí nếu được lưu trữ cục bộ hoặc trên Streamlit Community Cloud cho các ứng dụng nhỏ hơn, nhưng để sử dụng công khai ở quy mô lớn, chi phí dao động từ khoảng 5–50 đô la mỗi tháng trên các nền tảng đám mây như Heroku, AWS hoặc DigitalOcean, tùy thuộc vào lưu lượng truy cập và yêu cầu về thời gian hoạt động.