引言
在现代人工智能技术的世界中,聊天模型是一个重要的分支。在这篇文章中,我们将探索如何使用LangChain抽象创建自定义聊天模型。本教程将指导你如何将自定义语言模型(LLM)封装到标准的BaseChatModel接口中,从而可以在现有的LangChain程序中使用。此外,您的LLM将自动成为LangChainRunnable,并从一些开箱即用的优化中获益,如通过线程池进行批处理、异步支持、astream_events API等。
主要内容
消息的输入和输出
聊天模型以消息为输入,并返回消息作为输出。在LangChain中,有几种内置的消息类型:
- SystemMessage: 用于初始化AI行为,通常在输入消息序列中首先传入。
- HumanMessage: 表示与聊天模型交互的人的消息。
- AIMessage: 表示聊天模型的消息,可以是文本或请求调用工具。
- FunctionMessage/ToolMessage: 用于将工具调用的结果传递回模型。
from langchain_core.messages import (
AIMessage,
BaseMessage,
FunctionMessage,
HumanMessage,
SystemMessage,
ToolMessage,
)
基础聊天模型的实现
我们将实现一个简单的聊天模型,该模型回显提示中最后一条消息的前n个字符。为此,我们将继承BaseChatModel并实现以下方法:
- _generate: 用于根据提示生成聊天结果。
- _llm_type: 用于唯一标识模型类型。
- _identifying_params: 用于表示模型参数化信息。
代码示例
下面是一个简单的定制聊天模型示例,该模型回显提示最后一条消息的前n个字符:
from typing import Any, List, Optional
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,
additional_kwargs={},
response_metadata={"time_in_seconds": 3},
)
generation = ChatGeneration(message=message)
return ChatResult(generations=[generation])
# 使用API代理服务提高访问稳定性
model = CustomChatModelAdvanced(n=3, model_name="my_custom_model")
result = model.invoke([HumanMessage(content="hello!"), AIMessage(content="Hi there human!"), HumanMessage(content="Meow!")])
print(result.generations[0].message.content)
常见问题和解决方案
- 异步支持问题:实现异步的方法时,建议使用
run_in_executor来减少开销,如果可能实现本地异步代码是更优的解决方案。 - 停止标记行为:确保响应中包含停止标记以便于解析。
总结和进一步学习资源
通过本教程,你已经学会了如何创建自定义聊天模型。接下来可以查看其他关于聊天模型的指南,例如如何让模型返回结构化输出或如何跟踪聊天模型的令牌使用。
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力! ---END---