Azure OpenAI ServiceのモデルをLangGraphで使うにあたって、モデルのエンドポイントを読み込んだAzureChatOpenAIのインスタンスにメソッドとしえbind_tools()がないとエラーがでる場合の備忘録です。

llm = AzureChatOpenAI(...)

llm_with_tools = llm.bind_tools(tools)

---------------------------------------------------------------------------
NotImplementedError                       Traceback (most recent call last)
Cell In[6], line 1
----> 1 llm_with_tools = llm.bind_tools(tools)
      4 def chatbot(state: State):
      5     return {"messages": [llm_with_tools.invoke(state["messages"])]}

File ~/venv/ni/lib/python3.10/site-packages/langchain_core/language_models/chat_models.py:1172, in BaseChatModel.bind_tools(self, tools, **kwargs)
   1165 def bind_tools(
   1166     self,
   1167     tools: Sequence[
   (...)
   1170     **kwargs: Any,
   1171 ) -> Runnable[LanguageModelInput, BaseMessage]:
-> 1172     raise NotImplementedError

NotImplementedError: 

解決策:AzureChatOpenAIはlangchain.chat_modelsではなく、langchain_openaiから読む

OpenAI社のモデルを使う場合はlangchain_openaiを使うことが推奨見たいです。langchain.chat_modelsは古いみたいですが、ChatGPTに生成させたコードに混じって読み込まれていたようです。

from langchain_openai import AzureChatOpenAI

llm = AzureChatOpenAI(...)

AzureChatOpenAIのドキュメントに普通にbind_tools()が書いてあるのになんで?って思っていたのですが、別のモジュールにAzureChatOpenAIがあってそれを使ってしまっていることに気づきませんでした。

bind_tools(tools: Sequence[Union[Dict[str, Any], Type, Callable, BaseTool]]*tool_choice: Optional[Union[dict, str, Literal[‘auto’, ‘none’, ‘any’, ‘required’], bool]] = None**kwargs: Any) → Runnable[Union[PromptValue, str, Sequence[Union[BaseMessage, List[str], Tuple[str, str], str, Dict[str, Any]]]], BaseMessage][source]

それでは。