定制自己的聊天模型类:从基础到实现

107 阅读2分钟

引言

在现代人工智能技术的世界中,聊天模型是一个重要的分支。在这篇文章中,我们将探索如何使用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)

常见问题和解决方案

  1. 异步支持问题:实现异步的方法时,建议使用run_in_executor来减少开销,如果可能实现本地异步代码是更优的解决方案。
  2. 停止标记行为:确保响应中包含停止标记以便于解析。

总结和进一步学习资源

通过本教程,你已经学会了如何创建自定义聊天模型。接下来可以查看其他关于聊天模型的指南,例如如何让模型返回结构化输出或如何跟踪聊天模型的令牌使用。

参考资料

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