Langchain(六)进阶:创建自己的LangChain LLM封装器

2,261 阅读2分钟

引言: 这篇文章的具体内容是为了帮助大家创建自己的LangChain LLM封装器,以适用于自己的项目需求。在LangChain中,我们可能需要使用自己的LLM或不同于官方支持的LLM封装器,因此需要实现一个自定义的LLM封装器。提前说明,本节需要有较好的python基础。

一个自定义LLM封装器只需要实现一个必须的方法:

一个_call方法,该方法接收一个字符串、一些可选的停用词,返回一个字符串。

还有一个可选的方法:

一个_identifying_params属性,该属性用于帮助打印这个类。应该返回一个字典。

让我们来实现一个非常简单的自定义LLM封装器,它仅返回输入字符串的前N个字符。

#从typing库中导入必要的函数和类型声明
from typing import Any, List, Mapping, Optional

#导入所需的类和接口
from langchain.callbacks.manager import CallbackManagerForLLMRun
from langchain.llms.base import LLM

#定义一个名为CustomLLM的子类,继承自LLM类
class CustomLLM(LLM):
    
    # 类的成员变量,类型为整型
    n: int

    # 用于指定该子类对象的类型
    @property
    def _llm_type(self) -> str:
        return "custom"

    # 重写基类方法,根据用户输入的prompt来响应用户,返回字符串
    def _call(
        self,
        prompt: str,
        stop: Optional[List[str]] = None,
        run_manager: Optional[CallbackManagerForLLMRun] = None,
    ) -> str:
        if stop is not None:
            raise ValueError("stop kwargs are not permitted.")
        return prompt[: self.n]

    # 返回一个字典类型,包含LLM的唯一标识
    @property
    def _identifying_params(self) -> Mapping[str, Any]:
        """Get the identifying parameters."""
        return {"n": self.n}

# 语法解释:
# 1. 使用typing库中的相关类型进行类型声明
# 2. 使用继承实现自定义LLM类的功能扩展
# 3. 通过重写父类的方法以实现特定的功能需求
# 4. 使用@property装饰器很好地实现了对私有变量和方法的封装和保护
# 5. _identifying_params属性和_llm_type属性分别用于标识和记录各自对象的属性和类型信息。

现在我们可以像使用任何其他LLM一样使用这个自定义LLM。

llm = CustomLLM(n=10)
print(llm("This is a foobar thing"))
#返回:'This is a '

(注:如果报错:`ModuleNotFoundError: No module named 'langchain.callbacks.manager' 那么我们需要重新安装langchain)

pip uninstall langchain
pip install langchain

我们也可以打印这个LLM,并看到他的自定义格式。

print(llm)
#返回:
CustomLLM
Params: {'n': 10}

我们可以将这个自定义LLM用于自然语言处理(NLP)中,如文本生成,情感分析等。同时,我们还可以使用其他的自定义扩展,如支持特定语言的LLM封装器,或是支持特定数据集的LLM封装器。 今天就到这里,明天继续。