在前兩篇,我們了解了 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=[])