Concepts
Models
LangChain 集成的模型主要有两种类型:LLMs 和Chat Models。它们由它们的输入和输出类型定义。它们由它们的输入和输出类型定义。
-
LLMs
LangChain中的LLMs指的是纯文本补全模型,它们包装的 API 将字符串提示作为输入并输出字符串完成。
-
Chat Models
Chat Models通常由LLMs支持,但专门针对对话进行了调整。最重要的是,它们的API使用与纯文本完成模型不同的接口。不再使用单个字符串,而是将聊天消息列表作为输入,并返回 AIMessage作为输出。
-
Considerations 注意事项
这两种API模型具有截然不同的输入和输出架构,这意味着与他们互动的最佳方式可能会完全不同。尽管 LangChain 可以互换对待它们,但这并不意味着您应该这样做。特别是,LLMs 与 ChatModels 的提示策略可能会有很大不同。这意味着您需要确保您使用的提示是针对您正在使用的模型类型设计的。
不同的模型有不同的最佳提示策略。例如,Anthropic 的模型最适合使用 XML,而 OpenAI 的模型最适合使用 JSON。这意味着用于一种模型的提示可能不会转移到其他模型。LangChain 提供了很多默认提示,但不能保证这些提示能够很好地配合您所使用的模型,大多数提示在 OpenAI 上都能很好地工作,但没有在其他模型上进行过大量测试。
Messages
ChatModels将消息列表作为输入并返回消息。所有的消息都有一个role
和content
属性,role
表示这条消息的发送者。LangChain针对不同的角色有不同的消息类别。content
表示这条消息的内容。
- 字符串(大部分模型)
- 字典列表(用于多模式输入,其中字典包含有关该输入类型和该输入位置的信息)
此外,消息还有一个additional_kwargs
属性,用来传递有关消息的附加信息,主要用于特定于提供者而非通用的输入参数。最著名的例子是 OpenAI 的 function_call
。
-
HumanMessage
来自用户的消息,通常仅由内容组成
-
AIMessage
来自模型的消息,可能包含
additional_kwargs
-
SystemMessage
一条系统消息,只有部分模型支持此功能,告诉模型如何表现,通常仅包含内容
-
FunctionMessage
表示函数调用的结果,除了
role
和content
,还有一个name
参数,该参数传达为产生此结果而调用的函数的名称 -
ToolMessage
表示工具调用的结果。与
FunvtionMessage
不同,是为了匹配OpenAI的函数和工具消息类型。除了role
和content
,该消息有一个tool_call_id
参数,该参数将调用的 id 传达给被调用以产生此结果的工具。
Prompts
语言模型的输入通常称为提示。通常,应用程序中的用户输入并不是模型的直接输入。相反,它们的输入会以某种方式进行转换,以生成进入模型的字符串或消息列表。接受用户输入并将其转换为最终字符串或消息的对象称为“提示模板(Prompt Templates)”。
-
PromptValue
ChatModels 和 LLMs 采用不同的输入类型。 PromptValue 是一个设计为可在两者之间相互操作的类。它有一个要转换为字符串的方法(与 LLM 一起使用)和另一个要转换为消息列表的方法(与 ChatModel 一起使用)。
-
PromptTemplate
由模板字符串组成,然后使用用户输入格式化该字符串以生成最终字符串。
-
MessagePromptTemplate
由一条模板消息(表示特定角色)和一个 PromptTemplate 组成。然后,此 PromptTemplate 将根据用户输入进行格式化,以生成成为此消息的最终字符串
content
。-
HumanMessagePromptTemplate
生成 HumanMessage 的 MessagePromptTemplate。
-
AIMessagePromptTemplate
生成 HumanMessage 的 MessagePromptTemplate。
-
SystemMessagePromptTemplate
生成 SystemMessage 的 MessagePromptTemplate。
-
-
MessagesPlaceholder 消息占位符
通常提示的输入可以是消息列表。这需要使用 MessagesPlaceholder,这些对象由
variable_name
参数参数化,与该variable_name
值具有相同值的输入应该是消息列表。 -
ChatPromptTemplate
由 MessagePromptTemplates 或 MessagePlaceholders 的列表组成,然后根据用户输入对这些内容进行格式化以生成最终的消息列表。
Output Parsers
模型的输出是字符串或消息。通常,字符串或消息包含以供下游使用的特定格式格式化的信息(例如,逗号分隔列表或 JSON blob)。输出解析器负责接收模型的输出并将其转换为更可用的形式。这些通常适用于content
输出消息的值,但有时也适用于additional_kwargs
字段中的值。
-
StrOutputParser Str输出解析器
这是一个简单的输出解析器,仅将语言模型(LLM 或 ChatModel)的输出转换为字符串。如果模型是 LLM(输出一个字符串),它只会传递该字符串。如果输出是 ChatModel(输出消息),则它会传递
.content
消息的属性。 -
OpenAI Functions Parsers OpenAI函数解析器
有一些解析器专门用于处理 OpenAI 函数调用。它们获取
function_call
和arguments
参数(位于additional_kwargs
内部)的输出并使用它们,很大程度上忽略内容。 -
Agent Output Parsers Agent输出解析器
Agent是使用语言模型来确定要采取哪些步骤的系统。因此,需要将语言模型的输出解析为某种可以表示要采取的操作(如果有)的模式。
AgentOutputParsers
负责获取原始 LLM 或 ChatModel 输出并将其转换为该模式。这些输出解析器内部的逻辑可能会有所不同,具体取决于所使用的模型和提示策略。