跳到主要内容

聊天模型

概述

大型语言模型 (LLM) 是先进的机器学习模型,擅长各种语言相关任务,例如文本生成、翻译、摘要、问答等等,而无需为每种场景进行特定任务的调整。

现代 LLM 通常通过聊天模型接口访问,该接口接受 消息 列表作为输入,并返回 消息 作为输出。

最新一代的聊天模型提供了额外的功能

  • 工具调用:许多流行的聊天模型都提供原生的 工具调用 API。此 API 允许开发人员构建丰富的应用程序,使 AI 能够与外部服务、API 和数据库进行交互。工具调用还可用于从非结构化数据中提取结构化信息并执行各种其他任务。
  • 结构化输出:一种使聊天模型以结构化格式(例如与给定架构匹配的 JSON)响应的技术。
  • 多模态:处理文本以外数据的能力;例如,图像、音频和视频。

特性

LangChain 为使用来自不同提供商的聊天模型提供了一致的接口,同时为监控、调试和优化使用 LLM 的应用程序的性能提供了额外的功能。

  • 与许多聊天模型提供商的集成(例如,Anthropic、OpenAI、Ollama、Microsoft Azure、Google Vertex、Amazon Bedrock、Hugging Face、Cohere、Groq)。有关受支持模型的最新列表,请参阅 聊天模型集成
  • 使用 LangChain 的 消息 格式或 OpenAI 格式。
  • 标准 工具调用 API:用于将工具绑定到模型、访问模型发出的工具调用请求以及将工具结果发送回模型的标准接口。
  • 用于通过 withStructuredOutput 方法 构建输出结构 的标准 API。
  • LangSmith 集成,用于监控和调试基于 LLM 的生产级应用程序。
  • 其他功能,如标准化的 令牌使用量速率限制缓存 等。

集成

LangChain 具有许多聊天模型集成,允许您使用来自不同提供商的各种模型。

这些集成有两种类型

  1. 官方模型:这些模型是 LangChain 和/或模型提供商官方支持的模型。您可以在 @langchain/<provider> 包中找到这些模型。
  2. 社区模型:这些模型主要由社区贡献和支持。您可以在 @langchain/community 包中找到这些模型。

LangChain 聊天模型以一种约定命名,即在其类名前面加上 "Chat" 前缀(例如,ChatOllamaChatAnthropicChatOpenAI 等)。

请查看 聊天模型集成 以获取受支持模型的列表。

注意

名称中包含 "Chat" 前缀或名称中包含 "LLM" 后缀的模型通常指的是不遵循聊天模型接口的旧模型,而是使用接受字符串作为输入并返回字符串作为输出的接口。

接口

LangChain 聊天模型实现了 BaseChatModel 接口。由于 BaseChatModel 也实现了 Runnable 接口,因此聊天模型支持 标准流式传输接口、优化的 批处理 等。有关更多详细信息,请参阅 Runnable 接口

聊天模型的许多关键方法都对 消息 进行操作,作为输入并返回消息作为输出。

聊天模型提供了一组标准参数,可用于配置模型。这些参数通常用于控制模型的行为,例如输出的温度、响应中的最大令牌数以及等待响应的最大时间。有关更多详细信息,请参阅 标准参数 部分。

注意

在文档中,我们经常互换使用术语 "LLM" 和 "Chat Model"。这是因为大多数现代 LLM 通过聊天模型接口向用户公开。

但是,LangChain 也有旧版 LLM 的实现,这些实现不遵循聊天模型接口,而是使用接受字符串作为输入并返回字符串作为输出的接口。这些模型通常在命名时没有 "Chat" 前缀(例如,OllamaAnthropicOpenAI 等)。这些模型实现了 BaseLLM 接口,并且可能以 "LLM" 后缀命名(例如,OpenAILLM 等)。通常,用户不应使用这些模型。

关键方法

聊天模型的关键方法是

  1. invoke:与聊天模型交互的主要方法。它接受 消息 列表作为输入,并返回消息列表作为输出。
  2. stream:一种允许您在聊天模型生成输出时对其进行流式传输的方法。
  3. batch:一种允许您将对聊天模型的多个请求批量处理在一起以提高处理效率的方法。
  4. bindTools:一种允许您将工具绑定到聊天模型以在模型的执行上下文中使用的方法。
  5. withStructuredOutputinvoke 方法的包装器,用于本身支持 结构化输出 的模型。

其他重要方法可以在 BaseChatModel API 参考 中找到。

输入和输出

