在我們瞭解瞭如何在 Semantic Kernel 中整合語意和原生函式,以及如何建立語義 GPT 介面之後,接下來讓我們實作一個完整的電影推薦服務代理。這個過程將展示如何將理論應用於實踐,構建一個真正有用的 AI 應用。

設計服務代理架構

在設計服務代理時,我採取的架構包含以下幾個部分,這種分層架構使系統更加模組化,便於維護和擴充套件:

  1. API 連線層:負責與 TMDB API 進行底層通訊。
  2. 語義服務層 (Plugin):將 API 功能轉換為 Semantic Kernel 可理解的語義函式。
  3. 對話管理層 (Kernel):處理使用者輸入,並呼叫適當的語義函式。
  4. 回應生成層 (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

電影推薦代理互動流程圖

此時序圖展示了使用者請求電影推薦時,系統內部的完整互動流程。

PlantUML 圖表

這個流程展示了從使用者輸入到最終回應的完整鏈路。Semantic Kernel 在其中扮演了核心協調者的角色,它解析使用者意圖,選擇合適的工具(外掛),並將最終結果以自然語言的形式呈現。

結論

這種設計模式展示瞭如何將 API 呼叫封裝在語義函式中,使其能夠透過自然語言被呼叫。透過這種方式,我們可以將任何 API 服務轉換為 GPT 介面,使其能夠與聊天機器人或代理無縫整合。

在實際應用中,這種架構的實用性遠超過簡單的電影推薦。它可以應用於:

  • 企業級 AI 客服:整合訂單查詢、產品資訊等內部 API。
  • 資料分析助手:將複雜的數據分析流程封裝成簡單的自然語言指令。
  • 智慧家庭控制:將各種家電的 API 統一到一個語義層,實現用語音控制一切。

Semantic Kernel 提供了一個統一且強大的框架,使這些整合變得標準化和可重用,極大地拓展了 LLM 的能力邊界。