iT邦幫忙

2025 iThome 鐵人賽

DAY 16
0

自定義 Gemini LLM 包裝器 — 打造專屬的語言模型介面 (3)

在前兩篇,我們了解了 LangChain Agent 的系統架構和 SystemTools 的工具設計。今天,我們要深入探討如何將 Google 的 Gemini 模型完美整合到 LangChain 框架中。

這個自定義包裝器是整個智能助手的「語言理解核心」。


功能簡介

自定義 Gemini LLM 包裝器提供:

  • 無縫 LangChain 整合:讓 Gemini 能夠與 LangChain 工具完美配合
  • 繁體中文自動轉換:使用 OpenCC 確保輸出為繁體中文
  • 完整錯誤處理:處理 API 調用失敗和異常情況
  • 對話歷史管理:維護連續的對話上下文

核心程式碼解析

LLM 包裝器類別定義

class GeminiLLM(LLM):
    """Custom LLM wrapper for Google Gemini"""
    
    # 使用 Pydantic Field 來定義模型屬性
    api_key: str = Field(...)
    model_name: str = Field(default="models/gemini-2.5-flash")
    opencc_converter: Any = Field(default=None)
    
    class Config:
        """Pydantic 配置"""
        arbitrary_types_allowed = True
  • Pydantic 驗證:確保輸入參數的正確性
  • 靈活模型選擇:支援不同的 Gemini 模型版本
  • 類型安全:使用 Field 定義確保類型一致性

初始化機制

def __init__(self, api_key: str, **kwargs):
    # 初始化 OpenCC 轉換器
    opencc_converter = OpenCC('s2t')
    
    # 調用父類初始化,傳入所有必要字段
    super().__init__(
        api_key=api_key, 
        opencc_converter=opencc_converter,
        **kwargs
    )
    
    # 初始化 Gemini
    genai.configure(api_key=api_key)
    self._model = genai.GenerativeModel(model_name=self.model_name)
    self._chat = self._model.start_chat(history=[])

初始化流程:

  1. OpenCC 轉換器初始化:設定簡體轉繁體
  2. 父類初始化:符合 LangChain LLM 基類要求
  3. Gemini 配置:設定 API 金鑰和模型
  4. 對話會話啟動:創建持續的對話上下文

核心調用方法

def _call(self, prompt: str, stop: Optional[List[str]] = None) -> str:
    try:
        response = self._chat.send_message(prompt)
        return self.opencc_converter.convert(response.text)
    except Exception as e:
        return f"錯誤: {str(e)}"

處理流程:

  1. 發送訊息:使用 Gemini 的 chat 介面
  2. 自動轉換:將回應轉為繁體中文
  3. 錯誤處理:捕捉 API 調用異常

批次生成支援

def _generate(self, prompts: List[str], stop: Optional[List[str]] = None) -> LLMResult:
    generations = []
    for prompt in prompts:
        text = self._call(prompt, stop)
        generations.append([Generation(text=text)])
    return LLMResult(generations=generations)

與 LangChain 的整合機制

LLM 類型識別

@property
def _llm_type(self) -> str:
    return "gemini"

這個屬性讓 LangChain 能夠識別這是一個 Gemini 類型的 LLM,用於:

  • 日誌記錄:記錄使用的模型類型
  • 錯誤追蹤:提供更精確的錯誤資訊
  • 效能監控:追蹤不同模型的使用情況

Agent 初始化整合

# 在 LangChainAgentApp 中的使用
self.gemini_llm = GeminiLLM(
    api_key=api_key, 
    model_name=os.environ.get("GEMINI_MODEL", "models/gemini-2.5-flash")
)

# 傳遞給 Agent
self.agent = initialize_agent(
    tools, 
    self.gemini_llm,  # 使用自定義 LLM
    agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
    verbose=True
)

繁體中文處理機制

OpenCC 轉換器配置

opencc_converter = OpenCC('s2t')  # Simplified to Traditional

自動轉換流程

response = self._chat.send_message(prompt)
return self.opencc_converter.convert(response.text)

每次 Gemini 回應都會自動:

  1. 檢測原始回應語言
  2. 轉換為繁體中文
  3. 保持原始格式和結構

錯誤處理策略

API 調用保護

def _call(self, prompt: str, stop: Optional[List[str]] = None) -> str:
    try:
        response = self._chat.send_message(prompt)
        return self.opencc_converter.convert(response.text)
    except Exception as e:
        return f"錯誤: {str(e)}"

錯誤類型處理:

  • 網路連線問題:API 無法連接時的處理
  • 配額超限:當 API 使用量超限時的回應
  • 模型錯誤:Gemini 模型本身的錯誤處理
  • 轉換錯誤:OpenCC 轉換失敗的處理

環境變數配置

#放在.env裡
# API 金鑰來源
api_key = os.getenv('API_KEY') 

# 模型選擇
model_name = os.environ.get("GEMINI_MODEL", "models/gemini-2.5-flash")

對話上下文維護

self._chat = self._model.start_chat(history=[])

上一篇
DAY 15
系列文
我的 AI 助手開發16
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言