2026年7月2日 周四晚上19:30,报名腾讯会议了解“如何构建自进化的动态知识库(Brain)”(限30人)
免费POC, 零成本试错
FDE知识库

FDE知识库

学习大模型的前沿技术与行业落地应用


收藏

AGI|一文识别LangChain中ChatOpenAI 和OpenAI的区别

发布日期:2024-06-19 07:34:41 浏览次数: 4460
作者:神州数码云基地

微信搜一搜,关注“神州数码云基地”


Langchain中ChatOpenAI和OpenAI 的区别

在学习LangChain的过程中,我遇到了一些疑惑。在官方示例中,我发现有些地方使用的是OpenAI模型,而在其他一些地方却使用了ChatOpenAI模型。


我理解,不同的模型可能具有不同的功能和优化点,但具体到OpenAI与ChatOpenAI,它们在性能、特点和使用场景上有何不同呢?


本篇文章为大家分享一下我的研究结果~


 作者 

廖盈盈 | 前端开发工程师

学无止境。加油,奥力给~


Part1

LangChain官网的解释


从LangChain的官网上了解了粗略的概念的,就是OpenAI是属于LLMs,而ChatOpenAI是属于聊天模型。所以要理解ChatOpenAI 和 OpenAI 的区别,就得先知道LLMs和聊天模型的区别。那接下来就打开官网看看这俩到底是什么。


在 LangChain 官网和中文网上的相关解释:


Models

There are two main types of models that LangChain integrates with: LLMs and Chat Models. These are defined by their input and output types.

(LangChain 集成的模型主要有两种类型:LLM 和聊天模型。它们由它们的输入和输出类型定义。)


LLMs

LLMs in LangChain refer to pure text completion models. The APIs they wrap take a string prompt as input and output a string completion. OpenAI’s GPT-3 is implemented as an LLM.

(LangChain中的LLMs指的是纯文本补全模型。它们包装的 API 将字符串提示作为输入并输出字符串完成。OpenAI 的 GPT-3 是作为LLM实施的。)


Chat Models

Chat models are often backed by LLMs but tuned specifically for having conversations. Crucially, their provider APIs use a different interface than pure text completion models. Instead of a single string, they take a list of chat messages as input and they return an AI message as output…

(聊天模型通常由LLMs支持,但专门针对对话进行了调整。至关重要的是,他们的提供商 API 使用与纯文本完成模型不同的接口。他们不是使用单个字符串,而是将聊天消息列表作为输入,并返回 AI 消息作为输出…)


来源:

https://python.langchain.com/docs/modules/model_io/concepts


中文网:


LangChain中有两种类型的语言模型,称为:


  • LLMs: 这是一个以字符串作为输入并返回字符串的语言模型

  • ChatModels: 这是一个以消息列表作为输入并返回消息的语言模型


LLMs的输入/输出简单易懂 - 字符串。但是ChatModels呢?那里的输入是一个ChatMessage列表,输出是一个单独的ChatMessage。一个ChatMessage具有两个必需的组件:


  • content: 这是消息的内容。

  • role: 这是ChatMessage来自的实体的角色。


来源:

https://python.langchain.com.cn/docs/get_started/quickstart


简单的总结一下上边的内容:


  • OpenAI属于LLMs,其输入是字符串,输出也是字符串;


  • ChatOpenAI属于聊天模型,其输入是消息列表,输出是消息列表。



Part2

两者的选择


知道了LLMs和聊天模型的区别,那我们在实际使用的过程中该怎么选择呢?


ChatOpenAI侧重于模型被给与一组消息来构成会话,模型基于这组会话会进行后续的响应。OpenAI是基于问与答,没有会话的概念。


选择ChatOpenAI的情况是需要构建一个能够进行实时对话交流的聊天机器人,用于与用户进行自然语言交互和提供实时的响应。这种情况下,ChatOpenAI可以用于开发聊天机器人、虚拟助手或客服系统等应用。


选择OpenAI的情况是需要进行通用的机器学习和人工智能研究,包括开发和训练各种类型的机器学习模型,如图像识别、自然语言处理、语音识别等。OpenAI提供了一系列强大的机器学习工具和算法,适用于广泛的应用领域,并且能够满足复杂的研究和开发需求。



Part3

LangChain中ChatOpeAI和OpenAI支持的模型


要研究LangChian的ChatOpenAI 和 OpenAI支持的模型。


