在前兩篇,我們了解了 LangChain Agent 的系統架構和 SystemTools 的工具設計。今天,我們要深入探討如何將 Google 的 Gemini 模型完美整合到 LangChain 框架中。
這個自定義包裝器是整個智能助手的「語言理解核心」。
自定義 Gemini 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
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=[])
初始化流程:
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)}"
處理流程:
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)
@property
def _llm_type(self) -> str:
    return "gemini"
這個屬性讓 LangChain 能夠識別這是一個 Gemini 類型的 LLM,用於:
# 在 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_converter = OpenCC('s2t')  # Simplified to Traditional
自動轉換流程
response = self._chat.send_message(prompt)
return self.opencc_converter.convert(response.text)
每次 Gemini 回應都會自動:
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)}"
錯誤類型處理:
#放在.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=[])