You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自定义继承BaseChatModel的LLM调用bind_tools()触发NotImplementedError的问题咨询

自定义继承BaseChatModel的LLM调用bind_tools()触发NotImplementedError的问题咨询

嗨,我来帮你拆解下这个问题~

你遇到的这个报错其实是BaseChatModel类的设计逻辑导致的:虽然ChatOpenAI确实继承自BaseChatModel,但BaseChatModel里的bind_tools()方法只是一个空的接口定义(只抛出NotImplementedError),并没有实现具体的工具绑定逻辑。而ChatOpenAI作为LangChain官方维护的模型实现,已经重写了这个方法,适配了OpenAI系模型的工具调用格式要求,所以它能正常工作。

为什么要这么设计呢?因为不同大模型厂商对工具调用的格式规范差异很大:比如OpenAI用特定的tools参数和function_call格式,Anthropic是用tools数组加tool_choice,还有一些模型可能有完全自定义的格式。LangChain没办法在基类里写一个通用的实现,所以把这个逻辑交给各个子类自己去适配。

那解决这个问题的核心就是:在你的CustomizedChatAI类中重写bind_tools()方法,实现适配你所用模型的工具绑定逻辑。

给你一个简单的实现示例(假设你的模型兼容OpenAI的工具格式):

from typing import Sequence, Union, Dict, Any, Type, Callable, BaseTool
from langchain_core.language_models.chat_models import BaseChatModel
from langchain_core.runnables import Runnable
from langchain_core.messages import BaseMessage
from langchain_core.utils.function_calling import convert_to_openai_tool
from langchain_core.language_models.base import LanguageModelInput

class CustomizedChatAI(BaseChatModel):
    # 你的已有代码:比如__init__方法、_generate核心生成方法等
    
    def bind_tools(
        self,
        tools: Sequence[Union[Dict[str, Any], Type, Callable, BaseTool]],
        **kwargs: Any,
    ) -> Runnable[LanguageModelInput, BaseMessage]:
        # 1. 把LangChain格式的工具转换为模型能识别的格式(这里用OpenAI格式举例)
        formatted_tools = [convert_to_openai_tool(tool) for tool in tools]
        # 2. 将工具参数绑定到模型调用中,返回一个可运行的Runnable对象
        return self.bind(tools=formatted_tools, **kwargs)

需要注意的是,如果你所用的模型有自己独特的工具调用格式,你需要调整formatted_tools的转换逻辑,确保输出的格式符合模型的要求。另外,你可能还需要在_generate方法中处理模型返回的工具调用结果,确保能正确解析并返回符合LangChain规范的消息。

总结一下:BaseChatModel只定义了bind_tools的接口契约,具体实现需要子类根据自身模型的特性来完成,这就是为什么你用自定义模型时报错,而官方的ChatOpenAI可以正常运行的原因。

备注:内容来源于stack exchange,提问作者Joyee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 11:39:36