当然,最直接的探索ChatOpenAI 和 OpenAI和区别方法是查看源码。我们这里打开LangChian中的ChatOpenAI 和 OpenAI的源码来看看这两个支持的模型:


LangChian封装的OpenAI源码中,OpenAI继承一个名为BaseOpenAI的类



在BaseOpenAI中列举了OpenAI的模型,具体的每个模型可以做什么事情可以查看OpenAI官网:https://platform.openai.com/docs/models/overview


@staticmethod
    def modelname_to_contextsize(modelname: str) -> int:
        ...
        model_token_mapping = {
            "gpt-4": 8192,
            "gpt-4-0314": 8192,
            "gpt-4-0613": 8192,
            "gpt-4-32k": 32768,
            "gpt-4-32k-0314": 32768,
            "gpt-4-32k-0613": 32768,
            "gpt-3.5-turbo": 4096,
            "gpt-3.5-turbo-0301": 4096,
            "gpt-3.5-turbo-0613": 4096,
            "gpt-3.5-turbo-16k": 16385,
            "gpt-3.5-turbo-16k-0613": 16385,
            "gpt-3.5-turbo-instruct": 4096,
            "text-ada-001": 2049,
            "ada": 2049,
            "text-babbage-001": 2040,
            "babbage": 2049,
            "text-curie-001": 2049,
            "curie": 2049,
            "davinci": 2049,
            "text-davinci-003": 4097,
            "text-davinci-002": 4097,
            "code-davinci-002": 8001,
            "code-davinci-001": 8001,
            "code-cushman-002": 2048,
            "code-cushman-001": 2048,
        }

        # handling finetuned models
        if "ft-" in modelname:
            modelname = modelname.split(":")[0]

        context_size = model_token_mapping.get(modelname, None)

        if context_size is None:
            raise ValueError(
                f"Unknown model: {modelname}. Please provide a valid OpenAI model name."
                "Known models are: " + ", ".join(model_token_mapping.keys())
            )

        return context_size


OpenAI类的modelname_to_contextsize方法列举了LangChian中OpenAI支持的模型,在其构造方法中可以看到这些模型不是所有的都能支持。


def __new__(cls, **data: Any) -> Union[OpenAIChat, BaseOpenAI]:  # type: ignore
        """Initialize the OpenAI object."""
        model_name = data.get("model_name", "")
        if (
            model_name.startswith("gpt-3.5-turbo") or model_name.startswith("gpt-4")
        ) and "-instruct" not in model_name:
            warnings.warn(
                "You are trying to use a chat model. This way of initializing it is "
                "no longer supported. Instead, please use: "
                "`from langchain_community.chat_models import ChatOpenAI`"
            )
            return OpenAIChat(**data)
        return super().__new__(cls)


在BaseOpenAI的___new___方法中可以看到以模型名“gpt-3.5-turbo”和“gpt-4”开头且不包含“-instruct”的是是chat模型。也就是OpenAI中列举的模型中以gpt-3.5-turbo和gpt-4开头是ChatOpenAI 支持的模型,其余都是OpenAI支持的模型。


OpenAI支持的模型:


  • gpt-3.5-turbo-instruct

  • text-ada-001

  • ada

  • text-babbage-001

  • babbage

  • text-curie-001

  • curie davinci

  • text-davinci-003

  • text-davinci-002

  • code-davinci-002

  • code-davinci-001

  • code-cushman-002

  • code-cushman-001


当然,LangChian可能会更新所支持的OpenAI模型,具体的以最新LangChian源码为准。


ChatOpenAI支持的模型:


  • gpt-4

  • gpt-4-0314

  • gpt-4-0613

  • gpt-4-32k

  • gpt-4-32k-0314

  • gpt-4-32k-0613

  • gpt-3.5-turbo

  • gpt-3.5-turbo-0301

  • gpt-3.5-turbo-0613

  • gpt-3.5-turbo-16k

  • gpt-3.5-turbo-16k-0613



Part4

使用方法


直接官方例子:


(一)OpenAI 的使用:


官方链接:https://python.langchain.com/docs/modules/model_io/llms/quick_start


大型语言模型(LLMs)是LangChain的核心组件。LangChain不为自己的LLMs提供服务,而是提供一个标准接口来与许多不同的LLMs进行交互。


有很多 LLM 提供商(OpenAI、Cohere、Hugging Face 等)——LLM 类为所有提供商提供标准接口。


安装 OpenAI Python 包:


pip install openai


