在 Day 18,我把藥品資料整理進一個乾淨的資料表,讓系統有了穩固的基礎。但我發現一般人查藥品時,想知道的不只是官方適應症或副作用列表,而是一些更日常的問題:
「普拿疼可以空腹吃嗎?」
「這個藥會讓人想睡嗎?」
「小孩可以吃幾歲以上?」
這些問題往往不會直接出現在藥典或官方資料裡,但卻是使用者最關心的。
所以今天的重點,就是新增常見問與答(FAQ)模組。
1.建立 FAQ 資料表
import sqlite3
# 連線資料庫
conn = sqlite3.connect("medicine.db")
cursor = conn.cursor()
# 建立 FAQ 資料表
cursor.execute("""
CREATE TABLE IF NOT EXISTS faq (
id INTEGER PRIMARY KEY AUTOINCREMENT,
drug_name TEXT,
question TEXT,
answer TEXT
);
""")
conn.commit()
print("FAQ 資料表建立完成")
faq_data = {
"drug_name": "普拿疼",
"question": "普拿疼可以空腹吃嗎?",
"answer": "一般建議隨餐或飯後服用,避免空腹時可能造成腸胃不適。"
}
cursor.execute("""
INSERT INTO faq (drug_name, question, answer)
VALUES (:drug_name, :question, :answer)
""", faq_data)
conn.commit()
print(" FAQ 已新增!")
3.查詢 FAQ
def get_faq(drug_name, user_question):
cursor.execute("SELECT question, answer FROM faq WHERE drug_name=?", (drug_name,))
results = cursor.fetchall()
for q, a in results:
if user_question in q: # 簡單關鍵字比對
return a
return None
answer = get_faq("普拿疼", "空腹吃")
print(" 查詢結果:", answer)
from openai import OpenAI
client = OpenAI(api_key="YOUR_API_KEY")
def ask_ai(drug_name, question):
prompt = f"""
你是一位專業藥師,請根據藥品知識回答以下問題:
藥品:{drug_name}
問題:{question}
請用簡單白話的方式回答。
"""
response = client.chat.completions.create(
model="gpt-4o-mini",
messages=[{"role": "user", "content": prompt}]
)
return response.choices[0].message.content.strip()
def get_or_create_faq(drug_name, user_question):
answer = get_faq(drug_name, user_question)
if answer:
return answer
# 沒找到 → 請 AI 生成
answer = ask_ai(drug_name, user_question)
# 存進資料庫
cursor.execute("""
INSERT INTO faq (drug_name, question, answer)
VALUES (?, ?, ?)
""", (drug_name, user_question, answer))
conn.commit()
return answer
# 測試:問一個不存在的問題
print(" 使用者問題:普拿疼會不會讓人想睡?")
print(" 系統回覆:", get_or_create_faq("普拿疼", "會不會讓人想睡?"))
第一次詢問:
輸入:普拿疼有什麼副作用?
輸出:[AI 回覆並新增到資料庫] 普拿疼常見副作用包含噁心、胃不適,長期或過量使用可能造成肝臟損傷,建議依照醫師指示服用。
第二次詢問(同一問題):
輸入:普拿疼有什麼副作用?
輸出:[資料庫回覆] 普拿疼常見副作用包含噁心、胃不適,長期或過量使用可能造成肝臟損傷,建議依照醫師指示服用。
今天把常見問答模組接上 SQLite,做出了一個自我學習型 FAQ 系統。第一次查詢時,AI 會產生答案,並自動存到資料庫;第二次查詢同樣的問題時,就能直接回覆資料庫的內容,減少 API 成本,也提升反應速度。