資料科學第七週-用Streamlit連接資料庫與OpenAI聊天機器人

這堂課透過Streamlit展示登入功能,包含與OpenAI機器人對話。先講解資料庫基礎,用SQLite實作。介紹數據表、欄位、主鍵等。透過Python與資料庫連結,建立、新增、查詢資料。再結合Streamlit與OpenAI,實現用戶註冊、登入,與機器人對話功能。密碼、帳號管理技巧也一併探討。結合實作與應用,深入學習資料庫與人工智慧。

前言-會做到什麼功能

這堂課會使用Streamlit進行登入,畢竟有些東西,不是免費就能看的(搓手)

先上成果圖,下圖為登入成功畫面

Image

登入成功後,可以與OpenAI機器人進行交談(需有API Key)

Image

那就可以來練習這個主題了。

其中會簡化一些內容,比如密碼採明碼、API Key直接呈現在程式碼上,這些在真正要上線時,千萬不要這樣做。

先講講資料庫,再來做登入

資料庫是專門處理資料儲存、管理和檢索的資料集合。以註冊會員為例,會儲存會員的帳號密碼。你可能會問,用Excel這種東西不行嗎?

Excel雖然方便,就今天的例子而言,它不好做唯一性的管理,帳號只能是唯一的對吧?不會兩個陌生人用同個帳號,而且在資料量大時,Excel檢索也較慢。

所以會選擇使用資料庫,本次使用SQLite為資料庫教學。

資料庫的特色

這裡會使用GPT來操作資料庫,所以今天不用了解太多(資料庫可以是一整門課程),以下為資料庫的關鍵概念:

  • 數據表(Tables):資料庫中的數據通常存放在表格中,每個表格包含行和列。每行代表一條數據記錄,列代表該記錄的不同屬性。

  • 欄位(Fields):表格中的每一列代表一個欄位,定義了特定類型的數據,比如用戶名稱、年齡、地址等。

  • 主鍵(Primary Key):用來唯一標識表格中的每一條記錄。主鍵可以確保每條數據的唯一性。

Image

資料庫的語法

資料庫的語法稱為SQL (結構化查詢語),用於與資料庫溝通的語言,透過 SQL 可以查詢、插入、更新和刪除數據。

實作步驟一-建立資料庫

建立一檔案名為users.db

建立一檔案名為db.py ,專門處理資料庫相關內容程式碼。

Image

接著透過GPT,幫我們對資料庫進行:

  1. 建立表格與欄位.

  2. 新增資料

  3. 查詢資料(帶有條件的查詢)

實作步驟二-Python連結資料庫

安裝資料庫套件

1
pip instll sqlite3

請GPT完成:

  • prompt:利用python進行sqlite連線與建立表格(user) 欄位為帳號與密碼

  • prompt:新增帳號密碼、驗證帳號密碼,包成函式

  • prompt:測試

Image

Image

Image

db.py完整程式碼

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import sqlite3

# 建立使用者資料表
def create_usertable():
conn = sqlite3.connect('users.db')
c = conn.cursor()
c.execute('CREATE TABLE IF NOT EXISTS users(username TEXT PRIMARY KEY, password TEXT)')
conn.commit()
conn.close()
# 新增使用者
def add_user(username, password):
conn = sqlite3.connect('users.db')
c = conn.cursor()
c.execute('INSERT INTO users(username, password) VALUES (?, ?)', (username, password))
conn.commit()
conn.close()

# 驗證使用者
def login_user(username, password):
conn = sqlite3.connect('users.db')
c = conn.cursor()
c.execute('SELECT * FROM users WHERE username = ? AND password = ?', (username, password))
data = c.fetchone()
conn.close()
return data


結合Streamlit 與 OpenAI

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
import streamlit as st
from db import create_usertable, add_user, login_user
import time

# 初始化 session state
if 'logged_in' not in st.session_state:
st.session_state.logged_in = False # 初始化登入狀態


# Sidebar 選單
with st.sidebar:
choice = st.selectbox(
"選擇操作", ['login', 'register']
)

# 註冊頁面
if choice == 'register':
st.subheader('註冊新帳號')

new_user = st.text_input('使用者名稱')
new_password = st.text_input('密碼')

if st.button('註冊'):
create_usertable()
hashed_new_password = new_password
add_user(new_user, hashed_new_password)
st.success('註冊成功,正在跳轉至登入頁面...')
time.sleep(2) # 等待 2 秒
# 修改頁面狀態為登入頁面

# 登錄頁面
else:
st.subheader('帳號登入')
username = st.text_input('使用者名稱')
password = st.text_input('密碼', type='password')
if st.button('登入'):
result = login_user(username, password)
if result:
st.success(f'歡迎,{username}')
st.balloons()
time.sleep(0.5)
# 設置為已登錄
st.session_state.logged_in = True



else:
st.warning('使用者名稱或密碼錯誤')

if st.session_state.logged_in:
import streamlit as st
from openai import OpenAI
api_key = "" # 請填入您的 OpenAI API 金鑰
# 使用者輸入
user_input = st.text_input("輸入對話:")

# 當使用者點擊 "送出" 按鈕時觸發
if st.button("送出"):
# 顯示用戶訊息
with st.chat_message("user"):
st.write(user_input)

# 設定聊天區域,用於顯示 GPT 回應
with st.chat_message("assistant"):
output_placeholder = st.empty()

# 創建 OpenAI 客戶端
client = OpenAI(api_key=api_key)
print(client.models.list())
# 呼叫 OpenAI API 並啟用串流模式
stream = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": user_input}],
stream=True,
)

# 逐步顯示 GPT 回應
full_response = ""
for chunk in stream:
if chunk.choices[0].delta.content:
content = chunk.choices[0].delta.content
full_response += content
output_placeholder.markdown(full_response)


資料科學第七週-用Streamlit連接資料庫與OpenAI聊天機器人
https://codinglu.tw/2024/10/streamlit-database-gpt-chatbot/
作者
阿盧
發布於
2024年10月9日
許可協議
📌 本文瀏覽量: 0