今天要講意圖執行程式,用來查詢台北景點資料庫中的景點介紹、捷運、交通等等。
該程式會解析傳入的實體參數,並且根據不同的查詢需求(例如:介紹、捷運、交通等等)回傳相應的資訊。
# chatbot_intents_function.py
import chromadb
from openai import AzureOpenAI
from openai_config import *
import json
# 初始化 ChromaDB 客戶端
chroma_client = chromadb.PersistentClient(path="./data/cut")
collection_name = "taipei_tourism"
collection = chroma_client.get_collection(name=collection_name)
# 初始化 Azure OpenAI 客戶端
client = AzureOpenAI(
azure_endpoint=azure_endpoint,
api_key=api_key,
api_version=api_version
)
# 生成嵌入向量
def get_embedding(text):
response = client.embeddings.create(
input=text,
model="text-embedding-3-large"
)
return response.data[0].embedding
# 處理查詢景點的函數
def get_attraction_info(parameters, entity):
# 解析參數和實體
embedding = get_embedding(entity)
result = collection.query(query_embeddings=[embedding], n_results=1)
if not result['documents']:
return False, f"抱歉,找不到關於{entity}的資訊。"
# 提取 documents 內的 JSON 字符串
json_text = result['documents'][0][0]
# 將 JSON 字符串轉為 Python 字典
json_data = json.loads(json_text)
# 根據查詢的意圖處理
info = ""
found = True
if "介紹" in parameters:
intro = json_data['介紹']
info += f"{entity}的介紹:{intro}\n"
if "交通" in parameters:
transport = json_data['交通']
info += f"{entity}的交通資訊:{transport}\n"
if "地址" in parameters:
address = json_data['地址']
info += f"{entity}的地址是:{address}\n"
if "營業時間" in parameters:
hours = json_data['營業時間']
info += f"{entity}的營業時間是:{hours}\n"
if "照片" in parameters:
photo_url = json_data['照片']
info += f"{entity}的照片:{photo_url}\n"
if not info:
found = False
info = "未找到符合條件的相關資訊,請提供更多具體內容。"
return found, info
# 意圖分析函數
def detect_intent(user_input):
if "介紹" in user_input or "景點" in user_input:
return "景點介紹"
elif "交通" in user_input or "怎麼去" in user_input:
return "交通資訊"
elif "地址" in user_input or "位置" in user_input:
return "景點地址"
elif "營業時間" in user_input or "開放時間" in user_input:
return "營業時間"
elif "照片" in user_input or "圖片" in user_input:
return "景點照片"
else:
return "未知意圖"
# 處理使用者輸入的函數
def provide_info(user_input, collection):
intent = detect_intent(user_input)
place_name = user_input.split()[0] # 假設景點名稱在輸入的第一個詞
# 設定查詢的參數
if intent == "景點介紹":
parameters = ["介紹"]
elif intent == "交通資訊":
parameters = ["交通"]
elif intent == "景點地址":
parameters = ["地址"]
elif intent == "營業時間":
parameters = ["營業時間"]
elif intent == "景點照片":
parameters = ["照片"]
else:
return "抱歉,我無法理解您的請求,請您再具體說明。"
# 調用查詢函數
found, response = get_attraction_info(parameters, place_name)
return response
# 測試輸入
user_input = "新北投溫泉區 地址"
response = provide_info(user_input, collection)
print(response)
初始化 ChromaDB 客戶端:設定資料庫客戶端,並指定存儲景點資料的集合(collection)。
初始化 Azure OpenAI 客戶端:設定與 Azure OpenAI 服務的連接,以使用其模型生成文本嵌入向量。
生成嵌入向量(get_embedding 函數):這個函數將文本輸入轉化為嵌入向量,嵌入向量可用於後續的文本相似度查詢。
處理查詢景點資訊(get_attraction_info 函數):根據用戶提供的實體名稱(如景點名稱),使用生成的嵌入向量在 ChromaDB 中查詢相關資料。根據用戶的查詢意圖(如介紹、地址、照片等),從查詢結果中提取並返回相關資訊。
意圖分析函數(detect_intent 函數):分析用戶輸入的文本,識別其查詢意圖(例如查詢介紹、地址、照片等)。
處理使用者輸入(provide_info 函數):根據用戶輸入分析得到的意圖和景點名稱,設置查詢參數並調用查詢函數,返回查詢結果或錯誤訊息。
這樣就可以根據查詢的需求解析和回傳不同的景點資訊啦!