跟我学LangChain:模型包装器,一站式解锁多平台AI能力

60 阅读5分钟

跟我学LangChain:模型包装器,一站式解锁多平台AI能力

随着 AI 技术的飞速发展,各大科技公司都推出了自己的大语言模型,从 OpenAI 的 GPT 系列到 Google 的 Gemini ,从国内的智谱 GLM 到阿里的通义千问,模型生态百花齐放。然而,对于开发者而言,如何在这些各异的模型平台之间灵活切换和统一管理,却成了一个需要解决的难题。【AI大模型教程】

LangChain 通过精心设计的模型封装机制,为开发者提供了统一的编程接口。无论是调用 OpenAI 的 GPT-4 还是本地的 Ollama 模型,无论是使用智谱 AI 还是百度文心一言,开发者都可以通过几乎相同的代码格式进行调用。

01

模型包装器的分类

LangChain 是通过“模型包装器”,并基于各个模型平台的 API 协议,进行统一封装的。主要提供两种类型的包装器:一种是通用的 LLM 模型包装器;一种是专门针对 Chat 类型的 Chat Model(聊天模型包装器)。

1、LLM 模型包装器

该包装器位于 langchain.llms(或 langchain_community.llms) 模块下,用于封装以文本字符串作为输入并返回文本字符串的模型。

这些 LLM 模型包装器都继承自 BaseLLM 类,适用于文本生成、文本翻译等任务。

2、聊天模型包装器

该包装器位于 langchain.chat_models(或 langchain_community.chat_models) 模块下,专门为“聊天式” API 设计。

这些聊天模型包装器都继承自 BaseChatModel 类,并需要以消息列表(如 SystemMessage, HumanMessage)作为输入,返回 AIMessage。这更适用于多轮对话场景,当然也是目前更主流的用法。

3、两类包装器的比较

1、输入的区别

LLM 模型包装器,输入是单一的字符串提示词(prompt);

聊天模型包装器,输入是一系列的消息列表,通常带有 role(角色)和 content(内容)。

2、输出的区别

LLM 模型包装器,输出是一个字符串;

聊天模型包装器,输出是一个消息。

虽然,这两类包装器有所不同,但为了使它们能混合使用,它们都实现了基础模型接口,这个接口公开了两个常用方法:

(1)predict:接收一个字符串并返回一个字符串。

(2)predict_messages:接收一则消息并返回一则消息。

诀窍:两类包装器有个很好的理解方式,就是根据命名理解和调用。聊天包装器都含有 Chat(不过根据字母的排序,可能在前,可能在后,也可能在中间)。

02

模型生态

目前,LangChain 已经建立了极其丰富的模型生态系统:

  • 国际主流平台:OpenAI、Anthropic Claude、Google Gemini、Microsoft Azure OpenAI 等。
  • 云服务商解决方案:AWS Bedrock、Google Vertex AI 等。
  • 开源模型生态:通过 Hugging Face Hub 和 Ollama支持数千种开源模型。
  • 国内优秀模型:智谱 AI、百度文心一言、阿里通义千问、腾讯混元等。

从langchain.llms源码可以看到:

从langchain.chat_models源码可以看到:

以上截图不是全部,大家可以自行查看。

03

模型包装器开发示例

1、安装 Python 包

pip install openai langchain

2、LLM 模型包装器

(1)调用的本地 Ollama 服务的 Deepseek 模型

from langchain.llms import Ollama
或者
from langchain_community.llms.ollama import Ollama
llm = Ollama(model='deepseek-r1:7b')

(2)调用的 OpenAI

from langchain.llms import OpenAI
OpenAI.openai_api_key="xxx"
llm = OpenAI()

密钥管理可以参考:跟我学LangChain:入门指南,基于LLM构建强大AI应用的“魔法框架”

3、聊天模型包装器

其核心是要理解输入消息和输出消息。

from langchain_community.chat_models.ollama import ChatOllama
from langchain.schema import (
AIMessage,
HumanMessage,
SystemMessage
)
chat = ChatOllama(model="deepseek-r1:7b")
messages = [
SystemMessage(content="你是个旅游博主,了解全国的旅游景点"),
HumanMessage(content="帮我推荐一下上海有哪些两日游的景点")
]
resp = chat(messages)
print(resp.content, end='\n')

解析:

(1)相比 LLM 模型包装器,聊天包装器要更复杂一些。需要符合 AIMessage、HumanMessage、SystemMessage 这 3 种数据格式。这样设计的目的是提供一种标准,通过一致的标准可以便于数据的存储以及传输。

(2)在每个消息对象,都有一个 content 属性,用于存储实际的消息内容。

(3)调用 chat(messages) 后,Chat 模型包装器会接受消息列表,按照数据格式序列化后发送到服务器,服务器处理这些消息后,会生成 AI 回应,将这个回应发送回 Chat 模型包装器,Chat 模型包装器接受回应,回应组装为一个 AIMessage 对象,可以通过 resp.content 获取内容。

LLM 模型包装器的使用相对简单些,主要处理那些单一输入就可以完成的任务,比如文本翻译等。

聊天模型包装器使用起来相对复杂些,但它更有规范性,有标准的数据格式,同时,这样设计能处理复杂的对话场景,可以支持多轮对话,后续也能更好的引入历史对话等,让对话带有上下文,生成更好的响应。