iT邦幫忙

2024 iThome 鐵人賽

DAY 20
0
自我挑戰組

從零打造客製化 AI 聊天機器人系列 第 20

[從零打造客製化 AI 聊天機器人] 意圖執行函式

  • 分享至 

  • xImage
  •  

今天要講意圖執行程式,用來查詢台北景點資料庫中的景點介紹、捷運、交通等等。

該程式會解析傳入的實體參數,並且根據不同的查詢需求(例如:介紹、捷運、交通等等)回傳相應的資訊。

# 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 函數):根據用戶輸入分析得到的意圖和景點名稱,設置查詢參數並調用查詢函數,返回查詢結果或錯誤訊息。
    https://ithelp.ithome.com.tw/upload/images/20241008/20169415M67spMqHZl.png

這樣就可以根據查詢的需求解析和回傳不同的景點資訊啦!


上一篇
[從零打造客製化 AI 聊天機器人] 查詢意圖資料庫
下一篇
[從零打造客製化 AI 聊天機器人] RAG + LLM 查詢與意圖綜合處理
系列文
從零打造客製化 AI 聊天機器人30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言