聊天模型
概述
大型语言模型(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。 - 提供对异步编程、高效批处理、丰富的流式 API 的支持。
- 与LangSmith 集成,用于监控和调试基于 LLM 的生产级应用程序。
- 其他功能,如标准化的令牌使用、速率限制、缓存等。
集成
LangChain 有许多聊天模型集成,允许您使用来自不同提供商的各种模型。
这些集成有两种类型
- 官方模型:这些是 LangChain 和/或模型提供商官方支持的模型。您可以在
langchain-<provider>
包中找到这些模型。 - 社区模型:这些模型主要由社区贡献和支持。您可以在
langchain-community
包中找到这些模型。
LangChain 聊天模型以“Chat”作为其类名前缀(例如,ChatOllama
、ChatAnthropic
、ChatOpenAI
等)进行命名。
请查阅聊天模型集成以获取支持模型的列表。
名称中**不**包含“Chat”前缀或名称中包含“LLM”后缀的模型通常是指不遵循聊天模型接口,而是使用接受字符串作为输入并返回字符串作为输出的接口的旧模型。
接口
LangChain 聊天模型实现了BaseChatModel 接口。由于 BaseChatModel
也实现了可运行接口(Runnable Interface),聊天模型支持标准流式接口、异步编程、优化的批处理等。请参阅可运行接口以获取更多详细信息。
聊天模型的许多关键方法都以消息作为输入并返回消息作为输出。
聊天模型提供了一组标准参数,可用于配置模型。这些参数通常用于控制模型的行为,例如输出的温度、响应中的最大令牌数以及等待响应的最长时间。请参阅标准参数部分以获取更多详细信息。
在文档中,我们通常会互换使用“LLM”和“聊天模型”这两个术语。这是因为大多数现代 LLM 都通过聊天模型接口向用户公开。
然而,LangChain 也实现了不遵循聊天模型接口的旧 LLM,而是使用接受字符串作为输入并返回字符串作为输出的接口。这些模型通常不带“Chat”前缀命名(例如,Ollama
、Anthropic
、OpenAI
等)。这些模型实现了BaseLLM 接口,并且可能以“LLM”后缀命名(例如,OllamaLLM
、AnthropicLLM
、OpenAILLM
等)。通常,用户不应使用这些模型。
关键方法
聊天模型的关键方法是
- invoke:与聊天模型交互的主要方法。它接受消息列表作为输入,并返回消息列表作为输出。
- stream:允许您流式传输聊天模型生成输出的方法。
- batch:允许您将多个请求批处理到聊天模型中以进行更高效处理的方法。
- bind_tools:允许您将工具绑定到聊天模型以在模型的执行上下文中使用的方法。
- with_structured_output:针对原生支持结构化输出的模型,对
invoke
方法的包装。
其他重要方法可在BaseChatModel API 参考中找到。
输入和输出
现代 LLM 通常通过聊天模型接口访问,该接口将消息作为输入并返回消息作为输出。消息通常与角色(例如,“system”、“human”、“assistant”)和一个或多个包含文本或可能多模态数据(例如图像、音频、视频)的内容块相关联。
LangChain 支持两种消息格式与聊天模型交互
- LangChain 消息格式:LangChain 自己的消息格式,默认使用并由 LangChain 内部使用。
- OpenAI 消息格式:OpenAI 的消息格式。
标准参数
许多聊天模型都具有可用于配置模型的标准化参数
参数 | 描述 |
---|---|
model | 您要使用的特定 AI 模型的名称或标识符(例如,"gpt-3.5-turbo" 或 "gpt-4" )。 |
temperature | 控制模型输出的随机性。值越高(例如 1.0)使响应更具创造性,而值越低(例如 0.0)使它们更具确定性和集中性。 |
timeout | 在取消请求之前,等待模型响应的最长时间(以秒为单位)。确保请求不会无限期挂起。 |
max_tokens | 限制响应中令牌(单词和标点符号)的总数。这控制了输出的长度。 |
stop | 指定停止序列,指示模型何时应停止生成令牌。例如,您可以使用特定的字符串来表示响应的结束。 |
max_retries | 如果请求由于网络超时或速率限制等问题而失败,系统将尝试重新发送请求的最大次数。 |
api_key | 与模型提供商进行身份验证所需的 API 密钥。这通常在您注册访问模型时颁发。 |
base_url | 发送请求的 API 端点 URL。这通常由模型的提供商提供,对于指导您的请求是必需的。 |
rate_limiter | 一个可选的BaseRateLimiter,用于错开请求以避免超出速率限制。有关更多详细信息,请参阅下面的速率限制。 |
一些重要注意事项
- 标准参数仅适用于公开具有预期功能的参数的模型提供商。例如,一些提供商不公开最大输出令牌的配置,因此无法支持这些参数上的 max_tokens。
- 标准参数目前仅在具有自己集成包(例如
langchain-openai
、langchain-anthropic
等)的集成上强制执行,它们在langchain-community
中的模型上不强制执行。
聊天模型还接受特定于该集成的其他参数。要查找聊天模型支持的所有参数,请前往其各自的API 参考。
工具调用
聊天模型可以调用工具来执行任务,例如从数据库中获取数据、发出 API 请求或运行自定义代码。有关更多信息,请参阅工具调用指南。
结构化输出
可以请求聊天模型以特定格式(例如 JSON 或匹配特定模式)进行响应。此功能对于信息提取任务非常有用。请在结构化输出指南中阅读有关该技术的更多信息。
多模态
大型语言模型(LLM)不仅限于处理文本。它们还可以用于处理其他类型的数据,例如图像、音频和视频。这被称为多模态。
目前,只有少数 LLM 支持多模态输入,几乎没有 LLM 支持多模态输出。请查阅特定模型文档以获取详细信息。
上下文窗口
聊天模型的上下文窗口是指模型一次可以处理的输入序列的最大大小。虽然现代 LLM 的上下文窗口相当大,但它们仍然存在限制,开发者在使用聊天模型时必须牢记这一点。
如果输入超出上下文窗口,模型可能无法处理整个输入并可能引发错误。在会话应用程序中,这尤其重要,因为上下文窗口决定了模型在整个会话中可以“记住”多少信息。开发者通常需要管理上下文窗口内的输入,以保持连贯的对话而不会超出限制。有关在对话中处理内存的更多详细信息,请参阅内存。
输入的大小以令牌衡量,令牌是模型使用的处理单元。
高级主题
速率限制
许多聊天模型提供商对给定时间段内可以发出的请求数量施加限制。
如果您达到速率限制,您通常会收到来自提供商的速率限制错误响应,并且需要等待才能发出更多请求。
您有几种处理速率限制的选项
- 尝试通过错开请求来避免达到速率限制:聊天模型接受一个
rate_limiter
参数,可以在初始化时提供。此参数用于控制向模型提供商发出请求的速率。错开对给定模型的请求是在对模型进行基准测试以评估其性能时特别有用的策略。有关如何使用此功能的更多信息,请参阅如何处理速率限制。 - 尝试从速率限制错误中恢复:如果您收到速率限制错误,您可以等待一定时间,然后重试请求。等待时间可以随每次后续速率限制错误而增加。聊天模型有一个
max_retries
参数,可用于控制重试次数。有关更多信息,请参阅标准参数部分。 - 回退到另一个聊天模型:如果您达到一个聊天模型的速率限制,您可以切换到另一个未受速率限制的聊天模型。
缓存
聊天模型 API 可能很慢,因此一个自然的问题是是否缓存先前对话的结果。理论上,缓存可以通过减少向模型提供商发出的请求数量来帮助提高性能。实际上,缓存聊天模型响应是一个复杂的问题,应谨慎对待。
原因在于,如果依赖于缓存模型中的**精确**输入,那么在对话中第一次或第二次交互之后,缓存命中是不太可能的。例如,您认为多个对话以完全相同的消息开始的可能性有多大?或者完全相同的三条消息?
另一种方法是使用语义缓存,您根据输入的含义而不是精确的输入本身来缓存响应。这在某些情况下可能有效,但在其他情况下则不然。
语义缓存会在应用程序的关键路径上引入对另一个模型的依赖(例如,语义缓存可能依赖于嵌入模型将文本转换为向量表示),并且不能保证准确捕获输入的含义。
然而,在某些情况下缓存聊天模型响应可能是有益的。例如,如果您有一个用于回答常见问题的聊天模型,缓存响应可以帮助减少模型提供商的负载、降低成本并缩短响应时间。
有关更多详细信息,请参阅如何缓存聊天模型响应指南。