聊天模型
概述
大型语言模型 (LLM) 是高级机器学习模型,在各种与语言相关的任务(如文本生成、翻译、摘要、问答等)中表现出色,而无需针对每个场景进行特定于任务的微调。
现代 LLM 通常通过聊天模型界面进行访问,该界面将消息列表作为输入,并返回消息作为输出。
最新一代的聊天模型提供了额外的功能:
- 工具调用:许多流行的聊天模型都提供原生工具调用 API。此 API 允许开发人员构建丰富的应用程序,使 LLM 能够与外部服务、API 和数据库进行交互。工具调用还可用于从非结构化数据中提取结构化信息并执行各种其他任务。
- 结构化输出:一种使聊天模型以结构化格式(例如与给定架构匹配的 JSON)响应的技术。
- 多模态:能够处理文本以外的数据;例如,图像、音频和视频。
特征
LangChain 为使用来自不同提供商的聊天模型提供了一个一致的界面,同时提供了用于监控、调试和优化使用 LLM 的应用程序性能的附加功能。
- 与许多聊天模型提供商(例如 Anthropic、OpenAI、Ollama、Microsoft Azure、Google Vertex、Amazon Bedrock、Hugging Face、Cohere、Groq)集成。有关受支持模型的最新列表,请参阅聊天模型集成。
- 使用 LangChain 的消息格式或 OpenAI 格式。
- 标准工具调用 API:标准接口,用于为模型绑定工具,访问模型发出的工具调用请求,以及将工具结果发送回溯给模型。
- 用于通过
with_structured_output方法。 - 为异步编程、高效批处理和丰富的流式处理 API 提供支持。
- 与 LangSmith 集成,用于监控和调试基于 LLM 的生产级应用程序。
- 其他功能,如标准化令牌使用、速率限制、缓存等。
集成
LangChain 有许多聊天模型集成,允许您使用来自不同提供商的各种模型。
这些集成是以下两种类型之一:
- 官方模型:这些是 LangChain 和/或模型提供商官方支持的模型。您可以在
langchain-<provider>包。 - 社区模型:有些模型主要由社区贡献和支持。您可以在
langchain-community包。
LangChain 聊天模型的命名约定是在其类名前加上 “Chat” 前缀(例如ChatOllama,ChatAnthropic,ChatOpenAI等)。
请查看聊天模型集成,了解支持的模型列表。
名称中不包含前缀“Chat”或名称中不包含“LLM”作为后缀的模型通常是指不遵循聊天模型接口的旧模型,而是使用将字符串作为输入并返回字符串作为输出的接口。
接口
LangChain 聊天模型实现了 BaseChatModel 接口。因为BaseChatModel还实现了 Runnable Interface,聊天模型支持标准流式处理接口、异步编程、优化批处理等。有关更多详细信息,请参阅 Runnable 接口。
聊天模型的许多关键方法将消息作为输入进行作,并将返回消息作为输出。
聊天模型提供了一组可用于配置模型的标准参数。这些参数通常用于控制模型的行为,例如输出的温度、响应中的最大令牌数以及等待响应的最长时间。有关更多详细信息,请参阅标准参数部分。
在文档中,我们经常交替使用术语 “LLM” 和 “聊天模型”。这是因为大多数现代 LLM 都是通过聊天模型界面向用户公开的。
但是,LangChain 也有较旧的 LLM 的实现,这些 LLM 不遵循聊天模型接口,而是使用一个接口,该接口将字符串作为输入并返回字符串作为输出。这些模型通常不带 “Chat” 前缀(例如Ollama,Anthropic,OpenAI等)。
这些模型实现了 BaseLLM 接口,并且可以用 “LLM” 后缀命名(例如OllamaLLM,AnthropicLLM,OpenAILLM等)。通常,用户不应使用这些模型。
关键方法
聊天模型的主要方法包括:
- invoke:与聊天模型交互的主要方法。它采用消息列表作为输入,并返回消息列表作为输出。
- stream:一种允许您在生成聊天模型时流式传输聊天模型输出的方法。
- batch:一种允许您将对聊天模型的多个请求一起批处理以实现更高效处理的方法。
- bind_tools:一种允许您将工具绑定到聊天模型以在模型的执行上下文中使用的方法。
- with_structured_output:对
invoke方法。
其他重要方法可以在 BaseChatModel API 参考 中找到。
输入和输出
现代 LLM 通常通过聊天模型界面进行访问,该界面将消息作为输入,并将消息作为输出返回。消息通常与一个角色(例如,“系统”、“人类”、“助手”)和一个或多个包含文本或潜在多模式数据(例如,图像、音频、视频)的内容块相关联。
LangChain 支持两种消息格式与聊天模型交互:
- LangChain 消息格式:LangChain 自己的消息格式,默认使用,由 LangChain 内部使用。
- OpenAI 的消息格式:OpenAI 的消息格式。
标准参数
许多聊天模型都有可用于配置模型的标准化参数:
| 参数 | 描述 |
|---|---|
model | The name or identifier of the specific AI model you want to use (e.g., "gpt-3.5-turbo" or "gpt-4"). |
temperature | Controls the randomness of the model's output. A higher value (e.g., 1.0) makes responses more creative, while a lower value (e.g., 0.0) makes them more deterministic and focused. |
timeout | The maximum time (in seconds) to wait for a response from the model before canceling the request. Ensures the request doesn’t hang indefinitely. |
max_tokens | Limits the total number of tokens (words and punctuation) in the response. This controls how long the output can be. |
stop | Specifies stop sequences that indicate when the model should stop generating tokens. For example, you might use specific strings to signal the end of a response. |
max_retries | The maximum number of attempts the system will make to resend a request if it fails due to issues like network timeouts or rate limits. |
api_key | The API key required for authenticating with the model provider. This is usually issued when you sign up for access to the model. |
base_url | The URL of the API endpoint where requests are sent. This is typically provided by the model's provider and is necessary for directing your requests. |
rate_limiter | An optional BaseRateLimiter to space out requests to avoid exceeding rate limits. See rate-limiting below for more details. |
需要注意的一些重要事项:
- 标准参数仅适用于公开具有预期功能的参数的模型提供程序。例如,某些提供程序不会公开最大输出令牌的配置,因此这些提供程序不支持max_tokens。
- 标准参数目前仅在具有自己的集成包的集成(例如
langchain-openai,langchain-anthropic等),它们不会在langchain-community.
聊天模型还接受特定于该集成的其他参数。要查找 Chat 模型支持的所有参数,请前往该模型的相应 API 参考。
工具调用
聊天模型可以调用工具来执行任务,例如从数据库获取数据、发出 API 请求或运行自定义代码。请 有关更多信息,请参阅工具调用指南。
结构化输出
可以请求聊天模型以特定格式(例如 JSON 或匹配特定架构)进行响应。这个特点非常 对于信息提取任务很有用。请阅读更多关于 结构化输出指南中的技术。
综合
大型语言模型 (LLM) 不仅限于处理文本。它们还可用于处理其他类型的数据,例如图像、音频和视频。这称为多模态。
目前,只有一些 LLM 支持多模态输入,几乎没有支持多模态输出。有关详细信息,请参阅具体型号文档。
上下文窗口
聊天模型的上下文窗口是指模型一次可以处理的输入序列的最大大小。虽然现代 LLM 的上下文窗口相当大,但它们仍然存在开发人员在使用聊天模型时必须牢记的限制。
如果输入超出上下文窗口,则模型可能无法处理整个输入,并可能引发错误。在对话应用程序中,这一点尤其重要,因为上下文窗口决定了模型在整个对话中可以 “记住” 多少信息。开发人员通常需要在上下文窗口中管理输入,以便在不超出限制的情况下保持对话的连贯性。有关在对话中处理内存的更多详细信息,请参阅内存。
输入的大小以 tokens 为单位进行度量,tokens 是模型使用的处理单元。
高级主题
速率限制
许多聊天模型提供商对在给定时间段内可以发出的请求数量施加限制。
如果您达到速率限制,您通常会从提供商那里收到速率限制错误响应,并且需要等待才能发出更多请求。
您有几种方法可以处理速率限制:
- 尝试通过间隔请求来避免达到速率限制:聊天模型接受
rate_limiter参数。此参数用于控制向模型提供程序发出请求的速率。在对模型进行基准测试以评估其性能时,将请求与给定模型隔开是一种特别有用的策略。有关如何使用此功能的更多信息,请参阅如何处理速率限制。 - 尝试从速率限制错误中恢复:如果您收到速率限制错误,您可以等待一段时间,然后再重试请求。等待的时间可能会随着每个后续的速率限制错误而增加。聊天模型具有
max_retries参数,该参数可用于控制重试次数。请参阅 标准参数 部分以了解更多信息。 - 回退到另一个聊天模型:如果一个聊天模型达到速率限制,则可以切换到另一个不受速率限制的聊天模型。
缓存
聊天模型 API 可能很慢,因此一个自然的问题是是否缓存之前对话的结果。从理论上讲,缓存可以通过减少向模型提供程序发出的请求数来帮助提高性能。在实践中,缓存聊天模型响应是一个复杂的问题,应谨慎处理。
原因是,如果依赖于将确切的输入缓存到模型中,则在对话中的第一次或第二次交互后不太可能获得缓存命中。例如,您认为多个对话以完全相同的信息开始的可能性有多大?完全相同的三条消息呢?
另一种方法是使用语义缓存,其中根据输入的含义而不是确切的输入本身来缓存响应。这在某些情况下可能有效,但在其他情况下则无效。
语义缓存在应用程序的关键路径上引入了对另一个模型的依赖性(例如,语义缓存可能依赖于嵌入模型将文本转换为向量表示),并且不能保证准确捕获输入的含义。
但是,在某些情况下,缓存聊天模型响应可能是有益的。例如,如果您有一个用于回答常见问题的聊天模型,则缓存响应有助于减少模型提供商的负载、成本并缩短响应时间。
请参阅 如何缓存聊天模型响应 有关更多详细信息。