访问 API 需要 API 密钥,您可以通过创建帐户并前往 此处获取该密钥。一旦我们有了密钥,我们就需要通过运行以下命令将其设置为环境变量:


export OPENAI_API_KEY="..."


如果您不想设置环境变量,可以openai_api_key在启动 OpenAI LLM 类时直接通过命名参数传递密钥:


from langchain_openai import OpenAI

llm = OpenAI(openai_api_key="...")


LLMs 实现Runnable 接口,这是LangChain 表达式语言 (LCEL)的基本构建块。这意味着它们支持invoke、 ainvoke、stream、astream、batch、abatch、astream_log调用。


LLM 接受字符串作为输入,或可以强制为字符串提示的对象,包括List[BaseMessage]和PromptValue。


llm.invoke(
    "What are some theories about the relationship between unemployment and inflation?"
)


'\n\n1. The Phillips Curve Theory: This suggests that there is an inverse relationship between unemployment and inflation, meaning that when unemployment is low, inflation will be higher, and when unemployment is high, inflation will be lower.\n\n2. The Monetarist Theory: This theory suggests that the relationship between unemployment and inflation is weak, and that changes in the money supply are more important in determining inflation.\n\n3. The Resource Utilization Theory: This suggests that when unemployment is low, firms are able to raise wages and prices in order to take advantage of the increased demand for their products and services. This leads to higher inflation.'


(二)ChatOpenAI 的使用:


官方链接:https://python.langchain.com/docs/modules/model_io/chat/quick_start


聊天模型是语言模型的变体。虽然聊天模型在底层使用语言模型,但它们使用的接口有点不同。聊天模型没有使用“文本输入、文本输出”的接口,而是使用“聊天消息”作为输入和输出的接口。


与OpenAI一样,ChatOpenAI类也是集成OpenAI官方的模型,所以一样需要一样的密钥。


同样如果不想设置环境变量,可以openai_api_key在启动 OpenAI LLM 类时直接通过命名参数传递密钥:


from langchain_openai import ChatOpenAI

chat = ChatOpenAI(openai_api_key="...")


聊天模型界面基于消息而不是原始文本。LangChain目前支持的消息类型有AIMessage, HumanMessage, SystemMessage,FunctionMessage和ChatMessage- ChatMessage接受任意角色参数。大多数时候,您只需处理HumanMessage、AIMessage和 SystemMessage


聊天模型实现了Runnable 接口,这是LangChain 表达式语言(LCEL)的基本构建块。这意味着它们支持invoke、 ainvoke、stream、astream、batch、abatch、astream_log调用。


聊天模型接受List[BaseMessage]作为输入或可以强制为消息的对象,包括str(转换为HumanMessage)和PromptValue。


from langchain_core.messages import HumanMessage, SystemMessage

messages = [
    SystemMessage(content="You're a helpful assistant"),
    HumanMessage(content="What is the purpose of model regularization?"),
]


chat.invoke(messages)


AIMessage(content="The purpose of model regularization is to prevent overfitting in machine learning models. Overfitting occurs when a model becomes too complex and starts to fit the noise in the training data, leading to poor generalization on unseen data. Regularization techniques introduce additional constraints or penalties to the model's objective function, discouraging it from becoming overly complex and promoting simpler and more generalizable models. Regularization helps to strike a balance between fitting the training data well and avoiding overfitting, leading to better performance on new, unseen data.")



Part5

其他


在探索LangChian的ChatOpenAI 和 OpenAI这两个类时,了解到这两个类使用OpenAI接口不一样, OpenAI使用的是/v1/completions接口,而ChatOpenAI 使用的是/v1/chat/completions。


详细的可以查看OpenAI官网:


https://platform.openai.com/docs/models/model-endpoint-compatibility


53AI,企业落地大模型首选服务商

产品:场景落地咨询+大模型应用平台+行业解决方案

承诺:免费POC验证,效果达标后再合作。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

添加专属顾问

回到顶部

加载中...

扫码咨询

扫码登录
登录即表示您同意《53AI网站服务协议》
服务协议

欢迎您使用【53AI 官方网站】(以下简称“本网站”或“我们”)。本《会员服务协议》(以下简称“本协议”)是您(以下简称“会员”或“用户”)与【深圳市博思协创网络科技有限公司】之间关于注册、登录及使用本网站会员服务所订立的法律协议。