现代 LLM 通常通过聊天模型接口访问,该接口接受 消息 作为输入并返回 消息 作为输出。消息通常与角色(例如,“系统”、“人类”、“助手”)以及包含文本或潜在多模态数据(例如,图像、音频、视频)的一个或多个内容块相关联。

LangChain 支持两种消息格式与聊天模型交互

  1. LangChain 消息格式:LangChain 自己的消息格式,默认使用,并且在 LangChain 内部使用。
  2. OpenAI 的消息格式:OpenAI 的消息格式。

标准参数

许多聊天模型都具有标准化参数,可用于配置模型

参数描述
model您要使用的特定 AI 模型的名称或标识符(例如,"gpt-3.5-turbo""gpt-4")。
temperature控制模型输出的随机性。较高的值(例如,1.0)使响应更具创造性,而较低的值(例如,0.1)使响应更具确定性和重点。
timeout在取消请求之前,等待模型响应的最长时间(以秒为单位)。确保请求不会无限期挂起。
maxTokens限制响应中令牌(单词和标点符号)的总数。这控制了输出的长度。
stop指定停止序列,指示模型何时应停止生成令牌。例如,您可以使用特定字符串来表示响应的结束。
maxRetries如果系统因网络超时或速率限制等问题而失败,系统将尝试重新发送请求的最大次数。
apiKey与模型提供商进行身份验证所需的 API 密钥。这通常在您注册访问模型时颁发。
baseUrl发送请求的 API 端点的 URL。这通常由模型的提供商提供,对于定向您的请求是必要的。

一些需要注意的重要事项

  • 标准参数仅适用于公开具有预期功能的参数的模型提供商。例如,某些提供商不公开最大输出令牌的配置,因此在这些提供商上不支持 max_tokens。
  • 标准参数目前仅在具有自己集成包的集成(例如 @langchain/openai@langchain/anthropic 等)上强制执行,它们在 @langchain/community 中的模型上不强制执行。

ChatModels 还接受特定于该集成的其他参数。要查找 ChatModel 支持的所有参数,请转到该模型的 API 参考

工具调用

聊天模型可以调用 工具 来执行诸如从数据库获取数据、发出 API 请求或运行自定义代码之类的任务。有关更多信息,请参阅 工具调用 指南。

结构化输出

可以请求聊天模型以特定格式(例如,JSON 或匹配特定架构)响应。此功能对于信息提取任务非常有用。请在 结构化输出 指南中阅读有关该技术的更多信息。

多模态

大型语言模型 (LLM) 不仅限于处理文本。它们还可用于处理其他类型的数据,例如图像、音频和视频。这被称为 多模态

目前,只有部分 LLM 支持多模态输入,几乎没有 LLM 支持多模态输出。有关详细信息,请查阅特定模型的文档。

上下文窗口

聊天模型的上下文窗口是指模型一次可以处理的最大输入序列大小。虽然现代 LLM 的上下文窗口非常大,但它们仍然存在开发人员在使用聊天模型时必须牢记的限制。

如果输入超过上下文窗口,模型可能无法处理整个输入,并可能引发错误。在对话应用程序中,这一点尤为重要,因为上下文窗口决定了模型在整个对话过程中可以“记住”多少信息。开发人员通常需要在上下文窗口内管理输入,以保持连贯的对话而不超出限制。有关处理对话中内存的更多详细信息,请参阅 内存

输入的大小以 令牌 衡量,令牌是模型使用的处理单位。

高级主题

缓存

聊天模型 API 可能会很慢,因此一个自然的问题是是否缓存以前对话的结果。从理论上讲,缓存可以通过减少向模型提供商发出的请求数量来帮助提高性能。在实践中,缓存聊天模型响应是一个复杂的问题,应谨慎对待。

原因是,如果依赖于缓存模型的确切输入,则在对话的第一次或第二次交互后,不太可能获得缓存命中。例如,您认为有多少对话以完全相同的消息开始?那么完全相同的三条消息呢?

另一种方法是使用语义缓存,在这种方法中,您可以根据输入的含义而不是确切的输入本身来缓存响应。这在某些情况下可能有效,但在其他情况下则无效。

语义缓存引入了对应用程序关键路径上的另一个模型的依赖(例如,语义缓存可能依赖于 嵌入模型 将文本转换为向量表示),并且不能保证准确捕获输入的含义。

但是,在某些情况下,缓存聊天模型响应可能是有益的。例如,如果您有一个用于回答常见问题的聊天模型,则缓存响应可以帮助减少模型提供商的负载并缩短响应时间。

有关更多详细信息,请参阅 如何缓存聊天模型响应 指南。

概念指南


此页面是否对您有帮助?


您也可以留下详细的反馈 在 GitHub 上.