在人工智慧 (AI) 的時代,聊天機器人改變了我們與科技互動的方式。其中一個最具影響力的應用是在醫療行業。聊天機器人能夠快速、準確地提供資訊,幫助人們更有效地管理自己的健康。在這篇文章中,我們將學習如何使用 Gemini 2.0、Flask、HTML 和 Bootstrap 開發一個醫療聊天機器人。這個專案的目的是創建一個個性化、使用者友好的平台,能夠快速且準確地回答健康相關的問題。
學習目標
- 了解 Gemini 2.0 醫療聊天機器人的主要組件和架構,以及它如何增強醫療互動。
- 學習如何將 Gemini 2.0 整合到醫療聊天機器人中,以提供準確且針對病人需求的回應。
- 探索如何使用 HTML 和 Bootstrap 設計一個響應式和使用者友好的聊天機器人介面。
- 獲得設置和部署個性化醫療聊天機器人的實際經驗。
- 了解 FAISS 在提升聊天機器人功能的搜尋效率中的角色。
什麼是 Gemini 2.0?
Gemini 2.0 是 Google DeepMind 在 2024 年 12 月宣布的最新大型語言模型 (LLM)。它引入了幾個關鍵的增強功能,包括多模態輸出、原生工具使用和自主能力,讓它成為多種應用的多功能 AI 模型。
基於前一版本 Gemini 1.5,Gemini 2.0 擴展了處理和生成文本、圖像、視頻和音頻的能力。它增加了原生圖像創建和多語言文本轉語音輸出,提供更自然、互動的使用者體驗。
Gemini 2.0 的一個突出特點是其自主 AI,這使得系統能夠獨立計劃和執行任務。實驗性專案如 Project Astra 通過與 Google 服務(如搜尋和地圖)的整合,展示了這一能力,提供實時的上下文協助。另一個例子是 Project Mariner,這是一個 Chrome 擴展,能夠自主瀏覽網頁執行任務,如網上購物。
Gemini 2.0 的主要特點
- 多模態輸出:Gemini 2.0 能夠處理和生成多種數據類型,包括文本、圖像、音頻和視頻,實現更自然和豐富的互動。
- 原生工具使用:該模型能夠無縫整合各種工具和平台,增強其在不同應用中的實用性。
- 自主能力:Gemini 2.0 引入了能夠執行複雜任務的 AI 代理,標誌著向更自主的 AI 系統邁進了一步。
Gemini 2.0 的版本
Gemini 2.0 提供幾個版本,每個版本針對特定的使用情境:
- Gemini 2.0 Flash Experimental:一個專注於速度和效率的實驗性模型,適合快速執行任務。
- Gemini 2.0 Pro:設計用於廣泛的任務,提供性能和成本之間的平衡。
- Gemini 2.0 Ultra:針對高度複雜的任務進行優化,為要求高的應用提供卓越的性能。
Flask
Flask 是一個輕量級的 Python 網頁框架,非常適合構建可擴展和高效的網頁應用。
在聊天機器人中,Flask 負責後端操作,包括與 Gemini 2.0 的 API 整合、路由和管理用戶互動。
它的簡單性和靈活性使其非常適合快速開發和整合任務。
HTML 和 Bootstrap
HTML 是聊天機器人介面的結構基礎,確保語義和可訪問的網頁設計。
Bootstrap 是一個 CSS 框架,通過提供響應式和美觀的設計組件來增強介面。它確保聊天機器人在桌面和智能手機等各種設備上都能無縫運行。
醫療聊天機器人的主要特點
- 對話介面:聊天機器人通過自然的類人互動來吸引用戶,這得益於 Gemini 2.0。
- 使用者友好的設計:啟用 Bootstrap 的響應式設計確保在任何設備上都易於使用。
- 健康查詢支持:能夠解答各種醫療問題,從症狀到一般健康建議。
- 可訪問性:設計上便於各種技術水平的用戶導航。
Facebook AI 相似性搜尋
Meta(前身為 Facebook)開發了 FAISS,這是一個開源庫,用於高效的相似性搜尋和密集向量的聚類。FAISS 在機器學習中被廣泛使用,特別是涉及大規模向量搜尋和最近鄰檢索的任務。FAISS 優化了高維數據的處理,使其非常適合推薦系統、自然語言處理和圖像檢索等應用。
簡而言之,FAISS 能夠索引密集向量並支持對它們的快速近似或精確搜尋。它使用產品量化、HNSW(分層可導航小世界圖)和 IVF(倒排文件索引)技術來平衡速度和準確性之間的權衡。這些技術顯著減少了計算複雜性和內存使用,並在搜尋結果中保持高精度。然而,FAISS 進一步支持 CPU 和 GPU 加速,使其適合處理數百萬甚至數十億的向量。
FAISS 的一個主要優勢是其多樣性。它提供多種索引策略,使用戶能夠根據特定使用情境選擇最合適的方法。例如,平面索引提供精確的搜尋能力,而基於量化的索引則優先考慮效率。其 Python 和 C++ API 使其對廣泛的開發者可訪問,其模組化設計允許輕鬆整合進現有的機器學習管道。
在這裡了解更多有關向量數據庫的信息。
流程圖描述:醫療聊天機器人工作流程
以下是流程圖:
開始:用戶從醫療聊天機器人的首頁 (index.html) 開始。
上傳 PDF 構建知識庫:
- 用戶通過文件上傳功能上傳 PDF 文件。
- 後端處理 PDF 並構建知識庫,將其存儲在向量存儲 (vector_store.pkl) 中以供未來查詢。
- 如果上傳無效文件,系統會處理錯誤並提示用戶提供有效文件。
詢問醫療問題:
- 用戶通過詢問醫療問題 (/ask) 功能提交醫療問題。
- 如果存在知識庫,系統會檢索相關文檔。
- 如果不存在知識庫,則顯示錯誤信息或啟動重定向。
生成回應:
- 檢索相關文檔並將其傳遞給 Gemini 模型以生成回應。
- 模型處理輸入並提供準確的醫療回應。
顯示或重定向:
- 生成的回應顯示給用戶,或重定向到適當的頁面以進行進一步互動。
結束:用戶收到回應,並可以選擇進一步互動或結束會話。
這個工作流程確保了流暢的用戶互動、高效的錯誤處理和使用 Gemini 模型生成準確回應的能力,為醫療聊天機器人提供無縫的體驗。
設置環境
首先安裝所需的依賴項,配置 API 金鑰,並設置前端以準備醫療聊天機器人的環境。
安裝 requirements.txt
pip install -r https://raw.githubusercontent.com/Gouravlohar/Medical-Chatbot/refs/heads/master/requirements.txt
API 金鑰
在這裡獲取您的 Gemini 2.0 API 金鑰。
醫療聊天機器人的 HTML 前端代碼
這段 HTML 代碼構成了醫療聊天機器人應用的前端用戶介面。它創建了一個互動的網頁,使用戶可以:
- 上傳 PDF 文件以提供聊天機器人的額外上下文。
- 發送聊天消息與基於 AI 的醫療聊天機器人互動。
該介面使用 Bootstrap 進行樣式設計,並使用 jQuery 動態處理用戶互動。它包括聊天機器人的打字指示器和無縫的消息顯示。該代碼與 Flask 後端整合,以處理用戶輸入並返回 AI 生成的回應。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="Demonstration of Gemini API in a Python Flask Application.">
<title>醫療聊天機器人</title>
<link rel="shortcut icon" type="image/x-icon" href="https://www.analyticsvidhya.com/blog/2025/01/medical-chatbot-with-gemini-2-0-flask-and-vector-embedding/ url_for("static', filename="images/iba_logo.png") ">
<link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600&display=swap" rel="stylesheet">
<style>
:root
--primary-gradient: linear-gradient(135deg, #6e8efb, #4834d4);
--chat-bg: #111827;
--message-bg: #1f2937;
--user-message-bg: #3730a3;
--text-primary: #fff;
--text-secondary: #9ca3af;
body
font-family: 'Inter', sans-serif;
background-color: var(--chat-bg);
color: var(--text-primary);
min-height: 100vh;
display: flex;
flex-direction: column;
.chat-container
max-width: 1200px;
margin: 0 auto;
padding: 2rem;
flex: 1;
display: flex;
flex-direction: column;
.title
text-align: center;
margin-bottom: 1rem;
font-size: 2rem;
font-weight: 600;
color: var(--text-primary);
.warning
text-align: center;
margin-bottom: 2rem;
font-size: 1rem;
color: var(--text-secondary);
.messages-container
flex: 1;
overflow-y: auto;
padding: 1rem;
scroll-behavior: smooth;
.message
margin-bottom: 1rem;
opacity: 0;
transform: translateY(20px);
animation: fadeIn 0.3s ease forwards;
.message-content
padding: 1rem;
border-radius: 1rem;
max-width: 80%;
.user-message .message-content
background: var(--user-message-bg);
margin-left: auto;
.bot-message .message-content
background: var(--message-bg);
.input-container
padding: 1rem;
background: var(--chat-bg);
border-top: 1px solid rgba(255, 255, 255, 0.1);
.chat-input
background: var(--message-bg);
border: none;
border-radius: 1.5rem;
padding: 1rem 1.5rem;
color: var(--text-primary);
width: calc(100% - 120px);
.send-button
background: var(--primary-gradient);
border: none;
border-radius: 1.5rem;
padding: 1rem 2rem;
color: white;
font-weight: 600;
transition: all 0.3s ease;
.send-button:hover
transform: translateY(-2px);
box-shadow: 0 5px 15px rgba(110, 142, 251, 0.4);
.typing-indicator
display: flex;
gap: 0.5rem;
padding: 1rem;
background: var(--message-bg);
border-radius: 1rem;
width: fit-content;
.typing-dot
width: 8px;
height: 8px;
background: var(--text-secondary);
border-radius: 50%;
animation: typing 1.4s infinite ease-in-out;
.typing-dot:nth-child(2)
animation-delay: 0.2s;
.typing-dot:nth-child(3)
animation-delay: 0.4s;
@keyframes typing
0%,
100%
transform: translateY(0);
50%
transform: translateY(-10px);
@keyframes fadeIn
to
opacity: 1;
transform: translateY(0);
/* Message Formatting */
.bot-message strong
color: #818cf8;
font-weight: 600;
.bot-message ul
padding-left: 1.5rem;
margin: 0.5rem 0;
</style>
</head>
<body>
<div class="chat-container">
<div class="title">歡迎來到醫療聊天機器人</div>
<div class="warning">注意:這是一個 AI 聊天機器人,可能會出錯。請驗證提供的信息。</div>
% with messages = get_flashed_messages() %
% if messages %
<div class="alert alert-info" role="alert">
messages[0]
</div>
% endif %
% endwith %
<form id="upload-form" method="post" enctype="multipart/form-data" action="/upload">
<div class="mb-3">
<label for="pdf_files" class="form-label">上傳 PDF 文件</label>
<input class="form-control" type="file" id="pdf_files" name="pdf_files" multiple>
</div>
<button type="submit" class="btn btn-primary">上傳 PDFs</button>
</form>
<div class="messages-container" id="messages-container">
<!-- 消息將在這裡附加 -->
</div>
<form id="chat-form" method="post">
<div class="input-container">
<input type="text" class="chat-input" id="chat-input" name="prompt" placeholder="輸入您的消息...">
<button type="submit" class="send-button" id="send-button">發送</button>
</div>
</form>
</div>
<script src="https://code.jquery.com/jquery-3.6.3.min.js"></script>
<script>
$(document).ready(function () {
$("#chat-form").submit(function (event)
event.preventDefault();
var question = $("#chat-input").val();
if (question.trim() === "") return;
let userMessage = `
<div class="message user-message">
<div class="message-content">
$question
</div>
</div>`;
$("#messages-container").append(userMessage);
$("#chat-input").val("");
let typingIndicator = `
<div class="message bot-message typing-indicator">
<div class="typing-dot"></div>
<div class="typing-dot"></div>
<div class="typing-dot"></div>
</div>`;
$("#messages-container").append(typingIndicator);
$.ajax(
type: "POST",
url: "/ask",
data:
'prompt': question
,
success: function (data)
$(".typing-indicator").remove();
let cleanedData = data
.replace(/\*\*(.*?)\*\*/g, "<strong>$1</strong>")
.replace(/\n/g, "<br>")
.replace(/- (.*?)(?=\n
);
);
});
</script>
</body>
</html>
UI 輸出
建立一個文檔驅動的 AI 問答系統
想像一下,能夠上傳幾個 PDF,並立即詢問其內容,幾秒鐘內就能收到準確的 AI 生成的答案。這就是文檔驅動的 AI 問答系統的承諾。通過結合像 Gemini 這樣的 AI 模型、文檔嵌入技術和基於 Flask 的網頁介面,您可以創建一個智能工具,能夠理解、處理並根據上傳的文檔回應用戶查詢。接下來,我們將逐步介紹如何建立這樣的系統,從設置環境到實現相似性搜尋和實時回應等高級功能。
步驟 1:導入和設置
首先導入必要的庫和模組,例如用於網頁應用的 Flask、用於模型整合的 Google Generative AI,以及用於文檔處理和向量存儲管理的 LangChain。
from flask import Flask, render_template, request, redirect, url_for, flash
import google.generativeai as genai
from langchain_core.prompts import PromptTemplate
from langchain.chains import LLMChain
from langchain_community.document_loaders import PyPDFLoader
from langchain_community.vectorstores import FAISS
from langchain_huggingface import HuggingFaceEmbeddings
import os
import logging
import pickle
步驟 2:Flask 應用初始化和配置
設置 Flask 應用,配置上傳 PDF 的文件夾等關鍵設置,並定義用於會話管理的密鑰。
app = Flask(__name__)
app.config['UPLOAD_FOLDER'] = 'uploads'
app.secret_key = 'supersecretkey'
os.makedirs(app.config['UPLOAD_FOLDER'], exist_ok=True)
步驟 3:日誌設置
配置日誌以捕獲重要信息和錯誤,確保應用運行期間的平穩調試和監控。
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
步驟 4:Gemini 模型
初始化 Gemini AI 模型並使用您的 API 金鑰進行配置,以便與模型進行互動以生成內容。
model = genai.GenerativeModel('gemini-2.0-flash-exp')
my_api_key_gemini = os.getenv('GOOGLE_API_KEY')
genai.configure(api_key=my_api_key_gemini)
步驟 5:向量存儲設置
設置向量存儲以存儲文檔嵌入,如果已存在則加載,以便稍後進行高效的文檔相似性搜尋。
vector_store = None
# 如果存在,則加載現有的向量存儲
if os.path.exists('vector_store.pkl'):
with open('vector_store.pkl', 'rb') as f:
vector_store = pickle.load(f)
這段代碼初始化一個變量來存儲向量存儲。
如果存在,系統會使用 pickle.load(f) 從文件中加載向量存儲。
這樣可以存儲文檔嵌入(文檔的數值表示),以便進行高效的相似性搜尋。
步驟 6:錯誤處理 (404)
定義 404 錯誤的處理程序,當用戶訪問不存在的路由時,將其重定向到主頁。
@app.errorhandler(404)
def page_not_found(e):
return redirect(url_for('index'))
如果用戶訪問不存在的頁面(即發生 404 錯誤),系統會將其重定向到主頁 (index)。
步驟 7:主頁路由 (/)
創建網頁應用的主頁路由,將初始 HTML 模板呈現給用戶。
@app.route("/")
def index():
return render_template('index.html')
步驟 8:文件上傳路由 (/upload)
實現文件上傳路由,允許用戶上傳 PDF 文件,處理它們,並將其轉換為向量存儲中的嵌入。
@app.route('/upload', methods=['POST'])
def upload():
global vector_store
try:
if 'pdf_files' not in request.files:
flash("沒有文件部分")
return redirect(url_for('index'))
files = request.files.getlist('pdf_files')
documents = []
for file in files:
if file.filename == '':
flash("沒有選擇文件")
return redirect(url_for('index'))
file_path = os.path.join(app.config['UPLOAD_FOLDER'], file.filename)
file.save(file_path)
pdf_loader = PyPDFLoader(file_path)
documents.extend(pdf_loader.load())
# 使用 HuggingFaceEmbeddings 創建嵌入
embeddings = HuggingFaceEmbeddings()
if vector_store is None:
# 如果不存在,則創建新的向量存儲
vector_store = FAISS.from_documents(documents, embeddings)
else:
# 將新文檔添加到現有的向量存儲中
vector_store.add_documents(documents)
# 保存更新的向量存儲
with open('vector_store.pkl', 'wb') as f:
pickle.dump(vector_store, f)
flash("PDF 上傳和處理成功。知識庫已準備好。")
return redirect(url_for('index'))
except Exception as e:
logger.error("處理 PDF 時發生錯誤: %s", e)
flash("處理 PDF 時發生錯誤。")
return redirect(url_for('index'))
這個路由允許用戶上傳 PDF 文件。
請求的 files 對象檢查 pdf_files 鍵是否存在。
文件被保存到 uploads 目錄。
使用 PyPDFLoader 提取每個上傳 PDF 的文本。
提取的文本然後使用 HuggingFaceEmbeddings 轉換為嵌入。
嵌入被存儲在使用 FAISS 創建的 vector_store 中。
更新的 vector_store 被保存到 vector_store.pkl 以備未來使用。
如果上傳成功,顯示成功消息。如果發生錯誤,顯示錯誤消息。
步驟 9:問答路由 (/ask)
實現問答路由,用戶可以輸入問題,應用檢索相關文檔並根據內容生成 AI 驅動的回應。
@app.route('/ask', methods=['POST'])
def ask():
global vector_store
if vector_store is None:
return "知識庫尚未準備好。請先上傳 PDF。"
question = request.form['prompt']
# 根據問題檢索相關文檔
relevant_docs = vector_store.similarity_search(question)
context = " ".join([doc.page_content for doc in relevant_docs])
custom_prompt = f"你是最好的醫生。僅提供醫療相關的答案。上下文: {context} 問題: {question}"
response = model.generate_content(custom_prompt)
if response.text:
return response.text
else:
return "抱歉,我想 Gemini 不想回答這個問題!"
這個路由允許用戶提問。
如果向量存儲尚未準備好(即尚未上傳 PDF),應用會提示用戶先上傳 PDF。
用戶的問題從表單中提取。
應用執行相似性搜尋 (vector_store.similarity_search),根據問題查找相關文檔。
應用使用檢索到的文檔的上下文創建自定義提示,指示 AI 模型 (Gemini) 提供醫療相關的答案。
模型使用 model.generate_content(custom_prompt) 生成回應。
如果模型提供回應,應用將其返回給用戶。否則,應用將返回一條默認消息。
步驟 10:運行 Flask 應用
最後,在調試模式下運行 Flask 應用,以啟動網頁應用並使用戶能夠互動。
if __name__ == '__main__':
app.run(debug=True)
在這裡獲取 GitHub 上的代碼
輸出
我用於測試的 PDF 連結
提示
頭痛有多少種類型?
上傳 PDF 後,系統會直接從其內容提供回應。
結論
在這篇文章中,我們討論了如何創建一個基於 Flask 的網頁應用,使用 AI 工具和技術從上傳的 PDF 中構建知識庫。該應用允許用戶提出醫療相關問題,並根據上傳文檔的內容獲得相關的答案,通過整合像 Google Gemini 和向量搜尋機制等生成模型。這樣的系統中,AI 與現代網頁開發工具結合,可以完全自動化信息檢索,提供智能的互動體驗。
通過理解這段代碼的基本結構,從文件上傳到問答,我們看到一個基本的 Flask 應用如何擴展強大的 AI 功能。無論是開發知識管理系統還是設計聊天機器人,這些技術都能派上用場,幫助您開始。
關鍵要點
- 通過使用 LangChain 和 FAISS 等工具,我們可以將非結構化的 PDF 文檔轉換為強大的、可搜尋的知識庫,能夠智能地回應用戶查詢。
- 使用 Gemini 2.0 的醫療聊天機器人通過利用先進的 AI 模型提供個性化的實時醫療協助,實現準確的回應。
- 您可以使用 Google 的 Gemini 模型通過與向量化文檔互動生成上下文相關的答案,提供動態和互動的用戶體驗。
- Flask 作為輕量級框架,將所有功能整合在一起,無縫處理文件上傳、處理和用戶互動。
- FAISS,作為強大的向量搜尋引擎,幫助找到最相關的文檔,提升回應的質量和準確性。
常見問題
A. /ask 路由允許用戶提交問題。應用然後使用上傳的 PDF 查找相關信息,並使用 Google 的 Gemini AI 模型生成回應。
A. 應用使用 PyPDFLoader 從上傳的 PDF 中提取文本。然後,這些文本使用 HuggingFaceEmbeddings 轉換為嵌入,並存儲在 FAISS 向量存儲中以進行快速相似性搜尋。
A. 是的,您可以將應用調整到各種領域。通過更改提示,您可以自定義問答功能以匹配不同的領域,例如法律、教育或技術。
A. 向量存儲使用 Python 的 pickle 模組保存為 .pkl 文件。應用在啟動時檢查該文件是否存在,並在可用時加載,確保先前上傳的文檔在會話之間持久存在。
A. 您需要安裝 Python 和 Flask,以及 google.generativeai、langchain、FAISS 和 HuggingFaceEmbeddings 等依賴項。您還需要 Google 的 Gemini 模型的 API 金鑰。確保設置虛擬環境以管理依賴項。
本文由 AI 台灣 運用 AI 技術編撰,內容僅供參考,請自行核實相關資訊。
歡迎加入我們的 AI TAIWAN 台灣人工智慧中心 FB 社團,
隨時掌握最新 AI 動態與實用資訊!