在您注册或登录前,请务必审慎阅读、充分理解各条款内容,特别是免除或限制责任的条款、知识产权条款、争议解决条款等。此类条款将以加粗形式提示您注意。 当您通过微信公众号授权、手机验证码验证或其他方式成功登录本网站时,即视为您已完全理解并同意接受本协议的全部内容。

一、 定义

本网站:指由【深圳市博思协创网络科技有限公司】运营的,域名为【53ai.com】的网站及相关移动端页面。

会员服务:指本网站向注册会员提供的知识库文章查阅、内容检索及其他相关增值服务。

知识库内容:指本网站发布的包括但不限于文字、图表、数据、研究报告、行业分析等数字化内容资源。

二、 账号注册与登录

登录方式:本网站支持以下登录方式,您可根据实际情况选择:

微信公众号授权登录:您同意将您的微信OpenID信息授权给本网站,用于创建或关联会员账号。

手机验证码登录:您需提供真实有效的手机号码,并通过短信验证码完成身份验证与登录/注册。

账号安全:您的账号仅限您本人使用,禁止赠与、借用、租用、转让或售卖。因您保管不善导致的账号被盗、密码泄露等损失,由您自行承担。

实名认证:根据相关法律法规要求,我们可能要求您在特定功能下完成实名认证。如您拒绝提供,可能无法使用部分或全部服务。

未成年人保护:若您未满18周岁,请在法定监护人的陪同下阅读本协议,并在征得监护人同意后使用本服务。

三、 服务内容与规范

知识库查阅权限:会员登录后,有权按照其会员等级对应的权限范围,在线浏览、检索本网站知识库中的相关文章及内容。

服务变更:我们有权根据业务发展需要,调整、变更或终止部分服务内容,并将以网站公告、公众号消息等方式提前通知。

禁止行为:您在使用服务时不得实施以下行为:

利用技术手段批量爬取、下载、转存知识库内容;

将知识库内容用于商业目的或未经授权地向第三方传播;

干扰本网站正常运行或侵犯其他用户合法权益;

发布违法违规信息或从事违反公序良俗的活动。

四、 知识产权声明

权利归属:本网站知识库中的排版设计、软件代码等内容的知识产权均归【公司全称】或原权利人所有,受《中华人民共和国著作权法》等法律保护。

有限许可:本网站授予会员一项非独占、不可转让、不可转授权的普通许可,仅限于个人学习、研究之目的在线查阅知识库内容。

侵权追责:未经书面许可,任何单位或个人不得以任何形式复制、转载、摘编、镜像、汇编或以其他方式使用上述内容。一经发现,我们保留追究其法律责任的权利。

五、 个人信息保护

我们重视对您个人信息的保护。关于我们如何收集、使用、存储和保护您的个人信息,请单独阅读 《隐私政策》。

您通过微信公众号授权或手机号验证所提供的信息,我们将严格按照《个人信息保护法》的规定处理,仅用于身份识别、服务提供及安全验证等必要用途。

您可以随时通过网站设置或联系客服行使查阅、更正、删除个人信息及撤回授权同意的权利。

六、 免责声明

内容准确性:知识库内容仅供参考,不构成专业建议。我们不对其完整性、准确性、时效性作任何明示或暗示的保证,您应自行判断并承担使用风险。

不可抗力:因自然灾害、政策法规变化、网络故障、第三方平台接口异常(如微信接口维护、运营商短信通道故障)等不可抗力导致的服务中断或延迟,我们不承担违约责任。

第三方链接:本网站可能包含指向第三方网站的链接,该等网站的内容和服务不受我们控制,请您自行甄别风险。

七、 违约责任

如您违反本协议约定,我们有权视情节采取警告、限制功能、暂停服务、注销账号等措施,并保留要求赔偿损失的权利。

如因您的违约行为导致我们遭受行政处罚、第三方索赔或商誉损失,您应承担全部赔偿责任(包括但不限于罚款、赔偿金、律师费、公证费等)。

八、 法律适用与争议解决

本协议的订立、执行和解释均适用中华人民共和国大陆地区法律。

因本协议产生的或与本协议有关的任何争议,双方应友好协商解决;协商不成的,任何一方均可向【公司所在地】有管辖权的人民法院提起诉讼。

九、 其他

本协议构成双方就本服务达成的完整协议,取代此前任何口头或书面约定。

本协议任一条款被认定为无效或不可执行的,不影响其他条款的效力。

我们对本协议享有最终解释权,并在法律允许的范围内保留随时修改的权利。修改后的协议一经公布即生效,继续使用服务即视为同意修订内容。


已查阅