引言: 这篇文章的具体内容是为了帮助大家创建自己的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封装器。 今天就到这里,明天继续。