在我們瞭解瞭如何在 Semantic Kernel 中整合語意和原生函式,以及如何建立語義 GPT 介面之後,接下來讓我們實作一個完整的電影推薦服務代理。這個過程將展示如何將理論應用於實踐,構建一個真正有用的 AI 應用。
設計服務代理架構
在設計服務代理時,我採取的架構包含以下幾個部分,這種分層架構使系統更加模組化,便於維護和擴充套件:
- API 連線層:負責與 TMDB API 進行底層通訊。
- 語義服務層 (Plugin):將 API 功能轉換為 Semantic Kernel 可理解的語義函式。
- 對話管理層 (Kernel):處理使用者輸入,並呼叫適當的語義函式。
- 回應生成層 (LLM):根據 API 回傳的資料生成自然語言回應。
擴充套件 TMDB 服務功能
為了建立一個功能完整的電影推薦系統,我們需要擴充套件之前建立的 TMDbService 類別,增加更多功能。例如,一個根據標題搜尋電影的函式:
# 在 TMDbService 類別中新增方法
from semantic_kernel.functions import kernel_function
import requests
class TMDbService:
# ... (省略 __init__ 和其他函式)
@kernel_function(
description="Searches for movies by title",
name="search_movies",
)
def search_movies(self, movie_title: str) -> str:
"""根據電影標題搜尋電影"""
print("執行動畫搜尋...")
base_url = "https://api.themoviedb.org/3"
endpoint = f"{base_url}/search/movie?api_key={self.api_key}&query={movie_title}&language=en-US&page=1"
response = requests.get(endpoint)
if response.status_code == 200:
movies = response.json()['results']
if not movies:
return "找不到符合標題的電影。"
result = "找到了以下電影:\n\n"
for movie in movies[:5]: # 限制結果數量以保持簡潔
title = movie.get('title', 'N/A')
year = movie.get('release_date', 'N/A')[:4]
rating = movie.get('vote_average', 'N/A')
result += f"- {title} ({year}) - 評分: {rating}/10\n"
return result
return "搜尋電影時發生錯誤。"
這個函式允許使用者透過電影標題搜尋電影。它向 TMDB API 傳送搜尋請求,然後將結果格式化為易於閱讀的文字。
整合到聊天介面
要將這個服務整合到聊天介面,我們需要建立一個聊天函式,它可以理解使用者意圖並呼叫適當的 TMDB 服務函式。
import semantic_kernel as sk
# 建立並設定 kernel
kernel = sk.Kernel()
# 假設 TMDbService 已被實例化並註冊為外掛
# kernel.import_plugin_from_object(TMDbService(), "Movies")
# 建立聊天提示範本
chat_prompt = """
你是一個樂於助人的電影助理。你可以推薦電影、搜尋電影,並提供電影相關資訊。
使用者: {{$input}}
請使用以下函式來幫助使用者:
- Movies.search_movies: 根據標題搜尋電影
- Movies.get_top_movies_by_genre: 根據類型取得熱門電影
- Movies.get_movie_details: 取得特定電影的詳細資訊
"""
# 在實際應用中,我們會使用 Planner 或 Function Calling 來自動選擇和呼叫函式
async def chat_with_movies(user_input: str):
# 這裡簡化流程,實際應使用 SK 的規劃器
# ...
pass
電影推薦代理互動流程圖
此時序圖展示了使用者請求電影推薦時,系統內部的完整互動流程。
@startuml
!theme _none_
skinparam dpi auto
skinparam defaultFontName "Microsoft JhengHei UI"
skinparam minClassWidth 100
skinparam defaultFontSize 16
title 電影推薦代理互動流程
actor User as 使用者
participant "聊天介面" as ChatUI
participant "Semantic Kernel" as Kernel
participant "TMDB Plugin" as Plugin
participant "TMDB API" as API
使用者 -> ChatUI : "推薦一部科幻電影"
ChatUI -> Kernel : 處理使用者輸入
Kernel -> Kernel : **規劃**:決定使用\n`get_top_movies_by_genre`
Kernel -> Plugin : 呼叫 `get_top_movies_by_genre`\n(genre="科幻")
Plugin -> API : 發送 API 請求
API --> Plugin : 回傳電影列表 (JSON)
Plugin --> Kernel : 回傳格式化後的電影列表
Kernel -> Kernel : **生成回應**:將列表轉換為自然語言
Kernel --> ChatUI : "這是一些熱門的科幻電影:..."
ChatUI --> 使用者 : 顯示推薦結果
@enduml
這個流程展示了從使用者輸入到最終回應的完整鏈路。Semantic Kernel 在其中扮演了核心協調者的角色,它解析使用者意圖,選擇合適的工具(外掛),並將最終結果以自然語言的形式呈現。
結論
這種設計模式展示瞭如何將 API 呼叫封裝在語義函式中,使其能夠透過自然語言被呼叫。透過這種方式,我們可以將任何 API 服務轉換為 GPT 介面,使其能夠與聊天機器人或代理無縫整合。
在實際應用中,這種架構的實用性遠超過簡單的電影推薦。它可以應用於:
- 企業級 AI 客服:整合訂單查詢、產品資訊等內部 API。
- 資料分析助手:將複雜的數據分析流程封裝成簡單的自然語言指令。
- 智慧家庭控制:將各種家電的 API 統一到一個語義層,實現用語音控制一切。
Semantic Kernel 提供了一個統一且強大的框架,使這些整合變得標準化和可重用,極大地拓展了 LLM 的能力邊界。